SET TERM ^ ;

CREATE OR ALTER procedure SPI_TRATA_PEDIDO_AGRUPAMENTO_V2 (
    PEDIDO integer,
    PED_ITEM_ID integer)
as
declare variable DATA_PRODUCAO date;
declare variable MODELO_CODIGO integer;
declare variable PRODUTO_CODIGO integer;
declare variable PERFIL varchar(40);
declare variable TAMANHO integer;
declare variable QTD_EST numeric(18,4);
declare variable QTD_REM numeric(18,4);
declare variable QTD_AGP numeric(18,4);
declare variable EST_MIN char(4);
declare variable CAP_PROD_SKU numeric(18,4);
declare variable SALDO numeric(18,4);
declare variable QTD_MINIMO integer;
declare variable QTD_MULTIPLO integer;
declare variable REM_STATUS char(4);
declare variable MP numeric(18,4);
declare variable ESTABELECIMENTO_ID integer;
declare variable PERFIL_PED varchar(10);
declare variable DATA_AGRUPAMENTO date;
declare variable VPED_ITEM_ID integer;
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_GP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable PRODUZIR numeric(18,4);
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable PERFIL_COR varchar(10);
declare variable TRATAMENTO_PEDIDO_MP char(1);
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable AGRUP_UP_TOTAL integer;
declare variable COR_ID integer;
declare variable PROGRAMADO char(1);
declare variable DATA_CLIENTE date;
declare variable DATA_EMISSAO date;
declare variable CONF_AGRUPAMENTO_ID integer;
declare variable GP_AGRUPAMENTO_ID integer;
declare variable TIPO_AGP varchar(10);
declare variable SUB_TIPO_GP integer;
BEGIN

    FOR
        SELECT  P.DATA_CLIENTE,
                P.DATA,
                A.DATA_PRODUCAO,
                A.MODELO_CODIGO,
                A.PRODUTO_CODIGO,
                A.COR_ID,
                A.PERFIL,
                A.TAMANHO,
                A.QTD_EST,
                A.QTD_REM,
                A.QTD_AGP,
                A.EST_MIN,
               (SELECT FIRST 1 P.CAP_PRODUTIVA FROM TBPERFIL P WHERE P.TABELA = 'SKU' AND P.ID = A.PERFIL) CAP_PROD_SKU,
        
               CAST(COALESCE((SELECT FIRST 1 S.QUANTIDADE FROM TBPEDIDO_ITEM_SALDO S
                 WHERE S.PEDIDO = A.PEDIDO AND S.PEDIDO_ITEM_CONTROLE = A.CONTROLE),0.0000) AS NUMERIC(15,4)) SALDO,

               COALESCE((SELECT FIRST 1 CASE WHEN A.TAMANHO = 1 THEN MI01 WHEN A.TAMANHO = 2 THEN MI02
                                             WHEN A.TAMANHO = 3 THEN MI03 WHEN A.TAMANHO = 4 THEN MI04
                                             WHEN A.TAMANHO = 5 THEN MI05 WHEN A.TAMANHO = 6 THEN MI06
                                             WHEN A.TAMANHO = 7 THEN MI07 WHEN A.TAMANHO = 8 THEN MI08
                                             WHEN A.TAMANHO = 9 THEN MI09 WHEN A.TAMANHO =10 THEN MI10
                                             WHEN A.TAMANHO =11 THEN MI11 WHEN A.TAMANHO =12 THEN MI12
                                             WHEN A.TAMANHO =13 THEN MI13 WHEN A.TAMANHO =14 THEN MI14
                                             WHEN A.TAMANHO =15 THEN MI15 WHEN A.TAMANHO =16 THEN MI16
                                             WHEN A.TAMANHO =17 THEN MI17 WHEN A.TAMANHO =18 THEN MI18
                                             WHEN A.TAMANHO =19 THEN MI19 WHEN A.TAMANHO =20 THEN MI20 END
                           FROM TBMODELO_PEDIDO_COTA M WHERE M.MODELO_ID = A.MODELO_CODIGO),1) QTD_MINIMO,
        
               COALESCE((SELECT FIRST 1 CASE WHEN A.TAMANHO = 1 THEN MU01 WHEN A.TAMANHO = 2 THEN MU02
                                             WHEN A.TAMANHO = 3 THEN MU03 WHEN A.TAMANHO = 4 THEN MU04
                                             WHEN A.TAMANHO = 5 THEN MU05 WHEN A.TAMANHO = 6 THEN MU06
                                             WHEN A.TAMANHO = 7 THEN MU07 WHEN A.TAMANHO = 8 THEN MU08
                                             WHEN A.TAMANHO = 9 THEN MU09 WHEN A.TAMANHO =10 THEN MU10
                                             WHEN A.TAMANHO =11 THEN MU11 WHEN A.TAMANHO =12 THEN MU12
                                             WHEN A.TAMANHO =13 THEN MU13 WHEN A.TAMANHO =14 THEN MU14
                                             WHEN A.TAMANHO =15 THEN MU15 WHEN A.TAMANHO =16 THEN MU16
                                             WHEN A.TAMANHO =17 THEN MU17 WHEN A.TAMANHO =18 THEN MU18
                                             WHEN A.TAMANHO =19 THEN MU19 WHEN A.TAMANHO =20 THEN MU20 END
                           FROM TBMODELO_PEDIDO_COTA M WHERE M.MODELO_ID = A.MODELO_CODIGO),1) QTD_MULTIPLO,

               COALESCE((SELECT FIRST 1 T.STATUS FROM TBREMESSA_ITEM_TRATAMENTO T
                          WHERE T.ESTABELECIMENTO_ID = P.ESTABELECIMENTO_CODIGO
                            AND T.TABELA_ID = A.PEDIDO AND T.TAB_ITEM_ID = A.CONTROLE
                            AND T.STATUS = '1'),'0') REM_STATUS,
             
               COALESCE((SELECT SUM(G.NECESSIDADE)
                  FROM TBPEDIDO_CONSUMO G
                 WHERE G.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                   AND G.PEDIDO_ID = A.PEDIDO
                   AND G.PEDIDO_ITEM_ID = A.CONTROLE
                   AND G.TAMANHO_ITEM = A.TAMANHO),-1) MP,

                P.ESTABELECIMENTO_CODIGO,
                P.CLASSIFICACAO AS PERFIL_PED,
                P.DATA_ENTREGA AS DATA_AGRUPAMENTO,
                A.CONTROLE AS VPED_ITEM_ID,
                A.PERFIL_COR,
                (SELECT FIRST 1 PF.TRATAMENTO_PEDIDO_MP FROM TBPERFIL PF WHERE PF.TABELA = 'PED' AND PF.ID = P.CLASSIFICACAO) as TRATAMENTO_PEDIDO_MP,
                p.programado

         FROM TBPEDIDO P, TBPEDIDO_ITEM A
        WHERE P.PEDIDO = A.PEDIDO
          AND A.PEDIDO = :PEDIDO
          AND A.SITUACAO = 1
          AND A.TAMANHO > 0
          AND IIF( :PED_ITEM_ID > 0, A.CONTROLE = :PED_ITEM_ID, TRUE)

        INTO :DATA_CLIENTE,
             :DATA_EMISSAO,
             :DATA_PRODUCAO,
             :MODELO_CODIGO,
             :PRODUTO_CODIGO,
             :COR_ID,
             :PERFIL,
             :TAMANHO,
             :QTD_EST,
             :QTD_REM,
             :QTD_AGP,
             :EST_MIN,
             :CAP_PROD_SKU,
             :SALDO,
             :QTD_MINIMO,
             :QTD_MULTIPLO,
             :REM_STATUS,
             :MP,
             :ESTABELECIMENTO_ID,
             :PERFIL_PED,
             :DATA_AGRUPAMENTO,
             :VPED_ITEM_ID,
             :PERFIL_COR,
             :TRATAMENTO_PEDIDO_MP,
             :PROGRAMADO
        DO BEGIN
           IF (NOT QTD_MULTIPLO > 0) THEN
              QTD_MULTIPLO = 1;

           PRODUZIR = SALDO - (QTD_EST + QTD_REM + QTD_AGP);

           /* PEDIDOS DE AMOSTRAS */
           IF (REM_STATUS = '0' AND PRODUZIR > 0 AND EST_MIN = '0' AND TRATAMENTO_PEDIDO_MP = '2') THEN
               BEGIN

               if(PROGRAMADO = '0')then
               begin
                    AGRUPAMENTO_ID = COALESCE((SELECT FIRST 1 A.ID FROM TBAGRUPAMENTO A
                                            WHERE :DATA_AGRUPAMENTO BETWEEN A.DATA_INICIAL AND A.DATA_FINAL
                                              AND A.PERFIL = :PERFIL_PED AND A.STATUS = '1'
                                           ),0);
               end else
               begin
                   AGRUPAMENTO_ID = COALESCE((SELECT FIRST 1 A.ID FROM TBAGRUPAMENTO A
                                            WHERE :DATA_EMISSAO BETWEEN A.DATA_INICIAL AND A.DATA_FINAL
                                              AND A.PERFIL = :PERFIL_PED AND A.STATUS = '1'
                                           ),0);
               end

                IF (AGRUPAMENTO_ID > 0) THEN
                    BEGIN
                    INSERT INTO TBAGRUPAMENTO_PEDIDO (ESTABELECIMENTO_ID, AGRUPAMENTO_ID,
                    TABELA_ID, TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, TIPO,
                    SALDO, PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR)
                    VALUES (:ESTABELECIMENTO_ID, :AGRUPAMENTO_ID,
                    :PEDIDO, :VPED_ITEM_ID, :PRODUTO_CODIGO, :TAMANHO,
                    :PRODUZIR, 'P', :PRODUZIR, :PERFIL, 0, :PERFIL_COR, 0 );
                    END

               END ELSE

           /* PEDIDOS NORMAIS */
           IF (REM_STATUS = '0' AND PRODUZIR >= 0 AND EST_MIN = '0') THEN
               BEGIN

                    IF(CAP_PROD_SKU > 0)THEN
                    BEGIN
    
                        IF (PRODUZIR >= 0) THEN
                        BEGIN
                            select first 1
                                m.conf_agrupamento_id
                            from tbproduto p, tbmodelo m
                            where p.codigo = :PRODUTO_CODIGO
                            and m.codigo = p.modelo_codigo
                            into conf_agrupamento_id;
                    
                            modelo_codigo =  coalesce(modelo_codigo,0);
                            conf_agrupamento_id =  coalesce(conf_agrupamento_id,0);
                    
                            if(conf_agrupamento_id > 0)then
                            begin

                                EXECUTE PROCEDURE SPI_TRATA_PEDIDO_MULT_AGP(
                                     :conf_agrupamento_id,
                                     :PROGRAMADO,
                                     :PEDIDO,
                                     :PED_ITEM_ID,
                                     :DATA_PRODUCAO,
                                     :DATA_CLIENTE,
                                     :DATA_EMISSAO,
                                     :MODELO_CODIGO,
                                     :PRODUTO_CODIGO,
                                     :COR_ID,
                                     :PERFIL,
                                     :TAMANHO,
                                     :QTD_EST,
                                     :QTD_REM,
                                     :QTD_AGP,
                                     :EST_MIN,
                                     :SALDO,
                                     :QTD_MINIMO,
                                     :QTD_MULTIPLO,
                                     :REM_STATUS,
                                     :MP,
                                     :ESTABELECIMENTO_ID,
                                     :PERFIL_PED,
                                     :DATA_AGRUPAMENTO,
                                     :VPED_ITEM_ID,
                                     :PERFIL_COR,
                                     :TRATAMENTO_PEDIDO_MP,
                                     :PRODUZIR,
                                     :CAP_PROD_SKU,
                                     1
                                );
                            end else
                            begin
                                IF (PRODUZIR > 0) THEN
                                BEGIN
                                    EXECUTE PROCEDURE SPI_PEDIDO_AGP_CAP_PROD_SKU(
                                         :PROGRAMADO,
                                         :PEDIDO,
                                         :PED_ITEM_ID,
                                         :DATA_PRODUCAO,
                                         :DATA_CLIENTE,
                                         :DATA_EMISSAO,
                                         :MODELO_CODIGO,
                                         :PRODUTO_CODIGO,
                                         :PERFIL,
                                         :TAMANHO,
                                         :QTD_EST,
                                         :QTD_REM,
                                         :QTD_AGP,
                                         :EST_MIN,
                                         :CAP_PROD_SKU,
                                         :SALDO,
                                         :QTD_MINIMO,
                                         :QTD_MULTIPLO,
                                         :REM_STATUS,
                                         :MP,
                                         :ESTABELECIMENTO_ID,
                                         :PERFIL_PED,
                                         :DATA_AGRUPAMENTO,
                                         :VPED_ITEM_ID,
                                         :PERFIL_COR,
                                         :TRATAMENTO_PEDIDO_MP,
                                         :PRODUZIR
                                    );
                                 end
                            end

                        end
    
                    END ELSE
                    BEGIN

                        IF (PRODUZIR >= 0) THEN
                        BEGIN

                            select first 1
                                m.conf_agrupamento_id
                            from tbproduto p, tbmodelo m
                            where p.codigo = :PRODUTO_CODIGO
                            and m.codigo = p.modelo_codigo
                            into conf_agrupamento_id;
                    
                            modelo_codigo =  coalesce(modelo_codigo,0);
                            conf_agrupamento_id =  coalesce(conf_agrupamento_id,0);
                    
                            if(conf_agrupamento_id > 0)then
                            begin

                                EXECUTE PROCEDURE SPI_TRATA_PEDIDO_MULT_AGP(
                                     :conf_agrupamento_id,
                                     :PROGRAMADO,
                                     :PEDIDO,
                                     :PED_ITEM_ID,
                                     :DATA_PRODUCAO,
                                     :DATA_CLIENTE,
                                     :DATA_EMISSAO,
                                     :MODELO_CODIGO,
                                     :PRODUTO_CODIGO,
                                     :COR_ID,
                                     :PERFIL,
                                     :TAMANHO,
                                     :QTD_EST,
                                     :QTD_REM,
                                     :QTD_AGP,
                                     :EST_MIN,
                                     :SALDO,
                                     :QTD_MINIMO,
                                     :QTD_MULTIPLO,
                                     :REM_STATUS,
                                     :MP,
                                     :ESTABELECIMENTO_ID,
                                     :PERFIL_PED,
                                     :DATA_AGRUPAMENTO,
                                     :VPED_ITEM_ID,
                                     :PERFIL_COR,
                                     :TRATAMENTO_PEDIDO_MP,
                                     :PRODUZIR,
                                     :CAP_PROD_SKU,
                                     2
                                );
                            end else
                            begin
                                IF (PRODUZIR > 0) THEN
                                BEGIN
                                    EXECUTE PROCEDURE SPI_PEDIDO_AGP_TEMPO_PROD_SKU(
                                         :PROGRAMADO,
                                         :PEDIDO,
                                         :PED_ITEM_ID,
                                         :DATA_PRODUCAO,
                                         :DATA_CLIENTE,
                                         :DATA_EMISSAO,
                                         :MODELO_CODIGO,
                                         :PRODUTO_CODIGO,
                                         :COR_ID,
                                         :PERFIL,
                                         :TAMANHO,
                                         :QTD_EST,
                                         :QTD_REM,
                                         :QTD_AGP,
                                         :EST_MIN,
                                         :SALDO,
                                         :QTD_MINIMO,
                                         :QTD_MULTIPLO,
                                         :REM_STATUS,
                                         :MP,
                                         :ESTABELECIMENTO_ID,
                                         :PERFIL_PED,
                                         :DATA_AGRUPAMENTO,
                                         :VPED_ITEM_ID,
                                         :PERFIL_COR,
                                         :TRATAMENTO_PEDIDO_MP,
                                         :PRODUZIR
                                    );
                                end
                            end
                       end

                    END

               END
     END


END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_DESALOCA_AGRUP_PEDIDO2 (
    ESTABELECIMENTO_ID integer,
    TABELA_ID integer,
    TAB_ITEM_ID integer,
    TAMANHO integer)
as
declare variable QUANT numeric(15,4);
declare variable SALDO numeric(15,4);
declare variable CAP_SKU numeric(15,4);
declare variable CAP_COR numeric(15,4);
declare variable PERFIL_SKU varchar(10);
declare variable PERFIL_COR varchar(10);
declare variable AGRUPAMENTO_ID integer;
declare variable ID integer;
declare variable VSALDO_GP numeric(15,4);
declare variable VSALDO_COR numeric(15,4);
declare variable VSALDO_FER numeric(15,4);
declare variable QUANTIDADE1 numeric(15,4);
declare variable NECESSIDADE1 numeric(15,4);
declare variable QUANTIDADE2 numeric(15,4);
declare variable NECESSIDADE2 numeric(15,4);
declare variable QUANTIDADE3 numeric(15,4);
declare variable NECESSIDADE3 numeric(15,4);
declare variable ID1 integer;
declare variable ID2 integer;
declare variable ID3 integer;
BEGIN

FOR

   Select A.Quantidade, A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Sku and P.Tabela = 'SKU'),
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Cor and P.Tabela = 'COR'),
          A.agrupamento_id, A.id
     From TbAgrupamento_Pedido A                     
    Where Estabelecimento_id = :Estabelecimento_Id 
      and tabela_id = :tabela_id
      and tab_item_id = :tab_item_id
      and tamanho = :tamanho
      and Saldo > 0
    Into :Quant, :Saldo, :Perfil_Sku, :Perfil_Cor,
         :Cap_Sku, :Cap_Cor, :agrupamento_id, :id
    Do

    if (:Id > 0) then
        Begin

        if (:Quant = :Saldo) then
            Begin
            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Agrupamento_Id = :Agrupamento_Id
              and Id = :Id
              and Saldo = Quantidade;
            End else
        if (:Saldo > 0) then
            Begin
    
              Update TbAgrupamento_Pedido Set
               Quantidade =  Quantidade - Saldo,
               Necess_Sku = (Quantidade - Saldo)/:Cap_Sku,
               Necess_Cor = (Quantidade - Saldo)/:Cap_Cor,
               Saldo = 0
               Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :Id
                 and Saldo < Quantidade;

              if (:tabela_id > 0) then
                  Begin
                  Update tbpedido_item Set
                   Agp_Dt_Cli = Null,
                   Agp_Dt_Prd = Null
                   Where Estabelecimento_Codigo = :Estabelecimento_Id
                     and Pedido   = :tabela_id
                     and Controle = :tab_item_id
                     and Tamanho  = :Tamanho;
                  End

            --  vSaldo_Cor = :Saldo;
              vSaldo_GP  = :Saldo;
              vSaldo_Fer = :Saldo;
             /*
              if (:vSaldo_Cor > 0) then
                  Begin
                    FOR
                       Select A1.QUANTIDADE, A1.NECESSIDADE, A1.ID
                         From TBAGRUPAMENTO_CARGA_SKU_COR A1
                        Where A1.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A1.AGRUP_PED_ID = :Id
                          and A1.Quantidade > 0
                        Order By A1.Quantidade Desc
                        Into :QUANTIDADE1, :NECESSIDADE1, :ID1
                        Do
                        Begin
                           if (:vSaldo_Cor <= :QUANTIDADE1 and :vSaldo_Cor > 0) Then
                               Begin
                               update tbagrupamento_carga_sku_cor set
                               quantidade = quantidade - :vSaldo_Cor,
                               necessidade = necessidade - (:vSaldo_Cor/:Cap_Cor)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = 0;
                               End else
                           if (:vSaldo_Cor > :QUANTIDADE1) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Cor Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = vSaldo_Cor - :QUANTIDADE1;
                               End
                        End
                  End
               */
              if (:vSaldo_Gp > 0) then
                  Begin
                    FOR
                       Select A2.QUANTIDADE, A2.NECESSIDADE, A2.ID
                         From TBAGRUPAMENTO_CARGA_SKU_GP A2
                        Where A2.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A2.AGRUP_PED_ID = :Id
                          and A2.Quantidade > 0
                        Order By A2.Quantidade Desc
                        Into :QUANTIDADE2, :NECESSIDADE2, :ID2
                        Do
                        Begin
                           if (:vSaldo_Gp <= :QUANTIDADE2 and :vSaldo_Gp > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = Quantidade - :vSaldo_Gp,
                               Necessidade = Necessidade - (:vSaldo_Gp/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = 0;
                               End else
                           if (:vSaldo_Gp > :QUANTIDADE2) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = vSaldo_Gp - :QUANTIDADE2;
                               End
                        End
                  End
    
              if (:vSaldo_Fer > 0) then
                  Begin
                    FOR
                       Select A3.QUANTIDADE, A3.NECESSIDADE, A3.ID
                         From TBAGRUPAMENTO_CARGA_SKU_FER A3
                        Where A3.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A3.AGRUP_PED_ID = :Id
                          and A3.Quantidade > 0
                        Order By A3.Quantidade Desc
                        Into :QUANTIDADE3, :NECESSIDADE3, :ID3
                        Do
                        Begin
                           if (:vSaldo_Fer <= :QUANTIDADE3 and :vSaldo_Fer > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = Quantidade - :vSaldo_Fer,
                               Necessidade = Necessidade - (:vSaldo_Fer/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = 0;
                               End else
                           if (:vSaldo_Fer > :QUANTIDADE3) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = vSaldo_Fer - :QUANTIDADE3;
                               End
                        End
                  End
            End
        End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATA_PEDIDO_REMESSA6 (
    PEDIDO_1 integer,
    ALOCDESALOC char(1))
returns (
    ESTABELECIMENTO_ID integer,
    PEDIDO integer,
    CONTROLE integer,
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer,
    TAMANHO integer,
    PERFIL_SKU varchar(10),
    PERFIL_COR varchar(10),
    REM_STATUS char(1),
    QTD_PRD numeric(15,4),
    REMESSA integer,
    TALAO integer,
    AGRUPAMENTO_ID integer,
    AGRUP_PED_ID integer,
    ID integer,
    QTD_DISP numeric(15,4),
    QTD_MULT integer)
as
declare variable VQTD_PRD integer;
declare variable VQTD_DISP integer;
declare variable ALOC_MULT char(1);
declare variable TIPO_REMESSA varchar(20);
declare variable OUTRO_PRODUTO_ID integer;
declare variable CONF_AGRUPAMENTO_ID integer;
declare variable MODELO_CODIGO integer;
declare variable COR_ID integer;
declare variable QTD_SALDO numeric(15,4);
declare variable PRODUTO_ORIGEM integer;
declare variable TAMANHO_ORIGEM integer;
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

    FOR 
       Select
           A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
           A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,
    
           Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                      Where T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Status = '1'),'0') Rem_Status,
    
           Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                      Where C.Pedido = A.Pedido
                        and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
           -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

           Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                      Where C.Pedido = A.Pedido
                        and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
           -A.Qtd_Est AS QTD_SALDO,
    
           Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                    IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                    IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                    IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                    IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                    IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                    IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                    IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                    IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                    IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                    1))))))))))))))))))))
                       From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult
    
    
      From TbPedido_Item A
     Where Pedido = :Pedido_1
       and Situacao = 1
       and Tamanho > 0
     --For Update
       With Lock
    
    Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
         :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :QTD_SALDO, :Qtd_Mult
    Do begin

    if (:Rem_Status = '0') then
         Begin

          if (:AlocDesaloc = 'D') then
              Begin

                Update tbremessa_item_alocacao Set
                Tabela_Id = 0,
                Tab_Item_Id = 0
                Where Estabelecimento_id = :Estabelecimento_Id
                  and Tabela_id =  :Pedido
                  and Tab_item_id = :Controle
                --and Tipo = 'P'
                  and iif(tipo_remessa = 22595, TAMANHO_ORIGEM = :Tamanho, Tamanho = :Tamanho)
                  and Saldo > 0;
    
                Delete from TbAgrupamento_Pedido 
                Where Estabelecimento_id = :Estabelecimento_Id
                  and Tabela_Id = :Pedido
                  and Tab_Item_Id = :Controle
                  and Saldo = 0
                  and Tipo = 'M';
    
                Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
              End
            
          if (:AlocDesaloc = 'A') then
          Begin
    
           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End
    
           if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End
    
            if (:vQtd_Prd > 0) then
              Begin
    
                /* verifica se tem multiplos agrupamentos*/
                select first 1
                    m.conf_agrupamento_id,
                    m.codigo,
                    p.cor_codigo
                from tbproduto p, tbmodelo m
                where p.codigo = :produto_id
                and m.codigo = p.modelo_codigo
                into conf_agrupamento_id, MODELO_CODIGO, :COR_ID;
    
                conf_agrupamento_id =  coalesce(conf_agrupamento_id,0);
    
                if(conf_agrupamento_id = 0)then
                begin
                  Agrup_Ped_Id = 0;
    
                  For
                    Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo, b.TIPO_REMESSA, b.produto_id as OUTRO_PRODUTO_ID, b.produto_origem, b.tamanho_origem
                    From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                    Where B.Estabelecimento_Id = :Estabelecimento_Id
                    and B.Remessa = R.Numero
                    and B.Localizacao_Id = :Localizacao_Id
                    and B.Tabela_Id = 0
                    and B.TAMANHO = :Tamanho
                    and B.Status = '1'
                    and B.ORIGEM_PRODUTO_ID = :Produto_Id
                    and A.Remessa = B.Remessa
                    and A.Controle = B.Talao
                    and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                    and a.estoque_id = 0
                    and R.ORIGEM <> 22599
                    AND ((A.SITUACAO < 3) OR (R.ORIGEM = 22600 AND A.SITUACAO < 6))
    
                    and A.Data_Expedicao is Null
                    and B.Saldo >= :Qtd_Mult
                    Order By R.Data
    
                    Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp, :TIPO_REMESSA, :OUTRO_PRODUTO_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM
                    Do Begin
                       :PRODUTO_ORIGEM = null;--coalesce(PRODUTO_ORIGEM, Produto_Id);
                       :TAMANHO_ORIGEM = null;--coalesce(TAMANHO_ORIGEM, Tamanho);

                          if (:ID > 0) then
                               Begin
    
                                    vQtd_Disp = :Qtd_Disp;
                                    --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                    if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                        Begin
                                         :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                        End
                
                                    if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                        Begin
                        
                                        IF (:vQtd_Prd < :vQtd_Disp) Then
                                           Begin
                                            if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                                Begin
                                                Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd, QUANTIDADE = QUANTIDADE - :vQtd_Prd
                                                Where Estabelecimento_Id = :Estabelecimento_Id
                                                and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                and Id = :Id;
                
                
                                                if (:Agrup_Ped_Id = 0) then
                                                    Begin
                                                        Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
                
                                                        INSERT INTO TbAgrupamento_Pedido (
                                                        Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                        TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                        SALDO, TIPO, REMESSA,
                                                        PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR, PRODUTO_ORIGINAL, TAMANHO_ORIGINAL) VALUES (
                                                        :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                        :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                        0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                                    End else
                                                    Begin
                                                        UPDATE TbAgrupamento_Pedido SET
                                                        Quantidade = Quantidade + :vQtd_Prd
                                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                                        and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                        and ID = :Agrup_Ped_Id
                                                        and TABELA_ID = :Pedido
                                                        and TAB_ITEM_ID = :Controle
                                                        and Tipo = 'M';
                                                    End
                
                                                Insert into TBREMESSA_ITEM_ALOCACAO (
                                                estabelecimento_id, tabela_id, tab_item_id, tipo,
                                                localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                                Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA, ORIGEM_PRODUTO_ID, PRODUTO_ORIGEM, TAMANHO_ORIGEM)
                                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                                :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Prd,
                                                :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                                End
                
                                            vQtd_Prd = 0;
                
                                            Delete From TbPedido_Consumo
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                              and Pedido_Id = :Pedido
                                              and Pedido_Item_Id = :Controle
                                              and Tamanho_Item = :Tamanho
                                              and Tipo = 'C';
                
                                            --Exit;
                                           End else
                                        IF (:vQtd_Prd >= :vQtd_Disp) Then
                                           Begin
                                            if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                                Begin
                                                DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                                Where Estabelecimento_Id = :Estabelecimento_Id
                                                and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                and Id = :Id;
                
                                                if (:Agrup_Ped_Id = 0) then
                                                    Begin
                                                        Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
                
                                                        INSERT INTO TbAgrupamento_Pedido (
                                                        Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                        TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                        SALDO, TIPO, REMESSA,
                                                        PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR, PRODUTO_ORIGINAL, TAMANHO_ORIGINAL) VALUES (
                                                        :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                        :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                        0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                                    End else
                                                    Begin
                                                        UPDATE TbAgrupamento_Pedido SET
                                                        Quantidade = Quantidade + :vQtd_Disp
                                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                                        and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                        and ID = :Agrup_Ped_Id
                                                        and TABELA_ID = :Pedido
                                                        and TAB_ITEM_ID = :Controle
                                                        and Tipo = 'M';
                                                    End
                
                                                Insert into TBREMESSA_ITEM_ALOCACAO (
                                                estabelecimento_id, tabela_id, tab_item_id, tipo,
                                                localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                                Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA, ORIGEM_PRODUTO_ID, PRODUTO_ORIGEM, TAMANHO_ORIGEM)
                                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                                :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Disp,
                                                :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                                End
                
                                            vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
                
                                            Delete From TbPedido_Consumo
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                              and Pedido_Id = :Pedido
                                              and Pedido_Item_Id = :Controle
                                              and Tamanho_Item = :Tamanho
                                              and Tipo = 'C';
                                           End
                        
                                       End
                                  End
                              End
                        End else
                        begin
                            
                            vQtd_Prd = :QTD_SALDO;

                            if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                            Begin
                                :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
                            End
                            
                            if (:aloc_mult <> '1') Then
                            Begin
                                Qtd_Mult = 1;
                            End
                    
                            if (:vQtd_Prd > 0) then
                            Begin

                                EXECUTE PROCEDURE SPI_TRATA_PEDIDO_MULT_TAL(
                                     :conf_agrupamento_id,
                                     :PEDIDO,
                                     :Controle,
                                     NULL,
                                     :MODELO_CODIGO,
                                     :produto_id,
                                     :COR_ID,
                                     :Perfil_Sku,
                                     :TAMANHO,
                                     :vQtd_Prd,
                                     :qtd_mult,
                                     :ESTABELECIMENTO_ID,
                                     current_date,
                                     :PERFIL_COR,
                                     :vQtd_Prd,
                                     :produto_id,
                                     :TAMANHO
                                );
    
                                --exception "..." 'TRATAMENTO DE PEDIDOS COM MULTIPLOS AGRUPAMENTOS NÃO CONFIGURADO';
                           END
                        end
                    end
               End
         End
     end
End
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATA_PED_ITEM_REMESSA5 (
    PEDIDO_1 integer,
    CONTROLE_1 integer,
    ALOCDESALOC char(1))
returns (
    ESTABELECIMENTO_ID integer,
    PEDIDO integer,
    CONTROLE integer,
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer,
    TAMANHO integer,
    PERFIL_SKU varchar(10),
    PERFIL_COR varchar(10),
    REM_STATUS char(1),
    QTD_PRD numeric(15,4),
    REMESSA integer,
    TALAO integer,
    AGRUPAMENTO_ID integer,
    AGRUP_PED_ID integer,
    ID integer,
    QTD_DISP numeric(15,4),
    QTD_MULT integer,
    ALOC_MULT char(1))
as
declare variable VQTD_PRD integer;
declare variable VQTD_DISP integer;
declare variable TIPO_REMESSA varchar(20);
declare variable OUTRO_PRODUTO_ID integer;
declare variable CONF_AGRUPAMENTO_ID integer;
declare variable MODELO_CODIGO integer;
declare variable COR_ID integer;
declare variable QTD_SALDO numeric(15,4);
declare variable PRODUTO_ORIGEM integer;
declare variable TAMANHO_ORIGEM integer;
BEGIN
    
    FOR
        Select First 1
           A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
           A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

           Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                      Where T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Status = '1'),'0') Rem_Status,

           Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                      Where C.Pedido = A.Pedido
                        and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
           -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem, 

           Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                      Where C.Pedido = A.Pedido
                        and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
           -A.Qtd_Est AS QTD_SALDO,

          Coalesce((Select First 1  IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                    IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                    IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                    IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                    IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                    IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                    IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                    IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                    IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                    IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                    1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult,

                  (Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                     From TbPedido P, TbPerfil PF
                    Where P.Pedido = A.Pedido
                      and P.Classificacao = PF.Id
                      and PF.Tabela = 'PED') aloc_mult

        From TbPedido_Item A
    Where Pedido = :Pedido_1
        and Controle = :Controle_1
        and Situacao = 1
        and Tamanho > 0
    With Lock

    Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
         :Tamanho, :Perfil_Sku, :Perfil_Cor, :Rem_Status, :Qtd_Prd, :QTD_SALDO, :qtd_mult, :aloc_mult

    Do BEGIN
    if (:Rem_Status = '0') then
    Begin
    
          if (:AlocDesaloc = 'D') then
              Begin
                Update tbremessa_item_alocacao Set
                Tabela_Id = 0,
                Tab_Item_Id = 0
                Where Estabelecimento_id = :Estabelecimento_Id
                  and Tabela_id =  :Pedido
                  and Tab_item_id = :Controle
                --and Tipo = 'P'
                  and iif(tipo_remessa = '22595', TAMANHO_ORIGEM = :Tamanho, Tamanho = :Tamanho)
                  and Saldo > 0;
    
                Delete from TbAgrupamento_Pedido 
                Where Estabelecimento_id = :Estabelecimento_Id
                  and Tabela_Id = :Pedido
                  and Tab_Item_Id = :Controle
                  and Saldo = 0
                  and Tipo = 'M';
    
                Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
              End
            
        if (:AlocDesaloc = 'A') then
        Begin
        
            vQtd_Prd = Trunc(:Qtd_Prd);
            
            if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End
            
            if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End
            
            if (:vQtd_Prd > 0) then
              Begin
            
                /* verifica se tem multiplos agrupamentos*/
                select first 1
                    m.conf_agrupamento_id,
                    m.codigo,
                    p.cor_codigo
                from tbproduto p, tbmodelo m
                where p.codigo = :produto_id
                and m.codigo = p.modelo_codigo
                into conf_agrupamento_id, MODELO_CODIGO, :COR_ID;
    
                conf_agrupamento_id =  coalesce(conf_agrupamento_id,0);
    
                if(conf_agrupamento_id = 0)then
                begin

                    Agrup_Ped_Id = 0;
                    
                    For
                        Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo, b.TIPO_REMESSA, b.produto_id as OUTRO_PRODUTO_ID, b.produto_origem, b.tamanho_origem
                        From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                        Where B.Estabelecimento_Id = :Estabelecimento_Id
                        and B.Remessa = R.Numero
                        and B.Localizacao_Id = :Localizacao_Id
                        and B.Tabela_Id = 0
                        and B.TAMANHO = :Tamanho
                        and B.Status = '1'
                        and B.ORIGEM_PRODUTO_ID = :Produto_Id
                        and A.Remessa = B.Remessa
                        and A.Controle = B.Talao
                        and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                        
                        and a.estoque_id = 0
                        and R.ORIGEM <> 22599
                        AND ((A.SITUACAO < 3) OR
                        (R.ORIGEM = 22600 AND A.SITUACAO < 6))
                        
                        and A.Data_Expedicao is Null
                        and B.Saldo >= :Qtd_Mult
                        Order By R.Data
                    Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp, :TIPO_REMESSA, :OUTRO_PRODUTO_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM
                    Do Begin
                       :PRODUTO_ORIGEM = 0;--coalesce(PRODUTO_ORIGEM, Produto_Id);
                       :TAMANHO_ORIGEM = 0;--coalesce(TAMANHO_ORIGEM, Tamanho);
                    
                        if (:Id > 0) then
                        Begin
                        
                            vQtd_Disp = :Qtd_Disp;
                            --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                            if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                Begin
                                 :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                End
                        
                            if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                Begin
                        
                                IF (:vQtd_Prd < :vQtd_Disp) Then
                                   Begin
                        
                                    if (:AGRUPAMENTO_ID > 0) Then -- and :Tratamento_Pedido = '2') then
                                        Begin
                                        Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd, QUANTIDADE = QUANTIDADE - :vQtd_Prd
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                        and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                        and Id = :Id;
                        
                                        if (:Agrup_Ped_Id = 0) then
                                            Begin
                                                Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
                        
                                                INSERT INTO TbAgrupamento_Pedido (
                                                Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                SALDO, TIPO, REMESSA,
                                                PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR, PRODUTO_ORIGINAL, TAMANHO_ORIGINAL) VALUES (
                                                :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                            End else
                                            Begin
                                                UPDATE TbAgrupamento_Pedido SET
                                                Quantidade = Quantidade + :vQtd_Prd
                                                Where Estabelecimento_Id = :Estabelecimento_Id
                                                and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                and ID = :Agrup_Ped_Id
                                                and TABELA_ID = :Pedido
                                                and TAB_ITEM_ID = :Controle
                                                and Tipo = 'M';
                                            End
                        
                                        Insert into TBREMESSA_ITEM_ALOCACAO (
                                        estabelecimento_id, tabela_id, tab_item_id, tipo,
                                        localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                        Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA, ORIGEM_PRODUTO_ID, PRODUTO_ORIGEM, TAMANHO_ORIGEM)
                                        values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                        :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Prd,
                                        :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                        End
                        
                                    :vQtd_Prd = 0;
                        
                                    Delete From TbPedido_Consumo
                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                      and Pedido_Id = :Pedido
                                      and Pedido_Item_Id = :Controle
                                      and Tamanho_Item = :Tamanho
                                      and Tipo = 'C';
                        
                                   End else
                                IF (:vQtd_Prd >= :vQtd_Disp) Then
                                   Begin
                        
                                    if (:AGRUPAMENTO_ID > 0) Then 
                                        Begin
                                        DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                        and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                        and Id = :Id;
                        
                                        if (:Agrup_Ped_Id = 0) then
                                            Begin
                                                Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
                        
                                                INSERT INTO TbAgrupamento_Pedido (
                                                Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                SALDO, TIPO, REMESSA,
                                                PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR, PRODUTO_ORIGINAL, TAMANHO_ORIGINAL) VALUES (
                                                :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                            End else
                                            Begin
                                                UPDATE TbAgrupamento_Pedido SET
                                                Quantidade = Quantidade + :vQtd_Disp
                                                Where Estabelecimento_Id = :Estabelecimento_Id
                                                and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                and ID = :Agrup_Ped_Id
                                                and TABELA_ID = :Pedido
                                                and TAB_ITEM_ID = :Controle
                                                and Tipo = 'M';
                                            End
                        
                                        Insert into TBREMESSA_ITEM_ALOCACAO (
                                        estabelecimento_id, tabela_id, tab_item_id, tipo,
                                        localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                        Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA, ORIGEM_PRODUTO_ID, PRODUTO_ORIGEM, TAMANHO_ORIGEM)
                                        values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                        :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Disp,
                                        :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                        End
                        
                                    :vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
                        
                                    Delete From TbPedido_Consumo
                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                      and Pedido_Id = :Pedido
                                      and Pedido_Item_Id = :Controle
                                      and Tamanho_Item = :Tamanho
                                      and Tipo = 'C';
                                   End
                        
                               End
                            End
                        End
                    End ELSE
                    BEGIN

                        vQtd_Prd = :QTD_SALDO;

                        if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                        Begin
                            :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
                        End
                        
                        if (:aloc_mult <> '1') Then
                        Begin
                            Qtd_Mult = 1;
                        End
                
                        if (:vQtd_Prd > 0) then
                        Begin

                            EXECUTE PROCEDURE SPI_TRATA_PEDIDO_MULT_TAL(
                                 :conf_agrupamento_id,
                                 :PEDIDO,
                                 :Controle,
                                 NULL,
                                 :MODELO_CODIGO,
                                 :produto_id,
                                 :COR_ID,
                                 :Perfil_Sku,
                                 :TAMANHO,
                                 :vQtd_Prd,
                                 :qtd_mult,
                                 :ESTABELECIMENTO_ID,
                                 current_date,
                                 :PERFIL_COR,
                                 :vQtd_Prd,
                                 :produto_id,
                                 :TAMANHO
                            );

                            --exception "..." 'TRATAMENTO DE PEDIDOS COM MULTIPLOS AGRUPAMENTOS NÃO CONFIGURADO';
                        END
                    END
                END
            End
        End
    End
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPI_ALOCAR_PEDIDO_TALAO (
    TALAO_DETALHE_ID integer,
    QUANTIDADE integer,
    AGP_ITEM_ID integer)
returns (
    SALDO_ALOCACAO integer,
    SALDO_ALOCAR integer)
as
declare variable REMESSA_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable PERFIL_SKU varchar(10);
declare variable PRODUTO_ID integer;
declare variable TTAMANHO integer;
declare variable AGRUP_PED_ID integer;
declare variable ID integer;
declare variable PEDIDO_ID integer;
declare variable PEDIDO_ITEM_ID integer;
declare variable AGRUPAMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable QUANTIDADE_ALOCAR integer;
declare variable PERFIL_COR varchar(10);
declare variable TIPO_REMESSA varchar(10);
declare variable PRODUTO_ORIGEM_ID integer;
declare variable OID integer;
declare variable QUANTIDADE_ALOC_PED integer;
declare variable TIPO varchar(10);
declare variable GP_ID integer;
declare variable UP_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable TOTALTEMPO numeric(18,8);
declare variable PRODUTO_ORIGEM integer;
declare variable TAMANHO_ORIGEM integer;
declare variable PECA_CONJUNTO_SEQ integer;
declare variable CONJUNTO_PECA_ID integer;
declare variable CONJUNTO_MODELO_PAI integer;
begin

    SALDO_ALOCACAO = :QUANTIDADE;
    SALDO_ALOCAR   = :QUANTIDADE;

    select
        P.controle AS id,
        p.remessa,
        p.estabelecimento_codigo,
        P.localizacao_codigo,
        p.perfil,
        coalesce((select first 1 C.perfil FROM tbcor C WHERE C.codigo = P.cor_id),0) PERFIL_COR,
        p.produto_codigo,
        p.tamanho,
        p.produto_origem,
        p.tamanho_origem,
        p.peca_conjunto_seq
    from tbpedido_item_processado p
    where p.controle = :TALAO_DETALHE_ID
    INTO
        ID,
        REMESSA_ID,
        ESTABELECIMENTO_ID,
        LOCALIZACAO_ID,
        PERFIL_SKU,
        PERFIL_COR,
        PRODUTO_ID,
        TAMANHO,
        PRODUTO_ORIGEM,
        TAMANHO_ORIGEM,
        PECA_CONJUNTO_SEQ;

    select
        J.ID,
        J.PRODUTO_ORIGEM,
        J.AGRUPAMENTO_ID,
        J.TABELA_ID,
        J.TAB_ITEM_ID,
        J.SALDO,
        J.TIPO as TIPO,
        '22595' as TIPO_REMESSA,
        j.conjunto_peca_id,
        j.conjunto_modelo_pai
    FROM TBAGRUPAMENTO_PEDIDO J
    WHERE J.ID = :AGP_ITEM_ID
    and j.saldo > 0
    INTO
        OID,
        PRODUTO_ORIGEM_ID,
        AGRUPAMENTO_ID,
        PEDIDO_ID,
        PEDIDO_ITEM_ID,
        QUANTIDADE_ALOC_PED,
        TIPO,
        TIPO_REMESSA,
        CONJUNTO_PECA_ID,
        CONJUNTO_MODELO_PAI;

    QUANTIDADE_ALOC_PED = coalesce(QUANTIDADE_ALOC_PED,0);
    
    IF(SALDO_ALOCACAO > QUANTIDADE_ALOC_PED)THEN
    BEGIN
        QUANTIDADE_ALOCAR = QUANTIDADE_ALOC_PED;
        SALDO_ALOCACAO = SALDO_ALOCACAO - QUANTIDADE_ALOC_PED;
    END ELSE
    BEGIN
        QUANTIDADE_ALOCAR = SALDO_ALOCACAO;
        SALDO_ALOCACAO = 0;
    END

    AGRUP_PED_ID = coalesce((SELECT FIRST 1 K.ID FROM TBAGRUPAMENTO_PEDIDO K WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                AND AGRUPAMENTO_ID  = :AGRUPAMENTO_ID
                                AND TABELA_ID       = :PEDIDO_ID
                                AND TAB_ITEM_ID     = :PEDIDO_ITEM_ID
                                AND TIPO            = 'M'),0);

    IF(ID > 0 AND PEDIDO_ID > 0 AND QUANTIDADE_ALOCAR > 0)THEN
    BEGIN

        IF(AGRUP_PED_ID = 0)THEN
        BEGIN
            AGRUP_PED_ID = gen_id(gtbagrupamento_pedido,1);
    
            INSERT INTO TBAGRUPAMENTO_PEDIDO (
                ESTABELECIMENTO_ID, AGRUPAMENTO_ID, ID, TABELA_ID,
                TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                SALDO, TIPO, REMESSA, PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR, PRODUTO_ORIGINAL, TAMANHO_ORIGINAL
            ) VALUES (
                :ESTABELECIMENTO_ID, :AGRUPAMENTO_ID, :AGRUP_PED_ID,
                :PEDIDO_ID, :PEDIDO_ITEM_ID, :PRODUTO_ID, :TAMANHO, :QUANTIDADE_ALOCAR,
                0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM
            );
        END ELSE
        BEGIN
            UPDATE TBAGRUPAMENTO_PEDIDO SET QUANTIDADE = QUANTIDADE + :QUANTIDADE_ALOCAR
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
            AND AGRUPAMENTO_ID  = :AGRUPAMENTO_ID
            AND ID              = :AGRUP_PED_ID
            AND TABELA_ID       = :PEDIDO_ID
            AND TAB_ITEM_ID     = :PEDIDO_ITEM_ID
            AND TIPO            = 'M';
        END
    
        INSERT INTO TBREMESSA_ITEM_ALOCACAO (
            ESTABELECIMENTO_ID, TABELA_ID, TAB_ITEM_ID, TIPO,
            LOCALIZACAO_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, SALDO,
            REMESSA, TALAO, AGRUPAMENTO_ID, AGRUP_PED_ID, TIPO_REMESSA, ORIGEM_PRODUTO_ID, PRODUTO_ORIGEM, TAMANHO_ORIGEM, CONJUNTO_PECA_ID, CONJUNTO_MODELO_PAI
        ) VALUES (
            :ESTABELECIMENTO_ID, :PEDIDO_ID, :PEDIDO_ITEM_ID, :TIPO,
            :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO, :QUANTIDADE_ALOCAR,
            :QUANTIDADE_ALOCAR, :REMESSA_ID, :TALAO_DETALHE_ID, :AGRUPAMENTO_ID, :AGRUP_PED_ID, :TIPO_REMESSA, :PRODUTO_ORIGEM_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM, :CONJUNTO_PECA_ID, :CONJUNTO_MODELO_PAI
        );

        /* ----------------------------------------- */
        select first 1
            u.programacao_esteira,
            u.setor_codigo,
            u.modelo_codigo,
            p.cor_codigo,
            u.tamanho
         from tbpedido_item_processado u, tbproduto p, tbprogramacao s
         where u.controle = :TALAO_DETALHE_ID
             and p.codigo = u.produto_codigo
             and s.tipo = 'D'
             and s.tabela_id = u.controle
             and s.remessa_id = u.remessa
         into GP_ID, UP_ID, MODELO_ID, COR_ID, tTAMANHO;

         select
            s.TOTAL
         from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :tTAMANHO, :QUANTIDADE_ALOCAR) s
         into :TOTALTEMPO;

         TOTALTEMPO = coalesce(TOTALTEMPO,0);

         if(TOTALTEMPO = 0)then
         begin
            exception "..." 'TEMPO DO MODELO NAO FOI ENCONTRADO, MODELO:'||MODELO_ID||', COR:'||COR_ID||', TAMANHO:'||tTAMANHO;
         end

         UPDATE TBAGRUPAMENTO_CARGA_SKU_UP A SET a.quantidade = a.quantidade - :QUANTIDADE_ALOCAR, a.necessidade = iif((a.necessidade - :TOTALTEMPO) >= 0, (a.necessidade - :TOTALTEMPO), 0)
          WHERE AGRUPAMENTO_ID = :AGRUPAMENTO_ID
            AND AGRUP_PED_ID = :AGP_ITEM_ID
            and TIPO = 1;
         /* ----------------------------------------- */

         UPDATE TBAGRUPAMENTO_PEDIDO J SET j.quantidade = j.quantidade - :QUANTIDADE_ALOCAR, J.SALDO = J.SALDO - :QUANTIDADE_ALOCAR WHERE J.ID = :AGP_ITEM_ID;
         UPDATE TBPEDIDO_ITEM_PROCESSADO P SET P.AGRUPAMENTO_ID = :AGRUPAMENTO_ID WHERE P.CONTROLE = :TALAO_DETALHE_ID;

    END ELSE
    BEGIN
       --exception "..." 'ERRO AO ALOCAR TALAO, AGP:'||AGP_ITEM_ID||', QTD:'||QUANTIDADE;
    END

    SALDO_ALOCAR = SALDO_ALOCAR - SALDO_ALOCACAO;

    suspend;
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPI_TRATA_PEDIDO_MULT_TAL (
    CONF_AGRUPAMENTO_ID integer,
    PEDIDO integer,
    PED_ITEM_ID integer,
    DATA_PRODUCAO date,
    MODELO_CODIGO integer,
    PRODUTO_CODIGO integer,
    COR_ID integer,
    PERFIL varchar(10),
    TAMANHO integer,
    SALDO numeric(18,4),
    QTD_MULTIPLO integer,
    ESTABELECIMENTO_ID integer,
    DATA_AGRUPAMENTO date,
    PERFIL_COR varchar(10),
    PRODUZIR numeric(18,4),
    PRODUTO_ORIGEM integer,
    TAMANHO_ORIGEM integer)
as
declare variable OLD_TIPO_AGP varchar(10);
declare variable DESALOCAR_ITENS integer;
declare variable SUB_TIPO_GP integer;
declare variable ORDEM_AGP integer;
declare variable OPERFIL varchar(10);
declare variable OPRODUTO_CODIGO integer;
declare variable OCOR_ID integer;
declare variable ODATA_PRODUCAO date;
declare variable ODATA_AGRUPAMENTO date;
declare variable ALOCADO integer;
declare variable TIPO_AGP varchar(10);
declare variable GP_AGRUPAMENTO_ID integer;
declare variable SALDO_ALOCACAO integer;
declare variable TALAO_DETALHE_ID integer;
declare variable REMESSA_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable PERFIL_SKU varchar(10);
declare variable QUANTIDADE_ALOC_PED integer;
declare variable QUANTIDADE_ALOCAR integer;
declare variable AGRUPAMENTO_ID integer;
declare variable AGRUP_PED_ID integer;
declare variable TIPO_REMESSA varchar(10);
declare variable OPERFIL_COR varchar(10);
declare variable TIPO_DATA integer;
declare variable QTD_AGP integer;
declare variable PRODUTO_ORIGEM_ID integer;
declare variable GP_ID integer;
declare variable UP_ID integer;
declare variable MODELO_ID integer;
declare variable TTAMANHO integer;
declare variable TOTALTEMPO numeric(15,4);
declare variable AGP_ITEM_ID integer;
declare variable QTD_REM integer;
declare variable CONJUNTO_PECA_ID integer;
declare variable TAMANHO_ORIGINAL integer;
declare variable PRODUTO_ORIGINAL integer;
declare variable MODELO_ORIGINAL integer;
declare variable PERFIL_ORIGINAL varchar(10);
declare variable CONJUNTO_MODELO_PAI integer;
declare variable FATOR_CONVERSAO numeric(15,4);
declare variable TPRINCIPAL integer;
declare variable PRINCIPAL integer;
begin

    OLD_TIPO_AGP = '';
    DESALOCAR_ITENS = 0;
    TIPO_REMESSA = '22595';
    PRODUTO_ORIGEM_ID = :PRODUTO_CODIGO;

    --exception "..." TAMANHO_ORIGEM;

    TAMANHO_ORIGINAL = TAMANHO;
    PRODUTO_ORIGINAL = PRODUTO_CODIGO;
    MODELO_ORIGINAL  = MODELO_CODIGO;
    PERFIL_ORIGINAL  = PERFIL;

    for
        select
            h.PECA_ID,
            h.MODELO_PAI_ID,
            h.modelo_id,
            h.PRODUTO_ID,
            h.FATOR_CONVERSAO,
            h.TAMANHO,
            h.PERFIL_SKU,
            0 as PRINCIPAL
        from SPC_CONJUNTO(:MODELO_CODIGO, :COR_ID, :TAMANHO) h

        union all

        select
            0 PECA_ID,
            0 MODELO_PAI_ID,
            :MODELO_CODIGO modelo_id,
            :PRODUTO_CODIGO PRODUTO_ID,
            1 FATOR_CONVERSAO,
            :TAMANHO TAMANHO,
            :PERFIL PERFIL_SKU,
            1 as PRINCIPAL
       from RDB$DATABASE

    into
        CONJUNTO_PECA_ID,
        CONJUNTO_MODELO_PAI,
        MODELO_CODIGO,
        PRODUTO_CODIGO,
        FATOR_CONVERSAO,
        TAMANHO,
        PERFIL,
        TPRINCIPAL
    do begin

        for
            select
                g.gp_id, 
                g.principal,
                iif(g.principal = 1, 'P', h.tipo_agrupamento) as tipo_agrupamento,
                h.sub_tipo_gp,
                g.ordem
            from TBCONFI_ALOCACAO_MODELO_ITENS g, tbesteira h
            where g.confi_alocacao_id = :conf_agrupamento_id
            and h.codigo = g.gp_id
            order by ordem
        into
            :GP_AGRUPAMENTO_ID,
            :PRINCIPAL,
            :TIPO_AGP,
            :SUB_TIPO_GP,
            :ORDEM_AGP
        do begin
    
            if(TPRINCIPAL = PRINCIPAL)then
            begin

                if(PRINCIPAL = 1)then
                begin
                    TAMANHO         = TAMANHO_ORIGINAL;
                    PRODUTO_CODIGO  = PRODUTO_ORIGINAL;
                    MODELO_CODIGO   = MODELO_ORIGINAL;
                    PERFIL          = PERFIL_ORIGINAL;
                end

                :OPERFIL            = PERFIL;
                :OPERFIL_COR        = PERFIL_COR;
                :OPRODUTO_CODIGO    = PRODUTO_CODIGO;
                :OCOR_ID            = COR_ID;
                :ODATA_PRODUCAO     = DATA_PRODUCAO;
                :ODATA_AGRUPAMENTO  = DATA_AGRUPAMENTO;
    
                if(SUB_TIPO_GP = 8)then
                begin
    
                    select
                        (select first 1 B.perfil FROM tbmodelo_bloqueio B WHERE B.modelo_id = P.modelo_codigo AND B.cor_id = P.cor_codigo) AS PERFIL,
                        (select first 1 C.perfil FROM tbcor C WHERE C.codigo = P.cor_codigo) AS PERFIL_COR,
                        p.cor_codigo
                    from tbmodelo m, tbgrupo_modelo j, tbmodelo m2, tbproduto p
                    where m.codigo = :MODELO_CODIGO
                    and j.id = m.grupo_id
                    and m2.codigo = j.modelo_id
                    and p.modelo_codigo = m2.codigo
                    and p.cor_codigo = fn_parametro('SISTEMA.COR_TECELAGEM_SEAMLESS')
                    into :OPERFIL, :OPERFIL_COR, :OCOR_ID;
    
                    if(coalesce(:OCOR_ID,0) = 0)then
                    begin                               
                        exception "..." 'COR DO GRUPO DE FIO (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                    if(coalesce(:OPERFIL,'') = '')then
                    begin                               
                        exception "..." 'PERFIL DO GRUPO DE FIO NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                end
    
                if(SUB_TIPO_GP = 9)then
                begin
                    :OPRODUTO_CODIGO = 0;
    
                    select  
                        (select first 1 B.perfil FROM tbmodelo_bloqueio B WHERE B.modelo_id = P.modelo_codigo AND B.cor_id = P.cor_codigo AND B.tamanho = :tamanho) AS PERFIL,
                        (select first 1 C.perfil FROM tbcor C WHERE C.codigo = P.cor_codigo) AS PERFIL_COR,
                        p.codigo,
                        p.cor_codigo
                    from tbproduto p
                    where p.modelo_codigo = :MODELO_CODIGO
                    and p.cor_codigo = fn_parametro('SISTEMA.COR_TECELAGEM_SEAMLESS')
                    into :OPERFIL, :OPERFIL_COR, :OPRODUTO_CODIGO, :OCOR_ID;
    
                    if(coalesce(:OPRODUTO_CODIGO,0) = 0)then
                    begin                               
                        exception "..." 'COR TECELAGEM (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                    if(coalesce(:OPERFIL,'') = '')then
                    begin                               
                        exception "..." 'PERFIL DA COR TECELAGEM (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                end
    
                --exception "..." 'TIPO:'||TIPO_AGP||', PEDIDO:'||PEDIDO||', PRODUTO:'||OPRODUTO_CODIGO||', TAMANHO:'||TAMANHO;
    
                QTD_AGP  = coalesce((select
                                        sum(p.quantidade)
                                     from tbagrupamento_pedido p
                                     where p.tipo = :TIPO_AGP
                                     and p.tabela_id = :PEDIDO
                                     and p.produto_id = :OPRODUTO_CODIGO
                                     and p.tab_item_id = :PED_ITEM_ID
                                     and p.tamanho = :TAMANHO 
                                     and p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI
                                     and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                            ),0);
    
                QTD_REM  = coalesce((select
                                        sum(p.quantidade)
                                     from TbRemessa_Item_Alocacao p
                                     where p.tipo = :TIPO_AGP
                                     and p.tabela_id = :PEDIDO
                                     and p.tab_item_id = :PED_ITEM_ID
                                     and p.produto_id = :OPRODUTO_CODIGO
                                     and p.tamanho = :TAMANHO 
                                     and p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI
                                     and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                            ),0);
    
                PRODUZIR = SALDO - (QTD_REM + QTD_AGP);
                TIPO_DATA = 0;

    
                if(ORDEM_AGP > 1)then
                begin
                    :TIPO_DATA = 1;
                    :ODATA_PRODUCAO = (select
                                            max(a.data_inicial)
                                         from TbRemessa_Item_Alocacao p, tbagrupamento a
                                         where p.tipo = :OLD_TIPO_AGP
                                         and p.tabela_id = :PEDIDO
                                         and p.produto_origem = :produto_original
                                         and p.tamanho_origem = :tamanho_original
                                         and a.id = p.agrupamento_id
                                         and iif(:PRINCIPAL = 1, true,
                                            p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                                         )
                                      );
    
                    :ODATA_AGRUPAMENTO = ODATA_PRODUCAO;
    
                    if(ODATA_PRODUCAO is null)then
                    begin
                        PRODUZIR = 0;
                    end
                end
    
                PRODUZIR = FN_INT_ROUND_UP(PRODUZIR * FATOR_CONVERSAO);

                IF (PRODUZIR > 0) THEN
                BEGIN
                    SALDO_ALOCACAO = :PRODUZIR;

                    For
                        Select
                            a.agrupamento_id,
                            A.controle AS id,
                            A.remessa,
                            A.estabelecimento_codigo,
                            A.localizacao_codigo,
                            A.perfil,
                            coalesce((select first 1 J.perfil FROM tbcor J WHERE J.codigo = A.cor_id),0) PERFIL_COR,
                            A.tamanho,
                            b.saldo
                        From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R, tbagrupamento C
                        Where B.Remessa = R.Numero
                            and B.Tabela_Id = 0
                            and B.tamanho = :TAMANHO
                            and B.Status = '1'
                            and B.produto_id = :OPRODUTO_CODIGO
                            and A.Remessa = B.Remessa
                            and A.Controle = B.Talao
                            and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                            AND C.id = B.agrupamento_id
                            AND C.gp_id = :GP_AGRUPAMENTO_ID
                            and a.estoque_id = 0
                            and R.ORIGEM = 22595
                            AND A.SITUACAO < 6
                            and iif(:TIPO_AGP = 'P', A.Data_Expedicao is Null, true)
                            and B.Saldo >= :QTD_MULTIPLO
                            AND :ODATA_AGRUPAMENTO between C.data_inicial and c.data_final
    
                        Order By R.Data
                    INTO
                        AGRUPAMENTO_ID,
                        TALAO_DETALHE_ID,
                        REMESSA_ID,
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        PERFIL_SKU,
                        PERFIL_COR,
                        TAMANHO,
                        QUANTIDADE_ALOC_PED
                    Do
                    Begin
    
                        IF(SALDO_ALOCACAO > QUANTIDADE_ALOC_PED)THEN
                        BEGIN
                            QUANTIDADE_ALOCAR = QUANTIDADE_ALOC_PED;
                            SALDO_ALOCACAO = SALDO_ALOCACAO - QUANTIDADE_ALOC_PED;
                        END ELSE
                        BEGIN
                            QUANTIDADE_ALOCAR = SALDO_ALOCACAO;
                            SALDO_ALOCACAO = 0;
                        END
                    
                        AGRUP_PED_ID = coalesce((SELECT FIRST 1 K.ID FROM TBAGRUPAMENTO_PEDIDO K WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                                    AND AGRUPAMENTO_ID  = :AGRUPAMENTO_ID
                                                    AND TABELA_ID       = :PEDIDO
                                                    AND TAB_ITEM_ID     = :PED_ITEM_ID
                                                    AND TIPO            = 'M'),0);
                    
                        IF(TALAO_DETALHE_ID > 0 AND PEDIDO > 0 AND QUANTIDADE_ALOCAR > 0)THEN
                        BEGIN
                    
                            IF(AGRUP_PED_ID = 0)THEN
                            BEGIN
                                AGRUP_PED_ID = gen_id(gtbagrupamento_pedido,1);
                        
                                INSERT INTO TBAGRUPAMENTO_PEDIDO (
                                    ESTABELECIMENTO_ID, AGRUPAMENTO_ID, ID, TABELA_ID,
                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                    SALDO, TIPO, REMESSA, PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR, PRODUTO_ORIGINAL, TAMANHO_ORIGINAL, CONJUNTO_PECA_ID
                                ) VALUES (
                                    :ESTABELECIMENTO_ID, :AGRUPAMENTO_ID, :AGRUP_PED_ID,
                                    :PEDIDO, :PED_ITEM_ID, :OPRODUTO_CODIGO, :TAMANHO, :QUANTIDADE_ALOCAR,
                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM, :CONJUNTO_PECA_ID
                                );
                            END ELSE
                            BEGIN
                                UPDATE TBAGRUPAMENTO_PEDIDO SET QUANTIDADE = QUANTIDADE + :QUANTIDADE_ALOCAR
                                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                AND AGRUPAMENTO_ID  = :AGRUPAMENTO_ID
                                AND ID              = :AGRUP_PED_ID
                                AND TABELA_ID       = :PEDIDO
                                AND TAB_ITEM_ID     = :PED_ITEM_ID
                                AND TIPO            = 'M';
                            END
                        
                            INSERT INTO TBREMESSA_ITEM_ALOCACAO (
                                ESTABELECIMENTO_ID, TABELA_ID, TAB_ITEM_ID, TIPO,
                                LOCALIZACAO_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, SALDO,
                                REMESSA, TALAO, AGRUPAMENTO_ID, AGRUP_PED_ID, TIPO_REMESSA, ORIGEM_PRODUTO_ID, PRODUTO_ORIGEM, TAMANHO_ORIGEM, CONJUNTO_PECA_ID
                            ) VALUES (
                                :ESTABELECIMENTO_ID, :PEDIDO, :PED_ITEM_ID, :TIPO_AGP,
                                :LOCALIZACAO_ID, :OPRODUTO_CODIGO, :TAMANHO, :QUANTIDADE_ALOCAR,
                                :QUANTIDADE_ALOCAR, :REMESSA_ID, :TALAO_DETALHE_ID, :AGRUPAMENTO_ID, :AGRUP_PED_ID, :TIPO_REMESSA, :PRODUTO_ORIGEM_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM, :CONJUNTO_PECA_ID
                            );
    
                            /* -------------------------------------------------------------------------------- */
                            SELECT first 1
                                P.modelo_codigo,
                                P.cor_codigo
                            FROM TBPRODUTO P WHERE P.codigo = :OPRODUTO_CODIGO
                            INTO MODELO_ID, COR_ID;
    
                            select
                                s.TOTAL
                            from SPC_TEMPO_GP_CONJUNTO(:GP_AGRUPAMENTO_ID, :MODELO_ID, :COR_ID, :TAMANHO, :QUANTIDADE_ALOCAR) s
                            into :TOTALTEMPO;
                            
                            TOTALTEMPO = coalesce(TOTALTEMPO,0);
                            
                            if(TOTALTEMPO = 0)then
                            begin
                                exception "..." 'TEMPO DO MODELO NAO FOI ENCONTRADO, MODELO:'||MODELO_ID||', COR:'||COR_ID||', TAMANHO:'||TAMANHO;
                            end
                            
                            UPDATE TBAGRUPAMENTO_CARGA_SKU_UP A SET a.quantidade = a.quantidade - :QUANTIDADE_ALOCAR, a.necessidade = a.necessidade - :TOTALTEMPO
                            WHERE AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                            AND AGRUP_PED_ID = :AGP_ITEM_ID
                            and TIPO = 2;
                            /* -------------------------------------------------------------------------------- */
    
                        END
                    END
                END
            end

            OLD_TIPO_AGP = :TIPO_AGP;
        end
    end


    /*
    if (DESALOCAR_ITENS = 1) then
    BEGIN
        delete from TBREMESSA_ITEM_ALOCACAO p
        where p.tabela_id = :PEDIDO
        and p.tab_item_id = :PED_ITEM_ID
        and p.origem_produto_id = :PRODUTO_ORIGEM_ID
        and p.tamanho = :TAMANHO;
    END else
    begin
       for
        select
            t.agrupamento_id,
            t.id,
            u.programacao_esteira,
            u.setor_codigo,
            u.modelo_codigo,
            p.cor_codigo,
            u.tamanho,
            t.saldo
         from tbpedido_item_processado u, tbproduto p, tbprogramacao s, TBREMESSA_ITEM_ALOCACAO t
         where u.controle = t.talao
             and p.codigo = u.produto_codigo
             and s.tipo = 'D'
             and s.tabela_id = u.controle
             and s.remessa_id = u.remessa
             and t.tabela_id = :PEDIDO
             and t.tab_item_id = :PED_ITEM_ID
             and t.origem_produto_id = :PRODUTO_ORIGEM_ID
             and t.tamanho = :TAMANHO
             and t.saldo > 0
             and t.REMESSA = u.remessa
         into AGRUPAMENTO_ID, AGP_ITEM_ID, GP_ID, UP_ID, MODELO_ID, COR_ID, tTAMANHO, :QUANTIDADE_ALOCAR
       do begin
         select
            s.TOTAL
         from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :tTAMANHO, :QUANTIDADE_ALOCAR) s
         into :TOTALTEMPO;

         TOTALTEMPO = coalesce(TOTALTEMPO,0);

         if(TOTALTEMPO = 0)then
         begin
            exception "..." 'TEMPO DO MODELO NAO FOI ENCONTRADO, MODELO:'||MODELO_ID||', COR:'||COR_ID||', TAMANHO:'||tTAMANHO;
         end

         UPDATE TBAGRUPAMENTO_CARGA_SKU_UP A SET a.quantidade = a.quantidade - :QUANTIDADE_ALOCAR, a.necessidade = a.necessidade - :TOTALTEMPO
          WHERE AGRUPAMENTO_ID = :AGRUPAMENTO_ID
            AND AGRUP_PED_ID = :AGP_ITEM_ID
            and TIPO = 2;
       end
    end
    */

end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPI_TRATA_PEDIDO_MULT_AGP (
    CONF_AGRUPAMENTO_ID integer,
    PROGRAMADO varchar(10),
    PEDIDO integer,
    PED_ITEM_ID integer,
    DATA_PRODUCAO date,
    DATA_CLIENTE date,
    DATA_EMISSAO date,
    MODELO_CODIGO integer,
    PRODUTO_CODIGO integer,
    COR_ID integer,
    PERFIL varchar(10),
    TAMANHO integer,
    QTD_EST numeric(18,4),
    QTD_REM numeric(18,4),
    QTD_AGP numeric(18,4),
    EST_MIN varchar(10),
    SALDO numeric(18,4),
    QTD_MINIMO integer,
    QTD_MULTIPLO integer,
    REM_STATUS varchar(10),
    MP numeric(18,4),
    ESTABELECIMENTO_ID integer,
    PERFIL_PED varchar(10),
    DATA_AGRUPAMENTO date,
    VPED_ITEM_ID integer,
    PERFIL_COR varchar(10),
    TRATAMENTO_PEDIDO_MP varchar(10),
    PRODUZIR numeric(18,4),
    CAP_PROD_SKU numeric(18,4),
    TIPO_EXEC integer)
as
declare variable OLD_TIPO_AGP varchar(10);
declare variable SUB_TIPO_GP integer;
declare variable ORDEM_AGP integer;
declare variable OPERFIL varchar(10);
declare variable OPERFIL_COR varchar(10);
declare variable OPRODUTO_CODIGO integer;
declare variable OCOR_ID integer;
declare variable ODATA_PRODUCAO date;
declare variable ODATA_AGRUPAMENTO date;
declare variable TIPO_AGP varchar(10);
declare variable TIPO_DATA integer;
declare variable GP_AGRUPAMENTO_ID integer;
declare variable PRINCIPAL integer;
declare variable CONJUNTO_MODELO_PAI integer;
declare variable CONJUNTO_PECA_ID integer;
declare variable FATOR_CONVERSAO numeric(15,4);
declare variable TAMANHO_ORIGINAL integer;
declare variable PRODUTO_ORIGINAL integer;
declare variable MODELO_ORIGINAL integer;
declare variable PERFIL_ORIGINAL varchar(10);
declare variable TPRINCIPAL integer;
begin
  
    OLD_TIPO_AGP = '';

    TAMANHO_ORIGINAL = TAMANHO;
    PRODUTO_ORIGINAL = PRODUTO_CODIGO;
    MODELO_ORIGINAL  = MODELO_CODIGO;
    PERFIL_ORIGINAL  = PERFIL;

    for
        select
            h.PECA_ID,
            h.MODELO_PAI_ID,
            h.modelo_id,
            h.PRODUTO_ID,
            h.FATOR_CONVERSAO,
            h.TAMANHO,
            h.PERFIL_SKU,
            0 as PRINCIPAL
        from SPC_CONJUNTO(:MODELO_CODIGO, :COR_ID, :TAMANHO) h

        union all

        select
            0 PECA_ID,
            0 MODELO_PAI_ID,
            :MODELO_CODIGO modelo_id,
            :PRODUTO_CODIGO PRODUTO_ID,
            1 FATOR_CONVERSAO,
            :TAMANHO TAMANHO,
            :PERFIL PERFIL_SKU,
            1 as PRINCIPAL
       from RDB$DATABASE

    into
        CONJUNTO_PECA_ID,
        CONJUNTO_MODELO_PAI,
        MODELO_CODIGO,
        PRODUTO_CODIGO,
        FATOR_CONVERSAO,
        TAMANHO,
        PERFIL,
        TPRINCIPAL
    do begin

        for
            select
                g.gp_id,
                g.principal,
                iif(g.principal = 1, 'P', h.tipo_agrupamento) as tipo_agrupamento,
                h.sub_tipo_gp,
                g.ordem
            from TBCONFI_ALOCACAO_MODELO_ITENS g, tbesteira h
            where g.confi_alocacao_id = :conf_agrupamento_id
            and h.codigo = g.gp_id
            order by ordem
        into
            :GP_AGRUPAMENTO_ID,
            :PRINCIPAL,
            :TIPO_AGP,
            :SUB_TIPO_GP,
            :ORDEM_AGP
        do begin

            if(TPRINCIPAL = PRINCIPAL)then
            begin

                if(PRINCIPAL = 1)then
                begin
                    TAMANHO         = TAMANHO_ORIGINAL;
                    PRODUTO_CODIGO  = PRODUTO_ORIGINAL;
                    MODELO_CODIGO   = MODELO_ORIGINAL;
                    PERFIL          = PERFIL_ORIGINAL;
                end

                :OPERFIL            = PERFIL;
                :OPERFIL_COR        = PERFIL_COR;
                :OPRODUTO_CODIGO    = PRODUTO_CODIGO;
                :OCOR_ID            = COR_ID;
                :ODATA_PRODUCAO     = DATA_PRODUCAO;
                :ODATA_AGRUPAMENTO  = DATA_AGRUPAMENTO;
    
                if(SUB_TIPO_GP = 8)then
                begin
    
                    select
                        (select first 1 B.perfil FROM tbmodelo_bloqueio B WHERE B.modelo_id = P.modelo_codigo AND B.cor_id = P.cor_codigo) AS PERFIL,
                        (select first 1 C.perfil FROM tbcor C WHERE C.codigo = P.cor_codigo) AS PERFIL_COR,
                        p.cor_codigo
                    from tbmodelo m, tbgrupo_modelo j, tbmodelo m2, tbproduto p
                    where m.codigo = :MODELO_CODIGO
                    and j.id = m.grupo_id
                    and m2.codigo = j.modelo_id
                    and p.modelo_codigo = m2.codigo
                    and p.cor_codigo = fn_parametro('SISTEMA.COR_TECELAGEM_SEAMLESS')
                    into :OPERFIL, :OPERFIL_COR, :OCOR_ID;
    
                    if(coalesce(:OCOR_ID,0) = 0)then
                    begin                               
                        exception "..." 'COR DO GRUPO DE FIO (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                    if(coalesce(:OPERFIL,'') = '')then
                    begin                               
                        exception "..." 'PERFIL DO GRUPO DE FIO NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                end
    
                if(SUB_TIPO_GP = 9)then
                begin
                    :OPRODUTO_CODIGO = 0;
    
                    select  
                        (select first 1 B.perfil FROM tbmodelo_bloqueio B WHERE B.modelo_id = P.modelo_codigo AND B.cor_id = P.cor_codigo AND B.tamanho = :tamanho) AS PERFIL,
                        (select first 1 C.perfil FROM tbcor C WHERE C.codigo = P.cor_codigo) AS PERFIL_COR,
                        p.codigo,
                        p.cor_codigo
                    from tbproduto p
                    where p.modelo_codigo = :MODELO_CODIGO
                    and p.cor_codigo = fn_parametro('SISTEMA.COR_TECELAGEM_SEAMLESS')
                    into :OPERFIL, :OPERFIL_COR, :OPRODUTO_CODIGO, :OCOR_ID;
    
                    if(coalesce(:OPRODUTO_CODIGO,0) = 0)then
                    begin                               
                        exception "..." 'COR TECELAGEM (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                    if(coalesce(:OPERFIL,'') = '')then
                    begin                               
                        exception "..." 'PERFIL DA COR TECELAGEM (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                end
    
                QTD_AGP  = coalesce((select
                                        sum(p.quantidade)
                                     from tbagrupamento_pedido p
                                     where p.tipo = :TIPO_AGP
                                     and p.tabela_id = :PEDIDO
                                     and p.tab_item_id = :VPED_ITEM_ID
                                     and p.produto_id = :OPRODUTO_CODIGO
                                     and p.tamanho = :TAMANHO
                                     and p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI
                                     and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                            ),0);
    
                QTD_REM  = coalesce((select
                                        sum(p.quantidade)
                                     from TbRemessa_Item_Alocacao p
                                     where p.tipo = :TIPO_AGP
                                     and p.tabela_id = :PEDIDO
                                     and p.tab_item_id = :VPED_ITEM_ID
                                     and p.produto_id = :OPRODUTO_CODIGO
                                     and p.tamanho = :TAMANHO
                                     and p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI
                                     and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                            ),0);
    
                PRODUZIR = SALDO - (QTD_EST + QTD_REM + QTD_AGP);
                PRODUZIR = FN_INT_ROUND_UP(PRODUZIR * FATOR_CONVERSAO);
    
                TIPO_DATA = 0;
    
                if(ORDEM_AGP > 1)then
                begin
                    :TIPO_DATA = 1;
                    :ODATA_PRODUCAO = (select
                                            max(a.data_inicial)
                                         from tbagrupamento_pedido p, tbagrupamento a
                                         where p.tipo = :OLD_TIPO_AGP
                                         and p.tabela_id = :PEDIDO
                                        and p.tab_item_id = :VPED_ITEM_ID
                                         and p.tamanho_original = :tamanho_original
                                         and a.id = p.agrupamento_id
                                         and iif(:PRINCIPAL = 1, true,
                                            p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                                         )
                                      );
    
                    :ODATA_AGRUPAMENTO = ODATA_PRODUCAO;
    
                    if(ODATA_PRODUCAO is null)then
                    begin
                        PRODUZIR = 0;
                        --exception "..." 'PARAR | '||:OLD_TIPO_AGP||' | '||:TIPO_AGP;
                    end
                end else
                begin
                    ODATA_PRODUCAO = null;
                end
    
                if(ODATA_AGRUPAMENTO < current_date)then
                begin
                    ODATA_AGRUPAMENTO = current_date;
                end
    
                IF (PRODUZIR > 0) THEN
                BEGIN
    
                    if(TIPO_EXEC = 1)then
                    begin
    
                        EXECUTE PROCEDURE SPI_PEDIDO_AGP_CAP_PROD_SKU(
                             :PROGRAMADO,
                             :PEDIDO,
                             :PED_ITEM_ID,
                             :ODATA_PRODUCAO,
                             :DATA_CLIENTE,
                             :DATA_EMISSAO,
                             :MODELO_CODIGO,
                             :PRODUTO_CODIGO,
                             :PERFIL,
                             :TAMANHO,
                             :QTD_EST,
                             :QTD_REM,
                             :QTD_AGP,
                             :EST_MIN,
                             :CAP_PROD_SKU,
                             :SALDO,
                             :QTD_MINIMO,
                             :QTD_MULTIPLO,
                             :REM_STATUS,
                             :MP,
                             :ESTABELECIMENTO_ID,
                             :PERFIL_PED,
                             :ODATA_AGRUPAMENTO,
                             :VPED_ITEM_ID,
                             :PERFIL_COR,
                             :TRATAMENTO_PEDIDO_MP,
                             :PRODUZIR,
                             :GP_AGRUPAMENTO_ID,
                             :TIPO_AGP,  
                             :TIPO_DATA,
                             :PRODUTO_CODIGO,
                             :CONJUNTO_MODELO_PAI,
                             :CONJUNTO_PECA_ID,
                             :TAMANHO_ORIGINAL,
                             :PRODUTO_ORIGINAL
                        );
    
                    end else
                    begin
    
                        EXECUTE PROCEDURE SPI_PEDIDO_AGP_TEMPO_PROD_SKU(
                             :PROGRAMADO,
                             :PEDIDO,
                             :PED_ITEM_ID,
                             :ODATA_PRODUCAO,
                             :DATA_CLIENTE,
                             :DATA_EMISSAO,
                             :MODELO_CODIGO,
                             :OPRODUTO_CODIGO,
                             :OCOR_ID,
                             :OPERFIL,
                             :TAMANHO,
                             :QTD_EST,
                             :QTD_REM,
                             :QTD_AGP,
                             :EST_MIN,
                             :SALDO,
                             :QTD_MINIMO,
                             :QTD_MULTIPLO,
                             :REM_STATUS,
                             :MP,
                             :ESTABELECIMENTO_ID,
                             :PERFIL_PED,
                             :ODATA_AGRUPAMENTO,
                             :VPED_ITEM_ID,
                             :OPERFIL_COR,
                             :TRATAMENTO_PEDIDO_MP,
                             :PRODUZIR,
                             :GP_AGRUPAMENTO_ID,
                             :TIPO_AGP,
                             :TIPO_DATA,
                             :PRODUTO_CODIGO,
                             :CONJUNTO_MODELO_PAI,
                             :CONJUNTO_PECA_ID,
                             :TAMANHO_ORIGINAL,
                             :PRODUTO_ORIGINAL
                        );
                     end
                 END
             end
             OLD_TIPO_AGP = :TIPO_AGP;
         end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_PEDIDO_AGP_CAP_PROD_SKU (
    PROGRAMADO varchar(1),
    PEDIDO integer,
    PED_ITEM_ID integer,
    DATA_PRODUCAO date,
    DATA_CLIENTE date,
    DATA_EMISSAO date,
    MODELO_CODIGO integer,
    PRODUTO_CODIGO integer,
    PERFIL varchar(40),
    TAMANHO integer,
    QTD_EST numeric(18,4),
    QTD_REM numeric(18,4),
    QTD_AGP numeric(18,4),
    EST_MIN char(4),
    CAP_PROD_SKU numeric(18,4),
    SALDO numeric(18,4),
    QTD_MINIMO integer,
    QTD_MULTIPLO integer,
    REM_STATUS char(4),
    MP numeric(18,4),
    ESTABELECIMENTO_ID integer,
    PERFIL_PED varchar(10),
    DATA_AGRUPAMENTO date,
    VPED_ITEM_ID integer,
    PERFIL_COR varchar(10),
    TRATAMENTO_PEDIDO_MP char(1),
    PRODUZIR numeric(18,4),
    GP_ID_AGP integer = 0,
    TIPO_AGP varchar(10) = 'P',
    TIPO_DATA integer = 0,
    PRODUTO_ORIGEM integer = 0,
    CONJUNTO_MODELO_PAI integer = 0,
    CONJUNTO_PECA_ID integer = 0,
    TAMANHO_ORIGINAL integer = 0,
    PRODUTO_ORIGINAL integer = 0)
as
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_GP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable AGRUP_UP_TOTAL integer;
declare variable DATA_INICIAL_AGP date;
declare variable DATA_FINAL_AGP date;
declare variable DATA_PEDIDO_NOVO date;
declare variable DATA_CLIENTE_NOVO date;
BEGIN

    TAMANHO_ORIGINAL = coalesce(TAMANHO_ORIGINAL, TAMANHO);
    PRODUTO_ORIGEM = coalesce(PRODUTO_ORIGEM,0);
    VSALDO = TRUNC(PRODUZIR);

    IF (MP = 0) THEN --SE NãO HOUVER NECESSIDADE DE TECIDO (OU SEJA, O PROJETADO PARA O ITEM DO PEDIDO ESTá ALOCADO AO MESMO)
    BEGIN
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 6) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 06; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 7) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 05; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 1) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 11; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 2) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 10; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 3) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 09; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 4) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 08; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 5) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 07; END
    END ELSE
    IF (DATA_PRODUCAO IS NOT NULL) THEN
    BEGIN
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 6) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 06; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 7) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 07; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 1) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 01; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 2) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 02; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 3) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 03; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 4) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 04; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 5) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 05; END
    END ELSE
    BEGIN
        VDATA_PRODUCAO = :DATA_AGRUPAMENTO;
    END

    --exception "..." VDATA_PRODUCAO||' | '||DATA_AGRUPAMENTO;

    FOR

       select
            AGRUPAMENTO_ID,
            GP_ID,
            MINUTOS_PRODUTIVOS,
            DATA_INICIAL_AGP,
            DATA_FINAL_AGP
       FROM SPC_AGRUPAMENTO_DATA(:ESTABELECIMENTO_ID, :PROGRAMADO, :DATA_PRODUCAO, :VDATA_PRODUCAO, :DATA_CLIENTE, :DATA_EMISSAO, :GP_ID_AGP)
       where MINUTOS_PRODUTIVOS > 0
       and iif(:TIPO_DATA = 1, DATA_INICIAL_AGP >= :DATA_AGRUPAMENTO, true)

    INTO :AGRUPAMENTO_ID,
         :GP_ID,
         :MINUTOS_PRODUTIVOS,
         :DATA_INICIAL_AGP,
         :DATA_FINAL_AGP
    DO BEGIN

       IF (MINUTOS_PRODUTIVOS > 0 AND VSALDO > 0) THEN
           BEGIN
           VQTD = VSALDO;
    
           IF (VQTD > 0) THEN
               BEGIN
    
                 FOR
                 SELECT FIRST 1 GP_ID,
                                SUM(DISP) OVER() AS AGRUP_GP_TOTAL
                   FROM (
                         SELECT X.GP_ID, X.SUBUP_ID, X.AGRUP_GP_ID, X.SALDO,
                                CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                           FROM (
                                 SELECT A.GP_ID, A.SUBUP_ID, A.ID AGRUP_GP_ID, A.SALDO,
                                        CAST(TRUNC(A.SALDO*CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                                   FROM TBAGRUPAMENTO_CARGA_GP A
                                  WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                    AND A.PERFIL = :PERFIL
                                    AND A.SALDO > 0
                                  ORDER BY A.SALDO DESC
                                ) X
                          )
                  WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD )
                   INTO :GP_ID,
                        :AGRUP_GP_TOTAL
                     DO BEGIN
    
                        IF (GP_ID > 0) THEN
                            BEGIN
    
                            IF (AGRUP_GP_TOTAL < VQTD) THEN
                                BEGIN
                                    VQTD = AGRUP_GP_TOTAL;
                                END
    
                            IF (VQTD > 0) THEN
                                BEGIN
    
                                   FOR
                                    SELECT FIRST 1
                                        FERRAMENTARIA_ID,
                                        SUM(DISP) OVER() AS AGRUP_FER_TOTAL
                                      FROM (
                                            SELECT
                                                    Y.FERRAMENTARIA_ID,
                                                    Y.AGRUP_FER_ID,
                                                    Y.APROVEITAMENTO,
                                                    Y.SALDO,
                                                    CAST(Y.DISP-(MOD(Y.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                              FROM (
                                                    SELECT
                                                        X.FERRAMENTARIA_ID,
                                                        X.AGRUP_FER_ID,
                                                        X.APROVEITAMENTO,
                                                        X.SALDO,
                                                        CAST(TRUNC(X.SALDO * CAST(:CAP_PROD_SKU AS NUMERIC(15,4)) * (X.APROVEITAMENTO / 100.0000) ) AS INTEGER) DISP
                                                      FROM (
                                                            SELECT F.ID FERRAMENTARIA_ID,  I.APROVEITAMENTO,
                                                            COALESCE((SELECT AC.ID
                                                                   FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                   WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                     AND AC.FERRAMENTA_ID = F.ID),0) AGRUP_FER_ID,
                                                                   COALESCE((SELECT AC.SALDO
                                                                   FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                   WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                     AND AC.FERRAMENTA_ID = F.ID),A.MINUTOS_PRODUTIVOS) SALDO
                                                            
                                                            FROM TBAGRUPAMENTO A, TBFERRAMENTARIA F, TBFERRAMENTARIA_ITEM I, TBMODELO M
                                                            WHERE A.ID = :AGRUPAMENTO_ID
                                                              AND F.ID = I.FERRAMENTARIA_ID
                                                              AND I.LINHA_ID = M.LINHA_CODIGO
                                                              AND M.CODIGO = :MODELO_CODIGO
                                                              AND I.TAMANHO   = :TAMANHO
                                                              AND I.APROVEITAMENTO > 0
                                                              AND F.STATUS = '1'
                                                              AND F.STATUS_PEDIDO = '1'
                                                            ) X
                                                     WHERE X.SALDO > 0
                                                     ORDER BY X.SALDO DESC
                                                   ) Y
                                              ) WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD ) 
                                     INTO :FERRAMENTARIA_ID,
                                          :AGRUP_FER_TOTAL
                                     DO BEGIN
    
                                         IF (FERRAMENTARIA_ID > 0) THEN
                                            BEGIN
    
                                            IF (AGRUP_FER_TOTAL < VQTD) THEN
                                                BEGIN
                                                    VQTD = AGRUP_FER_TOTAL;
                                                END
    
                                                IF (VQTD > 0) THEN
                                                    BEGIN
    
                                                        DATA_PEDIDO_NOVO = DATA_INICIAL_AGP;
                                                        DATA_CLIENTE_NOVO= DATA_FINAL_AGP;

                                                        VAGR_PED_ID = GEN_ID(GTBAGRUPAMENTO_PEDIDO,1);
    
                                                        INSERT INTO TBAGRUPAMENTO_PEDIDO (ESTABELECIMENTO_ID, AGRUPAMENTO_ID,
                                                        ID, TABELA_ID, TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, TIPO,
                                                        SALDO, PERFIL_SKU, NECESS_SKU, PRODUTO_ORIGEM, CONJUNTO_MODELO_PAI, CONJUNTO_PECA_ID, TAMANHO_ORIGINAL, PRODUTO_ORIGINAL)
                                                        VALUES (:ESTABELECIMENTO_ID, :AGRUPAMENTO_ID, :VAGR_PED_ID,
                                                        :PEDIDO, :VPED_ITEM_ID, :PRODUTO_CODIGO, :TAMANHO, :VQTD, :TIPO_AGP,
                                                        :VQTD, :PERFIL, :VQTD / :CAP_PROD_SKU , :PRODUTO_ORIGEM, :CONJUNTO_MODELO_PAI, :CONJUNTO_PECA_ID, :TAMANHO_ORIGINAL, :PRODUTO_ORIGINAL);
    
                                                        VQTDGP = :VQTD;
                                                        VEXIT = FALSE;
    
                                                        FOR
                                                         SELECT GP_ID,
                                                                AGRUP_GP_ID,
                                                                DISP
                                                           FROM (
                                                                 SELECT X.GP_ID, X.SUBUP_ID, X.AGRUP_GP_ID, X.SALDO,
                                                                        CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                                                   FROM (
                                                                         SELECT A.GP_ID, A.SUBUP_ID, A.ID AGRUP_GP_ID, A.SALDO,
                                                                                CAST(TRUNC(A.SALDO*CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                                                                           FROM TBAGRUPAMENTO_CARGA_GP A
                                                                          WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                                            AND A.PERFIL = :PERFIL
                                                                            AND A.SALDO > 0
                                                                          ORDER BY A.SALDO DESC
                                                                        ) X
                                                                  )
                                                          WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD )
                                                           INTO :GP_ID,
                                                                :AGRUP_GP_ID,
                                                                :AGRUP_GP_DISP
                                                             DO BEGIN
                                                                  IF(VEXIT = FALSE) THEN
                                                                     BEGIN
    
                                                                        IF(:VQTDGP > 0) THEN
                                                                            BEGIN
                                                                                IF (AGRUP_GP_DISP < VQTDGP) THEN
                                                                                BEGIN
                                                                                    VQTDTEMP = :AGRUP_GP_DISP;
                                                                                END ELSE
                                                                                BEGIN
                                                                                    VQTDTEMP = :VQTDGP;
                                                                                END
                    
                                                                                INSERT INTO TBAGRUPAMENTO_CARGA_SKU_GP (AGRUPAMENTO_ID, 
                                                                                AGRUP_PED_ID,AGRUP_GP_ID,QUANTIDADE,NECESSIDADE) VALUES ( 
                                                                                :AGRUPAMENTO_ID,:VAGR_PED_ID,:AGRUP_GP_ID,:VQTDTEMP,:VQTDTEMP/:CAP_PROD_SKU);
        
                                                                                VQTDGP = :VQTDGP - :VQTDTEMP;
                                                                        END ELSE
                                                                        BEGIN
                                                                           VEXIT = TRUE;
                                                                        END
                                                                     END
                                                                END
    
                                                         VQTDFER = :VQTD;
                                                         VEXIT = FALSE;
    
                                                         FOR
                                                         SELECT FERRAMENTARIA_ID,
                                                                AGRUP_FER_ID,
                                                                APROVEITAMENTO,
                                                                DISP
                                                           FROM (
                                                                SELECT Y.FERRAMENTARIA_ID,
                                                                       Y.AGRUP_FER_ID,
                                                                       Y.APROVEITAMENTO,
                                                                       Y.SALDO,
                                                                       CAST(Y.DISP-(MOD(Y.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                                                  FROM (
                                                                        SELECT X.FERRAMENTARIA_ID,  X.AGRUP_FER_ID, X.APROVEITAMENTO, X.SALDO,
                                                                               CAST(TRUNC(X.SALDO * CAST(:CAP_PROD_SKU AS NUMERIC(15,4)) * (X.APROVEITAMENTO / 100.0000) ) AS INTEGER) DISP
                                                                          FROM (
                                                                                SELECT F.ID FERRAMENTARIA_ID,  I.APROVEITAMENTO,
                                                                                COALESCE((SELECT AC.ID
                                                                                       FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                                       WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                                         AND AC.FERRAMENTA_ID = F.ID),0) AGRUP_FER_ID,
                                                                                       COALESCE((SELECT AC.SALDO
                                                                                       FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                                       WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                                         AND AC.FERRAMENTA_ID = F.ID),A.MINUTOS_PRODUTIVOS) SALDO
                                                                                
                                                                                FROM TBAGRUPAMENTO A, TBFERRAMENTARIA F, TBFERRAMENTARIA_ITEM I, TBMODELO M
                                                                                WHERE A.ID = :AGRUPAMENTO_ID
                                                                                  AND F.ID = I.FERRAMENTARIA_ID
                                                                                  AND I.LINHA_ID = M.LINHA_CODIGO
                                                                                  AND M.CODIGO = :MODELO_CODIGO
                                                                                  AND I.TAMANHO   = :TAMANHO
                                                                                  AND I.APROVEITAMENTO > 0
                                                                                  AND F.STATUS = '1'
                                                                                  AND F.STATUS_PEDIDO = '1'
                                                                                ) X
                                                                         WHERE X.SALDO > 0
                                                                         ORDER BY X.SALDO DESC
                                                                       ) Y
                                                                  ) WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD ) 
                                                         INTO :FERRAMENTARIA_ID,
                                                              :AGRUP_FER_ID,
                                                              :APROVEITAMENTO,
                                                              :AGRUP_FER_DISP
                                                           DO BEGIN
                                                              IF(VEXIT = FALSE) THEN
                                                                 BEGIN
    
                                                                 IF(:VQTDFER > 0) THEN
                                                                    BEGIN
    
                                                                        IF (AGRUP_FER_ID = 0) THEN
                                                                        BEGIN
                                                                            VAGRUP_FER_ID = GEN_ID(GTBAGRUPAMENTO_CARGA_FERRAMENTA,1);
    
                                                                            INSERT INTO TBAGRUPAMENTO_CARGA_FERRAMENTA (AGRUPAMENTO_ID,
                                                                               FERRAMENTA_ID,ID,CAP_PRODUTIVA,SALDO,QUANTIDADE) VALUES (
                                                                               :AGRUPAMENTO_ID,:FERRAMENTARIA_ID,:VAGRUP_FER_ID,
                                                                               :MINUTOS_PRODUTIVOS,:MINUTOS_PRODUTIVOS,0);
    
                                                                        END ELSE
                                                                        BEGIN
                                                                            VAGRUP_FER_ID = :AGRUP_FER_ID;
                                                                        END
    
                                                                        IF (AGRUP_FER_DISP < VQTDFER) THEN
                                                                        BEGIN
                                                                            VQTDTEMP = :AGRUP_FER_DISP;
                                                                        END ELSE
                                                                        BEGIN
                                                                            VQTDTEMP = :VQTDFER;
                                                                        END
    
                                                                        IF (CAP_PROD_SKU = 0) THEN
                                                                            EXCEPTION "..." 'CAPACIDADE PRODUTIVA NAO PODE SER ZERADO. OPERACAO CANCELADA!';
                                                                        IF (APROVEITAMENTO = 0) THEN
                                                                            EXCEPTION "..." 'APROVEITAMENTO DA FERRAMENTA PRODUTIVA NÃO PODE SER ZERADO. OPERACAO CANCELADA!';
    
                                                                        INSERT INTO TBAGRUPAMENTO_CARGA_SKU_FER (AGRUPAMENTO_ID,
                                                                        AGRUP_PED_ID,AGRUP_FER_ID,QUANTIDADE,NECESSIDADE) VALUES (
                                                                        :AGRUPAMENTO_ID,:VAGR_PED_ID,:VAGRUP_FER_ID,:VQTDTEMP,
                                                                        FN_CALC_PRECISION(:VQTDTEMP,(:CAP_PROD_SKU*(:APROVEITAMENTO/100.00)),'/'));
    
                                                                        VQTDFER = :VQTDFER - :VQTDTEMP;
                                                                    END ELSE
                                                                    BEGIN
                                                                       VEXIT = TRUE;
                                                                    END
    
                                                                 END
    
                                                              END
    
                                                        VSALDO = VSALDO - VQTD;
                                                    END
                                               END
                                        END
                                  END
                            END
                      END
               END
    
           END
    
       END

       --SALDO_RESTO = VSALDO;
END
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER procedure SPI_TRATA_PEDIDO_MULT_AGP (
    CONF_AGRUPAMENTO_ID integer,
    PROGRAMADO varchar(10),
    PEDIDO integer,
    PED_ITEM_ID integer,
    DATA_PRODUCAO date,
    DATA_CLIENTE date,
    DATA_EMISSAO date,
    MODELO_CODIGO integer,
    PRODUTO_CODIGO integer,
    COR_ID integer,
    PERFIL varchar(10),
    TAMANHO integer,
    QTD_EST numeric(18,4),
    QTD_REM numeric(18,4),
    QTD_AGP numeric(18,4),
    EST_MIN varchar(10),
    SALDO numeric(18,4),
    QTD_MINIMO integer,
    QTD_MULTIPLO integer,
    REM_STATUS varchar(10),
    MP numeric(18,4),
    ESTABELECIMENTO_ID integer,
    PERFIL_PED varchar(10),
    DATA_AGRUPAMENTO date,
    VPED_ITEM_ID integer,
    PERFIL_COR varchar(10),
    TRATAMENTO_PEDIDO_MP varchar(10),
    PRODUZIR numeric(18,4),
    CAP_PROD_SKU numeric(18,4),
    TIPO_EXEC integer)
as
declare variable OLD_TIPO_AGP varchar(10);
declare variable SUB_TIPO_GP integer;
declare variable ORDEM_AGP integer;
declare variable OPERFIL varchar(10);
declare variable OPERFIL_COR varchar(10);
declare variable OPRODUTO_CODIGO integer;
declare variable OCOR_ID integer;
declare variable ODATA_PRODUCAO date;
declare variable ODATA_AGRUPAMENTO date;
declare variable TIPO_AGP varchar(10);
declare variable TIPO_DATA integer;
declare variable GP_AGRUPAMENTO_ID integer;
declare variable PRINCIPAL integer;
declare variable CONJUNTO_MODELO_PAI integer;
declare variable CONJUNTO_PECA_ID integer;
declare variable FATOR_CONVERSAO numeric(15,4);
declare variable TAMANHO_ORIGINAL integer;
declare variable PRODUTO_ORIGINAL integer;
declare variable MODELO_ORIGINAL integer;
declare variable PERFIL_ORIGINAL varchar(10);
declare variable TPRINCIPAL integer;
begin
  
    OLD_TIPO_AGP = '';

    TAMANHO_ORIGINAL = TAMANHO;
    PRODUTO_ORIGINAL = PRODUTO_CODIGO;
    MODELO_ORIGINAL  = MODELO_CODIGO;
    PERFIL_ORIGINAL  = PERFIL;

    for
        select
            h.PECA_ID,
            h.MODELO_PAI_ID,
            h.modelo_id,
            h.PRODUTO_ID,
            h.FATOR_CONVERSAO,
            h.TAMANHO,
            h.PERFIL_SKU,
            0 as PRINCIPAL
        from SPC_CONJUNTO(:MODELO_CODIGO, :COR_ID, :TAMANHO) h

        union all

        select
            0 PECA_ID,
            0 MODELO_PAI_ID,
            :MODELO_CODIGO modelo_id,
            :PRODUTO_CODIGO PRODUTO_ID,
            1 FATOR_CONVERSAO,
            :TAMANHO TAMANHO,
            :PERFIL PERFIL_SKU,
            1 as PRINCIPAL
       from RDB$DATABASE

    into
        CONJUNTO_PECA_ID,
        CONJUNTO_MODELO_PAI,
        MODELO_CODIGO,
        PRODUTO_CODIGO,
        FATOR_CONVERSAO,
        TAMANHO,
        PERFIL,
        TPRINCIPAL
    do begin

        for
            select
                g.gp_id,
                g.principal,
                iif(g.principal = 1, 'P', h.tipo_agrupamento) as tipo_agrupamento,
                h.sub_tipo_gp,
                g.ordem
            from TBCONFI_ALOCACAO_MODELO_ITENS g, tbesteira h
            where g.confi_alocacao_id = :conf_agrupamento_id
            and h.codigo = g.gp_id
            order by ordem
        into
            :GP_AGRUPAMENTO_ID,
            :PRINCIPAL,
            :TIPO_AGP,
            :SUB_TIPO_GP,
            :ORDEM_AGP
        do begin

            if(TPRINCIPAL = PRINCIPAL)then
            begin

                if(PRINCIPAL = 1)then
                begin
                    TAMANHO         = TAMANHO_ORIGINAL;
                    PRODUTO_CODIGO  = PRODUTO_ORIGINAL;
                    MODELO_CODIGO   = MODELO_ORIGINAL;
                    PERFIL          = PERFIL_ORIGINAL;
                end

                :OPERFIL            = PERFIL;
                :OPERFIL_COR        = PERFIL_COR;
                :OPRODUTO_CODIGO    = PRODUTO_CODIGO;
                :OCOR_ID            = COR_ID;
                :ODATA_PRODUCAO     = DATA_PRODUCAO;
                :ODATA_AGRUPAMENTO  = DATA_AGRUPAMENTO;
    
                if(SUB_TIPO_GP = 8)then
                begin
    
                    select
                        (select first 1 B.perfil FROM tbmodelo_bloqueio B WHERE B.modelo_id = P.modelo_codigo AND B.cor_id = P.cor_codigo) AS PERFIL,
                        (select first 1 C.perfil FROM tbcor C WHERE C.codigo = P.cor_codigo) AS PERFIL_COR,
                        p.cor_codigo
                    from tbmodelo m, tbgrupo_modelo j, tbmodelo m2, tbproduto p
                    where m.codigo = :MODELO_CODIGO
                    and j.id = m.grupo_id
                    and m2.codigo = j.modelo_id
                    and p.modelo_codigo = m2.codigo
                    and p.cor_codigo = fn_parametro('SISTEMA.COR_TECELAGEM_SEAMLESS')
                    into :OPERFIL, :OPERFIL_COR, :OCOR_ID;
    
                    if(coalesce(:OCOR_ID,0) = 0)then
                    begin                               
                        exception "..." 'COR DO GRUPO DE FIO (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                    if(coalesce(:OPERFIL,'') = '')then
                    begin                               
                        exception "..." 'PERFIL DO GRUPO DE FIO NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                end
    
                if(SUB_TIPO_GP = 9)then
                begin
                    :OPRODUTO_CODIGO = 0;
    
                    select  
                        (select first 1 B.perfil FROM tbmodelo_bloqueio B WHERE B.modelo_id = P.modelo_codigo AND B.cor_id = P.cor_codigo AND B.tamanho = :tamanho) AS PERFIL,
                        (select first 1 C.perfil FROM tbcor C WHERE C.codigo = P.cor_codigo) AS PERFIL_COR,
                        p.codigo,
                        p.cor_codigo
                    from tbproduto p
                    where p.modelo_codigo = :MODELO_CODIGO
                    and p.cor_codigo = fn_parametro('SISTEMA.COR_TECELAGEM_SEAMLESS')
                    into :OPERFIL, :OPERFIL_COR, :OPRODUTO_CODIGO, :OCOR_ID;
    
                    if(coalesce(:OPRODUTO_CODIGO,0) = 0)then
                    begin                               
                        exception "..." 'COR TECELAGEM (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                    if(coalesce(:OPERFIL,'') = '')then
                    begin                               
                        exception "..." 'PERFIL DA COR TECELAGEM (CRU) NAO ENCONTRADA NO MODELO '||:MODELO_CODIGO;
                    end
    
                end
    
                QTD_AGP  = coalesce((select
                                        sum(p.quantidade)
                                     from tbagrupamento_pedido p
                                     where p.tipo = :TIPO_AGP
                                     and p.tabela_id = :PEDIDO
                                     and p.tab_item_id = :VPED_ITEM_ID
                                     and p.produto_id = :OPRODUTO_CODIGO
                                     and p.tamanho = :TAMANHO
                                     and p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI
                                     and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                            ),0);
    
                QTD_REM  = coalesce((select
                                        sum(p.quantidade)
                                     from TbRemessa_Item_Alocacao p
                                     where p.tipo = :TIPO_AGP
                                     and p.tabela_id = :PEDIDO
                                     and p.tab_item_id = :VPED_ITEM_ID
                                     and p.produto_id = :OPRODUTO_CODIGO
                                     and p.tamanho = :TAMANHO
                                     and p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI
                                     and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                            ),0);
    
                PRODUZIR = SALDO - (QTD_EST + QTD_REM + QTD_AGP);
                PRODUZIR = FN_INT_ROUND_UP(PRODUZIR * FATOR_CONVERSAO);
    
                TIPO_DATA = 0;
    
                if(ORDEM_AGP > 1)then
                begin
                    :TIPO_DATA = 1;
                    :ODATA_PRODUCAO = (select
                                            max(a.data_inicial)
                                         from tbagrupamento_pedido p, tbagrupamento a
                                         where p.tipo = :OLD_TIPO_AGP
                                         and p.tabela_id = :PEDIDO
                                        and p.tab_item_id = :VPED_ITEM_ID
                                         and p.tamanho_original = :tamanho_original
                                         and a.id = p.agrupamento_id
                                         and iif(:PRINCIPAL = 1, true,
                                            p.CONJUNTO_MODELO_PAI = :CONJUNTO_MODELO_PAI and p.CONJUNTO_PECA_ID = :CONJUNTO_PECA_ID
                                         )
                                      );
    
                    :ODATA_AGRUPAMENTO = ODATA_PRODUCAO;
    
                    if(ODATA_PRODUCAO is null)then
                    begin
                        PRODUZIR = 0;
                        --exception "..." 'PARAR | '||:OLD_TIPO_AGP||' | '||:TIPO_AGP;
                    end
                end else
                begin
                    ODATA_PRODUCAO = null;
                end
    
                if(ODATA_AGRUPAMENTO < current_date)then
                begin
                    ODATA_AGRUPAMENTO = current_date;
                end
    
                IF (PRODUZIR > 0) THEN
                BEGIN
    
                    if(TIPO_EXEC = 1)then
                    begin
    
                        EXECUTE PROCEDURE SPI_PEDIDO_AGP_CAP_PROD_SKU(
                             :PROGRAMADO,
                             :PEDIDO,
                             :PED_ITEM_ID,
                             :ODATA_PRODUCAO,
                             :DATA_CLIENTE,
                             :DATA_EMISSAO,
                             :MODELO_CODIGO,
                             :PRODUTO_CODIGO,
                             :PERFIL,
                             :TAMANHO,
                             :QTD_EST,
                             :QTD_REM,
                             :QTD_AGP,
                             :EST_MIN,
                             :CAP_PROD_SKU,
                             :SALDO,
                             :QTD_MINIMO,
                             :QTD_MULTIPLO,
                             :REM_STATUS,
                             :MP,
                             :ESTABELECIMENTO_ID,
                             :PERFIL_PED,
                             :ODATA_AGRUPAMENTO,
                             :VPED_ITEM_ID,
                             :PERFIL_COR,
                             :TRATAMENTO_PEDIDO_MP,
                             :PRODUZIR,
                             :GP_AGRUPAMENTO_ID,
                             :TIPO_AGP,  
                             :TIPO_DATA,
                             :PRODUTO_CODIGO,
                             :CONJUNTO_MODELO_PAI,
                             :CONJUNTO_PECA_ID,
                             :TAMANHO_ORIGINAL,
                             :PRODUTO_ORIGINAL
                        );
    
                    end else
                    begin
    
                        EXECUTE PROCEDURE SPI_PEDIDO_AGP_TEMPO_PROD_SKU(
                             :PROGRAMADO,
                             :PEDIDO,
                             :PED_ITEM_ID,
                             :ODATA_PRODUCAO,
                             :DATA_CLIENTE,
                             :DATA_EMISSAO,
                             :MODELO_CODIGO,
                             :OPRODUTO_CODIGO,
                             :OCOR_ID,
                             :OPERFIL,
                             :TAMANHO,
                             :QTD_EST,
                             :QTD_REM,
                             :QTD_AGP,
                             :EST_MIN,
                             :SALDO,
                             :QTD_MINIMO,
                             :QTD_MULTIPLO,
                             :REM_STATUS,
                             :MP,
                             :ESTABELECIMENTO_ID,
                             :PERFIL_PED,
                             :ODATA_AGRUPAMENTO,
                             :VPED_ITEM_ID,
                             :OPERFIL_COR,
                             :TRATAMENTO_PEDIDO_MP,
                             :PRODUZIR,
                             :GP_AGRUPAMENTO_ID,
                             :TIPO_AGP,
                             :TIPO_DATA,
                             :PRODUTO_CODIGO,
                             :CONJUNTO_MODELO_PAI,
                             :CONJUNTO_PECA_ID,
                             :TAMANHO_ORIGINAL,
                             :PRODUTO_ORIGINAL
                        );
                     end
                 END
             end
             OLD_TIPO_AGP = :TIPO_AGP;
         end
    end
end
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER procedure SPI_TRATA_PEDIDO_AGRUPAMENTO_V2 (
    PEDIDO integer,
    PED_ITEM_ID integer)
as
declare variable DATA_PRODUCAO date;
declare variable MODELO_CODIGO integer;
declare variable PRODUTO_CODIGO integer;
declare variable PERFIL varchar(40);
declare variable TAMANHO integer;
declare variable QTD_EST numeric(18,4);
declare variable QTD_REM numeric(18,4);
declare variable QTD_AGP numeric(18,4);
declare variable EST_MIN char(4);
declare variable CAP_PROD_SKU numeric(18,4);
declare variable SALDO numeric(18,4);
declare variable QTD_MINIMO integer;
declare variable QTD_MULTIPLO integer;
declare variable REM_STATUS char(4);
declare variable MP numeric(18,4);
declare variable ESTABELECIMENTO_ID integer;
declare variable PERFIL_PED varchar(10);
declare variable DATA_AGRUPAMENTO date;
declare variable VPED_ITEM_ID integer;
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_GP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable PRODUZIR numeric(18,4);
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable PERFIL_COR varchar(10);
declare variable TRATAMENTO_PEDIDO_MP char(1);
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable AGRUP_UP_TOTAL integer;
declare variable COR_ID integer;
declare variable PROGRAMADO char(1);
declare variable DATA_CLIENTE date;
declare variable DATA_EMISSAO date;
declare variable CONF_AGRUPAMENTO_ID integer;
declare variable GP_AGRUPAMENTO_ID integer;
declare variable TIPO_AGP varchar(10);
declare variable SUB_TIPO_GP integer;
BEGIN

    FOR
        SELECT  P.DATA_CLIENTE,
                P.DATA,
                A.DATA_PRODUCAO,
                A.MODELO_CODIGO,
                A.PRODUTO_CODIGO,
                A.COR_ID,
                A.PERFIL,
                A.TAMANHO,
                A.QTD_EST,
                A.QTD_REM,
                A.QTD_AGP,
                A.EST_MIN,
               (SELECT FIRST 1 P.CAP_PRODUTIVA FROM TBPERFIL P WHERE P.TABELA = 'SKU' AND P.ID = A.PERFIL) CAP_PROD_SKU,
        
               CAST(COALESCE((SELECT FIRST 1 S.QUANTIDADE FROM TBPEDIDO_ITEM_SALDO S
                 WHERE S.PEDIDO = A.PEDIDO AND S.PEDIDO_ITEM_CONTROLE = A.CONTROLE),0.0000) AS NUMERIC(15,4)) SALDO,

               COALESCE((SELECT FIRST 1 CASE WHEN A.TAMANHO = 1 THEN MI01 WHEN A.TAMANHO = 2 THEN MI02
                                             WHEN A.TAMANHO = 3 THEN MI03 WHEN A.TAMANHO = 4 THEN MI04
                                             WHEN A.TAMANHO = 5 THEN MI05 WHEN A.TAMANHO = 6 THEN MI06
                                             WHEN A.TAMANHO = 7 THEN MI07 WHEN A.TAMANHO = 8 THEN MI08
                                             WHEN A.TAMANHO = 9 THEN MI09 WHEN A.TAMANHO =10 THEN MI10
                                             WHEN A.TAMANHO =11 THEN MI11 WHEN A.TAMANHO =12 THEN MI12
                                             WHEN A.TAMANHO =13 THEN MI13 WHEN A.TAMANHO =14 THEN MI14
                                             WHEN A.TAMANHO =15 THEN MI15 WHEN A.TAMANHO =16 THEN MI16
                                             WHEN A.TAMANHO =17 THEN MI17 WHEN A.TAMANHO =18 THEN MI18
                                             WHEN A.TAMANHO =19 THEN MI19 WHEN A.TAMANHO =20 THEN MI20 END
                           FROM TBMODELO_PEDIDO_COTA M WHERE M.MODELO_ID = A.MODELO_CODIGO),1) QTD_MINIMO,
        
               COALESCE((SELECT FIRST 1 CASE WHEN A.TAMANHO = 1 THEN MU01 WHEN A.TAMANHO = 2 THEN MU02
                                             WHEN A.TAMANHO = 3 THEN MU03 WHEN A.TAMANHO = 4 THEN MU04
                                             WHEN A.TAMANHO = 5 THEN MU05 WHEN A.TAMANHO = 6 THEN MU06
                                             WHEN A.TAMANHO = 7 THEN MU07 WHEN A.TAMANHO = 8 THEN MU08
                                             WHEN A.TAMANHO = 9 THEN MU09 WHEN A.TAMANHO =10 THEN MU10
                                             WHEN A.TAMANHO =11 THEN MU11 WHEN A.TAMANHO =12 THEN MU12
                                             WHEN A.TAMANHO =13 THEN MU13 WHEN A.TAMANHO =14 THEN MU14
                                             WHEN A.TAMANHO =15 THEN MU15 WHEN A.TAMANHO =16 THEN MU16
                                             WHEN A.TAMANHO =17 THEN MU17 WHEN A.TAMANHO =18 THEN MU18
                                             WHEN A.TAMANHO =19 THEN MU19 WHEN A.TAMANHO =20 THEN MU20 END
                           FROM TBMODELO_PEDIDO_COTA M WHERE M.MODELO_ID = A.MODELO_CODIGO),1) QTD_MULTIPLO,

               COALESCE((SELECT FIRST 1 T.STATUS FROM TBREMESSA_ITEM_TRATAMENTO T
                          WHERE T.ESTABELECIMENTO_ID = P.ESTABELECIMENTO_CODIGO
                            AND T.TABELA_ID = A.PEDIDO AND T.TAB_ITEM_ID = A.CONTROLE
                            AND T.STATUS = '1'),'0') REM_STATUS,
             
               COALESCE((SELECT SUM(G.NECESSIDADE)
                  FROM TBPEDIDO_CONSUMO G
                 WHERE G.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                   AND G.PEDIDO_ID = A.PEDIDO
                   AND G.PEDIDO_ITEM_ID = A.CONTROLE
                   AND G.TAMANHO_ITEM = A.TAMANHO),-1) MP,

                P.ESTABELECIMENTO_CODIGO,
                P.CLASSIFICACAO AS PERFIL_PED,
                P.DATA_ENTREGA AS DATA_AGRUPAMENTO,
                A.CONTROLE AS VPED_ITEM_ID,
                A.PERFIL_COR,
                (SELECT FIRST 1 PF.TRATAMENTO_PEDIDO_MP FROM TBPERFIL PF WHERE PF.TABELA = 'PED' AND PF.ID = P.CLASSIFICACAO) as TRATAMENTO_PEDIDO_MP,
                p.programado

         FROM TBPEDIDO P, TBPEDIDO_ITEM A
        WHERE P.PEDIDO = A.PEDIDO
          AND A.PEDIDO = :PEDIDO
          AND A.SITUACAO = 1
          AND A.TAMANHO > 0
          AND IIF( :PED_ITEM_ID > 0, A.CONTROLE = :PED_ITEM_ID, TRUE)

        INTO :DATA_CLIENTE,
             :DATA_EMISSAO,
             :DATA_PRODUCAO,
             :MODELO_CODIGO,
             :PRODUTO_CODIGO,
             :COR_ID,
             :PERFIL,
             :TAMANHO,
             :QTD_EST,
             :QTD_REM,
             :QTD_AGP,
             :EST_MIN,
             :CAP_PROD_SKU,
             :SALDO,
             :QTD_MINIMO,
             :QTD_MULTIPLO,
             :REM_STATUS,
             :MP,
             :ESTABELECIMENTO_ID,
             :PERFIL_PED,
             :DATA_AGRUPAMENTO,
             :VPED_ITEM_ID,
             :PERFIL_COR,
             :TRATAMENTO_PEDIDO_MP,
             :PROGRAMADO
        DO BEGIN
           IF (NOT QTD_MULTIPLO > 0) THEN
              QTD_MULTIPLO = 1;

           PRODUZIR = SALDO - (QTD_EST + QTD_REM + QTD_AGP);

           /* PEDIDOS DE AMOSTRAS */
           IF (REM_STATUS = '0' AND PRODUZIR > 0 AND EST_MIN = '0' AND TRATAMENTO_PEDIDO_MP = '2') THEN
               BEGIN

               if(PROGRAMADO = '0')then
               begin
                    AGRUPAMENTO_ID = COALESCE((SELECT FIRST 1 A.ID FROM TBAGRUPAMENTO A
                                            WHERE :DATA_AGRUPAMENTO BETWEEN A.DATA_INICIAL AND A.DATA_FINAL
                                              AND A.PERFIL = :PERFIL_PED AND A.STATUS = '1'
                                           ),0);
               end else
               begin
                   AGRUPAMENTO_ID = COALESCE((SELECT FIRST 1 A.ID FROM TBAGRUPAMENTO A
                                            WHERE :DATA_EMISSAO BETWEEN A.DATA_INICIAL AND A.DATA_FINAL
                                              AND A.PERFIL = :PERFIL_PED AND A.STATUS = '1'
                                           ),0);
               end

                IF (AGRUPAMENTO_ID > 0) THEN
                    BEGIN
                    INSERT INTO TBAGRUPAMENTO_PEDIDO (ESTABELECIMENTO_ID, AGRUPAMENTO_ID,
                    TABELA_ID, TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, TIPO,
                    SALDO, PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR)
                    VALUES (:ESTABELECIMENTO_ID, :AGRUPAMENTO_ID,
                    :PEDIDO, :VPED_ITEM_ID, :PRODUTO_CODIGO, :TAMANHO,
                    :PRODUZIR, 'P', :PRODUZIR, :PERFIL, 0, :PERFIL_COR, 0 );
                    END

               END ELSE

           /* PEDIDOS NORMAIS */
           IF (REM_STATUS = '0' AND PRODUZIR >= 0 AND EST_MIN = '0') THEN
               BEGIN

                    IF(CAP_PROD_SKU > 0)THEN
                    BEGIN
    
                        IF (PRODUZIR >= 0) THEN
                        BEGIN
                            select first 1
                                m.conf_agrupamento_id
                            from tbproduto p, tbmodelo m
                            where p.codigo = :PRODUTO_CODIGO
                            and m.codigo = p.modelo_codigo
                            into conf_agrupamento_id;
                    
                            modelo_codigo =  coalesce(modelo_codigo,0);
                            conf_agrupamento_id =  coalesce(conf_agrupamento_id,0);
                    
                            if(conf_agrupamento_id > 0)then
                            begin

                                EXECUTE PROCEDURE SPI_TRATA_PEDIDO_MULT_AGP(
                                     :conf_agrupamento_id,
                                     :PROGRAMADO,
                                     :PEDIDO,
                                     :PED_ITEM_ID,
                                     :DATA_PRODUCAO,
                                     :DATA_CLIENTE,
                                     :DATA_EMISSAO,
                                     :MODELO_CODIGO,
                                     :PRODUTO_CODIGO,
                                     :COR_ID,
                                     :PERFIL,
                                     :TAMANHO,
                                     :QTD_EST,
                                     :QTD_REM,
                                     :QTD_AGP,
                                     :EST_MIN,
                                     :SALDO,
                                     :QTD_MINIMO,
                                     :QTD_MULTIPLO,
                                     :REM_STATUS,
                                     :MP,
                                     :ESTABELECIMENTO_ID,
                                     :PERFIL_PED,
                                     :DATA_AGRUPAMENTO,
                                     :VPED_ITEM_ID,
                                     :PERFIL_COR,
                                     :TRATAMENTO_PEDIDO_MP,
                                     :PRODUZIR,
                                     :CAP_PROD_SKU,
                                     1
                                );
                            end else
                            begin
                                IF (PRODUZIR > 0) THEN
                                BEGIN
                                    EXECUTE PROCEDURE SPI_PEDIDO_AGP_CAP_PROD_SKU(
                                         :PROGRAMADO,
                                         :PEDIDO,
                                         :PED_ITEM_ID,
                                         :DATA_PRODUCAO,
                                         :DATA_CLIENTE,
                                         :DATA_EMISSAO,
                                         :MODELO_CODIGO,
                                         :PRODUTO_CODIGO,
                                         :PERFIL,
                                         :TAMANHO,
                                         :QTD_EST,
                                         :QTD_REM,
                                         :QTD_AGP,
                                         :EST_MIN,
                                         :CAP_PROD_SKU,
                                         :SALDO,
                                         :QTD_MINIMO,
                                         :QTD_MULTIPLO,
                                         :REM_STATUS,
                                         :MP,
                                         :ESTABELECIMENTO_ID,
                                         :PERFIL_PED,
                                         :DATA_AGRUPAMENTO,
                                         :VPED_ITEM_ID,
                                         :PERFIL_COR,
                                         :TRATAMENTO_PEDIDO_MP,
                                         :PRODUZIR
                                    );
                                 end
                            end

                        end
    
                    END ELSE
                    BEGIN

                        IF (PRODUZIR >= 0) THEN
                        BEGIN

                            select first 1
                                m.conf_agrupamento_id
                            from tbproduto p, tbmodelo m
                            where p.codigo = :PRODUTO_CODIGO
                            and m.codigo = p.modelo_codigo
                            into conf_agrupamento_id;
                    
                            modelo_codigo =  coalesce(modelo_codigo,0);
                            conf_agrupamento_id =  coalesce(conf_agrupamento_id,0);
                    
                            if(conf_agrupamento_id > 0)then
                            begin

                                EXECUTE PROCEDURE SPI_TRATA_PEDIDO_MULT_AGP(
                                     :conf_agrupamento_id,
                                     :PROGRAMADO,
                                     :PEDIDO,
                                     :PED_ITEM_ID,
                                     :DATA_PRODUCAO,
                                     :DATA_CLIENTE,
                                     :DATA_EMISSAO,
                                     :MODELO_CODIGO,
                                     :PRODUTO_CODIGO,
                                     :COR_ID,
                                     :PERFIL,
                                     :TAMANHO,
                                     :QTD_EST,
                                     :QTD_REM,
                                     :QTD_AGP,
                                     :EST_MIN,
                                     :SALDO,
                                     :QTD_MINIMO,
                                     :QTD_MULTIPLO,
                                     :REM_STATUS,
                                     :MP,
                                     :ESTABELECIMENTO_ID,
                                     :PERFIL_PED,
                                     :DATA_AGRUPAMENTO,
                                     :VPED_ITEM_ID,
                                     :PERFIL_COR,
                                     :TRATAMENTO_PEDIDO_MP,
                                     :PRODUZIR,
                                     :CAP_PROD_SKU,
                                     2
                                );
                            end else
                            begin
                                IF (PRODUZIR > 0) THEN
                                BEGIN
                                    EXECUTE PROCEDURE SPI_PEDIDO_AGP_TEMPO_PROD_SKU(
                                         :PROGRAMADO,
                                         :PEDIDO,
                                         :PED_ITEM_ID,
                                         :DATA_PRODUCAO,
                                         :DATA_CLIENTE,
                                         :DATA_EMISSAO,
                                         :MODELO_CODIGO,
                                         :PRODUTO_CODIGO,
                                         :COR_ID,
                                         :PERFIL,
                                         :TAMANHO,
                                         :QTD_EST,
                                         :QTD_REM,
                                         :QTD_AGP,
                                         :EST_MIN,
                                         :SALDO,
                                         :QTD_MINIMO,
                                         :QTD_MULTIPLO,
                                         :REM_STATUS,
                                         :MP,
                                         :ESTABELECIMENTO_ID,
                                         :PERFIL_PED,
                                         :DATA_AGRUPAMENTO,
                                         :VPED_ITEM_ID,
                                         :PERFIL_COR,
                                         :TRATAMENTO_PEDIDO_MP,
                                         :PRODUZIR
                                    );
                                end
                            end
                       end

                    END

               END
     END


END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_PEDIDO_AGP_TEMPO_PROD_SKU (
    PROGRAMADO varchar(1),
    PEDIDO integer,
    PED_ITEM_ID integer,
    DATA_PRODUCAO date,
    DATA_CLIENTE date,
    DATA_EMISSAO date,
    MODELO_CODIGO integer,
    PRODUTO_CODIGO integer,
    COR_ID integer,
    PERFIL varchar(40),
    TAMANHO integer,
    QTD_EST numeric(18,4),
    QTD_REM numeric(18,4),
    QTD_AGP numeric(18,4),
    EST_MIN char(4),
    SALDO numeric(18,4),
    QTD_MINIMO integer,
    QTD_MULTIPLO integer,
    REM_STATUS char(4),
    MP numeric(18,4),
    ESTABELECIMENTO_ID integer,
    PERFIL_PED varchar(10),
    DATA_AGRUPAMENTO date,
    VPED_ITEM_ID integer,
    PERFIL_COR varchar(10),
    TRATAMENTO_PEDIDO_MP char(1),
    PRODUZIR numeric(18,4),
    GP_ID_AGP integer = 0,
    TIPO_AGP varchar(10) = 'P',
    TIPO_DATA integer = 0,
    PRODUTO_ORIGEM integer = 0,
    CONJUNTO_MODELO_PAI integer = 0,
    CONJUNTO_PECA_ID integer = 0,
    TAMANHO_ORIGINAL integer = 0,
    PRODUTO_ORIGINAL integer = 0)
as
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_UP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable AGRUP_UP_TOTAL integer;
declare variable VTEMPO numeric(18,4);
declare variable CAP_PROD_SKU numeric(18,4);
BEGIN

    TAMANHO_ORIGINAL = coalesce(TAMANHO_ORIGINAL, TAMANHO);
    PRODUTO_ORIGEM = coalesce(:PRODUTO_ORIGEM,0);
    VSALDO = TRUNC(PRODUZIR);

    --exception "..." MP||' | '||coalesce(DATA_PRODUCAO,current_date)||' | '||coalesce(DATA_AGRUPAMENTO,current_date);

   IF (MP = 0) THEN --SE NãO HOUVER NECESSIDADE DE TECIDO (OU SEJA, O PROJETADO PARA O ITEM DO PEDIDO ESTá ALOCADO AO MESMO)
       BEGIN
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 6) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 06; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 7) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 05; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 1) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 11; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 2) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 10; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 3) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 09; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 4) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 08; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 5) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 07; END
       END ELSE
   IF (DATA_PRODUCAO IS NOT NULL) THEN
       BEGIN
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 6) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 06; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 7) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 07; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 1) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 01; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 2) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 02; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 3) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 03; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 4) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 04; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 5) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 05; END
       END ELSE
       BEGIN
           VDATA_PRODUCAO = :DATA_AGRUPAMENTO;
       END



   FOR

       select
            AGRUPAMENTO_ID,
            GP_ID
       FROM SPC_AGRUPAMENTO_DATA(:ESTABELECIMENTO_ID, :PROGRAMADO, :DATA_PRODUCAO, :VDATA_PRODUCAO, :DATA_CLIENTE, :DATA_EMISSAO, :GP_ID_AGP)
       where GP_ID > 0
       and iif(:TIPO_DATA = 1, (:DATA_AGRUPAMENTO between DATA_INICIAL_AGP and DATA_FINAL_AGP) or (DATA_INICIAL_AGP > :DATA_AGRUPAMENTO) , true)

    INTO :AGRUPAMENTO_ID,
         :GP_ID
    DO BEGIN

         IF (VSALDO > 0) THEN
         BEGIN

             SELECT
                coalesce(S.TOTAL,0) as TOTAL
             FROM SPC_TEMPO_GP_CONJUNTO(:GP_ID, :MODELO_CODIGO, :COR_ID, :TAMANHO, 1) S
             INTO :VTEMPO;

             if(VTEMPO <= 0)then
             begin
                exception "..." 'MODELO '||:MODELO_CODIGO||' SEM TEMPOS DEFINIDO, GP:'||GP_ID||', COR:'||COR_ID||', TAM:'||:TAMANHO||'';
             end

             CAP_PROD_SKU = VTEMPO;
             VQTD = VSALDO;

             IF (VQTD > 0 and VTEMPO > 0) THEN
             BEGIN

                FOR
                    SELECT FIRST 1 UP_ID,
                            SUM(DISP) OVER() AS AGRUP_UP_TOTAL
                    FROM (
                     SELECT X.UP_ID, X.AGRUP_UP_ID, X.SALDO,
                            CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                       FROM (
                             SELECT A.UP_ID, A.ID AGRUP_UP_ID, A.SALDO,
                                    CAST(TRUNC(A.SALDO / CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                               FROM (
                                    select distinct
                                        a.*
                                    from TBAGRUPAMENTO_CARGA_UP A, tbsub_up s
                                    WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                    and s.up_id = a.up_id
                                    and s.perfil_sku = :PERFIL
                                    AND A.SALDO > 0
                              ) A
                              ORDER BY A.SALDO DESC
                            ) X
                      )
                    WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD )
                    INTO :UP_ID,
                    :AGRUP_UP_TOTAL
                DO BEGIN

                    IF (UP_ID > 0) THEN
                    BEGIN
                    
                        IF (AGRUP_UP_TOTAL < VQTD) THEN
                        BEGIN
                            VQTD = AGRUP_UP_TOTAL;
                        END
                        
                        IF (VQTD > 0) THEN
                        BEGIN
                            
                            VAGR_PED_ID = GEN_ID(GTBAGRUPAMENTO_PEDIDO,1);
                            
                            INSERT INTO TBAGRUPAMENTO_PEDIDO (ESTABELECIMENTO_ID, AGRUPAMENTO_ID,
                                ID, TABELA_ID, TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, TIPO,
                                SALDO, PERFIL_SKU, NECESS_SKU, PRODUTO_ORIGEM, CONJUNTO_MODELO_PAI, CONJUNTO_PECA_ID, TAMANHO_ORIGINAL, PRODUTO_ORIGINAL)
                            VALUES (:ESTABELECIMENTO_ID, :AGRUPAMENTO_ID, :VAGR_PED_ID,
                                :PEDIDO, :VPED_ITEM_ID, :PRODUTO_CODIGO, :TAMANHO, :VQTD, :TIPO_AGP,
                                :VQTD, :PERFIL, :VQTD * :CAP_PROD_SKU, :PRODUTO_ORIGEM, :CONJUNTO_MODELO_PAI, :CONJUNTO_PECA_ID, :TAMANHO_ORIGINAL, :PRODUTO_ORIGINAL);
                            
                            VQTDGP = :VQTD;
                            VEXIT = FALSE;
                            
                            FOR
                                SELECT
                                    UP_ID,
                                    AGRUP_UP_ID,
                                    DISP
                                FROM (
                                    SELECT X.UP_ID, X.AGRUP_UP_ID, X.SALDO,
                                    CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                    FROM (
                                        SELECT A.UP_ID, A.ID AGRUP_UP_ID, A.SALDO,
                                            CAST(TRUNC(A.SALDO / CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                                        FROM (
                                            select distinct
                                                a.*
                                            from TBAGRUPAMENTO_CARGA_UP A, tbsub_up s
                                            WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and s.up_id = a.up_id
                                            and s.perfil_sku = :PERFIL
                                            AND A.SALDO > 0
                                        ) A
                                        ORDER BY A.SALDO DESC
                                    ) X
                                )
                                WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD )
                            INTO
                                :UP_ID,
                                :AGRUP_UP_ID,
                                :AGRUP_UP_DISP
                            DO BEGIN
                                IF(VEXIT = FALSE) THEN
                                BEGIN
                                
                                    IF(:VQTDGP > 0) THEN
                                    BEGIN
                                        IF (AGRUP_UP_DISP < VQTDGP) THEN
                                        BEGIN
                                            VQTDTEMP = :AGRUP_UP_DISP;
                                        END ELSE
                                        BEGIN
                                            VQTDTEMP = :VQTDGP;
                                        END
                                        
                                        INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (AGRUPAMENTO_ID,
                                        AGRUP_PED_ID,AGRUP_UP_ID,QUANTIDADE,NECESSIDADE, TIPO) VALUES (
                                        :AGRUPAMENTO_ID,:VAGR_PED_ID,:AGRUP_UP_ID,:VQTDTEMP,:VQTDTEMP * :CAP_PROD_SKU, 1);

                                        VQTDGP = :VQTDGP - :VQTDTEMP;
                                    END ELSE
                                    BEGIN
                                        VEXIT = TRUE;
                                    END
                                END
                            END
                            
                            VQTDFER = :VQTD;
                            VEXIT = FALSE;
                            
                            VSALDO = VSALDO - VQTD;
                        END
                    END
                END

            END
        END
    END

    --SALDO_RESTO = VSALDO;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPI_PEDIDO_AGP_TEMPO_PROD_SKU (
    PROGRAMADO varchar(1),
    PEDIDO integer,
    PED_ITEM_ID integer,
    DATA_PRODUCAO date,
    DATA_CLIENTE date,
    DATA_EMISSAO date,
    MODELO_CODIGO integer,
    PRODUTO_CODIGO integer,
    COR_ID integer,
    PERFIL varchar(40),
    TAMANHO integer,
    QTD_EST numeric(18,4),
    QTD_REM numeric(18,4),
    QTD_AGP numeric(18,4),
    EST_MIN char(4),
    SALDO numeric(18,4),
    QTD_MINIMO integer,
    QTD_MULTIPLO integer,
    REM_STATUS char(4),
    MP numeric(18,4),
    ESTABELECIMENTO_ID integer,
    PERFIL_PED varchar(10),
    DATA_AGRUPAMENTO date,
    VPED_ITEM_ID integer,
    PERFIL_COR varchar(10),
    TRATAMENTO_PEDIDO_MP char(1),
    PRODUZIR numeric(18,4),
    GP_ID_AGP integer = 0,
    TIPO_AGP varchar(10) = 'P',
    TIPO_DATA integer = 0,
    PRODUTO_ORIGEM integer = 0,
    CONJUNTO_MODELO_PAI integer = 0,
    CONJUNTO_PECA_ID integer = 0,
    TAMANHO_ORIGINAL integer = 0,
    PRODUTO_ORIGINAL integer = 0)
as
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_UP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable AGRUP_UP_TOTAL integer;
declare variable VTEMPO numeric(18,4);
declare variable CAP_PROD_SKU numeric(18,4);
BEGIN

    TAMANHO_ORIGINAL = coalesce(TAMANHO_ORIGINAL, TAMANHO);
    PRODUTO_ORIGEM = coalesce(:PRODUTO_ORIGEM,0);
    VSALDO = TRUNC(PRODUZIR);

    --exception "..." MP||' | '||coalesce(DATA_PRODUCAO,current_date)||' | '||coalesce(DATA_AGRUPAMENTO,current_date);

   IF (MP = 0) THEN --SE NãO HOUVER NECESSIDADE DE TECIDO (OU SEJA, O PROJETADO PARA O ITEM DO PEDIDO ESTá ALOCADO AO MESMO)
       BEGIN
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 6) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 06; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 7) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 05; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 1) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 11; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 2) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 10; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 3) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 09; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 4) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 08; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 5) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 07; END
       END ELSE
   IF (DATA_PRODUCAO IS NOT NULL) THEN
       BEGIN
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 6) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 06; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 7) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 07; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 1) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 01; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 2) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 02; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 3) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 03; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 4) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 04; END
           IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 5) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 05; END
       END ELSE
       BEGIN
           VDATA_PRODUCAO = :DATA_AGRUPAMENTO;
       END



   FOR

       select
            AGRUPAMENTO_ID,
            GP_ID
       FROM SPC_AGRUPAMENTO_DATA(:ESTABELECIMENTO_ID, :PROGRAMADO, :DATA_PRODUCAO, :VDATA_PRODUCAO, :DATA_CLIENTE, :DATA_EMISSAO, :GP_ID_AGP)
       where GP_ID > 0
       and iif(:TIPO_DATA = 1, (:DATA_AGRUPAMENTO between DATA_INICIAL_AGP and DATA_FINAL_AGP) or (DATA_INICIAL_AGP > :DATA_AGRUPAMENTO) , true)

    INTO :AGRUPAMENTO_ID,
         :GP_ID
    DO BEGIN

         IF (VSALDO > 0) THEN
         BEGIN

             SELECT
                coalesce(S.TOTAL,0) as TOTAL
             FROM SPC_TEMPO_GP_CONJUNTO(:GP_ID, :MODELO_CODIGO, :COR_ID, :TAMANHO, 1) S
             INTO :VTEMPO;

             if(VTEMPO <= 0)then
             begin
                exception "..." 'MODELO '||:MODELO_CODIGO||' SEM TEMPOS DEFINIDO, GP:'||GP_ID||', COR:'||COR_ID||', TAM:'||:TAMANHO||'';
             end

             CAP_PROD_SKU = VTEMPO;
             VQTD = VSALDO;

             IF (VQTD > 0 and VTEMPO > 0) THEN
             BEGIN

                FOR
                    SELECT FIRST 1 UP_ID,
                            SUM(DISP) OVER() AS AGRUP_UP_TOTAL
                    FROM (
                     SELECT X.UP_ID, X.AGRUP_UP_ID, X.SALDO,
                            CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                       FROM (
                             SELECT A.UP_ID, A.ID AGRUP_UP_ID, A.SALDO,
                                    CAST(TRUNC(A.SALDO / CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                               FROM (
                                    select distinct
                                        a.*
                                    from TBAGRUPAMENTO_CARGA_UP A, tbsub_up s
                                    WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                    and s.up_id = a.up_id
                                    and s.perfil_sku = :PERFIL
                                    AND A.SALDO > 0
                              ) A
                              ORDER BY A.SALDO DESC
                            ) X
                      )
                    WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD )
                    INTO :UP_ID,
                    :AGRUP_UP_TOTAL
                DO BEGIN

                    IF (UP_ID > 0) THEN
                    BEGIN
                    
                        IF (AGRUP_UP_TOTAL < VQTD) THEN
                        BEGIN
                            VQTD = AGRUP_UP_TOTAL;
                        END
                        
                        IF (VQTD > 0) THEN
                        BEGIN
                            
                            VAGR_PED_ID = GEN_ID(GTBAGRUPAMENTO_PEDIDO,1);
                            
                            INSERT INTO TBAGRUPAMENTO_PEDIDO (ESTABELECIMENTO_ID, AGRUPAMENTO_ID,
                                ID, TABELA_ID, TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, TIPO,
                                SALDO, PERFIL_SKU, NECESS_SKU, PRODUTO_ORIGEM, CONJUNTO_MODELO_PAI, CONJUNTO_PECA_ID, TAMANHO_ORIGINAL, PRODUTO_ORIGINAL)
                            VALUES (:ESTABELECIMENTO_ID, :AGRUPAMENTO_ID, :VAGR_PED_ID,
                                :PEDIDO, :VPED_ITEM_ID, :PRODUTO_CODIGO, :TAMANHO, :VQTD, :TIPO_AGP,
                                :VQTD, :PERFIL, :VQTD * :CAP_PROD_SKU, :PRODUTO_ORIGEM, :CONJUNTO_MODELO_PAI, :CONJUNTO_PECA_ID, :TAMANHO_ORIGINAL, :PRODUTO_ORIGINAL);
                            
                            VQTDGP = :VQTD;
                            VEXIT = FALSE;
                            
                            FOR
                                SELECT
                                    UP_ID,
                                    AGRUP_UP_ID,
                                    DISP
                                FROM (
                                    SELECT X.UP_ID, X.AGRUP_UP_ID, X.SALDO,
                                    CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                    FROM (
                                        SELECT A.UP_ID, A.ID AGRUP_UP_ID, A.SALDO,
                                            CAST(TRUNC(A.SALDO / CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                                        FROM (
                                            select distinct
                                                a.*
                                            from TBAGRUPAMENTO_CARGA_UP A, tbsub_up s
                                            WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and s.up_id = a.up_id
                                            and s.perfil_sku = :PERFIL
                                            AND A.SALDO > 0
                                        ) A
                                        ORDER BY A.SALDO DESC
                                    ) X
                                )
                                WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD )
                            INTO
                                :UP_ID,
                                :AGRUP_UP_ID,
                                :AGRUP_UP_DISP
                            DO BEGIN
                                IF(VEXIT = FALSE) THEN
                                BEGIN
                                
                                    IF(:VQTDGP > 0) THEN
                                    BEGIN
                                        IF (AGRUP_UP_DISP < VQTDGP) THEN
                                        BEGIN
                                            VQTDTEMP = :AGRUP_UP_DISP;
                                        END ELSE
                                        BEGIN
                                            VQTDTEMP = :VQTDGP;
                                        END
                                        
                                        INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (AGRUPAMENTO_ID,
                                        AGRUP_PED_ID,AGRUP_UP_ID,QUANTIDADE,NECESSIDADE, TIPO) VALUES (
                                        :AGRUPAMENTO_ID,:VAGR_PED_ID,:AGRUP_UP_ID,:VQTDTEMP,:VQTDTEMP * :CAP_PROD_SKU, 1);

                                        VQTDGP = :VQTDGP - :VQTDTEMP;
                                    END ELSE
                                    BEGIN
                                        VEXIT = TRUE;
                                    END
                                END
                            END
                            
                            VQTDFER = :VQTD;
                            VEXIT = FALSE;
                            
                            VSALDO = VSALDO - VQTD;
                        END
                    END
                END

            END
        END
    END

    --SALDO_RESTO = VSALDO;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_AGRUPAMENTO_DATA (
    ESTABELECIMENTO_ID integer,
    PROGRAMADO varchar(1),
    DATA_PRODUCAO date,
    VDATA_PRODUCAO date,
    DATA_CLIENTE date,
    DATA_EMISSAO date,
    GP_ID_AGP integer = 0)
returns (
    AGRUPAMENTO_ID integer,
    GP_ID integer,
    MINUTOS_PRODUTIVOS integer,
    DATA_INICIAL_AGP date,
    DATA_FINAL_AGP date)
as
declare variable ENCONTRADO integer;
begin

    if(PROGRAMADO = '0')then
    begin
        for
            SELECT
                  A.ID,
                  A.GP_ID,
                  A.MINUTOS_PRODUTIVOS,
                  A.DATA_INICIAL,
                  A.DATA_FINAL
             FROM TBAGRUPAMENTO A
            WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND A.SIMULACAO = '0'
              AND A.STATUS = '1'
              AND ((A.DATA_INICIAL <= :DATA_PRODUCAO AND A.DATA_FINAL >= :DATA_PRODUCAO) OR (A.DATA_FINAL   >= :VDATA_PRODUCAO))
              and iif(:GP_ID_AGP > 0, a.gp_id = :GP_ID_AGP, true)

            ORDER BY A.DATA_INICIAL, A.ID
        into
            :AGRUPAMENTO_ID,
            :GP_ID,
            :MINUTOS_PRODUTIVOS,
            :DATA_INICIAL_AGP,
            :DATA_FINAL_AGP
        do begin
            suspend;
        end
    end else
    begin

       ENCONTRADO = 0;

       FOR
            SELECT
                  A.ID,
                  A.GP_ID,
                  A.MINUTOS_PRODUTIVOS,
                  A.DATA_INICIAL,
                  A.DATA_FINAL
             FROM TBAGRUPAMENTO A
            WHERE A.ESTABELECIMENTO_ID  = :ESTABELECIMENTO_ID
              AND A.SIMULACAO           = '0'
              AND A.STATUS              = '1'
              AND A.DATA_INICIAL        >= :DATA_EMISSAO
              AND A.DATA_FINAL          <= DATEADD(DAY, CAST(COALESCE(FN_PARAMETRO('SISTEMA.QTD_DIAS_AGP_PROGRAMADO'),0) AS INTEGER) * -1, :DATA_CLIENTE)
              and iif(:GP_ID_AGP > 0, a.gp_id = :GP_ID_AGP, true)

            ORDER BY A.DATA_INICIAL DESC, A.ID
        INTO
            :AGRUPAMENTO_ID,
            :GP_ID,
            :MINUTOS_PRODUTIVOS,
            :DATA_INICIAL_AGP,
            :DATA_FINAL_AGP
        DO BEGIN
            ENCONTRADO = 1;
            SUSPEND;
        END

        for
            SELECT
                A.ID,
                A.GP_ID,
                A.MINUTOS_PRODUTIVOS,
                A.DATA_INICIAL,
                A.DATA_FINAL
            FROM TBAGRUPAMENTO A
            WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                AND A.SIMULACAO = '0'
                AND A.STATUS = '1'
                AND ((A.DATA_INICIAL <= :DATA_PRODUCAO AND A.DATA_FINAL >= :DATA_PRODUCAO) OR (A.DATA_FINAL   >= :VDATA_PRODUCAO))
                and iif(:GP_ID_AGP > 0, a.gp_id = :GP_ID_AGP, true)
            
            ORDER BY A.DATA_INICIAL, A.ID
        into
            :AGRUPAMENTO_ID,
            :GP_ID,
            :MINUTOS_PRODUTIVOS,
            :DATA_INICIAL_AGP,
            :DATA_FINAL_AGP
        do begin
            suspend;
        end
    end

end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbagrupamento_b0u_01 for tbagrupamento
active before update position 9
AS
DECLARE VARIABLE Agrup_Id Integer;
DECLARE VARIABLE Agrup_Desc VARCHAR(50);
DECLARE VARIABLE Pedidos Integer;
begin

   if (New.Simulacao <> Old.Simulacao or New.Data_Inicial <> Old.Data_Inicial or New.Data_Final <> Old.Data_Final) Then
       Begin
       if (New.Simulacao = '1') then
           Begin
            Pedidos = Coalesce((Select First 1 Id From TbAgrupamento_Pedido Where Agrupamento_Id = Old.Id and Tipo = 'P'),0);
            if (:Pedidos > 0) Then
                Begin
                Exception "..." 'TIPO DE AGRUPAMENTO NAO PODE SER ALTERADO, JA EXISTEM PEDIDOS VINCULADOS!'||
                                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                End
           End
       if (New.Simulacao = '0') then
           Begin
            Agrup_Id = Coalesce((Select First 1 Id From TbAgrupamento h
                                  Where ((Data_Inicial <= New.Data_Inicial and Data_Final >= New.Data_Inicial) or
                                         (Data_Inicial <= New.Data_Final and Data_Final >= New.Data_Final))
                                    and Simulacao = '0' and Id <> Old.Id and Perfil = New.Perfil
                                    and localizacao_Id = New.Localizacao_Id
                                    and h.gp_id = new.gp_id
                                    ),0);
            if (:Agrup_Id > 0) Then
                Begin
                Agrup_Desc = (Select First 1 Id||'-'||Descricao From TbAgrupamento Where Id = :Agrup_Id);
                Exception "..." 'PERIODO INFORMADO SOBREPONDO PERIODO DE OUTRO AGRUPAMENTO: '||:AGRUP_DESC||
                                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                End
           End
       End

end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b06iud for tbremessa_item_alocacao
active before insert or update or delete position 1
AS
declare variable GP_ID integer;
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable NEW_TEMPO numeric(15,4);
declare variable TOTALTEMPO numeric(15,4);
declare variable colaboradores numeric(15,4);
declare variable data_inicio_agrupamento date;
begin

  if(inserting)then
  begin
     if(new.TIPO_REMESSA = '22595')then
     begin

         select first 1
            u.programacao_esteira,
            u.setor_codigo,
            u.modelo_codigo,
            p.cor_codigo,
            u.tamanho,
            s.colaboradores
         from tbpedido_item_processado u, tbproduto p, tbprogramacao s
         where u.controle = new.talao
             and p.codigo = u.produto_codigo
             and s.tipo = 'D'
             and s.tabela_id = u.controle
             and s.remessa_id = u.remessa
         into GP_ID, UP_ID, MODELO_ID, COR_ID, TAMANHO, colaboradores;

         UP_ID = coalesce(UP_ID,0);

         if(UP_ID = 0)then
         begin
            exception "..." 'UP DO AGRUPAMENTO '||new.agrupamento_id||' NAO FOI ENCONTRADO.';
         end

         AGRUP_UP_ID = coalesce((select first 1 u.id from TBAGRUPAMENTO_CARGA_UP u where u.up_id = :UP_ID and u.agrupamento_id = new.agrupamento_id),0);

         if( AGRUP_UP_ID > 0 )then
         begin
             select
                s.TOTAL
             from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, NEW.quantidade) s
             into :TOTALTEMPO;
    
             NEW_TEMPO = coalesce(TOTALTEMPO,0);
    
             if(NEW_TEMPO = 0)then
             begin
                exception "..." 'TEMPO DO SKU NÃO ENCONTRADO, MODELO:'||:MODELO_ID||', COR:'||:COR_ID||', TAMANHO:'||:TAMANHO||', QUANTIDADE:'||NEW.quantidade||'';
             end
    
             INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (
                AGRUPAMENTO_ID,
                AGRUP_PED_ID,
                AGRUP_UP_ID,
                QUANTIDADE,
                NECESSIDADE,
                TIPO
             ) VALUES (
                new.agrupamento_id,
                new.id,
                :AGRUP_UP_ID,
                new.QUANTIDADE,
                :NEW_TEMPO,
                2
             );

          end
      end
  end

  if(updating)then
  begin
     if(new.TIPO_REMESSA = '22595' AND NEW.quantidade IS distinct FROM OLD.quantidade)then
     begin

         select first 1
            u.programacao_esteira,
            u.setor_codigo,
            u.modelo_codigo,
            p.cor_codigo,
            u.tamanho,
            s.colaboradores
         from tbpedido_item_processado u, tbproduto p, tbprogramacao s
         where u.controle = new.talao
             and p.codigo = u.produto_codigo
             and s.tipo = 'D'
             and s.tabela_id = u.controle
             and s.remessa_id = u.remessa
         into GP_ID, UP_ID, MODELO_ID, COR_ID, TAMANHO, colaboradores;

         if(UP_ID = 0)then
         begin
            exception "..." 'UP DO AGRUPAMENTO '||new.agrupamento_id||' NAO FOI ENCONTRADO.';
         end

         select
            s.TOTAL
         from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, NEW.quantidade) s
         into :TOTALTEMPO;

         NEW_TEMPO = coalesce(TOTALTEMPO,0);

         if( NEW_TEMPO > 0 )then
         begin
             UPDATE TBAGRUPAMENTO_CARGA_SKU_UP
                SET QUANTIDADE = NEW.quantidade, NECESSIDADE = :NEW_TEMPO
             WHERE TIPO = 2
             AND AGRUPAMENTO_ID = new.agrupamento_id
             AND AGRUP_PED_ID = new.id;
         end
      end

      if(new.TIPO_REMESSA = '22595' AND NEW.ENCERRADO IS distinct FROM OLD.ENCERRADO)then
      begin

         if(coalesce(NEW.ENCERRADO,0) = 0 and coalesce(OLD.ENCERRADO,0) = 1)then
         begin

            if(new.encerramento_tipo = 1)then
            begin
                NEW.SALDO = OLD.QTD_BAIXA;
                NEW.QTD_BAIXA = 0;
                NEW.saldo_baixa = 0;

                select first 1
                    u.programacao_esteira,
                    u.setor_codigo,
                    u.modelo_codigo,
                    p.cor_codigo,
                    u.tamanho,
                    s.colaboradores
                 from tbpedido_item_processado u, tbproduto p, tbprogramacao s
                 where u.controle = new.talao
                     and p.codigo = u.produto_codigo
                     and s.tipo = 'D'
                     and s.tabela_id = u.controle
                     and s.remessa_id = u.remessa
                 into GP_ID, UP_ID, MODELO_ID, COR_ID, TAMANHO, colaboradores;
        
                 UP_ID = coalesce(UP_ID,0);
        
                 if(UP_ID = 0)then
                 begin
                    exception "..." 'UP DO AGRUPAMENTO '||new.agrupamento_id||' NAO FOI ENCONTRADO.';
                 end
        
                 AGRUP_UP_ID = coalesce((select first 1 u.id from TBAGRUPAMENTO_CARGA_UP u where u.up_id = :UP_ID and u.agrupamento_id = new.agrupamento_id),0);
        
                 if( AGRUP_UP_ID > 0 )then
                 begin
                     select
                        s.TOTAL
                     from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, NEW.quantidade) s
                     into :TOTALTEMPO;
            
                     NEW_TEMPO = coalesce(TOTALTEMPO,0);
            
                     if(NEW_TEMPO = 0)then
                     begin
                        exception "..." 'TEMPO DO SKU NÃO ENCONTRADO, MODELO:'||:MODELO_ID||', COR:'||:COR_ID||', TAMANHO:'||:TAMANHO||', QUANTIDADE:'||NEW.quantidade||'';
                     end
            
                     INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (
                        AGRUPAMENTO_ID,
                        AGRUP_PED_ID,
                        AGRUP_UP_ID,
                        QUANTIDADE,
                        NECESSIDADE,
                        TIPO
                     ) VALUES (
                        new.agrupamento_id,
                        new.id,
                        :AGRUP_UP_ID,
                        new.QUANTIDADE,
                        :NEW_TEMPO,
                        2
                     );
                  end
              end

              new.encerramento_tipo = 0;
         end

         if(coalesce(NEW.ENCERRADO,0) = 1 and coalesce(OLD.ENCERRADO,0) = 0)then
         begin

             data_inicio_agrupamento = coalesce((select first 1 f.data_final from TBAGRUPAMENTO f where f.id = Old.Agrupamento_Id),'01.01.2000');

             if(current_date < data_inicio_agrupamento)then
             begin
                 new.encerramento_tipo = 1;

                 if(new.agrup_ped_id > 0)then
                 begin
                    agrup_up_id = coalesce((select first 1 AGRUP_UP_ID from TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUPAMENTO_ID = Old.agrupamento_id AND AGRUP_PED_ID = Old.id),0);
                    Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO_UP (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id, :agrup_up_id, Old.Quantidade);
                 end

                 NEW.QTD_BAIXA = NEW.saldo;
                 NEW.saldo = 0;
                 NEW.saldo_baixa = 0;
                 new.tabela_id = 0;
                 new.tab_item_id = 0;
                 new.agrup_ped_id = 0;
    
                 delete from TBAGRUPAMENTO_CARGA_SKU_UP
                 WHERE TIPO = 2
                 AND AGRUPAMENTO_ID = old.agrupamento_id
                 AND AGRUP_PED_ID = old.id;

             end ELSE
             begin
                new.encerramento_tipo = 2;
             end

         end

      end
  end

  if(deleting)then
  begin
     if(old.TIPO_REMESSA = '22595')then
     begin

         delete from TBAGRUPAMENTO_CARGA_SKU_UP
         WHERE TIPO = 2
         AND AGRUPAMENTO_ID = old.agrupamento_id
         AND AGRUP_PED_ID = old.id;

         DELETE FROM TBAGRUPAMENTO_PEDIDO G WHERE G.ID = OLD.AGRUP_PED_ID AND G.tipo = 'M';

      end
  end

end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b0i_01 for tbremessa_item_alocacao
active before insert position 0
AS
BEGIN

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

  NEW.TAB_ITEM_ID_OLD = NEW.TAB_ITEM_ID;
  NEW.origem_produto_id = IIF(new.tipo_remessa <> '22600' and new.tipo_remessa <> '22595', NEW.produto_id, coalesce(NEW.origem_produto_id,0));

END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b1i_02 for tbremessa_item_alocacao
active before insert position 2
AS
declare variable HISTORICO VARCHAR(500);
begin

    HISTORICO = '';

    if (New.Agrup_Ped_Id > 0) then
        Begin
        UPDATE tbagrupamento_pedido set
        Saldo = Saldo - New.Saldo
          Where Estabelecimento_Id = NEW.Estabelecimento_Id
            and Agrupamento_Id = NEW.Agrupamento_Id
            and Id = NEW.Agrup_Ped_Id
            and Produto_Id = NEW.ORIGEM_PRODUTO_ID
            and Tamanho = NEW.Tamanho
        --  and Tipo = 'P'
            and Saldo > 0;--New.Saldo;
        End

    if (New.Tabela_Id > 0 and New.Saldo > 0) then
        Begin

        if(new.tipo = 'P')then
        begin
            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem + New.Saldo
              Where Estabelecimento_Codigo = NEW.Estabelecimento_Id
                and Pedido = NEW.Tabela_Id
                and Controle = NEW.Tab_Item_Id
                and Produto_Codigo = NEW.ORIGEM_PRODUTO_ID
                and Tamanho = NEW.Tamanho;
        end

        HISTORICO = 'ALOC.REM ('||new.tipo||') - PED/ITEM:'||New.Tabela_Id||'/'||New.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(New.SALDO)||'/'||New.TAMANHO||'/'||NEW.LOCALIZACAO_ID||' REM/TALAO:'||New.REMESSA||'/'||New.TALAO||' AGRUP.'||New.AGRUPAMENTO_ID;
        End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', New.ORIGEM_PRODUTO_ID,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);


       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', NEW.Tabela_Id,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b1i_02 for tbremessa_item_alocacao
active before insert position 2
AS
declare variable HISTORICO VARCHAR(500);
begin

    HISTORICO = '';

    if (New.Agrup_Ped_Id > 0) then
        Begin
        UPDATE tbagrupamento_pedido set
        Saldo = Saldo - New.Saldo
          Where Estabelecimento_Id = NEW.Estabelecimento_Id
            and Agrupamento_Id = NEW.Agrupamento_Id
            and Id = NEW.Agrup_Ped_Id
            and Produto_Id = NEW.ORIGEM_PRODUTO_ID
            and Tamanho = NEW.Tamanho
        --  and Tipo = 'P'
            and Saldo > 0;--New.Saldo;
        End

    if (New.Tabela_Id > 0 and New.Saldo > 0) then
        Begin

        if(new.tipo = 'P')then
        begin
            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem + New.Saldo
              Where Estabelecimento_Codigo = NEW.Estabelecimento_Id
                and Pedido = NEW.Tabela_Id
                and Controle = NEW.Tab_Item_Id
                and Produto_Codigo = NEW.ORIGEM_PRODUTO_ID
                and Tamanho = NEW.Tamanho;
        end

        HISTORICO = 'ALOC.REM ('||new.tipo||') - PED/ITEM:'||New.Tabela_Id||'/'||New.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(New.SALDO)||'/'||New.TAMANHO||'/'||NEW.LOCALIZACAO_ID||' REM/TALAO:'||New.REMESSA||'/'||New.TALAO||' AGRUP.'||New.AGRUPAMENTO_ID;
        End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', New.ORIGEM_PRODUTO_ID,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);


       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', NEW.Tabela_Id,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End

End
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b1u_02 for tbremessa_item_alocacao
active before update position 3
AS
declare variable HISTORICO VARCHAR(500);
declare variable agrup_up_id integer;
begin

    HISTORICO = '';

  if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0 and Old.Quantidade > New.Quantidade) then
      Begin

          if(new.tipo_remessa <> '22600')then
          begin
            Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO4 (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id,Old.Quantidade-New.Quantidade);
          end else
          begin
             --agrup_up_id = coalesce((select first 1 AGRUP_UP_ID from TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUPAMENTO_ID = Old.agrupamento_id AND AGRUP_PED_ID = Old.id),0);
             --Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO_UP (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id, :agrup_up_id, Old.Quantidade-New.Quantidade);
          end

      End else
  if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0 and Old.Quantidade < New.Quantidade) then
      Begin
        Exception "..." 'QUANTIDADE DO TALAO NAO PODE SER ALTERADA PARA MAIOR! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      End

  if (Old.Tabela_Id > 0 and Old.Tabela_Id = New.Tabela_Id and Old.Saldo <> New.Saldo) then
      Begin
            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - (Old.Saldo-New.Saldo)
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.ORIGEM_PRODUTO_ID
                and Tamanho = Old.Tamanho;
      End else

  if (Old.Tabela_Id > 0 and New.Tabela_Id = 0) then
      Begin

       if(new.tipo = 'P')then
       begin
            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - Old.Saldo
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.ORIGEM_PRODUTO_ID
                and Tamanho = Old.Tamanho;
       end

       HISTORICO = 'DESALOC.REM. ('||new.tipo||') PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID;

      End else

  if (Old.Tabela_Id > 0 and New.Tabela_Id > 0 and Old.Tabela_Id <> New.Tabela_Id and /*Old.Saldo = New.Saldo and*/ New.Saldo > 0) then
      Begin

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - Old.Saldo
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.ORIGEM_PRODUTO_ID
                and Tamanho = Old.Tamanho;

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem + New.Saldo
              Where Estabelecimento_Codigo = NEW.Estabelecimento_Id
                and Pedido = NEW.Tabela_Id
                and Controle = NEW.Tab_Item_Id
                and Produto_Codigo = NEW.ORIGEM_PRODUTO_ID
                and Tamanho = NEW.Tamanho;

            HISTORICO = 'TRANSF.'||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID
                                 ||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID
                                 ||' *** PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id
                                 ||' -> '||NEW.Tabela_Id||'/'||New.Tab_item_Id;
      End

  if (Old.Tab_Item_Id = 0 and New.Tab_Item_Id > 0 and New.Tab_Item_Id_Old = 0) then
      Begin
         New.Tab_Item_Id_Old = New.Tab_Item_Id;
         New.Usuario = (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection);
      End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', OLD.ORIGEM_PRODUTO_ID,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);


       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', OLD.Tabela_Id,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);

          if (Old.Tabela_Id > 0 and New.Tabela_Id > 0 and Old.Tabela_Id <> New.Tabela_Id and New.Saldo > 0) then
              Begin
               INSERT INTO TBHISTORICO (
               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
              'TBPEDIDO_ALOCADO', NEW.Tabela_Id,
              (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
              (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
               :Historico);
               End

       End

End
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b1d_02 for tbremessa_item_alocacao
active before delete position 0
AS
declare variable HISTORICO VARCHAR(500);
declare variable agrup_up_id integer;
begin

    HISTORICO = '';

    if (Old.Tabela_Id > 0 and Old.Saldo > 0) then
        Begin

        if(old.TIPO = 'P')then
        begin
            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - Old.Saldo,
            Agp_Dt_Cli = Null,
            Agp_Dt_Prd = Null
              Where Estabelecimento_Codigo = OLD.Estabelecimento_Id
                and Pedido = OLD.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = OLD.ORIGEM_PRODUTO_ID
                and Tamanho = OLD.Tamanho;
        End

        HISTORICO = 'DESALOC.REM. ('||old.TIPO||') PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID;
        End

    if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0) then
        Begin
            if(OLD.tipo_remessa <> '22600')then
            begin
                Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO5 (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id,Old.Saldo);
            END else
            begin
                agrup_up_id = coalesce((select first 1 AGRUP_UP_ID from TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUPAMENTO_ID = old.agrupamento_id AND AGRUP_PED_ID = old.id),0);
                Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO_UP (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id, :agrup_up_id, Old.Saldo);
            end
        End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', OLD.ORIGEM_PRODUTO_ID,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);

       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', OLD.Tabela_Id,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End

End
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_ITEM_ALOCACAO_TALAO (
    AGRUPAMENTO_ID integer,
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer,
    TIPO_REMESSA varchar(10))
as
declare variable ITEM_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable TABELA_ID integer;
declare variable TAB_ITEM_ID integer;
declare variable REMESSA integer;
declare variable TALAO integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(18,5);
declare variable TIPO char(1);
declare variable SALDO numeric(18,5);
declare variable DATAHORA date;
declare variable USUARIO integer;
declare variable QUANTIDADE_ORIGINAL numeric(18,5);
declare variable VAGR_REM_ID integer;
declare variable TEMPO numeric(15,4);
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable ORIGEM_PRODUTO_ID integer;
declare variable TIPO_GP varchar(10);
begin

    --REMOVER AS BAIXA DE SALDO do talao
    FOR
        select
            s.id
        from TBREMESSA_ITEM_ALOCACAO s
        where s.remessa = :REMESSA_ID
        and s.talao = :REMESSA_TALAO_ID
    into
        :VAGR_REM_ID
    DO begin
        DELETE FROM TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUP_PED_ID = :VAGR_REM_ID;
    END

    --REMOVER A ALOCACAO Ddo talao
    DELETE FROM TBREMESSA_ITEM_ALOCACAO S WHERE s.remessa = :REMESSA_ID and s.talao = :REMESSA_TALAO_ID;


    TIPO_GP = coalesce((select first 1 g.tipo_agrupamento from tbpedido_item_processado p, tbgp g where p.controle = :REMESSA_TALAO_ID and g.id = p.PROGRAMACAO_ESTEIRA),'');

    if(TIPO_GP = '')then
    begin
        exception "..." 'TIPO DE AGRUPAMENTO DO GRUPO DE PRODUCAO NAO ENCONTRADO';
    end

    if(AGRUPAMENTO_ID > 0)then
    begin
        FOR
            select
                SETOR_CODIGO,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                TABELA_ID,
                TAB_ITEM_ID,
                REMESSA,
                TALAO,
                PRODUTO_ID,
                TAMANHO,
                QUANTIDADE,
                TIPO,
                SALDO,
                DATAHORA,
                USUARIO,
                QUANTIDADE_ORIGINAL,
                TEMPO,
                ORIGEM_PRODUTO_ID
            from(
                select
                    p.setor_codigo,
                    P.estabelecimento_codigo ESTABELECIMENTO_ID,
                    P.localizacao_codigo LOCALIZACAO_ID,
                    0 TABELA_ID,
                    0 TAB_ITEM_ID,
                    P.remessa REMESSA,
                    P.controle TALAO,
                    P.produto_codigo PRODUTO_ID,
                    p.tamanho TAMANHO,
                    p.quantidade_pedido QUANTIDADE,
                    :TIPO_GP TIPO,
                    p.quantidade_pedido SALDO,
                    current_date DATAHORA,
                    fn_current_user_id() USUARIO,
                    p.quantidade_pedido QUANTIDADE_ORIGINAL,
                    s.tempo * s.colaboradores as tempo,
                    P.remessa_acumulado_controle,
                    p.produto_codigo as ORIGEM_PRODUTO_ID
                FROM tbpedido_item_processado P, tbremessa R, tbprogramacao s
                WHERE P.remessa = :REMESSA_ID
                AND R.numero = P.remessa
                and s.remessa_id = p.remessa
                and s.tabela_id = p.controle
                and s.tipo = 'D'
                and coalesce(p.modelo_origem,0) = 0
                and p.peca_conjunto_id = 0
                and p.controle = :REMESSA_TALAO_ID
        
                union all
    
                select
                    p.setor_codigo,
                    P.estabelecimento_codigo ESTABELECIMENTO_ID,
                    P.localizacao_codigo LOCALIZACAO_ID,
                    0 TABELA_ID,
                    0 TAB_ITEM_ID,
                    P.remessa REMESSA,
                    P.controle TALAO,
                    k1.codigo PRODUTO_ID,
                    p.tamanho TAMANHO,
                    p.quantidade_pedido QUANTIDADE,
                    :TIPO_GP TIPO,
                    p.quantidade_pedido SALDO,
                    current_date DATAHORA,
                    fn_current_user_id() USUARIO,
                    p.quantidade_pedido QUANTIDADE_ORIGINAL,
                    s.tempo * s.colaboradores as tempo,
                    P.remessa_acumulado_controle,
                    coalesce(k2.codigo,0) as ORIGEM_PRODUTO_ID
                FROM tbremessa R, tbprogramacao s, tbproduto k1, tbpedido_item_processado P
                left join tbproduto k2 on k2.modelo_codigo = p.modelo_origem and p.cor_id = k2.cor_codigo

                WHERE P.remessa = :REMESSA_ID
                AND R.numero = P.remessa
                and s.remessa_id = p.remessa
                and s.tabela_id = p.controle
                and s.tipo = 'D'
                and k1.modelo_codigo = p.modelo_codigo
                and p.cor_id = k1.cor_codigo
                and p.peca_conjunto_id > 0
                and p.controle = :REMESSA_TALAO_ID

            ) ORDER BY remessa_acumulado_controle
        into
            UP_ID,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            TABELA_ID,
            TAB_ITEM_ID,
            REMESSA,
            TALAO,
            PRODUTO_ID,
            TAMANHO,
            QUANTIDADE,
            TIPO,
            SALDO,
            DATAHORA,
            USUARIO,
            QUANTIDADE_ORIGINAL,
            TEMPO,
            ORIGEM_PRODUTO_ID
        do begin
        
           VAGR_REM_ID = GEN_ID(Gtbremessa_item_alocacao,1);
            
           --AGRUP_UP_ID = coalesce((select first 1 u.id from TBAGRUPAMENTO_CARGA_UP u where u.up_id = :UP_ID and u.agrupamento_id = :AGRUPAMENTO_ID),0);
    
           --if(AGRUP_UP_ID = 0)then
           --begin
           --     exception "..." 'AGRUPAMENTO DA UP '||:UP_ID||' NAO FOI ENCONTRADO.';
           --end
    
           --BAIXAR SALDO
           --INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (AGRUPAMENTO_ID , AGRUP_PED_ID,  AGRUP_UP_ID,  QUANTIDADE, NECESSIDADE, TIPO) VALUES (:AGRUPAMENTO_ID, :VAGR_REM_ID, :AGRUP_UP_ID, :QUANTIDADE, :TEMPO, 2);
    
           --ALOCAR REMESSA
           INSERT INTO TBREMESSA_ITEM_ALOCACAO (
                ID,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                TABELA_ID,
                TAB_ITEM_ID,
                REMESSA,
                TALAO,
                PRODUTO_ID,
                TAMANHO,
                QUANTIDADE,
                TIPO,
                SALDO,
                USUARIO,
                AGRUPAMENTO_ID,
                TEMPO,
                QTD_BAIXA,
                SALDO_BAIXA,
                TIPO_REMESSA,
                ORIGEM_PRODUTO_ID
           ) VALUES (
                :VAGR_REM_ID,
                :ESTABELECIMENTO_ID,
                :LOCALIZACAO_ID,
                :TABELA_ID,
                :TAB_ITEM_ID,
                :REMESSA,
                :TALAO,
                :PRODUTO_ID,
                :TAMANHO,
                :QUANTIDADE,
                :TIPO,
                :SALDO,
                :USUARIO,
                :AGRUPAMENTO_ID,
                :TEMPO,
                0,
                0,
                :TIPO_REMESSA,
                :ORIGEM_PRODUTO_ID
           );
    
        end
    end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPC_CONJUNTO (
    MODELO_CODIGO integer,
    COR_CODIGO integer,
    TAMANHO_CODIGO integer)
returns (
    PECA_ID integer,
    MODELO_PAI_ID integer,
    MODELO_ID integer,
    PRODUTO_ID integer,
    FATOR_CONVERSAO numeric(15,4),
    TAMANHO integer,
    PERFIL_SKU varchar(10))
as
begin

  for
    select
        iif(j.CONJUNTO > 0, row_number() over(),0) PECA_ID,
        j.modelo_pai,
        j.MODELO_CODIGO,
        j.PRODUTO_ID,
        j.FATOR_CONVERSAO,
        j.TAMANHO,
        (select first 1 a.perfil from vwsku a where a.modelo_id = :MODELO_CODIGO and a.cor_id = :COR_CODIGO and a.tamanho = j.TAMANHO) as PERFIL_SKU
    from(
        select
            CONJUNTO,
            modelo_pai,
            MODELO_CODIGO,
            PRODUTO_ID,
            FATOR_CONVERSAO,
            TAMANHO,
            max(CONJUNTO) over() as COM_CONJUNTOS
        from(
            select
                1 as CONJUNTO,
                m.modelo_pai,
                m.codigo as MODELO_CODIGO,
                p.codigo as PRODUTO_ID,
                m.FATOR_CONVERSAO,
                coalesce((select first 1 g.tamanho_filho from tbmodelo_conjunto_grade g where g.modelo_pai_id = m.modelo_pai and g.modelo_filho_id = m.codigo and g.tamanho_pai = :TAMANHO_CODIGO),:TAMANHO_CODIGO) as TAMANHO
            
            from tbmodelo m, tbproduto p
            where m.modelo_pai = :MODELO_CODIGO
            and m.modelo_pai <> m.codigo
            and m.status = '1'
            and p.modelo_codigo = m.codigo
            and p.cor_codigo = :COR_CODIGO
            
            union all
            
            select
                0 as CONJUNTO,
                0 as modelo_pai,
                m.codigo as MODELO_CODIGO,
                p.codigo as PRODUTO_ID,
                coalesce(m.FATOR_CONVERSAO,1) as FATOR_CONVERSAO,
                cast(:TAMANHO_CODIGO as integer) as TAMANHO
            
            from tbmodelo m, tbproduto p
            where m.codigo = :MODELO_CODIGO
            and m.status = '1'
            and p.modelo_codigo = m.codigo
            and p.cor_codigo = :COR_CODIGO
        ) order by FATOR_CONVERSAO desc, MODELO_CODIGO
    ) j where COM_CONJUNTOS = CONJUNTO
  into
    PECA_ID,
    MODELO_PAI_ID,
    MODELO_ID,
    PRODUTO_ID,
    FATOR_CONVERSAO,
    TAMANHO,
    PERFIL_SKU
  do begin
    suspend;
  end

end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbagrupamento_pedido_a1d_01 for tbagrupamento_pedido
active after delete position 0
AS
begin
  if(coalesce(old.conjunto_peca_id,0) > 0)then
  begin
    delete from TBAGRUPAMENTO_PEDIDO p where p.tabela_id = old.tabela_id and p.tab_item_id = old.tab_item_id and p.conjunto_modelo_pai = old.conjunto_modelo_pai and p.id <> old.id;
  end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbagrupamento_pedido_b1i_02 for tbagrupamento_pedido
active before insert position 1
AS
declare variable HISTORICO VARCHAR(500);
declare variable Produto_original integer;
begin

    HISTORICO = '';

    if (New.Tipo = 'P' and New.Saldo > 0) then
        Begin

            if(coalesce(new.conjunto_peca_id,0) > 0)then
            begin
                if(new.conjunto_peca_id = 1)then
                begin
                    UPDATE tbpedido_item set
                    Qtd_Agp = Qtd_Agp + New.Saldo
                      Where Estabelecimento_Codigo = NEW.Estabelecimento_Id
                        and Pedido = NEW.Tabela_Id
                        and Controle = NEW.Tab_Item_Id
                        and Produto_Codigo = NEW.Produto_original
                        and Tamanho = NEW.tamanho_original;
                end
            end else
            begin
                UPDATE tbpedido_item set
                Qtd_Agp = Qtd_Agp + New.Saldo
                  Where Estabelecimento_Codigo = NEW.Estabelecimento_Id
                    and Pedido = NEW.Tabela_Id
                    and Controle = NEW.Tab_Item_Id
                    and Produto_Codigo = NEW.Produto_Id
                    and Tamanho = NEW.Tamanho;
            end

          HISTORICO = 'ALOC.AGP. PED/ITEM:'||NEW.Tabela_Id||'/'||NEW.Tab_item_Id||' QTD/TAM.'||TRUNC(NEW.SALDO)||'/'||NEW.TAMANHO;
        End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', NEW.PRODUTO_ID,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);

       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', NEW.Tabela_Id,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End

End
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbagrupamento_pedido_b1u_02 for tbagrupamento_pedido
active before update position 1
AS
begin
  if (Old.Saldo <> New.Saldo) then
      Begin

      if (Old.Saldo > 0 and New.Saldo = 0) then
          Begin
              DELETE FROM TBAGRUPAMENTO_CONSUMO WHERE
              ESTABELECIMENTO_ID   = OLD.ESTABELECIMENTO_ID
              AND AGRUPAMENTO_ID   = OLD.AGRUPAMENTO_ID
              AND AGRUP_PEDIDO_ID  = OLD.ID 
              AND AGRUP_CONSUMO_ID = 0;
          End

        if (New.Tipo = 'P') then
            Begin
                if(coalesce(new.conjunto_peca_id,0) > 0)then
                begin
                    if(new.conjunto_peca_id = 1)then
                    begin
                        UPDATE tbpedido_item set
                        Qtd_Agp = Qtd_Agp - (Old.Saldo-New.Saldo)
                          Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                            and Pedido = Old.Tabela_Id
                            and Controle = Old.Tab_Item_Id
                            and Produto_Codigo = Old.produto_original
                            and Tamanho = Old.tamanho_original;
                    end
                end else
                begin
                    UPDATE tbpedido_item set
                    Qtd_Agp = Qtd_Agp - (Old.Saldo-New.Saldo)
                      Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                        and Pedido = Old.Tabela_Id
                        and Controle = Old.Tab_Item_Id
                        and Produto_Codigo = Old.Produto_Id
                        and Tamanho = Old.Tamanho;
                end
            End
      End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbagrupamento_pedido_b1d_02 for tbagrupamento_pedido
active before delete position 1
AS
declare variable HISTORICO VARCHAR(500);
begin

    HISTORICO = '';

if (Old.Id > 0) Then
    Begin

    if (Old.Tipo = 'P' and Old.Saldo > 0) then
        Begin
            if(coalesce(Old.conjunto_peca_id,0) > 0)then
            begin
                if(Old.conjunto_peca_id = 1)then
                begin
                    UPDATE tbpedido_item set
                    Qtd_Agp = Qtd_Agp - Old.Saldo,
                    Agp_Dt_Cli = Null,
                    Agp_Dt_Prd = Null
                      Where Estabelecimento_Codigo = OLD.Estabelecimento_Id
                        and Pedido = OLD.Tabela_Id
                        and Controle = Old.Tab_Item_Id
                        and Produto_Codigo = OLD.produto_original
                        and Tamanho = OLD.tamanho_original;
                end
            end else
            begin
                UPDATE tbpedido_item set
                Qtd_Agp = Qtd_Agp - Old.Saldo,
                Agp_Dt_Cli = Null,
                Agp_Dt_Prd = Null
                  Where Estabelecimento_Codigo = OLD.Estabelecimento_Id
                    and Pedido = OLD.Tabela_Id
                    and Controle = Old.Tab_Item_Id
                    and Produto_Codigo = OLD.Produto_Id
                    and Tamanho = OLD.Tamanho;
           end

          HISTORICO = 'DESALOC.AGRUP. PED/ITEM:'||OLD.Tabela_Id||'/'||OLD.Tab_item_Id||' QTD/TAM.'||TRUNC(Old.SALDO)||'/'||Old.TAMANHO;
        End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', Old.PRODUTO_ID,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);

       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', OLD.Tabela_Id,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End

      DELETE FROM TBAGRUPAMENTO_CARGA_SKU_UP
      WHERE AGRUPAMENTO_ID = OLD.AGRUPAMENTO_ID
        AND AGRUP_PED_ID = OLD.ID
        and TIPO = 1;

      DELETE FROM TBAGRUPAMENTO_CARGA_SKU_GP
      WHERE AGRUPAMENTO_ID = OLD.AGRUPAMENTO_ID
        AND AGRUP_PED_ID = OLD.ID;
    
      DELETE FROM TBAGRUPAMENTO_CARGA_SKU_FER
      WHERE AGRUPAMENTO_ID = OLD.AGRUPAMENTO_ID
        AND AGRUP_PED_ID = OLD.ID;
    
    --  DELETE FROM TBAGRUPAMENTO_CARGA_SKU_COR
   --   WHERE AGRUPAMENTO_ID = OLD.AGRUPAMENTO_ID
     --   AND AGRUP_PED_ID = OLD.ID;

    End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_TEMPO_GP_CONJUNTO (
    GP_ID numeric(15,4),
    MODELO_ID numeric(15,4),
    COR_ID numeric(15,4),
    TAMANHO numeric(15,4),
    QUANTIDADE numeric(15,4))
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 TTEMPOSETUP numeric(15,4);
declare variable TTEMPOSETCOR numeric(15,4);
declare variable TTEMPOREB numeric(15,4);
declare variable TTEMPOPROCESSO numeric(15,4);
declare variable TTOTALSETUP numeric(15,4);
declare variable TTOTALPROCESSO numeric(15,4);
declare variable TTOTAL numeric(15,4);
declare variable TQUANTIDADE_OPERADOR numeric(15,4);
declare variable FATOR_CONVERSAO numeric(15,4);
Begin

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

    for
        select
            h.modelo_id,
            :COR_ID as COR_ID,
            h.TAMANHO,
            h.fator_conversao
        from SPC_CONJUNTO(:MODELO_ID, :COR_ID, :TAMANHO) h
    into
        MODELO_ID,
        COR_ID,
        TAMANHO,
        FATOR_CONVERSAO
    do begin

        SELECT
            TEMPOSETUP,
            TEMPOSETCOR,
            TEMPOREB,
            TEMPOPROCESSO,
            TOTALSETUP,
            TOTALPROCESSO,
            TOTAL,
            QUANTIDADE_OPERADOR
        FROM SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, :QUANTIDADE) S
        INTO
            TTEMPOSETUP,
            TTEMPOSETCOR,
            TTEMPOREB,
            TTEMPOPROCESSO,
            TTOTALSETUP,
            TTOTALPROCESSO,
            TTOTAL,
            TQUANTIDADE_OPERADOR;

            TEMPOSETUP          = TEMPOSETUP            + (FATOR_CONVERSAO * coalesce(TTEMPOSETUP,0));
            TEMPOSETCOR         = TEMPOSETCOR           + (FATOR_CONVERSAO * coalesce(TTEMPOSETCOR,0));
            TEMPOREB            = TEMPOREB              + (FATOR_CONVERSAO * coalesce(TTEMPOREB,0));
            TEMPOPROCESSO       = TEMPOPROCESSO         + (FATOR_CONVERSAO * coalesce(TTEMPOPROCESSO,0));
            TOTALSETUP          = TOTALSETUP            + (FATOR_CONVERSAO * coalesce(TTOTALSETUP,0));
            TOTALPROCESSO       = TOTALPROCESSO         + (FATOR_CONVERSAO * coalesce(TTOTALPROCESSO,0));
            TOTAL               = TOTAL                 + (FATOR_CONVERSAO * coalesce(TTOTAL,0));
            QUANTIDADE_OPERADOR = QUANTIDADE_OPERADOR   + (FATOR_CONVERSAO * coalesce(TQUANTIDADE_OPERADOR,0));

    end

   suspend;
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATA_PEDIDO_REMESSA6 (
    PEDIDO_1 integer,
    ALOCDESALOC char(1))
returns (
    ESTABELECIMENTO_ID integer,
    PEDIDO integer,
    CONTROLE integer,
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer,
    TAMANHO integer,
    PERFIL_SKU varchar(10),
    PERFIL_COR varchar(10),
    REM_STATUS char(1),
    QTD_PRD numeric(15,4),
    REMESSA integer,
    TALAO integer,
    AGRUPAMENTO_ID integer,
    AGRUP_PED_ID integer,
    ID integer,
    QTD_DISP numeric(15,4),
    QTD_MULT integer)
as
declare variable VQTD_PRD integer;
declare variable VQTD_DISP integer;
declare variable ALOC_MULT char(1);
declare variable TIPO_REMESSA varchar(20);
declare variable OUTRO_PRODUTO_ID integer;
declare variable CONF_AGRUPAMENTO_ID integer;
declare variable MODELO_CODIGO integer;
declare variable COR_ID integer;
declare variable QTD_SALDO numeric(15,4);
declare variable PRODUTO_ORIGEM integer;
declare variable TAMANHO_ORIGEM integer;
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

    FOR 
       Select
           A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
           A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,
    
           Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                      Where T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Status = '1'),'0') Rem_Status,
    
           Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                      Where C.Pedido = A.Pedido
                        and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
           -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

           Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                      Where C.Pedido = A.Pedido
                        and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
           -A.Qtd_Est AS QTD_SALDO,
    
           Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                    IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                    IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                    IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                    IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                    IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                    IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                    IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                    IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                    IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                    1))))))))))))))))))))
                       From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult
    
    
      From TbPedido_Item A
     Where Pedido = :Pedido_1
       and Situacao = 1
       and Tamanho > 0
     --For Update
       With Lock
    
    Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
         :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :QTD_SALDO, :Qtd_Mult
    Do begin

    if (:Rem_Status = '0') then
         Begin

          if (:AlocDesaloc = 'D') then
              Begin

                Update tbremessa_item_alocacao Set
                Tabela_Id = 0,
                Tab_Item_Id = 0
                Where Estabelecimento_id = :Estabelecimento_Id
                  and Tabela_id =  :Pedido
                  and Tab_item_id = :Controle
                --and Tipo = 'P'
                  and iif(tipo_remessa = '22595', TAMANHO_ORIGEM = :Tamanho, Tamanho = :Tamanho)
                  and Saldo > 0;
    
                Delete from TbAgrupamento_Pedido 
                Where Estabelecimento_id = :Estabelecimento_Id
                  and Tabela_Id = :Pedido
                  and Tab_Item_Id = :Controle
                  and Saldo = 0
                  and Tipo = 'M';
    
                Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
              End
            
          if (:AlocDesaloc = 'A') then
          Begin
    
           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End
    
           if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End
    
            if (:vQtd_Prd > 0) then
              Begin
    
                /* verifica se tem multiplos agrupamentos*/
                select first 1
                    m.conf_agrupamento_id,
                    m.codigo,
                    p.cor_codigo
                from tbproduto p, tbmodelo m
                where p.codigo = :produto_id
                and m.codigo = p.modelo_codigo
                into conf_agrupamento_id, MODELO_CODIGO, :COR_ID;
    
                conf_agrupamento_id =  coalesce(conf_agrupamento_id,0);
    
                if(conf_agrupamento_id = 0)then
                begin
                  Agrup_Ped_Id = 0;
    
                  For
                    Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo, b.TIPO_REMESSA, b.produto_id as OUTRO_PRODUTO_ID, b.produto_origem, b.tamanho_origem
                    From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                    Where B.Estabelecimento_Id = :Estabelecimento_Id
                    and B.Remessa = R.Numero
                    and B.Localizacao_Id = :Localizacao_Id
                    and B.Tabela_Id = 0
                    and B.TAMANHO = :Tamanho
                    and B.Status = '1'
                    and B.ORIGEM_PRODUTO_ID = :Produto_Id
                    and A.Remessa = B.Remessa
                    and A.Controle = B.Talao
                    and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                    and a.estoque_id = 0
                    and R.ORIGEM <> 22599
                    AND ((A.SITUACAO < 3) OR (R.ORIGEM = 22600 AND A.SITUACAO < 6))
    
                    and A.Data_Expedicao is Null
                    and B.Saldo >= :Qtd_Mult
                    Order By R.Data
    
                    Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp, :TIPO_REMESSA, :OUTRO_PRODUTO_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM
                    Do Begin
                       :PRODUTO_ORIGEM = null;--coalesce(PRODUTO_ORIGEM, Produto_Id);
                       :TAMANHO_ORIGEM = null;--coalesce(TAMANHO_ORIGEM, Tamanho);

                          if (:ID > 0) then
                               Begin
    
                                    vQtd_Disp = :Qtd_Disp;
                                    --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                    if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                        Begin
                                         :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                        End
                
                                    if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                        Begin
                        
                                        IF (:vQtd_Prd < :vQtd_Disp) Then
                                           Begin
                                            if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                                Begin
                                                Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd, QUANTIDADE = QUANTIDADE - :vQtd_Prd
                                                Where Estabelecimento_Id = :Estabelecimento_Id
                                                and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                and Id = :Id;
                
                
                                                if (:Agrup_Ped_Id = 0) then
                                                    Begin
                                                        Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
                
                                                        INSERT INTO TbAgrupamento_Pedido (
                                                        Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                        TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                        SALDO, TIPO, REMESSA,
                                                        PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR, PRODUTO_ORIGINAL, TAMANHO_ORIGINAL) VALUES (
                                                        :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                        :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                        0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                                    End else
                                                    Begin
                                                        UPDATE TbAgrupamento_Pedido SET
                                                        Quantidade = Quantidade + :vQtd_Prd
                                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                                        and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                        and ID = :Agrup_Ped_Id
                                                        and TABELA_ID = :Pedido
                                                        and TAB_ITEM_ID = :Controle
                                                        and Tipo = 'M';
                                                    End
                
                                                Insert into TBREMESSA_ITEM_ALOCACAO (
                                                estabelecimento_id, tabela_id, tab_item_id, tipo,
                                                localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                                Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA, ORIGEM_PRODUTO_ID, PRODUTO_ORIGEM, TAMANHO_ORIGEM)
                                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                                :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Prd,
                                                :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                                End
                
                                            vQtd_Prd = 0;
                
                                            Delete From TbPedido_Consumo
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                              and Pedido_Id = :Pedido
                                              and Pedido_Item_Id = :Controle
                                              and Tamanho_Item = :Tamanho
                                              and Tipo = 'C';
                
                                            --Exit;
                                           End else
                                        IF (:vQtd_Prd >= :vQtd_Disp) Then
                                           Begin
                                            if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                                Begin
                                                DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                                Where Estabelecimento_Id = :Estabelecimento_Id
                                                and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                and Id = :Id;
                
                                                if (:Agrup_Ped_Id = 0) then
                                                    Begin
                                                        Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
                
                                                        INSERT INTO TbAgrupamento_Pedido (
                                                        Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                        TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                        SALDO, TIPO, REMESSA,
                                                        PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR, PRODUTO_ORIGINAL, TAMANHO_ORIGINAL) VALUES (
                                                        :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                        :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                        0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                                    End else
                                                    Begin
                                                        UPDATE TbAgrupamento_Pedido SET
                                                        Quantidade = Quantidade + :vQtd_Disp
                                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                                        and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                        and ID = :Agrup_Ped_Id
                                                        and TABELA_ID = :Pedido
                                                        and TAB_ITEM_ID = :Controle
                                                        and Tipo = 'M';
                                                    End
                
                                                Insert into TBREMESSA_ITEM_ALOCACAO (
                                                estabelecimento_id, tabela_id, tab_item_id, tipo,
                                                localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                                Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA, ORIGEM_PRODUTO_ID, PRODUTO_ORIGEM, TAMANHO_ORIGEM)
                                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                                :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Disp,
                                                :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID, :PRODUTO_ORIGEM, :TAMANHO_ORIGEM);
                                                End
                
                                            vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
                
                                            Delete From TbPedido_Consumo
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                              and Pedido_Id = :Pedido
                                              and Pedido_Item_Id = :Controle
                                              and Tamanho_Item = :Tamanho
                                              and Tipo = 'C';
                                           End
                        
                                       End
                                  End
                              End
                        End else
                        begin
                            
                            vQtd_Prd = :QTD_SALDO;

                            if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                            Begin
                                :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
                            End
                            
                            if (:aloc_mult <> '1') Then
                            Begin
                                Qtd_Mult = 1;
                            End
                    
                            if (:vQtd_Prd > 0) then
                            Begin

                                EXECUTE PROCEDURE SPI_TRATA_PEDIDO_MULT_TAL(
                                     :conf_agrupamento_id,
                                     :PEDIDO,
                                     :Controle,
                                     NULL,
                                     :MODELO_CODIGO,
                                     :produto_id,
                                     :COR_ID,
                                     :Perfil_Sku,
                                     :TAMANHO,
                                     :vQtd_Prd,
                                     :qtd_mult,
                                     :ESTABELECIMENTO_ID,
                                     current_date,
                                     :PERFIL_COR,
                                     :vQtd_Prd,
                                     :produto_id,
                                     :TAMANHO
                                );
    
                                --exception "..." 'TRATAMENTO DE PEDIDOS COM MULTIPLOS AGRUPAMENTOS NÃO CONFIGURADO';
                           END
                        end
                    end
               End
         End
     end
End
^

SET TERM ; ^

