SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_b10i for tbpedido
active before insert position 0
    AS
DECLARE VARIABLE STATUS_REP VARCHAR(1);
BEGIN

  IF(NEW.ECOMMERCE = 1)THEN
  BEGIN
    NEW.REPRESENTANTE_CODIGO = COALESCE((SELECT FIRST 1 P.VALOR_EXT  FROM TBCONTROLE_N P WHERE P.ID = 272),0);
    NEW.FAMILIA_CODIGO = NULL;
    NEW.STATUS_ECOMMERCE = 2;
    NEW.STATUS_PAGAMENTO = 1;
    NEW.CODIGO_RASTREIO = '';
    NEW.CTE = '';

    UPDATE OR INSERT INTO TBUPDATE_ECOMMERCE (TABELA, TABELA_ID, SUB_ID) VALUES ('TBPEDIDO', NEW.PEDIDO, 0) MATCHING (TABELA, TABELA_ID, SUB_ID);
  END

  IF(NEW.ECOMMERCE = 2 AND coalesce(NEW.REPRESENTANTE_CODIGO,0) = 0)THEN
  BEGIN
    NEW.REPRESENTANTE_CODIGO = COALESCE( FN_PARAMETRO('SISTEMA.REPRESENTANTE_LACLOFIT'),0);
    NEW.FAMILIA_CODIGO = NULL;
    NEW.STATUS_ECOMMERCE = 2;
    NEW.STATUS_PAGAMENTO = 1;
    NEW.CODIGO_RASTREIO = '';
    NEW.CTE = '';
  END

  IF(NEW.REPRESENTANTE_CODIGO = 0 OR NEW.REPRESENTANTE_CODIGO IS NULL)THEN
  BEGIN
    EXCEPTION "..." 'REPRESENTANTE DO PEDIDO INVALIDO OU NAO CADASTRADO, OPERACAO CANCELADA!';
  END

  STATUS_REP = COALESCE((SELECT FIRST 1 A.STATUS FROM TBREPRESENTANTE A WHERE A.CODIGO = NEW.REPRESENTANTE_CODIGO),0);
  IF(STATUS_REP = 0)THEN
  BEGIN
     EXCEPTION "..." 'REPRESENTANTE DO PEDIDO INATIVO OU NAO CADASTRADO, OPERACAO CANCELADA!';
  END
END
^

SET TERM ; ^

CREATE TABLE TBCONFIGURACAO_BIHANDS (
    ID INTEGER NOT NULL,
    USUARIO VARCHAR(100),
    SENHA VARCHAR(100),
    AUTHORIZATIONS VARCHAR(300));

ALTER TABLE TBCONFIGURACAO_BIHANDS
ADD CONSTRAINT PK_TBCONFIGURACAO_BIHANDS
PRIMARY KEY (ID);

CREATE SEQUENCE GTBCONFIGURACAO_BIHANDS;

SET TERM ^ ;

create trigger ttbconfiguracao_bihands_b01i for tbconfiguracao_bihands
active before insert position 0
as
begin
  if (new.ID is null) then
    new.ID = gen_id(gtbconfiguracao_bihands,1);
end
^

SET TERM ; ^

UPDATE OR INSERT INTO TBMENU (CONTROLE, GRUPO, SUBGRUPO, TIPO, URL, DESCRICAO, DATAHORA)
                      VALUES (15232, 'EST', 'EST', '1   ', '', 'BIHANDS INVENTÁRIO', '2021-12-18 11:03:47')
                    MATCHING (CONTROLE, GRUPO);


SET TERM ^ ;

CREATE trigger ttbconfiguracao_bihands_b02i for tbconfiguracao_bihands
active before insert position 2
AS
begin
   INSERT INTO TBHISTORICO (
   TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
   'TBCONFIGURACAO_BIHANDS', NEW.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),
   'Registro incluido.');
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE trigger ttbconfiguracao_bihands_b1u for tbconfiguracao_bihands
active before update position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE USUARIO VARCHAR(20);
BEGIN

   HISTORICO = '';

   IF (OLD.usuario <> NEW.usuario) THEN
   BEGIN
        HISTORICO = HISTORICO||' Usuario:'||OLD.usuario||'->'||NEW.usuario;
   END

   IF (OLD.senha <> NEW.senha) THEN
   BEGIN
        HISTORICO = HISTORICO||' Senha alterada.';
   END
 
   IF (HISTORICO <> '') THEN
   BEGIN
       USUARIO = (SELECT FIRST 1 MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION);

       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
       'TBCONFIGURACAO_BIHANDS', OLD.id, :USUARIO,
       (SELECT FIRST 1 MON$REMOTE_ADDRESS FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
       :HISTORICO);
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE trigger ttbconfiguracao_bihands_b01d for tbconfiguracao_bihands
active before delete position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE USUARIO VARCHAR(20);
BEGIN

   HISTORICO = 'Registro excluido.';
 
   IF (HISTORICO <> '') THEN
   BEGIN
       USUARIO = (SELECT FIRST 1 MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION);

       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
       'TBCONFIGURACAO_BIHANDS', OLD.id, :USUARIO,
       (SELECT FIRST 1 MON$REMOTE_ADDRESS FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
       :HISTORICO);
  end
end
^

SET TERM ; ^

ALTER TABLE TBCONFIGURACAO_BIHANDS DROP AUTHORIZATIONS;

ALTER TABLE TBCONFIGURACAO_BIHANDS
    ADD AUTHORIZATIONS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ADD VALIDADE TIMESTAMP;

ALTER TABLE TBCONFIGURACAO_BIHANDS
    ADD COMPANIA VARCHAR(300),
    ADD CNPJ VARCHAR(50);

CREATE TABLE TBBIHANDS_LISTAS (
    ID INTEGER NOT NULL,
    ID_LISTA INTEGER,
    DATA TIMESTAMP DEFAULT 'NOW');

CREATE SEQUENCE GTBBIHANDS_LISTAS;

SET TERM ^ ;

create trigger ttbbihands_listas_b01i for tbbihands_listas
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbbihands_listas,1);
end
^

SET TERM ; ^

UPDATE OR INSERT INTO TBBIHANDS_LISTAS (ID, ID_LISTA, DATA)
                                VALUES (0, 0, '2021-12-18 15:48:06')
                              MATCHING (ID);

ALTER TABLE TBBIHANDS_LISTAS
    ADD ID_LISTA_2 INTEGER;

ALTER TABLE TBBIHANDS_LISTAS
    ALTER ID_LISTA TO ID_LISTA_1;

UPDATE OR INSERT INTO TBCONFIGURACAO_BIHANDS (ID, USUARIO, SENHA, VALIDADE, COMPANIA, CNPJ)
                                      VALUES (1, 'haroldo.delfa@gmail.com', 'US4CfAqB667ASgd', '2021-12-19 18:32:52', 'Kayros Cursos e Desenvolvimento de Softwares Ltda', '13268582000133')
                                    MATCHING (ID);

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)
       where MINUTOS_PRODUTIVOS > 0

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

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,
    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))
            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)
            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))
            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 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))
returns (
    DATA_PEDIDO_NOVO date,
    DATA_CLIENTE_NOVO date)
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;
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
    
    --exception "..." ''||:DATA_PRODUCAO||' - '||:VDATA_PRODUCAO||' - '||:DATA_CLIENTE||' - '||:DATA_EMISSAO;

    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)
       where MINUTOS_PRODUTIVOS > 0

    INTO :AGRUPAMENTO_ID,
         :GP_ID,
         :MINUTOS_PRODUTIVOS,
         :DATA_INICIAL_AGP,
         :DATA_FINAL_AGP
    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
    
                                                        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)
                                                        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 ; ^


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;
declare variable DATA_INICIAL_AGP date;
declare variable DATA_FINAL_AGP date;
declare variable DATA_PEDIDO_NOVO integer;
declare variable DATA_CLIENTE_NOVO 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
    
    --exception "..." ''||:DATA_PRODUCAO||' - '||:VDATA_PRODUCAO||' - '||:DATA_CLIENTE||' - '||:DATA_EMISSAO;

    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)
       where MINUTOS_PRODUTIVOS > 0

    INTO :AGRUPAMENTO_ID,
         :GP_ID,
         :MINUTOS_PRODUTIVOS,
         :DATA_INICIAL_AGP,
         :DATA_FINAL_AGP
    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
    
                                                        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)
                                                        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 ; ^

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


    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 "..." ''||:DATA_PRODUCAO||' - '||:VDATA_PRODUCAO||' - '||:DATA_CLIENTE||' - '||:DATA_EMISSAO;

    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)
       where MINUTOS_PRODUTIVOS > 0

    INTO :AGRUPAMENTO_ID,
         :GP_ID,
         :MINUTOS_PRODUTIVOS,
         :DATA_INICIAL_AGP,
         :DATA_FINAL_AGP
    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
    
                                                        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)
                                                        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 ; ^

