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)
returns (
    AGRUPAMENTO_ID integer,
    GP_ID integer,
    MINUTOS_PRODUTIVOS integer)
as
begin

    if(PROGRAMADO = '0')then
    begin
        for
            SELECT
                  A.ID,
                  A.GP_ID,
                  A.MINUTOS_PRODUTIVOS
             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))
            ORDER BY A.DATA_INICIAL, A.ID
        into
            :AGRUPAMENTO_ID,
            :GP_ID,
            :MINUTOS_PRODUTIVOS
        do begin
            suspend;
        end
    end else
    begin
       for
            SELECT
                  A.ID,
                  A.GP_ID,
                  A.MINUTOS_PRODUTIVOS
             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   <= :DATA_CLIENTE - 14
            ORDER BY A.DATA_INICIAL desc, A.ID
        into
            :AGRUPAMENTO_ID,
            :GP_ID,
            :MINUTOS_PRODUTIVOS
        do begin
            suspend;
        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))
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;
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
            AGRUPAMENTO_ID,
            GP_ID,
            MINUTOS_PRODUTIVOS
       FROM SPC_AGRUPAMENTO_DATA(:ESTABELECIMENTO_ID, :PROGRAMADO, :DATA_PRODUCAO, :VDATA_PRODUCAO, :DATA_CLIENTE, :DATA_EMISSAO)

    INTO :AGRUPAMENTO_ID,
         :GP_ID,
         :MINUTOS_PRODUTIVOS
    DO BEGIN
    
        --exception "..." coalesce(AGRUPAMENTO_ID,0)||' | '||coalesce(MINUTOS_PRODUTIVOS,0)||' | '||coalesce(VSALDO,0);

       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
    
                                                        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;
                                                        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
END
^

SET TERM ; ^

