SET TERM ^ ;

CREATE OR ALTER procedure SPI_TRATA_PREVISAO_AGRUPAMENTO_V2 (
    PREVISAO integer,
    PREV_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_inicial DATA_CLIENTE,
                P.data_inicial DATA,
                null DATA_PRODUCAO,
                A.modelo_id MODELO_CODIGO,
                l.codigo PRODUTO_CODIGO,
                A.COR_ID,
                b.perfil PERFIL,
                A.TAMANHO,
                0 QTD_EST,
                0 QTD_REM,
                A.QTD_AGP,
                0 EST_MIN,
               (SELECT FIRST 1 P.CAP_PRODUTIVA FROM TBPERFIL P WHERE P.TABELA = 'SKU' AND P.ID = b.PERFIL) CAP_PROD_SKU,
        
               a.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_id),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_id),1) QTD_MULTIPLO,

               0 REM_STATUS,
               -1 MP,
               P.estabelecimento_producao ESTABELECIMENTO_CODIGO,
               '' AS PERFIL_PED,
               P.data_inicial AS DATA_AGRUPAMENTO,
               A.id AS VPED_ITEM_ID,
               c.perfil PERFIL_COR,
               0 as TRATAMENTO_PEDIDO_MP,
               0 programado

         FROM TBPREVISAO_VENDA P, TBPREVISAO_VENDA_ITEM A
         left join tbproduto l on l.modelo_codigo = a.modelo_id and l.cor_codigo = a.cor_id and l.status = '1'
         left join tbmodelo_bloqueio b on b.modelo_id = a.modelo_id and b.cor_id = a.cor_id and b.tamanho = a.tamanho
         left join tbcor c on c.codigo = a.cor_id
        WHERE P.id = A.previsao_venda_id
          AND A.previsao_venda_id = :PREVISAO
          AND A.status = 1
          AND A.tamanho > 0
          AND IIF( :PREV_ITEM_ID > 0, A.id = :PREV_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;

           /* 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_PREVISAO (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,
                    :PREVISAO, :PREV_ITEM_ID, :PRODUTO_CODIGO, :TAMANHO,
                    :PRODUZIR, 'A', :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_PREVISAO_MULT_AGP(
                                     :conf_agrupamento_id,
                                     :PROGRAMADO,
                                     :PREVISAO,
                                     :PREV_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_PREVISAO_AGP_CAP_PROD_SKU(
                                         :PROGRAMADO,
                                         :PREVISAO,
                                         :PREV_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_PREVISAO_MULT_AGP(
                                     :conf_agrupamento_id,
                                     :PROGRAMADO,
                                     :PREVISAO,
                                     :PREV_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_PREVISAO_AGP_TEMPO_PROD_SKU(
                                         :PROGRAMADO,
                                         :PREVISAO,
                                         :PREV_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 ; ^

