CREATE OR ALTER PROCEDURE SPI_TRATA_PEDIDO_AGRUP_PROG (
    PEDIDO INTEGER,
    PED_ITEM_ID INTEGER)
AS
DECLARE VARIABLE DATA_CLIENTE       DATE;
DECLARE VARIABLE DATA_EMISSAO       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 ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE PERFIL_PED         VARCHAR(10);
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 VAGR_PED_ID        INTEGER;
DECLARE VARIABLE VAGRUP_FER_ID      INTEGER;
DECLARE VARIABLE VEXIT              BOOLEAN;
Begin
    For
        SELECT -- A.DATA_PRODUCAO,
                P.DATA_CLIENTE,
                P.DATA,
                A.MODELO_CODIGO,
             -- A.COR_ID,
                A.PRODUTO_CODIGO,
                A.PERFIL,
             -- A.LOCALIZACAO_ID,
                A.TAMANHO,
                A.QTD_EST,
                A.QTD_REM,
                A.QTD_AGP,
                A.EST_MIN,
             -- A.COR_COND,
               (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,
             /*
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=1,PF.PZOI1_PED_D1,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=2,PF.PZOI1_PED_D2,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=3,PF.PZOI1_PED_D3,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=4,PF.PZOI1_PED_D4,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=5,PF.PZOI1_PED_D5,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=6,PF.PZOI1_PED_D6,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=7,PF.PZOI1_PED_D7,0))))))) PZO_PROD_COR_ESTIND,
        
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=1,PF.PZOI2_PED_D1,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=2,PF.PZOI2_PED_D2,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=3,PF.PZOI2_PED_D3,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=4,PF.PZOI2_PED_D4,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=5,PF.PZOI2_PED_D5,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=6,PF.PZOI2_PED_D6,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=7,PF.PZOI2_PED_D7,0))))))) PZO_CLI_COR_ESTIND,
        
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=1,PF.PZO1_PED_D1,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=2,PF.PZO1_PED_D2,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=3,PF.PZO1_PED_D3,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=4,PF.PZO1_PED_D4,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=5,PF.PZO1_PED_D5,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=6,PF.PZO1_PED_D6,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=7,PF.PZO1_PED_D7,0))))))) PZO_PROD_COR_ESTDISP,
        
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=1,PF.PZO2_PED_D1,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=2,PF.PZO2_PED_D2,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=3,PF.PZO2_PED_D3,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=4,PF.PZO2_PED_D4,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=5,PF.PZO2_PED_D5,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=6,PF.PZO2_PED_D6,
               IIF(EXTRACT(WEEKDAY FROM :DATA)+1=7,PF.PZO2_PED_D7,0))))))) PZO_CLI_COR_ESTDISP,

               CAST(COALESCE((SELECT FIRST 1 SUM(PC.NECESSIDADE) FROM TBPEDIDO_CONSUMO PC
                 WHERE A.ESTABELECIMENTO_CODIGO = PC.ESTABELECIMENTO_ID
                   AND A.PEDIDO = PC.PEDIDO_ID
                   AND A.CONTROLE = PC.PEDIDO_ITEM_ID
                   AND PC.TAMANHO_ITEM = A.TAMANHO
                   AND PC.NECESSIDADE > 0),0.0000) AS NUMERIC(15,4)) NECESSIDADE_MP,
               
               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

         FROM TBPEDIDO P, TBPEDIDO_ITEM A
    --     LEFT JOIN TBPERFIL PF ON A.PERFIL = PF.ID AND PF.TABELA = 'SKU'
        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_PRODUCAO,
             :DATA_CLIENTE,
             :DATA_EMISSAO,
             :MODELO_CODIGO,
           --:COR_ID,
             :PRODUTO_CODIGO,
             :PERFIL,
           --:LOCALIZACAO_ID,
             :TAMANHO,
             :QTD_EST,
             :QTD_REM,
             :QTD_AGP,
             :EST_MIN,
           --:COR_COND,
             :CAP_PROD_SKU,
             :SALDO,
             :QTD_MINIMO,
             :QTD_MULTIPLO,
             :REM_STATUS,
           --:PZO_PROD_COR_ESTIND,
           --:PZO_CLI_COR_ESTIND,
           --:PZO_PROD_COR_ESTDISP,
           --:PZO_CLI_COR_ESTDISP,
           --:NECESSIDADE_MP,
           --:MP,
             :ESTABELECIMENTO_ID,
             :PERFIL_PED,
             --:DATA_AGRUPAMENTO,
             :vPED_ITEM_ID
        DO BEGIN
           IF (NOT QTD_MULTIPLO > 0) THEN
              QTD_MULTIPLO = 1;

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

           IF (REM_STATUS = '0' AND PRODUZIR > 0 AND EST_MIN = '0' AND CAP_PROD_SKU > 0) THEN
               BEGIN
               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
                 */

                       FOR
                       SELECT A.ID,
                              A.MINUTOS_PRODUTIVOS
                          --  A.SEMANA,
                          --  A.DATA_INICIAL,
                          --  A.DATA_FINAL,
                          /*  (SELECT SUM(B.SALDO) FROM TBAGRUPAMENTO_PEDIDO B
                                WHERE B.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_ID
                                  AND B.AGRUPAMENTO_ID = A.ID
                                  AND B.TABELA_ID = :PEDIDO
                                  AND B.TAB_ITEM_ID = :vPED_ITEM_ID) AGRUPADO
                          */
                         FROM TBAGRUPAMENTO A
                        WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                          AND A.PERFIL = :PERFIL_PED /* PERFIL DO PEDIDO */
                          AND A.SIMULACAO = '0'
                          AND A.STATUS = '1'
                          AND (A.DATA_INICIAL >= :DATA_EMISSAO AND
                               A.DATA_FINAL   <= :DATA_CLIENTE - 14)

                        ORDER BY A.DATA_INICIAL Desc, A.ID
                        INTO :AGRUPAMENTO_ID,
                             :MINUTOS_PRODUTIVOS
                           --:SEMANA,
                           --:DATA_INICIAL,
                           --:DATA_FINAL,
                           --:AGRUPADO
                        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
--                                                                        if(:CAP_PROD_SKU = 0 or :vQTD = 0)then
--                                                                        begin
--                                                                        exception "..." 'calculo 1 '||(:vQTD/:CAP_PROD_SKU);
--                                                                        end

                                                                        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)
                                                                        VALUES (:ESTABELECIMENTO_ID, :AGRUPAMENTO_ID, :vAGR_PED_ID,
                                                                        :PEDIDO, :vPED_ITEM_ID, :PRODUTO_CODIGO, :TAMANHO, :vQTD, 'P',
                                                                        :vQTD, :PERFIL, :vQTD / :CAP_PROD_SKU );

                                                                        vQTDGP = :vQTD;
                                                                       -- exception "..." 'calculo 5 '||(vQTDGP);
                                                                        vExit = False;
                                                                             --exception "..." 'calculo mult.'||:QTD_MULTIPLO||', cap.sku '||:CAP_PROD_SKU||', agp.id '||:AGRUPAMENTO_ID||' perfil:'||:PERFIL;
                                                                             FOR
                                                                             SELECT GP_ID,
                                                                                 -- SUBUP_ID,
                                                                                    AGRUP_GP_ID,
                                                                                 -- SALDO,
                                                                                    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,
                                                                                  --:SUBUP_ID,
                                                                                    :AGRUP_GP_ID,
                                                                                  --:AGRUP_GP_SALDO,
                                                                                    :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
--                                                                                                if(:Cap_Prod_Sku = 0 or :vQtdTemp = 0)then
--                                                                                                begin
                                                                                                   --exception "..." 'calculo 2 '||:vQtdTemp/:Cap_Prod_Sku;
                                                                                               --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,
                                                                                  --SALDO,
                                                                                    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_SALDO,
                                                                                  :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(:APROVEITAMENTO = 0)then
--                                                                                               begin
                                                                                                 --exception "..." 'calculo 3 '||:vQtdTemp||'/'||:Cap_Prod_Sku||'*'||:APROVEITAMENTO||'/'||100;
                                                                                              -- end

                                                                                               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,
                                                                                               :vQtdTemp/(:Cap_Prod_Sku*(:APROVEITAMENTO/100.0000)));
        
                                                                                               vQTDFER = :vQTDFER - :vQtdTemp;
                                                                                            End else
                                                                                            Begin
                                                                                               vExit = True;
                                                                                            End
                                                                                      END

                                                                                  END

                                                                        vSaldo = vSaldo - vQTD;
                                                                        END
                                                                   END
                                                                END
                                                        END
                                                END
                                            END
                                   END

                               END
        
                           END


               END
           END
END;