SET TERM ^ ;

CREATE OR ALTER procedure SPI_PREVISAO_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_PREVISAO (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 ; ^

