ALTER TABLE TBREMESSA_ITEM_ALOCACAO ADD ENCERRADO INTEGER DEFAULT 0;
ALTER TABLE TBREMESSA_ITEM_ALOCACAO ADD ENCERRAMENTO_TIPO INTEGER;

COMMENT ON COLUMN TBREMESSA_ITEM_ALOCACAO.ENCERRAMENTO_TIPO IS
'1 - ANTES DO FIM DO AGRUPAMENTO
2 - DESPOIS DO FIM DO AGRUPAMENTO';


ALTER TABLE TBREMESSA_ITEM_ALOCACAO ADD QTD_BAIXA NUMERIC(15,4);
ALTER TABLE TBREMESSA_ITEM_ALOCACAO ADD SALDO_BAIXA NUMERIC(15,4);
ALTER TABLE TBREMESSA_ITEM_ALOCACAO ADD TIPO_REMESSA VARCHAR(10) DEFAULT 'BOJO';
COMMENT ON COLUMN TBREMESSA_ITEM_ALOCACAO.TIPO_REMESSA IS 'BOJO, 22600';
CREATE INDEX ITBREMESSA_ITEM_ALOCACAO_13 ON TBREMESSA_ITEM_ALOCACAO (TIPO_REMESSA);

CREATE INDEX ITBREMESSA_ITEM_ALOCACAO_12 ON TBREMESSA_ITEM_ALOCACAO (AGRUP_PED_ID);


CREATE GENERATOR GTBAGRUPAMENTO_CARGA_SKU_UP;

CREATE TABLE TBAGRUPAMENTO_CARGA_SKU_UP (
    AGRUPAMENTO_ID  INTEGER NOT NULL,
    AGRUP_PED_ID    INTEGER NOT NULL,
    AGRUP_UP_ID     INTEGER NOT NULL,
    ID              INTEGER NOT NULL,
    QUANTIDADE      NUMERIC(15,4) DEFAULT 0,
    NECESSIDADE     NUMERIC(15,4) DEFAULT 0
);

ALTER TABLE TBAGRUPAMENTO_CARGA_SKU_UP ADD PRIMARY KEY (AGRUPAMENTO_ID, AGRUP_PED_ID, AGRUP_UP_ID, ID);


SET TERM ^ ;

CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B0I FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gTBAGRUPAMENTO_CARGA_SKU_UP,1);
end
^


/* Trigger: TTBAGRUP_CARGA_SKU_UP_B1D_01 */
CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B1D_01 FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE DELETE POSITION 1
AS
begin

    UPDATE tbagrupamento_carga_up set
    --Quantidade = Quantidade - OLD.Quantidade,
    Saldo = Saldo + OLD.Necessidade
      Where AGRUPAMENTO_ID = OLD.Agrupamento_Id
        and ID = OLD.AGRUP_UP_ID;

End
^


/* Trigger: TTBAGRUP_CARGA_SKU_UP_B1I_01 */
CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B1I_01 FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE INSERT POSITION 1
AS
Begin

  UPDATE tbagrupamento_carga_up set
  --Quantidade = Quantidade + NEW.Quantidade,
  Saldo = Saldo - NEW.Necessidade
  Where AGRUPAMENTO_ID = New.Agrupamento_Id
    and ID = New.AGRUP_UP_ID;

End
^

SET TERM ; ^

ALTER TABLE TBAGRUPAMENTO_CARGA_SKU_UP
    ADD TIPO INTEGER;

COMMENT ON COLUMN TBAGRUPAMENTO_CARGA_SKU_UP.TIPO IS
'1 - pedido
2 - remessa';



ALTER TABLE TBREMESSA_ITEM_ALOCACAO ADD TEMPO NUMERIC(15,4);

CREATE INDEX ITBAGRUPAMENTO_CARGA_SKU_UP_03
ON TBAGRUPAMENTO_CARGA_SKU_UP (AGRUP_PED_ID,TIPO);

CREATE INDEX ITBAGRUPAMENTO_CARGA_SKU_UP_02
ON TBAGRUPAMENTO_CARGA_SKU_UP (AGRUP_PED_ID);

CREATE INDEX ITBAGRUPAMENTO_CARGA_SKU_UP_01
ON TBAGRUPAMENTO_CARGA_SKU_UP (TIPO);

ALTER TABLE TBAGRUPAMENTO_CARGA_UP
    ADD UTILIZADO COMPUTED BY (cap_produtiva - saldo);




SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_ITEM_ALOCACAO (
    REMESSA_ID integer,
    AGRUPAMENTO_ID integer)
as
declare variable ITEM_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable TABELA_ID integer;
declare variable TAB_ITEM_ID integer;
declare variable REMESSA integer;
declare variable TALAO integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(18,5);
declare variable TIPO char(1);
declare variable SALDO numeric(18,5);
declare variable DATAHORA date;
declare variable USUARIO integer;
declare variable QUANTIDADE_ORIGINAL numeric(18,5);
declare variable VAGR_REM_ID integer;
declare variable TEMPO numeric(15,4);
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
begin

    
    --VERIFICAR SE REMESSA JA TEM VINCULOS
    select first 1
        s.id
    from TBREMESSA_ITEM_ALOCACAO s
    where s.remessa = :REMESSA_ID
    and s.tabela_id > 0
    into :ITEM_ID;
    
    ITEM_ID = coalesce(ITEM_ID,0);
    
    if(ITEM_ID > 0)then
    begin
        exception "..." 'ITENS DA ALOCACAO DA REMESSA COM PEDIDOS VINCULADOS';
    end

    --REMOVER AS BAIXA DE SALDO
    FOR
        select
            s.id
        from TBREMESSA_ITEM_ALOCACAO s
        where s.remessa = :REMESSA_ID
    into
        :VAGR_REM_ID
    DO begin
        DELETE FROM TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUP_PED_ID = :VAGR_REM_ID;
    END

    --REMOVER A ALOCACAO DA REMESSA
    DELETE FROM TBREMESSA_ITEM_ALOCACAO S WHERE s.remessa = :REMESSA_ID;

    if(AGRUPAMENTO_ID > 0)then
    begin
        FOR
    
            select
    
                p.setor_codigo,
                P.estabelecimento_codigo ESTABELECIMENTO_ID,
                P.localizacao_codigo LOCALIZACAO_ID,
                0 TABELA_ID,
                0 TAB_ITEM_ID,
                P.remessa REMESSA,
                P.controle TALAO,
                P.produto_codigo PRODUTO_ID,
                p.tamanho TAMANHO,
                p.quantidade_pedido QUANTIDADE,
                'R' TIPO,
                p.quantidade_pedido SALDO,
                current_date DATAHORA,
                fn_current_user_id() USUARIO,
                p.quantidade_pedido QUANTIDADE_ORIGINAL,
                s.tempo * s.colaboradores as tempo
            
            FROM tbpedido_item_processado P, tbremessa R, tbprogramacao s
            WHERE P.remessa = :REMESSA_ID
            AND R.numero = P.remessa
            and s.remessa_id = p.remessa
            and s.tabela_id = p.controle
            and s.tipo = 'D'
    
            ORDER BY P.remessa_acumulado_controle
        into
            UP_ID,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            TABELA_ID,
            TAB_ITEM_ID,
            REMESSA,
            TALAO,
            PRODUTO_ID,
            TAMANHO,
            QUANTIDADE,
            TIPO,
            SALDO,
            DATAHORA,
            USUARIO,
            QUANTIDADE_ORIGINAL,
            TEMPO
        do begin
        
           VAGR_REM_ID = GEN_ID(Gtbremessa_item_alocacao,1);
            
           --AGRUP_UP_ID = coalesce((select first 1 u.id from TBAGRUPAMENTO_CARGA_UP u where u.up_id = :UP_ID and u.agrupamento_id = :AGRUPAMENTO_ID),0);
    
           --if(AGRUP_UP_ID = 0)then
           --begin
           --     exception "..." 'AGRUPAMENTO DA UP '||:UP_ID||' NAO FOI ENCONTRADO.';
           --end
    
           --BAIXAR SALDO
           --INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (AGRUPAMENTO_ID , AGRUP_PED_ID,  AGRUP_UP_ID,  QUANTIDADE, NECESSIDADE, TIPO) VALUES (:AGRUPAMENTO_ID, :VAGR_REM_ID, :AGRUP_UP_ID, :QUANTIDADE, :TEMPO, 2);
    
           --ALOCAR REMESSA
           INSERT INTO TBREMESSA_ITEM_ALOCACAO (
                ID,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                TABELA_ID,
                TAB_ITEM_ID,
                REMESSA,
                TALAO,
                PRODUTO_ID,
                TAMANHO,
                QUANTIDADE,
                TIPO,
                SALDO,
                USUARIO,
                AGRUPAMENTO_ID,
                TEMPO,
                QTD_BAIXA,
                SALDO_BAIXA,
                TIPO_REMESSA
           ) VALUES (
                :VAGR_REM_ID,
                :ESTABELECIMENTO_ID,
                :LOCALIZACAO_ID,
                :TABELA_ID,
                :TAB_ITEM_ID,
                :REMESSA,
                :TALAO,
                :PRODUTO_ID,
                :TAMANHO,
                :QUANTIDADE,
                :TIPO,
                :SALDO,
                :USUARIO,
                :AGRUPAMENTO_ID,
                :TEMPO,
                0,
                0,
                '22600'
           );
    
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_TRATA_PEDIDO_AGRUPAMENTO (
    PEDIDO integer,
    PED_ITEM_ID integer)
as
declare variable DATA_PRODUCAO date;
declare variable MODELO_CODIGO integer;
declare variable PRODUTO_CODIGO integer;
declare variable PERFIL varchar(40);
declare variable TAMANHO integer;
declare variable QTD_EST numeric(18,4);
declare variable QTD_REM numeric(18,4);
declare variable QTD_AGP numeric(18,4);
declare variable EST_MIN char(4);
declare variable CAP_PROD_SKU numeric(18,4);
declare variable SALDO numeric(18,4);
declare variable QTD_MINIMO integer;
declare variable QTD_MULTIPLO integer;
declare variable REM_STATUS char(4);
declare variable MP numeric(18,4);
declare variable ESTABELECIMENTO_ID integer;
declare variable PERFIL_PED varchar(10);
declare variable DATA_AGRUPAMENTO date;
declare variable VPED_ITEM_ID integer;
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_GP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable PRODUZIR numeric(18,4);
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable PERFIL_COR varchar(10);
declare variable TRATAMENTO_PEDIDO_MP char(1);
Begin

    For
        SELECT  A.DATA_PRODUCAO,
                A.MODELO_CODIGO,
                A.PRODUTO_CODIGO,
                A.PERFIL,
                A.TAMANHO,
                A.QTD_EST,
                A.QTD_REM,
                A.QTD_AGP,
                A.EST_MIN,
               (SELECT FIRST 1 P.CAP_PRODUTIVA FROM TBPERFIL P WHERE P.TABELA = 'SKU' AND P.ID = A.PERFIL) CAP_PROD_SKU,
        
               CAST(COALESCE((SELECT FIRST 1 S.QUANTIDADE FROM TBPEDIDO_ITEM_SALDO S
                 WHERE S.PEDIDO = A.PEDIDO AND S.PEDIDO_ITEM_CONTROLE = A.CONTROLE),0.0000) AS NUMERIC(15,4)) SALDO,

               COALESCE((SELECT FIRST 1 CASE WHEN A.TAMANHO = 1 THEN MI01 WHEN A.TAMANHO = 2 THEN MI02
                                             WHEN A.TAMANHO = 3 THEN MI03 WHEN A.TAMANHO = 4 THEN MI04
                                             WHEN A.TAMANHO = 5 THEN MI05 WHEN A.TAMANHO = 6 THEN MI06
                                             WHEN A.TAMANHO = 7 THEN MI07 WHEN A.TAMANHO = 8 THEN MI08
                                             WHEN A.TAMANHO = 9 THEN MI09 WHEN A.TAMANHO =10 THEN MI10
                                             WHEN A.TAMANHO =11 THEN MI11 WHEN A.TAMANHO =12 THEN MI12
                                             WHEN A.TAMANHO =13 THEN MI13 WHEN A.TAMANHO =14 THEN MI14
                                             WHEN A.TAMANHO =15 THEN MI15 WHEN A.TAMANHO =16 THEN MI16
                                             WHEN A.TAMANHO =17 THEN MI17 WHEN A.TAMANHO =18 THEN MI18
                                             WHEN A.TAMANHO =19 THEN MI19 WHEN A.TAMANHO =20 THEN MI20 END
                           FROM TBMODELO_PEDIDO_COTA M WHERE M.MODELO_ID = A.MODELO_CODIGO),1) QTD_MINIMO,
        
               COALESCE((SELECT FIRST 1 CASE WHEN A.TAMANHO = 1 THEN MU01 WHEN A.TAMANHO = 2 THEN MU02
                                             WHEN A.TAMANHO = 3 THEN MU03 WHEN A.TAMANHO = 4 THEN MU04
                                             WHEN A.TAMANHO = 5 THEN MU05 WHEN A.TAMANHO = 6 THEN MU06
                                             WHEN A.TAMANHO = 7 THEN MU07 WHEN A.TAMANHO = 8 THEN MU08
                                             WHEN A.TAMANHO = 9 THEN MU09 WHEN A.TAMANHO =10 THEN MU10
                                             WHEN A.TAMANHO =11 THEN MU11 WHEN A.TAMANHO =12 THEN MU12
                                             WHEN A.TAMANHO =13 THEN MU13 WHEN A.TAMANHO =14 THEN MU14
                                             WHEN A.TAMANHO =15 THEN MU15 WHEN A.TAMANHO =16 THEN MU16
                                             WHEN A.TAMANHO =17 THEN MU17 WHEN A.TAMANHO =18 THEN MU18
                                             WHEN A.TAMANHO =19 THEN MU19 WHEN A.TAMANHO =20 THEN MU20 END
                           FROM TBMODELO_PEDIDO_COTA M WHERE M.MODELO_ID = A.MODELO_CODIGO),1) QTD_MULTIPLO,

               COALESCE((SELECT FIRST 1 T.STATUS FROM TBREMESSA_ITEM_TRATAMENTO T
                          WHERE T.ESTABELECIMENTO_ID = P.ESTABELECIMENTO_CODIGO
                            AND T.TABELA_ID = A.PEDIDO AND T.TAB_ITEM_ID = A.CONTROLE
                            AND T.STATUS = '1'),'0') REM_STATUS,
             
               COALESCE((SELECT SUM(G.NECESSIDADE)
                  FROM TBPEDIDO_CONSUMO G
                 WHERE G.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                   AND G.PEDIDO_ID = A.PEDIDO
                   AND G.PEDIDO_ITEM_ID = A.CONTROLE
                   AND G.TAMANHO_ITEM = A.TAMANHO),-1) MP,

                P.ESTABELECIMENTO_CODIGO,
                P.CLASSIFICACAO AS PERFIL_PED,
                P.DATA_ENTREGA AS DATA_AGRUPAMENTO,
                A.CONTROLE as vPED_ITEM_ID,
                A.PERFIL_COR,
               (SELECT FIRST 1 PF.TRATAMENTO_PEDIDO_MP FROM TBPERFIL PF
                 WHERE PF.TABELA = 'PED' AND PF.ID = P.CLASSIFICACAO)

         FROM TBPEDIDO P, TBPEDIDO_ITEM A
        WHERE P.PEDIDO = A.PEDIDO
          AND A.PEDIDO = :PEDIDO
          AND A.SITUACAO = 1
          AND A.TAMANHO > 0
          AND IIF( :PED_ITEM_ID > 0, A.CONTROLE = :PED_ITEM_ID, TRUE)

        INTO :DATA_PRODUCAO,
             :MODELO_CODIGO,
             :PRODUTO_CODIGO,
             :PERFIL,
             :TAMANHO,
             :QTD_EST,
             :QTD_REM,
             :QTD_AGP,
             :EST_MIN,
             :CAP_PROD_SKU,
             :SALDO,
             :QTD_MINIMO,
             :QTD_MULTIPLO,
             :REM_STATUS,
             :MP,
             :ESTABELECIMENTO_ID,
             :PERFIL_PED,
             :DATA_AGRUPAMENTO,
             :vPED_ITEM_ID,
             :PERFIL_COR,
             :TRATAMENTO_PEDIDO_MP
        DO BEGIN
           IF (NOT QTD_MULTIPLO > 0) THEN
              QTD_MULTIPLO = 1;

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

           /* PEDIDOS DE AMOSTRAS */
           IF (REM_STATUS = '0' AND PRODUZIR > 0 AND EST_MIN = '0' AND TRATAMENTO_PEDIDO_MP = '2') THEN
               BEGIN

                AGRUPAMENTO_ID = COALESCE((SELECT FIRST 1 A.ID FROM TBAGRUPAMENTO A
                                            WHERE :DATA_AGRUPAMENTO BETWEEN A.DATA_INICIAL AND A.DATA_FINAL
                                              AND A.PERFIL = :PERFIL_PED AND A.STATUS = '1'
                                           ),0);
                if (AGRUPAMENTO_ID > 0) then
                    BEGIN
                    INSERT INTO TBAGRUPAMENTO_PEDIDO (ESTABELECIMENTO_ID, AGRUPAMENTO_ID,
                    TABELA_ID, TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, TIPO,
                    SALDO, PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR)
                    VALUES (:ESTABELECIMENTO_ID, :AGRUPAMENTO_ID,
                    :PEDIDO, :vPED_ITEM_ID, :PRODUTO_CODIGO, :TAMANHO,
                    :PRODUZIR, 'P', :PRODUZIR, :PERFIL, 0, :PERFIL_COR, 0 );
                    END

               END ELSE
           
           /* PEDIDOS NORMAIS */
           IF (REM_STATUS = '0' AND PRODUZIR > 0 AND EST_MIN = '0' AND CAP_PROD_SKU > 0) THEN
               BEGIN
               vSALDO = TRUNC(PRODUZIR);

                
               if (MP = 0) Then --Se nÃ£o houver necessidade de tecido (ou seja, o projetado para o item do pedido estÃ¡ alocado ao mesmo)
                   Begin
                       if (Extract (WeekDay from Current_Date) = 6) Then begin vDATA_PRODUCAO = CURRENT_DATE + 06; end
                       if (Extract (WeekDay from Current_Date) = 7) Then begin vDATA_PRODUCAO = CURRENT_DATE + 05; end
                       if (Extract (WeekDay from Current_Date) = 1) Then begin vDATA_PRODUCAO = CURRENT_DATE + 11; end
                       if (Extract (WeekDay from Current_Date) = 2) Then begin vDATA_PRODUCAO = CURRENT_DATE + 10; end
                       if (Extract (WeekDay from Current_Date) = 3) Then begin vDATA_PRODUCAO = CURRENT_DATE + 09; end
                       if (Extract (WeekDay from Current_Date) = 4) Then begin vDATA_PRODUCAO = CURRENT_DATE + 08; end
                       if (Extract (WeekDay from Current_Date) = 5) Then begin vDATA_PRODUCAO = CURRENT_DATE + 07; end
                   end else
               if (DATA_PRODUCAO is not Null) Then
                   Begin
                       if (Extract (WeekDay from Current_Date) = 6) Then begin vDATA_PRODUCAO = DATA_PRODUCAO - 06; end
                       if (Extract (WeekDay from Current_Date) = 7) Then begin vDATA_PRODUCAO = DATA_PRODUCAO - 07; end
                       if (Extract (WeekDay from Current_Date) = 1) Then begin vDATA_PRODUCAO = DATA_PRODUCAO - 01; end
                       if (Extract (WeekDay from Current_Date) = 2) Then begin vDATA_PRODUCAO = DATA_PRODUCAO - 02; end
                       if (Extract (WeekDay from Current_Date) = 3) Then begin vDATA_PRODUCAO = DATA_PRODUCAO - 03; end
                       if (Extract (WeekDay from Current_Date) = 4) Then begin vDATA_PRODUCAO = DATA_PRODUCAO - 04; end
                       if (Extract (WeekDay from Current_Date) = 5) Then begin vDATA_PRODUCAO = DATA_PRODUCAO - 05; end
                   End else
                   Begin
                       vDATA_PRODUCAO = :DATA_AGRUPAMENTO;
                   End
              
                       FOR
                       SELECT A.ID,
                              A.MINUTOS_PRODUTIVOS
                          --  A.SEMANA,
                          --  A.DATA_INICIAL,
                          --  A.DATA_FINAL,
                          /*  (SELECT SUM(B.SALDO) FROM TBAGRUPAMENTO_PEDIDO B
                                WHERE B.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_ID
                                  AND B.AGRUPAMENTO_ID = A.ID
                                  AND B.TABELA_ID = :PEDIDO
                                  AND B.TAB_ITEM_ID = :vPED_ITEM_ID) AGRUPADO
                          */
                         FROM TBAGRUPAMENTO A
                        WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                          AND A.PERFIL = :PERFIL_PED /* PERFIL DO PEDIDO */
                          AND A.SIMULACAO = '0'
                          AND A.STATUS = '1'
                          AND ((A.DATA_INICIAL <= :DATA_PRODUCAO AND A.DATA_FINAL >= :DATA_PRODUCAO) OR
                               (A.DATA_FINAL   >= :vDATA_PRODUCAO))
    
                        ORDER BY A.DATA_INICIAL, A.ID
                        INTO :AGRUPAMENTO_ID,
                             :MINUTOS_PRODUTIVOS
                           --:SEMANA,
                           --:DATA_INICIAL,
                           --:DATA_FINAL,
                           --:AGRUPADO
                        DO BEGIN
    
                           if (MINUTOS_PRODUTIVOS > 0 and vSALDO > 0) Then
                               BEGIN
                               vQTD = vSALDO;

                               if (vQTD > 0) Then
                                   BEGIN

                                     FOR
                                     SELECT FIRST 1 GP_ID,
                                                    SUM(DISP) OVER() AS AGRUP_GP_TOTAL
                                       FROM (
                                             SELECT X.GP_ID, X.SUBUP_ID, X.AGRUP_GP_ID, X.SALDO,
                                                    CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                               FROM (
                                                     SELECT A.GP_ID, A.SUBUP_ID, A.ID AGRUP_GP_ID, A.SALDO,
                                                            CAST(TRUNC(A.SALDO*CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                                                       FROM TBAGRUPAMENTO_CARGA_GP A
                                                      WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                        AND A.PERFIL = :PERFIL
                                                        AND A.SALDO > 0
                                                      ORDER BY A.SALDO DESC
                                                    ) X
                                              )
                                      WHERE DISP >= IIF( :QTD_MINIMO < :vQTD, :QTD_MINIMO, :vQTD )
                                       INTO :GP_ID,
                                            :AGRUP_GP_TOTAL
                                         DO BEGIN

                                            if (GP_ID > 0) Then
                                                BEGIN

                                                If (AGRUP_GP_TOTAL < vQTD) Then
                                                    Begin
                                                    vQTD = AGRUP_GP_TOTAL;
                                                    End

                                                    if (vQTD > 0) Then
                                                        Begin

                                                           FOR
                                                            SELECT FIRST 1 FERRAMENTARIA_ID,
                                                                           SUM(DISP) OVER() AS AGRUP_FER_TOTAL
                                                              FROM (
                                                                    SELECT Y.FERRAMENTARIA_ID, Y.AGRUP_FER_ID, Y.APROVEITAMENTO, Y.SALDO,
                                                                           CAST(Y.DISP-(MOD(Y.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                                                      FROM (
                                                                            SELECT X.FERRAMENTARIA_ID,  X.AGRUP_FER_ID, X.APROVEITAMENTO, X.SALDO,
                                                                                   CAST(TRUNC(X.SALDO * CAST(:CAP_PROD_SKU AS NUMERIC(15,4)) * (X.APROVEITAMENTO / 100.0000) ) AS INTEGER) DISP
                                                                              FROM (
                                                                                    SELECT F.ID FERRAMENTARIA_ID,  I.APROVEITAMENTO,
                                                                                    COALESCE((SELECT AC.ID
                                                                                           FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                                           WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                                             AND AC.FERRAMENTA_ID = F.ID),0) AGRUP_FER_ID,
                                                                                           COALESCE((SELECT AC.SALDO
                                                                                           FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                                           WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                                             AND AC.FERRAMENTA_ID = F.ID),A.MINUTOS_PRODUTIVOS) SALDO
                                                                                    
                                                                                    FROM TBAGRUPAMENTO A, TBFERRAMENTARIA F, TBFERRAMENTARIA_ITEM I, TBMODELO M
                                                                                    WHERE A.ID = :AGRUPAMENTO_ID
                                                                                      AND F.ID = I.FERRAMENTARIA_ID
                                                                                      AND I.LINHA_ID = M.LINHA_CODIGO
                                                                                      AND M.CODIGO = :MODELO_CODIGO
                                                                                      AND I.TAMANHO   = :TAMANHO
                                                                                      AND I.APROVEITAMENTO > 0
                                                                                      AND F.STATUS = '1'
                                                                                      AND F.STATUS_PEDIDO = '1'
                                                                                    ) X
                                                                             WHERE X.SALDO > 0
                                                                             ORDER BY X.SALDO DESC
                                                                           ) Y
                                                                      ) WHERE DISP >= IIF( :QTD_MINIMO < :vQTD, :QTD_MINIMO, :vQTD ) 
                                                             INTO :FERRAMENTARIA_ID,
                                                                  :AGRUP_FER_TOTAL
                                                             DO BEGIN

                                                             If (FERRAMENTARIA_ID > 0) Then
                                                                Begin

                                                                If (AGRUP_FER_TOTAL < vQTD) Then
                                                                    Begin
                                                                    vQTD = AGRUP_FER_TOTAL;
                                                                    End
                
                                                                    if (vQTD > 0) Then
                                                                        Begin

                                                                        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,
                                                                                 -- SUBUP_ID,
                                                                                    AGRUP_GP_ID,
                                                                                 -- SALDO,
                                                                                    DISP
                                                                               FROM (
                                                                                     SELECT X.GP_ID, X.SUBUP_ID, X.AGRUP_GP_ID, X.SALDO,
                                                                                            CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                                                                       FROM (
                                                                                             SELECT A.GP_ID, A.SUBUP_ID, A.ID AGRUP_GP_ID, A.SALDO,
                                                                                                    CAST(TRUNC(A.SALDO*CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                                                                                               FROM TBAGRUPAMENTO_CARGA_GP A
                                                                                              WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                                                                AND A.PERFIL = :PERFIL
                                                                                                AND A.SALDO > 0
                                                                                              ORDER BY A.SALDO DESC
                                                                                            ) X
                                                                                      )
                                                                              WHERE DISP >= IIF( :QTD_MINIMO < :vQTD, :QTD_MINIMO, :vQTD )
                                                                               INTO :GP_ID,
                                                                                  --:SUBUP_ID,
                                                                                    :AGRUP_GP_ID,
                                                                                  --:AGRUP_GP_SALDO,
                                                                                    :AGRUP_GP_DISP
                                                                                 DO BEGIN
                                                                                      IF(vEXIT = False) Then
                                                                                         BEGIN

                                                                                         If(:vQTDGP > 0) Then
                                                                                            Begin
                                                                                             If (AGRUP_GP_DISP < vQTDGP) Then
                                                                                                 BEGIN
                                                                                                 vQtdTemp = :AGRUP_GP_DISP;
                                                                                                 END else
                                                                                                 BEGIN
                                                                                                 vQtdTemp = :vQTDGP;
                                                                                                 END
                                        
                                                                                               INSERT INTO TBAGRUPAMENTO_CARGA_SKU_GP (AGRUPAMENTO_ID, 
                                                                                               AGRUP_PED_ID,AGRUP_GP_ID,QUANTIDADE,NECESSIDADE) VALUES ( 
                                                                                               :AGRUPAMENTO_ID,:vAGR_PED_ID,:AGRUP_GP_ID,:vQtdTemp,:vQtdTemp/:Cap_Prod_Sku);
        
                                                                                               vQTDGP = :vQTDGP - :vQtdTemp;
                                                                                            End else
                                                                                            Begin
                                                                                               vExit = True;
                                                                                            End
                                                                                         END
                                                                                    END

                                                                             vQTDFER = :vQTD;
                                                                             vExit = False;

                                                                             FOR
                                                                             SELECT FERRAMENTARIA_ID,
                                                                                    AGRUP_FER_ID,
                                                                                    APROVEITAMENTO,
                                                                                  --SALDO,
                                                                                    DISP
                                                                               FROM (
                                                                                    SELECT Y.FERRAMENTARIA_ID,
                                                                                           Y.AGRUP_FER_ID,
                                                                                           Y.APROVEITAMENTO,
                                                                                           Y.SALDO,
                                                                                           CAST(Y.DISP-(MOD(Y.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                                                                      FROM (
                                                                                            SELECT X.FERRAMENTARIA_ID,  X.AGRUP_FER_ID, X.APROVEITAMENTO, X.SALDO,
                                                                                                   CAST(TRUNC(X.SALDO * CAST(:CAP_PROD_SKU AS NUMERIC(15,4)) * (X.APROVEITAMENTO / 100.0000) ) AS INTEGER) DISP
                                                                                              FROM (
                                                                                                    SELECT F.ID FERRAMENTARIA_ID,  I.APROVEITAMENTO,
                                                                                                    COALESCE((SELECT AC.ID
                                                                                                           FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                                                           WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                                                             AND AC.FERRAMENTA_ID = F.ID),0) AGRUP_FER_ID,
                                                                                                           COALESCE((SELECT AC.SALDO
                                                                                                           FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                                                           WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                                                             AND AC.FERRAMENTA_ID = F.ID),A.MINUTOS_PRODUTIVOS) SALDO
                                                                                                    
                                                                                                    FROM TBAGRUPAMENTO A, TBFERRAMENTARIA F, TBFERRAMENTARIA_ITEM I, TBMODELO M
                                                                                                    WHERE A.ID = :AGRUPAMENTO_ID
                                                                                                      AND F.ID = I.FERRAMENTARIA_ID
                                                                                                      AND I.LINHA_ID = M.LINHA_CODIGO
                                                                                                      AND M.CODIGO = :MODELO_CODIGO
                                                                                                      AND I.TAMANHO   = :TAMANHO
                                                                                                      AND I.APROVEITAMENTO > 0
                                                                                                      AND F.STATUS = '1'
                                                                                                      AND F.STATUS_PEDIDO = '1'
                                                                                                    ) X
                                                                                             WHERE X.SALDO > 0
                                                                                             ORDER BY X.SALDO DESC
                                                                                           ) Y
                                                                                      ) WHERE DISP >= IIF( :QTD_MINIMO < :vQTD, :QTD_MINIMO, :vQTD ) 
                                                                             INTO :FERRAMENTARIA_ID,
                                                                                  :AGRUP_FER_ID,
                                                                                  :APROVEITAMENTO,
                                                                                --:AGRUP_FER_SALDO,
                                                                                  :AGRUP_FER_DISP
                                                                               DO BEGIN
                                                                                  IF(vEXIT = False) Then
                                                                                     BEGIN

                                                                                     If(:vQTDFER > 0) Then
                                                                                        Begin

                                                                                        If (AGRUP_FER_ID = 0) Then
                                                                                        Begin
                                                                                        vAgrup_Fer_Id = GEN_ID(GTBAGRUPAMENTO_CARGA_FERRAMENTA,1);

                                                                                        INSERT INTO TBAGRUPAMENTO_CARGA_FERRAMENTA (AGRUPAMENTO_ID,
                                                                                           FERRAMENTA_ID,ID,CAP_PRODUTIVA,SALDO,QUANTIDADE) VALUES (
                                                                                           :AGRUPAMENTO_ID,:FERRAMENTARIA_ID,:vAgrup_Fer_Id,
                                                                                           :MINUTOS_PRODUTIVOS,:MINUTOS_PRODUTIVOS,0);

                                                                                        End else
                                                                                        BEGIN
                                                                                        vAgrup_Fer_Id = :AGRUP_FER_ID;
                                                                                        END

                                                                                         If (AGRUP_FER_DISP < vQTDFER) Then
                                                                                             BEGIN
                                                                                             vQtdTemp = :AGRUP_FER_DISP;
                                                                                             END else
                                                                                             BEGIN
                                                                                             vQtdTemp = :vQTDFER;
                                                                                             END

                                                                                           if (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
           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)
as
begin

    if(PROGRAMADO = '0')then
    begin
        for
            SELECT A.ID,
                  A.GP_ID
             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
        do begin
            suspend;
        end
    end else
    begin
       for
            SELECT A.ID,
                  A.GP_ID
             FROM TBAGRUPAMENTO A
            WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND A.SIMULACAO = '0'
              AND A.STATUS = '1'
              AND A.DATA_INICIAL >= :DATA_EMISSAO
              AND A.DATA_FINAL   <= :DATA_CLIENTE - 14
            ORDER BY A.DATA_INICIAL desc, A.ID
        into
            :AGRUPAMENTO_ID,
            :GP_ID
        do begin
            suspend;
        end
    end

end
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER procedure SPI_PEDIDO_AGP_CAP_PROD_SKU (
    PROGRAMADO varchar(1),
    PEDIDO integer,
    PED_ITEM_ID integer,
    DATA_PRODUCAO date,
    DATA_CLIENTE date,
    DATA_EMISSAO date,
    MODELO_CODIGO integer,
    PRODUTO_CODIGO integer,
    PERFIL varchar(40),
    TAMANHO integer,
    QTD_EST numeric(18,4),
    QTD_REM numeric(18,4),
    QTD_AGP numeric(18,4),
    EST_MIN char(4),
    CAP_PROD_SKU numeric(18,4),
    SALDO numeric(18,4),
    QTD_MINIMO integer,
    QTD_MULTIPLO integer,
    REM_STATUS char(4),
    MP numeric(18,4),
    ESTABELECIMENTO_ID integer,
    PERFIL_PED varchar(10),
    DATA_AGRUPAMENTO date,
    VPED_ITEM_ID integer,
    PERFIL_COR varchar(10),
    TRATAMENTO_PEDIDO_MP char(1),
    PRODUZIR numeric(18,4))
as
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_GP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable AGRUP_UP_TOTAL integer;
BEGIN

    VSALDO = TRUNC(PRODUZIR);

    IF (MP = 0) THEN --SE NÃ£O HOUVER NECESSIDADE DE TECIDO (OU SEJA, O PROJETADO PARA O ITEM DO PEDIDO ESTÃ¡ ALOCADO AO MESMO)
    BEGIN
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 6) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 06; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 7) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 05; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 1) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 11; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 2) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 10; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 3) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 09; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 4) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 08; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 5) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 07; END
    END ELSE
    IF (DATA_PRODUCAO IS NOT NULL) THEN
    BEGIN
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 6) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 06; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 7) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 07; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 1) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 01; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 2) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 02; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 3) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 03; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 4) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 04; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 5) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 05; END
    END ELSE
    BEGIN
        VDATA_PRODUCAO = :DATA_AGRUPAMENTO;
    END
    
    FOR

       select
            AGRUPAMENTO_ID,
            GP_ID
       FROM SPC_AGRUPAMENTO_DATA(:ESTABELECIMENTO_ID, :PROGRAMADO, :DATA_PRODUCAO, :VDATA_PRODUCAO, :DATA_CLIENTE, :DATA_EMISSAO)

    INTO :AGRUPAMENTO_ID,
         :MINUTOS_PRODUTIVOS
    DO BEGIN
    
       IF (MINUTOS_PRODUTIVOS > 0 AND VSALDO > 0) THEN
           BEGIN
           VQTD = VSALDO;
    
           IF (VQTD > 0) THEN
               BEGIN
    
                 FOR
                 SELECT FIRST 1 GP_ID,
                                SUM(DISP) OVER() AS AGRUP_GP_TOTAL
                   FROM (
                         SELECT X.GP_ID, X.SUBUP_ID, X.AGRUP_GP_ID, X.SALDO,
                                CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                           FROM (
                                 SELECT A.GP_ID, A.SUBUP_ID, A.ID AGRUP_GP_ID, A.SALDO,
                                        CAST(TRUNC(A.SALDO*CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                                   FROM TBAGRUPAMENTO_CARGA_GP A
                                  WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                    AND A.PERFIL = :PERFIL
                                    AND A.SALDO > 0
                                  ORDER BY A.SALDO DESC
                                ) X
                          )
                  WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD )
                   INTO :GP_ID,
                        :AGRUP_GP_TOTAL
                     DO BEGIN
    
                        IF (GP_ID > 0) THEN
                            BEGIN
    
                            IF (AGRUP_GP_TOTAL < VQTD) THEN
                                BEGIN
                                    VQTD = AGRUP_GP_TOTAL;
                                END
    
                            IF (VQTD > 0) THEN
                                BEGIN
    
                                   FOR
                                    SELECT FIRST 1
                                        FERRAMENTARIA_ID,
                                        SUM(DISP) OVER() AS AGRUP_FER_TOTAL
                                      FROM (
                                            SELECT
                                                    Y.FERRAMENTARIA_ID,
                                                    Y.AGRUP_FER_ID,
                                                    Y.APROVEITAMENTO,
                                                    Y.SALDO,
                                                    CAST(Y.DISP-(MOD(Y.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                              FROM (
                                                    SELECT
                                                        X.FERRAMENTARIA_ID,
                                                        X.AGRUP_FER_ID,
                                                        X.APROVEITAMENTO,
                                                        X.SALDO,
                                                        CAST(TRUNC(X.SALDO * CAST(:CAP_PROD_SKU AS NUMERIC(15,4)) * (X.APROVEITAMENTO / 100.0000) ) AS INTEGER) DISP
                                                      FROM (
                                                            SELECT F.ID FERRAMENTARIA_ID,  I.APROVEITAMENTO,
                                                            COALESCE((SELECT AC.ID
                                                                   FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                   WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                     AND AC.FERRAMENTA_ID = F.ID),0) AGRUP_FER_ID,
                                                                   COALESCE((SELECT AC.SALDO
                                                                   FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                   WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                     AND AC.FERRAMENTA_ID = F.ID),A.MINUTOS_PRODUTIVOS) SALDO
                                                            
                                                            FROM TBAGRUPAMENTO A, TBFERRAMENTARIA F, TBFERRAMENTARIA_ITEM I, TBMODELO M
                                                            WHERE A.ID = :AGRUPAMENTO_ID
                                                              AND F.ID = I.FERRAMENTARIA_ID
                                                              AND I.LINHA_ID = M.LINHA_CODIGO
                                                              AND M.CODIGO = :MODELO_CODIGO
                                                              AND I.TAMANHO   = :TAMANHO
                                                              AND I.APROVEITAMENTO > 0
                                                              AND F.STATUS = '1'
                                                              AND F.STATUS_PEDIDO = '1'
                                                            ) X
                                                     WHERE X.SALDO > 0
                                                     ORDER BY X.SALDO DESC
                                                   ) Y
                                              ) WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD ) 
                                     INTO :FERRAMENTARIA_ID,
                                          :AGRUP_FER_TOTAL
                                     DO BEGIN
    
                                         IF (FERRAMENTARIA_ID > 0) THEN
                                            BEGIN
    
                                            IF (AGRUP_FER_TOTAL < VQTD) THEN
                                                BEGIN
                                                    VQTD = AGRUP_FER_TOTAL;
                                                END
    
                                                IF (VQTD > 0) THEN
                                                    BEGIN
    
                                                        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_TEMPO_PROD_SKU (
    PROGRAMADO varchar(1),
    PEDIDO integer,
    PED_ITEM_ID integer,
    DATA_PRODUCAO date,
    DATA_CLIENTE date,
    DATA_EMISSAO date,
    MODELO_CODIGO integer,
    PRODUTO_CODIGO integer,
    COR_ID integer,
    PERFIL varchar(40),
    TAMANHO integer,
    QTD_EST numeric(18,4),
    QTD_REM numeric(18,4),
    QTD_AGP numeric(18,4),
    EST_MIN char(4),
    SALDO numeric(18,4),
    QTD_MINIMO integer,
    QTD_MULTIPLO integer,
    REM_STATUS char(4),
    MP numeric(18,4),
    ESTABELECIMENTO_ID integer,
    PERFIL_PED varchar(10),
    DATA_AGRUPAMENTO date,
    VPED_ITEM_ID integer,
    PERFIL_COR varchar(10),
    TRATAMENTO_PEDIDO_MP char(1),
    PRODUZIR numeric(18,4))
as
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_UP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable AGRUP_UP_TOTAL integer;
declare variable VTEMPO numeric(18,4);
declare variable CAP_PROD_SKU numeric(18,4);
BEGIN


    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
       FROM SPC_AGRUPAMENTO_DATA(:ESTABELECIMENTO_ID, :PROGRAMADO, :DATA_PRODUCAO, :VDATA_PRODUCAO, :DATA_CLIENTE, :DATA_EMISSAO)
       where GP_ID > 0

        INTO :AGRUPAMENTO_ID,
             :GP_ID
    DO BEGIN

         IF (VSALDO > 0) THEN
         BEGIN

            
             SELECT
                coalesce(S.TOTAL,0) as TOTAL
             FROM SPC_TEMPO_GP(:GP_ID, :MODELO_CODIGO, :COR_ID, :TAMANHO, 1) S
             INTO :VTEMPO;

            if(VTEMPO <= 0)then
             begin
                --exception "..." 'MODELO '||:MODELO_CODIGO||' SEM TEMPOS DEFINIDO, GP:'||GP_ID||', COR:'||COR_ID||', TAM:'||:TAMANHO||'';
             end

            CAP_PROD_SKU = VTEMPO;
            VQTD = VSALDO;
        
            IF (VQTD > 0 and VTEMPO > 0) THEN
            BEGIN
            
                FOR
                    SELECT FIRST 1 UP_ID,
                            SUM(DISP) OVER() AS AGRUP_UP_TOTAL
                    FROM (
                     SELECT X.UP_ID, X.AGRUP_UP_ID, X.SALDO,
                            CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                       FROM (
                             SELECT A.UP_ID, A.ID AGRUP_UP_ID, A.SALDO,
                                    CAST(TRUNC(A.SALDO / CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                               FROM (
                                    select distinct
                                        a.*
                                    from TBAGRUPAMENTO_CARGA_UP A, tbsub_up s
                                    WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                    and s.up_id = a.up_id
                                    and s.perfil_sku = :PERFIL
                                    AND A.SALDO > 0
                              ) A
                              ORDER BY A.SALDO DESC
                            ) X
                      )
                    WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD )
                    INTO :UP_ID,
                    :AGRUP_UP_TOTAL
                DO BEGIN
                
                    IF (UP_ID > 0) THEN
                    BEGIN
                    
                        IF (AGRUP_UP_TOTAL < VQTD) THEN
                        BEGIN
                            VQTD = AGRUP_UP_TOTAL;
                        END
                        
                        IF (VQTD > 0) THEN
                        BEGIN
                            
                            VAGR_PED_ID = GEN_ID(GTBAGRUPAMENTO_PEDIDO,1);
                            
                            INSERT INTO TBAGRUPAMENTO_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
                                    UP_ID,
                                    AGRUP_UP_ID,
                                    DISP
                                FROM (
                                    SELECT X.UP_ID, X.AGRUP_UP_ID, X.SALDO,
                                    CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                    FROM (
                                        SELECT A.UP_ID, A.ID AGRUP_UP_ID, A.SALDO,
                                            CAST(TRUNC(A.SALDO / CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                                        FROM (
                                            select distinct
                                                a.*
                                            from TBAGRUPAMENTO_CARGA_UP A, tbsub_up s
                                            WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and s.up_id = a.up_id
                                            and s.perfil_sku = :PERFIL
                                            AND A.SALDO > 0
                                        ) A
                                        ORDER BY A.SALDO DESC
                                    ) X
                                )
                                WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD )
                            INTO
                                :UP_ID,
                                :AGRUP_UP_ID,
                                :AGRUP_UP_DISP
                            DO BEGIN
                                IF(VEXIT = FALSE) THEN
                                BEGIN
                                
                                    IF(:VQTDGP > 0) THEN
                                    BEGIN
                                        IF (AGRUP_UP_DISP < VQTDGP) THEN
                                        BEGIN
                                            VQTDTEMP = :AGRUP_UP_DISP;
                                        END ELSE
                                        BEGIN
                                            VQTDTEMP = :VQTDGP;
                                        END
                                        
                                        INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (AGRUPAMENTO_ID,
                                        AGRUP_PED_ID,AGRUP_UP_ID,QUANTIDADE,NECESSIDADE, TIPO) VALUES (
                                        :AGRUPAMENTO_ID,:VAGR_PED_ID,:AGRUP_UP_ID,:VQTDTEMP,:VQTDTEMP * :CAP_PROD_SKU, 1);

                                        VQTDGP = :VQTDGP - :VQTDTEMP;
                                    END ELSE
                                    BEGIN
                                        VEXIT = TRUE;
                                    END
                                END
                            END
                            
                            VQTDFER = :VQTD;
                            VEXIT = FALSE;
                            
                            VSALDO = VSALDO - VQTD;
                        END
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_TRATA_PEDIDO_AGRUPAMENTO_V2 (
    PEDIDO integer,
    PED_ITEM_ID integer)
as
declare variable DATA_PRODUCAO date;
declare variable MODELO_CODIGO integer;
declare variable PRODUTO_CODIGO integer;
declare variable PERFIL varchar(40);
declare variable TAMANHO integer;
declare variable QTD_EST numeric(18,4);
declare variable QTD_REM numeric(18,4);
declare variable QTD_AGP numeric(18,4);
declare variable EST_MIN char(4);
declare variable CAP_PROD_SKU numeric(18,4);
declare variable SALDO numeric(18,4);
declare variable QTD_MINIMO integer;
declare variable QTD_MULTIPLO integer;
declare variable REM_STATUS char(4);
declare variable MP numeric(18,4);
declare variable ESTABELECIMENTO_ID integer;
declare variable PERFIL_PED varchar(10);
declare variable DATA_AGRUPAMENTO date;
declare variable VPED_ITEM_ID integer;
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_GP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable PRODUZIR numeric(18,4);
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable PERFIL_COR varchar(10);
declare variable TRATAMENTO_PEDIDO_MP char(1);
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable AGRUP_UP_TOTAL integer;
declare variable COR_ID integer;
declare variable PROGRAMADO integer;
declare variable DATA_CLIENTE date;
declare variable DATA_EMISSAO date;
BEGIN

    FOR
        SELECT  P.DATA_CLIENTE,
                P.DATA,
                A.DATA_PRODUCAO,
                A.MODELO_CODIGO,
                A.PRODUTO_CODIGO,
                A.COR_ID,
                A.PERFIL,
                A.TAMANHO,
                A.QTD_EST,
                A.QTD_REM,
                A.QTD_AGP,
                A.EST_MIN,
               (SELECT FIRST 1 P.CAP_PRODUTIVA FROM TBPERFIL P WHERE P.TABELA = 'SKU' AND P.ID = A.PERFIL) CAP_PROD_SKU,
        
               CAST(COALESCE((SELECT FIRST 1 S.QUANTIDADE FROM TBPEDIDO_ITEM_SALDO S
                 WHERE S.PEDIDO = A.PEDIDO AND S.PEDIDO_ITEM_CONTROLE = A.CONTROLE),0.0000) AS NUMERIC(15,4)) SALDO,

               COALESCE((SELECT FIRST 1 CASE WHEN A.TAMANHO = 1 THEN MI01 WHEN A.TAMANHO = 2 THEN MI02
                                             WHEN A.TAMANHO = 3 THEN MI03 WHEN A.TAMANHO = 4 THEN MI04
                                             WHEN A.TAMANHO = 5 THEN MI05 WHEN A.TAMANHO = 6 THEN MI06
                                             WHEN A.TAMANHO = 7 THEN MI07 WHEN A.TAMANHO = 8 THEN MI08
                                             WHEN A.TAMANHO = 9 THEN MI09 WHEN A.TAMANHO =10 THEN MI10
                                             WHEN A.TAMANHO =11 THEN MI11 WHEN A.TAMANHO =12 THEN MI12
                                             WHEN A.TAMANHO =13 THEN MI13 WHEN A.TAMANHO =14 THEN MI14
                                             WHEN A.TAMANHO =15 THEN MI15 WHEN A.TAMANHO =16 THEN MI16
                                             WHEN A.TAMANHO =17 THEN MI17 WHEN A.TAMANHO =18 THEN MI18
                                             WHEN A.TAMANHO =19 THEN MI19 WHEN A.TAMANHO =20 THEN MI20 END
                           FROM TBMODELO_PEDIDO_COTA M WHERE M.MODELO_ID = A.MODELO_CODIGO),1) QTD_MINIMO,
        
               COALESCE((SELECT FIRST 1 CASE WHEN A.TAMANHO = 1 THEN MU01 WHEN A.TAMANHO = 2 THEN MU02
                                             WHEN A.TAMANHO = 3 THEN MU03 WHEN A.TAMANHO = 4 THEN MU04
                                             WHEN A.TAMANHO = 5 THEN MU05 WHEN A.TAMANHO = 6 THEN MU06
                                             WHEN A.TAMANHO = 7 THEN MU07 WHEN A.TAMANHO = 8 THEN MU08
                                             WHEN A.TAMANHO = 9 THEN MU09 WHEN A.TAMANHO =10 THEN MU10
                                             WHEN A.TAMANHO =11 THEN MU11 WHEN A.TAMANHO =12 THEN MU12
                                             WHEN A.TAMANHO =13 THEN MU13 WHEN A.TAMANHO =14 THEN MU14
                                             WHEN A.TAMANHO =15 THEN MU15 WHEN A.TAMANHO =16 THEN MU16
                                             WHEN A.TAMANHO =17 THEN MU17 WHEN A.TAMANHO =18 THEN MU18
                                             WHEN A.TAMANHO =19 THEN MU19 WHEN A.TAMANHO =20 THEN MU20 END
                           FROM TBMODELO_PEDIDO_COTA M WHERE M.MODELO_ID = A.MODELO_CODIGO),1) QTD_MULTIPLO,

               COALESCE((SELECT FIRST 1 T.STATUS FROM TBREMESSA_ITEM_TRATAMENTO T
                          WHERE T.ESTABELECIMENTO_ID = P.ESTABELECIMENTO_CODIGO
                            AND T.TABELA_ID = A.PEDIDO AND T.TAB_ITEM_ID = A.CONTROLE
                            AND T.STATUS = '1'),'0') REM_STATUS,
             
               COALESCE((SELECT SUM(G.NECESSIDADE)
                  FROM TBPEDIDO_CONSUMO G
                 WHERE G.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                   AND G.PEDIDO_ID = A.PEDIDO
                   AND G.PEDIDO_ITEM_ID = A.CONTROLE
                   AND G.TAMANHO_ITEM = A.TAMANHO),-1) MP,

                P.ESTABELECIMENTO_CODIGO,
                P.CLASSIFICACAO AS PERFIL_PED,
                P.DATA_ENTREGA AS DATA_AGRUPAMENTO,
                A.CONTROLE AS VPED_ITEM_ID,
                A.PERFIL_COR,
                (SELECT FIRST 1 PF.TRATAMENTO_PEDIDO_MP FROM TBPERFIL PF WHERE PF.TABELA = 'PED' AND PF.ID = P.CLASSIFICACAO) as TRATAMENTO_PEDIDO_MP,
                p.programado


         FROM TBPEDIDO P, TBPEDIDO_ITEM A
        WHERE P.PEDIDO = A.PEDIDO
          AND A.PEDIDO = :PEDIDO
          AND A.SITUACAO = 1
          AND A.TAMANHO > 0
          AND IIF( :PED_ITEM_ID > 0, A.CONTROLE = :PED_ITEM_ID, TRUE)

        INTO :DATA_CLIENTE,
             :DATA_EMISSAO,
             :DATA_PRODUCAO,
             :MODELO_CODIGO,
             :PRODUTO_CODIGO,
             :COR_ID,
             :PERFIL,
             :TAMANHO,
             :QTD_EST,
             :QTD_REM,
             :QTD_AGP,
             :EST_MIN,
             :CAP_PROD_SKU,
             :SALDO,
             :QTD_MINIMO,
             :QTD_MULTIPLO,
             :REM_STATUS,
             :MP,
             :ESTABELECIMENTO_ID,
             :PERFIL_PED,
             :DATA_AGRUPAMENTO,
             :VPED_ITEM_ID,
             :PERFIL_COR,
             :TRATAMENTO_PEDIDO_MP,
             :PROGRAMADO
        DO BEGIN
           IF (NOT QTD_MULTIPLO > 0) THEN
              QTD_MULTIPLO = 1;

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

           /* PEDIDOS DE AMOSTRAS */
           IF (REM_STATUS = '0' AND PRODUZIR > 0 AND EST_MIN = '0' AND TRATAMENTO_PEDIDO_MP = '2') THEN
               BEGIN

               if(PROGRAMADO = '0')then
               begin
                    AGRUPAMENTO_ID = COALESCE((SELECT FIRST 1 A.ID FROM TBAGRUPAMENTO A
                                            WHERE :DATA_AGRUPAMENTO BETWEEN A.DATA_INICIAL AND A.DATA_FINAL
                                              AND A.PERFIL = :PERFIL_PED AND A.STATUS = '1'
                                           ),0);
               end else
               begin
                   AGRUPAMENTO_ID = COALESCE((SELECT FIRST 1 A.ID FROM TBAGRUPAMENTO A
                                            WHERE :DATA_EMISSAO BETWEEN A.DATA_INICIAL AND A.DATA_FINAL
                                              AND A.PERFIL = :PERFIL_PED AND A.STATUS = '1'
                                           ),0);
               end

                IF (AGRUPAMENTO_ID > 0) THEN
                    BEGIN
                    INSERT INTO TBAGRUPAMENTO_PEDIDO (ESTABELECIMENTO_ID, AGRUPAMENTO_ID,
                    TABELA_ID, TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, TIPO,
                    SALDO, PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR)
                    VALUES (:ESTABELECIMENTO_ID, :AGRUPAMENTO_ID,
                    :PEDIDO, :VPED_ITEM_ID, :PRODUTO_CODIGO, :TAMANHO,
                    :PRODUZIR, 'P', :PRODUZIR, :PERFIL, 0, :PERFIL_COR, 0 );
                    END

               END ELSE

           /* PEDIDOS NORMAIS */
           IF (REM_STATUS = '0' AND PRODUZIR > 0 AND EST_MIN = '0') THEN
               BEGIN

                    IF(CAP_PROD_SKU > 0)THEN
                    BEGIN
    
                        IF (PRODUZIR > 0) THEN
                        BEGIN
                            EXECUTE PROCEDURE SPI_PEDIDO_AGP_CAP_PROD_SKU(
                                 :PROGRAMADO,
                                 :PEDIDO,
                                 :PED_ITEM_ID,
                                 :DATA_PRODUCAO,
                                 :DATA_CLIENTE,
                                 :DATA_EMISSAO,
                                 :MODELO_CODIGO,
                                 :PRODUTO_CODIGO,
                                 :PERFIL,
                                 :TAMANHO,
                                 :QTD_EST,
                                 :QTD_REM,
                                 :QTD_AGP,
                                 :EST_MIN,
                                 :CAP_PROD_SKU,
                                 :SALDO,
                                 :QTD_MINIMO,
                                 :QTD_MULTIPLO,
                                 :REM_STATUS,
                                 :MP,
                                 :ESTABELECIMENTO_ID,
                                 :PERFIL_PED,
                                 :DATA_AGRUPAMENTO,
                                 :VPED_ITEM_ID,
                                 :PERFIL_COR,
                                 :TRATAMENTO_PEDIDO_MP,
                                 :PRODUZIR
                            );
                        end
    
                    END ELSE
                    BEGIN

                        IF (PRODUZIR > 0) THEN
                        BEGIN
                            EXECUTE PROCEDURE SPI_PEDIDO_AGP_TEMPO_PROD_SKU(
                                 :PROGRAMADO,
                                 :PEDIDO,
                                 :PED_ITEM_ID,
                                 :DATA_PRODUCAO,
                                 :DATA_CLIENTE,
                                 :DATA_EMISSAO,
                                 :MODELO_CODIGO,
                                 :PRODUTO_CODIGO,
                                 :COR_ID,
                                 :PERFIL,
                                 :TAMANHO,
                                 :QTD_EST,
                                 :QTD_REM,
                                 :QTD_AGP,
                                 :EST_MIN,
                                 :SALDO,
                                 :QTD_MINIMO,
                                 :QTD_MULTIPLO,
                                 :REM_STATUS,
                                 :MP,
                                 :ESTABELECIMENTO_ID,
                                 :PERFIL_PED,
                                 :DATA_AGRUPAMENTO,
                                 :VPED_ITEM_ID,
                                 :PERFIL_COR,
                                 :TRATAMENTO_PEDIDO_MP,
                                 :PRODUZIR
                            );
                       end

                    END

               END
     END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_PEDIDO_AGP_CAP_PROD_SKU (
    PROGRAMADO varchar(1),
    PEDIDO integer,
    PED_ITEM_ID integer,
    DATA_PRODUCAO date,
    DATA_CLIENTE date,
    DATA_EMISSAO date,
    MODELO_CODIGO integer,
    PRODUTO_CODIGO integer,
    PERFIL varchar(40),
    TAMANHO integer,
    QTD_EST numeric(18,4),
    QTD_REM numeric(18,4),
    QTD_AGP numeric(18,4),
    EST_MIN char(4),
    CAP_PROD_SKU numeric(18,4),
    SALDO numeric(18,4),
    QTD_MINIMO integer,
    QTD_MULTIPLO integer,
    REM_STATUS char(4),
    MP numeric(18,4),
    ESTABELECIMENTO_ID integer,
    PERFIL_PED varchar(10),
    DATA_AGRUPAMENTO date,
    VPED_ITEM_ID integer,
    PERFIL_COR varchar(10),
    TRATAMENTO_PEDIDO_MP char(1),
    PRODUZIR numeric(18,4))
as
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_GP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable AGRUP_UP_TOTAL integer;
BEGIN

    VSALDO = TRUNC(PRODUZIR);

    IF (MP = 0) THEN --SE NÃ£O HOUVER NECESSIDADE DE TECIDO (OU SEJA, O PROJETADO PARA O ITEM DO PEDIDO ESTÃ¡ ALOCADO AO MESMO)
    BEGIN
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 6) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 06; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 7) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 05; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 1) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 11; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 2) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 10; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 3) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 09; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 4) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 08; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 5) THEN BEGIN VDATA_PRODUCAO = CURRENT_DATE + 07; END
    END ELSE
    IF (DATA_PRODUCAO IS NOT NULL) THEN
    BEGIN
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 6) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 06; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 7) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 07; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 1) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 01; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 2) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 02; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 3) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 03; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 4) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 04; END
        IF (EXTRACT (WEEKDAY FROM CURRENT_DATE) = 5) THEN BEGIN VDATA_PRODUCAO = DATA_PRODUCAO - 05; END
    END ELSE
    BEGIN
        VDATA_PRODUCAO = :DATA_AGRUPAMENTO;
    END
    
    FOR

       select
            AGRUPAMENTO_ID,
            GP_ID
       FROM SPC_AGRUPAMENTO_DATA(:ESTABELECIMENTO_ID, :PROGRAMADO, :DATA_PRODUCAO, :VDATA_PRODUCAO, :DATA_CLIENTE, :DATA_EMISSAO)

    INTO :AGRUPAMENTO_ID,
         :MINUTOS_PRODUTIVOS
    DO BEGIN
    
       IF (MINUTOS_PRODUTIVOS > 0 AND VSALDO > 0) THEN
           BEGIN
           VQTD = VSALDO;
    
           IF (VQTD > 0) THEN
               BEGIN
    
                 FOR
                 SELECT FIRST 1 GP_ID,
                                SUM(DISP) OVER() AS AGRUP_GP_TOTAL
                   FROM (
                         SELECT X.GP_ID, X.SUBUP_ID, X.AGRUP_GP_ID, X.SALDO,
                                CAST(X.DISP-(MOD(X.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                           FROM (
                                 SELECT A.GP_ID, A.SUBUP_ID, A.ID AGRUP_GP_ID, A.SALDO,
                                        CAST(TRUNC(A.SALDO*CAST(:CAP_PROD_SKU AS NUMERIC(15,4))) AS INTEGER) DISP
                                   FROM TBAGRUPAMENTO_CARGA_GP A
                                  WHERE A.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                    AND A.PERFIL = :PERFIL
                                    AND A.SALDO > 0
                                  ORDER BY A.SALDO DESC
                                ) X
                          )
                  WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD )
                   INTO :GP_ID,
                        :AGRUP_GP_TOTAL
                     DO BEGIN
    
                        IF (GP_ID > 0) THEN
                            BEGIN
    
                            IF (AGRUP_GP_TOTAL < VQTD) THEN
                                BEGIN
                                    VQTD = AGRUP_GP_TOTAL;
                                END
    
                            IF (VQTD > 0) THEN
                                BEGIN
    
                                   FOR
                                    SELECT FIRST 1
                                        FERRAMENTARIA_ID,
                                        SUM(DISP) OVER() AS AGRUP_FER_TOTAL
                                      FROM (
                                            SELECT
                                                    Y.FERRAMENTARIA_ID,
                                                    Y.AGRUP_FER_ID,
                                                    Y.APROVEITAMENTO,
                                                    Y.SALDO,
                                                    CAST(Y.DISP-(MOD(Y.DISP,CAST(:QTD_MULTIPLO AS INTEGER))) AS INTEGER) DISP
                                              FROM (
                                                    SELECT
                                                        X.FERRAMENTARIA_ID,
                                                        X.AGRUP_FER_ID,
                                                        X.APROVEITAMENTO,
                                                        X.SALDO,
                                                        CAST(TRUNC(X.SALDO * CAST(:CAP_PROD_SKU AS NUMERIC(15,4)) * (X.APROVEITAMENTO / 100.0000) ) AS INTEGER) DISP
                                                      FROM (
                                                            SELECT F.ID FERRAMENTARIA_ID,  I.APROVEITAMENTO,
                                                            COALESCE((SELECT AC.ID
                                                                   FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                   WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                     AND AC.FERRAMENTA_ID = F.ID),0) AGRUP_FER_ID,
                                                                   COALESCE((SELECT AC.SALDO
                                                                   FROM TBAGRUPAMENTO_CARGA_FERRAMENTA AC
                                                                   WHERE AC.AGRUPAMENTO_ID = A.ID
                                                                     AND AC.FERRAMENTA_ID = F.ID),A.MINUTOS_PRODUTIVOS) SALDO
                                                            
                                                            FROM TBAGRUPAMENTO A, TBFERRAMENTARIA F, TBFERRAMENTARIA_ITEM I, TBMODELO M
                                                            WHERE A.ID = :AGRUPAMENTO_ID
                                                              AND F.ID = I.FERRAMENTARIA_ID
                                                              AND I.LINHA_ID = M.LINHA_CODIGO
                                                              AND M.CODIGO = :MODELO_CODIGO
                                                              AND I.TAMANHO   = :TAMANHO
                                                              AND I.APROVEITAMENTO > 0
                                                              AND F.STATUS = '1'
                                                              AND F.STATUS_PEDIDO = '1'
                                                            ) X
                                                     WHERE X.SALDO > 0
                                                     ORDER BY X.SALDO DESC
                                                   ) Y
                                              ) WHERE DISP >= IIF( :QTD_MINIMO < :VQTD, :QTD_MINIMO, :VQTD ) 
                                     INTO :FERRAMENTARIA_ID,
                                          :AGRUP_FER_TOTAL
                                     DO BEGIN
    
                                         IF (FERRAMENTARIA_ID > 0) THEN
                                            BEGIN
    
                                            IF (AGRUP_FER_TOTAL < VQTD) THEN
                                                BEGIN
                                                    VQTD = AGRUP_FER_TOTAL;
                                                END
    
                                                IF (VQTD > 0) THEN
                                                    BEGIN
    
                                                        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_TRATA_PEDIDO_AGRUPAMENTO_V2 (
    PEDIDO integer,
    PED_ITEM_ID integer)
as
declare variable DATA_PRODUCAO date;
declare variable MODELO_CODIGO integer;
declare variable PRODUTO_CODIGO integer;
declare variable PERFIL varchar(40);
declare variable TAMANHO integer;
declare variable QTD_EST numeric(18,4);
declare variable QTD_REM numeric(18,4);
declare variable QTD_AGP numeric(18,4);
declare variable EST_MIN char(4);
declare variable CAP_PROD_SKU numeric(18,4);
declare variable SALDO numeric(18,4);
declare variable QTD_MINIMO integer;
declare variable QTD_MULTIPLO integer;
declare variable REM_STATUS char(4);
declare variable MP numeric(18,4);
declare variable ESTABELECIMENTO_ID integer;
declare variable PERFIL_PED varchar(10);
declare variable DATA_AGRUPAMENTO date;
declare variable VPED_ITEM_ID integer;
declare variable AGRUPAMENTO_ID integer;
declare variable MINUTOS_PRODUTIVOS integer;
declare variable GP_ID integer;
declare variable AGRUP_GP_ID integer;
declare variable AGRUP_GP_DISP integer;
declare variable AGRUP_GP_TOTAL integer;
declare variable FERRAMENTARIA_ID integer;
declare variable AGRUP_FER_ID integer;
declare variable APROVEITAMENTO integer;
declare variable AGRUP_FER_DISP integer;
declare variable AGRUP_FER_TOTAL integer;
declare variable PRODUZIR numeric(18,4);
declare variable VSALDO numeric(18,4);
declare variable VQTD numeric(18,4);
declare variable VQTDGP numeric(18,4);
declare variable VQTDFER numeric(18,4);
declare variable VQTDTEMP numeric(18,4);
declare variable VDATA_PRODUCAO date;
declare variable VAGR_PED_ID integer;
declare variable VAGRUP_FER_ID integer;
declare variable VEXIT boolean;
declare variable PERFIL_COR varchar(10);
declare variable TRATAMENTO_PEDIDO_MP char(1);
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable AGRUP_UP_TOTAL integer;
declare variable COR_ID integer;
declare variable PROGRAMADO integer;
declare variable DATA_CLIENTE date;
declare variable DATA_EMISSAO date;
BEGIN

    FOR
        SELECT  P.DATA_CLIENTE,
                P.DATA,
                A.DATA_PRODUCAO,
                A.MODELO_CODIGO,
                A.PRODUTO_CODIGO,
                A.COR_ID,
                A.PERFIL,
                A.TAMANHO,
                A.QTD_EST,
                A.QTD_REM,
                A.QTD_AGP,
                A.EST_MIN,
               (SELECT FIRST 1 P.CAP_PRODUTIVA FROM TBPERFIL P WHERE P.TABELA = 'SKU' AND P.ID = A.PERFIL) CAP_PROD_SKU,
        
               CAST(COALESCE((SELECT FIRST 1 S.QUANTIDADE FROM TBPEDIDO_ITEM_SALDO S
                 WHERE S.PEDIDO = A.PEDIDO AND S.PEDIDO_ITEM_CONTROLE = A.CONTROLE),0.0000) AS NUMERIC(15,4)) SALDO,

               COALESCE((SELECT FIRST 1 CASE WHEN A.TAMANHO = 1 THEN MI01 WHEN A.TAMANHO = 2 THEN MI02
                                             WHEN A.TAMANHO = 3 THEN MI03 WHEN A.TAMANHO = 4 THEN MI04
                                             WHEN A.TAMANHO = 5 THEN MI05 WHEN A.TAMANHO = 6 THEN MI06
                                             WHEN A.TAMANHO = 7 THEN MI07 WHEN A.TAMANHO = 8 THEN MI08
                                             WHEN A.TAMANHO = 9 THEN MI09 WHEN A.TAMANHO =10 THEN MI10
                                             WHEN A.TAMANHO =11 THEN MI11 WHEN A.TAMANHO =12 THEN MI12
                                             WHEN A.TAMANHO =13 THEN MI13 WHEN A.TAMANHO =14 THEN MI14
                                             WHEN A.TAMANHO =15 THEN MI15 WHEN A.TAMANHO =16 THEN MI16
                                             WHEN A.TAMANHO =17 THEN MI17 WHEN A.TAMANHO =18 THEN MI18
                                             WHEN A.TAMANHO =19 THEN MI19 WHEN A.TAMANHO =20 THEN MI20 END
                           FROM TBMODELO_PEDIDO_COTA M WHERE M.MODELO_ID = A.MODELO_CODIGO),1) QTD_MINIMO,
        
               COALESCE((SELECT FIRST 1 CASE WHEN A.TAMANHO = 1 THEN MU01 WHEN A.TAMANHO = 2 THEN MU02
                                             WHEN A.TAMANHO = 3 THEN MU03 WHEN A.TAMANHO = 4 THEN MU04
                                             WHEN A.TAMANHO = 5 THEN MU05 WHEN A.TAMANHO = 6 THEN MU06
                                             WHEN A.TAMANHO = 7 THEN MU07 WHEN A.TAMANHO = 8 THEN MU08
                                             WHEN A.TAMANHO = 9 THEN MU09 WHEN A.TAMANHO =10 THEN MU10
                                             WHEN A.TAMANHO =11 THEN MU11 WHEN A.TAMANHO =12 THEN MU12
                                             WHEN A.TAMANHO =13 THEN MU13 WHEN A.TAMANHO =14 THEN MU14
                                             WHEN A.TAMANHO =15 THEN MU15 WHEN A.TAMANHO =16 THEN MU16
                                             WHEN A.TAMANHO =17 THEN MU17 WHEN A.TAMANHO =18 THEN MU18
                                             WHEN A.TAMANHO =19 THEN MU19 WHEN A.TAMANHO =20 THEN MU20 END
                           FROM TBMODELO_PEDIDO_COTA M WHERE M.MODELO_ID = A.MODELO_CODIGO),1) QTD_MULTIPLO,

               COALESCE((SELECT FIRST 1 T.STATUS FROM TBREMESSA_ITEM_TRATAMENTO T
                          WHERE T.ESTABELECIMENTO_ID = P.ESTABELECIMENTO_CODIGO
                            AND T.TABELA_ID = A.PEDIDO AND T.TAB_ITEM_ID = A.CONTROLE
                            AND T.STATUS = '1'),'0') REM_STATUS,
             
               COALESCE((SELECT SUM(G.NECESSIDADE)
                  FROM TBPEDIDO_CONSUMO G
                 WHERE G.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                   AND G.PEDIDO_ID = A.PEDIDO
                   AND G.PEDIDO_ITEM_ID = A.CONTROLE
                   AND G.TAMANHO_ITEM = A.TAMANHO),-1) MP,

                P.ESTABELECIMENTO_CODIGO,
                P.CLASSIFICACAO AS PERFIL_PED,
                P.DATA_ENTREGA AS DATA_AGRUPAMENTO,
                A.CONTROLE AS VPED_ITEM_ID,
                A.PERFIL_COR,
                (SELECT FIRST 1 PF.TRATAMENTO_PEDIDO_MP FROM TBPERFIL PF WHERE PF.TABELA = 'PED' AND PF.ID = P.CLASSIFICACAO) as TRATAMENTO_PEDIDO_MP,
                p.programado


         FROM TBPEDIDO P, TBPEDIDO_ITEM A
        WHERE P.PEDIDO = A.PEDIDO
          AND A.PEDIDO = :PEDIDO
          AND A.SITUACAO = 1
          AND A.TAMANHO > 0
          AND IIF( :PED_ITEM_ID > 0, A.CONTROLE = :PED_ITEM_ID, TRUE)

        INTO :DATA_CLIENTE,
             :DATA_EMISSAO,
             :DATA_PRODUCAO,
             :MODELO_CODIGO,
             :PRODUTO_CODIGO,
             :COR_ID,
             :PERFIL,
             :TAMANHO,
             :QTD_EST,
             :QTD_REM,
             :QTD_AGP,
             :EST_MIN,
             :CAP_PROD_SKU,
             :SALDO,
             :QTD_MINIMO,
             :QTD_MULTIPLO,
             :REM_STATUS,
             :MP,
             :ESTABELECIMENTO_ID,
             :PERFIL_PED,
             :DATA_AGRUPAMENTO,
             :VPED_ITEM_ID,
             :PERFIL_COR,
             :TRATAMENTO_PEDIDO_MP,
             :PROGRAMADO
        DO BEGIN
           IF (NOT QTD_MULTIPLO > 0) THEN
              QTD_MULTIPLO = 1;

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

           /* PEDIDOS DE AMOSTRAS */
           IF (REM_STATUS = '0' AND PRODUZIR > 0 AND EST_MIN = '0' AND TRATAMENTO_PEDIDO_MP = '2') THEN
               BEGIN

               if(PROGRAMADO = '0')then
               begin
                    AGRUPAMENTO_ID = COALESCE((SELECT FIRST 1 A.ID FROM TBAGRUPAMENTO A
                                            WHERE :DATA_AGRUPAMENTO BETWEEN A.DATA_INICIAL AND A.DATA_FINAL
                                              AND A.PERFIL = :PERFIL_PED AND A.STATUS = '1'
                                           ),0);
               end else
               begin
                   AGRUPAMENTO_ID = COALESCE((SELECT FIRST 1 A.ID FROM TBAGRUPAMENTO A
                                            WHERE :DATA_EMISSAO BETWEEN A.DATA_INICIAL AND A.DATA_FINAL
                                              AND A.PERFIL = :PERFIL_PED AND A.STATUS = '1'
                                           ),0);
               end

                IF (AGRUPAMENTO_ID > 0) THEN
                    BEGIN
                    INSERT INTO TBAGRUPAMENTO_PEDIDO (ESTABELECIMENTO_ID, AGRUPAMENTO_ID,
                    TABELA_ID, TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, TIPO,
                    SALDO, PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR)
                    VALUES (:ESTABELECIMENTO_ID, :AGRUPAMENTO_ID,
                    :PEDIDO, :VPED_ITEM_ID, :PRODUTO_CODIGO, :TAMANHO,
                    :PRODUZIR, 'P', :PRODUZIR, :PERFIL, 0, :PERFIL_COR, 0 );
                    END

               END ELSE

           /* PEDIDOS NORMAIS */
           IF (REM_STATUS = '0' AND PRODUZIR > 0 AND EST_MIN = '0') THEN
               BEGIN

                    IF(CAP_PROD_SKU > 0)THEN
                    BEGIN
    
                        IF (PRODUZIR > 0) THEN
                        BEGIN
                            EXECUTE PROCEDURE SPI_PEDIDO_AGP_CAP_PROD_SKU(
                                 :PROGRAMADO,
                                 :PEDIDO,
                                 :PED_ITEM_ID,
                                 :DATA_PRODUCAO,
                                 :DATA_CLIENTE,
                                 :DATA_EMISSAO,
                                 :MODELO_CODIGO,
                                 :PRODUTO_CODIGO,
                                 :PERFIL,
                                 :TAMANHO,
                                 :QTD_EST,
                                 :QTD_REM,
                                 :QTD_AGP,
                                 :EST_MIN,
                                 :CAP_PROD_SKU,
                                 :SALDO,
                                 :QTD_MINIMO,
                                 :QTD_MULTIPLO,
                                 :REM_STATUS,
                                 :MP,
                                 :ESTABELECIMENTO_ID,
                                 :PERFIL_PED,
                                 :DATA_AGRUPAMENTO,
                                 :VPED_ITEM_ID,
                                 :PERFIL_COR,
                                 :TRATAMENTO_PEDIDO_MP,
                                 :PRODUZIR
                            );
                        end
    
                    END ELSE
                    BEGIN

                        IF (PRODUZIR > 0) THEN
                        BEGIN
                            EXECUTE PROCEDURE SPI_PEDIDO_AGP_TEMPO_PROD_SKU(
                                 :PROGRAMADO,
                                 :PEDIDO,
                                 :PED_ITEM_ID,
                                 :DATA_PRODUCAO,
                                 :DATA_CLIENTE,
                                 :DATA_EMISSAO,
                                 :MODELO_CODIGO,
                                 :PRODUTO_CODIGO,
                                 :COR_ID,
                                 :PERFIL,
                                 :TAMANHO,
                                 :QTD_EST,
                                 :QTD_REM,
                                 :QTD_AGP,
                                 :EST_MIN,
                                 :SALDO,
                                 :QTD_MINIMO,
                                 :QTD_MULTIPLO,
                                 :REM_STATUS,
                                 :MP,
                                 :ESTABELECIMENTO_ID,
                                 :PERFIL_PED,
                                 :DATA_AGRUPAMENTO,
                                 :VPED_ITEM_ID,
                                 :PERFIL_COR,
                                 :TRATAMENTO_PEDIDO_MP,
                                 :PRODUZIR
                            );
                       end

                    END

               END
     END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TALAO_AGRUPAMENTO (
    REMESSA_ID integer,
    TALAO integer,
    OPERACAO integer)
as
declare variable TABELA_ID integer;
declare variable TAB_ITEM_ID integer;
declare variable QUANT numeric(15,4);
declare variable SALDO numeric(15,4);
declare variable TIPO char(1);
declare variable ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable ALOCACAO_ID integer;
declare variable TALAO_ID integer;
declare variable QUANTIDADE_PRODUCAO integer;
declare variable QUANTIDADE_ALOCACAO integer;
declare variable SALDO_PRODUCAO integer;
declare variable QTD_BAIXAR numeric(15,4);
declare variable SALDO2 numeric(15,4);
declare variable SALDO_BAIXA numeric(15,4);
begin

    select
        P.QUANTIDADE_PRODUCAO,
        p.controle,
        p.estabelecimento_codigo,
        p.localizacao_codigo,
        p.tamanho,
        P.produto_codigo
    from tbpedido_item_processado p
    where p.controle = :TALAO
    and p.remessa = :REMESSA_ID
        into :QUANTIDADE_PRODUCAO, :TALAO_ID, :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :TAMANHO, :PRODUTO_ID;

    TALAO_ID = coalesce(TALAO_ID,0);

    if(TALAO_ID = 0)then
    begin
       Exception "..." 'TALAO NAO ENCONTRADO, REMESSA_ID:'||:REMESSA_ID||', TALAO:'||:TALAO||'';
    end

    SALDO_PRODUCAO = QUANTIDADE_PRODUCAO;

    --produzir
    if (OPERACAO = 1) then
    Begin
    
        FOR
            select
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO, 
                QUANTIDADE,
                TIPO,
                ID
            from(
                Select
                    TABELA_ID,
                    TAB_ITEM_ID,
                    SALDO, 
                    QUANTIDADE,
                    TIPO,
                    ID,
                    IIF(TABELA_ID > 0, 2147483647 - TABELA_ID,0) ORDEM
                From TBREMESSA_ITEM_ALOCACAO
                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                  AND REMESSA = :REMESSA_ID
                  AND TALAO   = :TALAO
                  AND SALDO   > 0

              ) order by ORDEM DESC

        INTO :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID
        DO Begin
        
            IF(SALDO_PRODUCAO > SALDO)THEN
            BEGIN
                QTD_BAIXAR = SALDO;
            END ELSE
            BEGIN
                QTD_BAIXAR = SALDO_PRODUCAO;
            END

            SALDO_PRODUCAO = SALDO_PRODUCAO - QTD_BAIXAR;

            IF(QTD_BAIXAR > 0)THEN
            BEGIN
                if (:TABELA_ID > 0) then
                Begin
                    Insert into TBESTOQUE_DETALHE_ALOCACAO (
                        Estabelecimento_id,Tabela_id,Tab_item_id,Tipo,
                        Localizacao_id, Produto_id, Tamanho, Quantidade,
                        Saldo, Alocacao_Id) values (:ESTABELECIMENTO_ID, :TABELA_ID,
                        :TAB_ITEM_ID, :Tipo, :LOCALIZACAO_ID, :PRODUTO_ID,
                        :TAMANHO, :QTD_BAIXAR, :QTD_BAIXAR, :ID);
                End

                Update TBREMESSA_ITEM_ALOCACAO Set QTD_BAIXA = :QTD_BAIXAR, SALDO_BAIXA = SALDO - :QTD_BAIXAR, SALDO = 0
                Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                    and REMESSA = :REMESSA_ID and TALAO = :TALAO
                    and ID = :ID;

            END ELSE
            BEGIN

                Update TBREMESSA_ITEM_ALOCACAO Set QTD_BAIXA = SALDO, SALDO_BAIXA = 0, SALDO = 0
                Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                    and REMESSA = :REMESSA_ID and TALAO = :TALAO
                    and ID = :ID;
           END
        
        END
    End

    --desproduzir
    if (OPERACAO = 2) then
    Begin
    
        FOR
            Select
                coalesce(SALDO_BAIXA,0) AS SALDO_BAIXA,
                coalesce(QTD_BAIXA,0) AS QTD_BAIXA,
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO,
                QUANTIDADE,
                TIPO,
                ID
            From TBREMESSA_ITEM_ALOCACAO
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND REMESSA = :REMESSA_ID
              AND TALAO   = :TALAO
            INTO :SALDO_BAIXA, :QTD_BAIXAR, :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID
        DO Begin

            SALDO2      = 0;
            QUANT       = 0;
            ALOCACAO_ID = 0;

            select
                l.id,
                Quantidade,
                Saldo
            from TBESTOQUE_DETALHE_ALOCACAO l
            where Estabelecimento_id = :ESTABELECIMENTO_ID
            and Tabela_id = :TABELA_ID
            and Tab_item_id = :TAB_ITEM_ID
            and Tipo = 'P'
            and Localizacao_id = :LOCALIZACAO_ID
            and PRODUTO_ID = :PRODUTO_ID
            and Tamanho = :TAMANHO
            and Alocacao_Id = :ID
                into :ALOCACAO_ID, :QUANT, :SALDO2;
            

            if (:ALOCACAO_ID > 0 and :SALDO2 > 0 AND :TABELA_ID > 0) then
            Begin

                Delete From TBESTOQUE_DETALHE_ALOCACAO
                 where Estabelecimento_id = :ESTABELECIMENTO_ID
                    and Tabela_id = :TABELA_ID
                    and Tab_item_id = :TAB_ITEM_ID
                    and Tipo = 'P'
                    and Localizacao_id = :LOCALIZACAO_ID
                    and PRODUTO_ID = :PRODUTO_ID
                    and Tamanho = :TAMANHO
                    and Alocacao_Id = :ID;

                Update TBREMESSA_ITEM_ALOCACAO Set SALDO = :SALDO2, QUANTIDADE = :SALDO2, QTD_BAIXA = 0, SALDO_BAIXA = 0
                  Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                    and REMESSA = :REMESSA_ID and TALAO = :TALAO
                    and ID = :ID;

                IF((:QTD_BAIXAR + :SALDO_BAIXA) > :SALDO2)THEN
                BEGIN
                    INSERT INTO TBREMESSA_ITEM_ALOCACAO (
                        ID,
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        TABELA_ID,
                        TAB_ITEM_ID,
                        REMESSA,
                        TALAO,
                        PRODUTO_ID,
                        TAMANHO,
                        QUANTIDADE,
                        TIPO,
                        SALDO,
                        STATUS,
                        AGRUPAMENTO_ID,
                        AGRUP_PED_ID,
                        DATAHORA,
                        TAB_ITEM_ID_OLD,
                        USUARIO,
                        TEMPO,
                        QTD_BAIXA,
                        SALDO_BAIXA,
                        TIPO_REMESSA
                    ) SELECT
                        GEN_ID(Gtbremessa_item_alocacao,1),
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        0 TABELA_ID,
                        0 TAB_ITEM_ID,
                        REMESSA,
                        TALAO,
                        PRODUTO_ID,
                        TAMANHO,
                        (:QTD_BAIXAR + :SALDO_BAIXA) - :SALDO2 AS QUANTIDADE,
                        'R' TIPO,
                        (:QTD_BAIXAR + :SALDO_BAIXA) - :SALDO2 AS SALDO,
                        STATUS,
                        AGRUPAMENTO_ID,
                        AGRUP_PED_ID,
                        DATAHORA,
                        TAB_ITEM_ID_OLD,
                        USUARIO,
                        TEMPO,
                        0 QTD_BAIXA,
                        0 SALDO_BAIXA,
                        '22600'
                    FROM TBREMESSA_ITEM_ALOCACAO WHERE ID = :ID;

                END

            End else
            begin
                if (:ID > 0) then
                Begin
                     Update TBREMESSA_ITEM_ALOCACAO Set TIPO = 'R', SALDO = (QTD_BAIXA + SALDO_BAIXA), SALDO_BAIXA = 0, QTD_BAIXA = 0, TABELA_ID = 0, TAB_ITEM_ID = 0
                      Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        and REMESSA = :REMESSA_ID and TALAO = :TALAO
                        and ID = :ID;
                End
            End
        
        END
    End

    --encerrar
    if (OPERACAO = 3) then
    Begin
        FOR
            Select
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO,
                QUANTIDADE,
                TIPO,
                ID
            From TBREMESSA_ITEM_ALOCACAO
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND REMESSA = :REMESSA_ID
              AND TALAO = :TALAO
              AND SALDO > 0
        INTO :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID
        DO Begin
           if (:TABELA_ID > 0) then
           Begin
               --Exception "..." 'TALÃO NÃO PODE SER ENCERRADO, HÁ ITENS DE PEDIDO ALOCADOS A ELE. PEDIDO: '||:TABELA_ID||'';
                if (:ID > 0) then
                Begin
                     DELETE FROM TBREMESSA_ITEM_ALOCACAO
                      Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        and REMESSA = :REMESSA_ID and TALAO = :TALAO
                        and ID = :ID;
                End
           End
        End
    End

end
^

SET TERM ; ^

COMMENT ON PARAMETER SPU_TALAO_AGRUPAMENTO.OPERACAO IS
'1 - produzir, 2 - desproduzir, 3 - encerrar';

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_setor_b03u for tbremessa_setor
active before update position 3
AS
begin
  IF(NEW.situacao = 0 AND OLD.situacao = 1 and new.estoque = '1')THEN
  BEGIN
     EXECUTE PROCEDURE SPU_TALAO_AGRUPAMENTO(NEW.remessa, NEW.talao_id, 2);
  END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbagrupamento_carga_up_b02iu for tbagrupamento_carga_up
active before insert or update position 2
AS
begin
  if(new.saldo is null)then
  begin
    exception "..." 'SALDO DA UP '||NEW.up_id||' NO AGRUPAMENTO '||NEW.agrupamento_id||' NAO PODE SER NULO';
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATA_PEDIDO_REMESSA5 (
    PEDIDO_1 integer,
    ALOCDESALOC char(1))
returns (
    ESTABELECIMENTO_ID integer,
    PEDIDO integer,
    CONTROLE integer,
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer,
    TAMANHO integer,
    PERFIL_SKU varchar(10),
    PERFIL_COR varchar(10),
    REM_STATUS char(1),
    QTD_PRD numeric(15,4),
    REMESSA integer,
    TALAO integer,
    AGRUPAMENTO_ID integer,
    AGRUP_PED_ID integer,
    ID integer,
    QTD_DISP numeric(15,4),
    QTD_MULT integer)
as
declare variable VQTD_PRD integer;
declare variable VQTD_DISP integer;
declare variable ALOC_MULT char(1);
declare variable TIPO_REMESSA varchar(20);
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

FOR 
Select A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
       A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--     Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

       Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                  Where T.Tabela_Id = A.Pedido
                    and T.Tab_Item_Id = A.Controle
                    and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                    AND T.TAMANHO = A.TAMANHO
                    and T.Status = '1'),'0') Rem_Status,

       Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                  Where C.Pedido = A.Pedido
                    and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
       -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult


  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin

           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo, b.TIPO_REMESSA
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                Order By R.Data

                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp, :TIPO_REMESSA
                    Do
                      Begin

                      if (:ID > 0) then
                           Begin

                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
                    
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd, QUANTIDADE = QUANTIDADE - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_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,
                                                        SALDO, TIPO, REMESSA, PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR
                                                    ) VALUES (
                                                        :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                        :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                        0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0
                                                    );
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                                estabelecimento_id, tabela_id, tab_item_id, tipo,
                                                localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                                Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA
                                            ) values (
                                                :estabelecimento_id, :Pedido, :Controle, 'P',
                                                :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                                :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA
                                            );
                                            End
            
                                        vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                        --Exit;
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_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,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA);
                                            End
            
                                        vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                              End
                          End
                    End
           End
     End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATA_PEDIDO_REMESSA6 (
    PEDIDO_1 integer,
    ALOCDESALOC char(1))
returns (
    ESTABELECIMENTO_ID integer,
    PEDIDO integer,
    CONTROLE integer,
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer,
    TAMANHO integer,
    PERFIL_SKU varchar(10),
    PERFIL_COR varchar(10),
    REM_STATUS char(1),
    QTD_PRD numeric(15,4),
    REMESSA integer,
    TALAO integer,
    AGRUPAMENTO_ID integer,
    AGRUP_PED_ID integer,
    ID integer,
    QTD_DISP numeric(15,4),
    QTD_MULT integer)
as
declare variable VQTD_PRD integer;
declare variable VQTD_DISP integer;
declare variable ALOC_MULT char(1);
declare variable TIPO_REMESSA varchar(20);
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

FOR 
Select A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
       A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--     Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

       Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                  Where T.Tabela_Id = A.Pedido
                    and T.Tab_Item_Id = A.Controle
                    and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                    AND T.TAMANHO = A.TAMANHO
                    and T.Status = '1'),'0') Rem_Status,

       Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                  Where C.Pedido = A.Pedido
                    and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
       -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult


  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin

           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo, b.TIPO_REMESSA
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                and B.Saldo >= :Qtd_Mult
                Order By R.Data

                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp, :TIPO_REMESSA
                    Do
                      Begin

                      if (:ID > 0) then
                           Begin

                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
                    
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd, QUANTIDADE = QUANTIDADE - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_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,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA);
                                            End
            
                                        vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                        --Exit;
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_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,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA);
                                            End
            
                                        vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                              End
                          End
                    End
           End
     End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATA_PED_ITEM_REMESSA5 (
    PEDIDO_1 integer,
    CONTROLE_1 integer,
    ALOCDESALOC char(1))
returns (
    ESTABELECIMENTO_ID integer,
    PEDIDO integer,
    CONTROLE integer,
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer,
    TAMANHO integer,
    PERFIL_SKU varchar(10),
    PERFIL_COR varchar(10),
    REM_STATUS char(1),
    QTD_PRD numeric(15,4),
    REMESSA integer,
    TALAO integer,
    AGRUPAMENTO_ID integer,
    AGRUP_PED_ID integer,
    ID integer,
    QTD_DISP numeric(15,4),
    QTD_MULT integer,
    ALOC_MULT char(1))
as
declare variable VQTD_PRD integer;
declare variable VQTD_DISP integer;
declare variable TIPO_REMESSA varchar(20);
BEGIN
    
FOR
Select First 1 A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
               A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--               Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                          Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

               Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                          Where T.Tabela_Id = A.Pedido
                            and T.Tab_Item_Id = A.Controle
                            and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                            AND T.TAMANHO = A.TAMANHO
                            and T.Status = '1'),'0') Rem_Status,

               Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                          Where C.Pedido = A.Pedido
                            and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
               -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult,

                  (Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                     From TbPedido P, TbPerfil PF
                    Where P.Pedido = A.Pedido
                      and P.Classificacao = PF.Id
                      and PF.Tabela = 'PED') aloc_mult

  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Controle = :Controle_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :qtd_mult, :aloc_mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin
    
           vQtd_Prd = Trunc(:Qtd_Prd);

           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo, b.TIPO_REMESSA
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                and B.Saldo >= :Qtd_Mult
                Order By R.Data
                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp, :TIPO_REMESSA
                    Do
                       Begin
    
                        if (:Id > 0) then
                            Begin
    
                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
            
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
            
                                        if (:AGRUPAMENTO_ID > 0) Then -- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd, QUANTIDADE = QUANTIDADE - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_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,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA);
                                            End
            
                                        :vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
            
                                        if (:AGRUPAMENTO_ID > 0) Then 
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_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,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id, TIPO_REMESSA)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA);
                                            End
            
                                        :vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                           End
                        End
                   End
           End
     End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b1u_02 for tbremessa_item_alocacao
active before update position 1
AS
declare variable HISTORICO VARCHAR(500);
begin

    HISTORICO = '';

  if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0 and Old.Quantidade > New.Quantidade) then
      Begin
          if(new.tipo_remessa <> '22600')then
          begin
            Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO4 (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id,Old.Quantidade-New.Quantidade);
          end
      End else
  if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0 and Old.Quantidade < New.Quantidade) then
      Begin
      exception "..." Old.Agrupamento_Id||', '||Old.Agrup_Ped_Id||', '||Old.Quantidade||' -> '||New.Quantidade;

      Exception "..." 'QUANTIDADE DO TALAO NAO PODE SER ALTERADA PARA MAIOR! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      End

  if (Old.Tabela_Id > 0 and Old.Tabela_Id = New.Tabela_Id and Old.Saldo <> New.Saldo) then
      Begin
            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - (Old.Saldo-New.Saldo)
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.Produto_Id
                and Tamanho = Old.Tamanho;
      End else

  if (Old.Tabela_Id > 0 and New.Tabela_Id = 0) then
      Begin

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - Old.Saldo
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.Produto_Id
                and Tamanho = Old.Tamanho;

            HISTORICO = 'DESALOC.REM. PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID;

      End else

  if (Old.Tabela_Id > 0 and New.Tabela_Id > 0 and Old.Tabela_Id <> New.Tabela_Id and /*Old.Saldo = New.Saldo and*/ New.Saldo > 0) then
      Begin

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - Old.Saldo
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.Produto_Id
                and Tamanho = Old.Tamanho;

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem + New.Saldo
              Where Estabelecimento_Codigo = NEW.Estabelecimento_Id
                and Pedido = NEW.Tabela_Id
                and Controle = NEW.Tab_Item_Id
                and Produto_Codigo = NEW.Produto_Id
                and Tamanho = NEW.Tamanho;

            HISTORICO = 'TRANSF.'||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID
                                 ||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID
                                 ||' *** PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id
                                 ||' -> '||NEW.Tabela_Id||'/'||New.Tab_item_Id;
      End

  if (Old.Tab_Item_Id = 0 and New.Tab_Item_Id > 0 and New.Tab_Item_Id_Old = 0) then
      Begin
         New.Tab_Item_Id_Old = New.Tab_Item_Id;
         New.Usuario = (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection);
      End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', OLD.PRODUTO_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),
       :Historico);


       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', OLD.Tabela_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),
       :Historico);

          if (Old.Tabela_Id > 0 and New.Tabela_Id > 0 and Old.Tabela_Id <> New.Tabela_Id and New.Saldo > 0) then
              Begin
               INSERT INTO TBHISTORICO (
               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
              'TBPEDIDO_ALOCADO', NEW.Tabela_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),
               :Historico);
               End

       End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b05iud for tbremessa_item_alocacao
active before insert or update or delete position 5
AS
declare variable GP_ID integer;
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable NEW_TEMPO numeric(15,4);
declare variable TOTALTEMPO numeric(15,4);
declare variable colaboradores numeric(15,4);
begin

  if(inserting)then
  begin
     if(new.TIPO_REMESSA = '22600')then
     begin

         select first 1
            u.programacao_esteira,
            u.setor_codigo,
            u.modelo_codigo,
            p.cor_codigo,
            u.tamanho,
            s.colaboradores
         from tbpedido_item_processado u, tbproduto p, tbprogramacao s
         where u.controle = new.talao
             and p.codigo = u.produto_codigo
             and s.tipo = 'D'
             and s.tabela_id = u.controle
             and s.remessa_id = u.remessa
         into GP_ID, UP_ID, MODELO_ID, COR_ID, TAMANHO, colaboradores;

         UP_ID = coalesce(UP_ID,0);

         if(UP_ID = 0)then
         begin
            exception "..." 'UP DO AGRUPAMENTO '||new.agrupamento_id||' NAO FOI ENCONTRADO.';
         end

         AGRUP_UP_ID = coalesce((select first 1 u.id from TBAGRUPAMENTO_CARGA_UP u where u.up_id = :UP_ID and u.agrupamento_id = new.agrupamento_id),0);

         if(AGRUP_UP_ID = 0)then
         begin
            exception "..." 'AGRUPAMENTO DA UP '||coalesce(:UP_ID,'')||' NAO FOI ENCONTRADO. TALAO:'||new.talao;
         end

         select
            s.TOTAL
         from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, NEW.quantidade) s
         into :TOTALTEMPO;

         NEW_TEMPO = coalesce(TOTALTEMPO,0);

         if(NEW_TEMPO = 0)then
         begin
            exception "..." 'TEMPO DO SKU NÃO ENCONTRADO, MODELO:'||:MODELO_ID||', COR:'||:COR_ID||', TAMANHO:'||:TAMANHO||', QUANTIDADE:'||NEW.quantidade||'';
         end

         INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (
            AGRUPAMENTO_ID,
            AGRUP_PED_ID,
            AGRUP_UP_ID,
            QUANTIDADE,
            NECESSIDADE,
            TIPO
         ) VALUES (
            new.agrupamento_id,
            new.id,
            :AGRUP_UP_ID,
            new.QUANTIDADE,
            :NEW_TEMPO,
            2
         );

      end
  end

  if(updating)then
  begin
     if(new.TIPO_REMESSA = '22600' AND NEW.quantidade IS distinct FROM OLD.quantidade)then
     begin

         select first 1
            u.programacao_esteira,
            u.setor_codigo,
            u.modelo_codigo,
            p.cor_codigo,
            u.tamanho,
            s.colaboradores
         from tbpedido_item_processado u, tbproduto p, tbprogramacao s
         where u.controle = new.talao
             and p.codigo = u.produto_codigo
             and s.tipo = 'D'
             and s.tabela_id = u.controle
             and s.remessa_id = u.remessa
         into GP_ID, UP_ID, MODELO_ID, COR_ID, TAMANHO, colaboradores;

         if(UP_ID = 0)then
         begin
            exception "..." 'UP DO AGRUPAMENTO '||new.agrupamento_id||' NAO FOI ENCONTRADO.';
         end

         select
            s.TOTAL
         from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, NEW.quantidade) s
         into :TOTALTEMPO;

         NEW_TEMPO = coalesce(TOTALTEMPO,0);

         if(NEW_TEMPO = 0)then
         begin
            exception "..." 'TEMPO DO SKU NÃO ENCONTRADO, MODELO:'||:MODELO_ID||', COR:'||:COR_ID||', TAMANHO:'||:TAMANHO||', QUANTIDADE:'||NEW.quantidade||'';
         end

         UPDATE TBAGRUPAMENTO_CARGA_SKU_UP
            SET QUANTIDADE = NEW.quantidade, NECESSIDADE = :NEW_TEMPO
         WHERE TIPO = 2
         AND AGRUPAMENTO_ID = new.agrupamento_id
         AND AGRUP_PED_ID = new.id;

      end
  end

  if(deleting)then
  begin
     if(old.TIPO_REMESSA = '22600')then
     begin

         delete from TBAGRUPAMENTO_CARGA_SKU_UP
         WHERE TIPO = 2
         AND AGRUPAMENTO_ID = old.agrupamento_id
         AND AGRUP_PED_ID = old.id;

      end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_proc_b1u_01 for tbpedido_item_processado
active before update position 2
AS
DECLARE VARIABLE TABELA_ID integer;
DECLARE VARIABLE TAB_ITEM_ID integer;
DECLARE VARIABLE QUANT Numeric(15,4);
DECLARE VARIABLE SALDO Numeric(15,4);
DECLARE VARIABLE TIPO Char(1);
DECLARE VARIABLE ID integer;
BEGIN

  if (New.Situacao = 3 and Old.Situacao < 3 and
      New.Data_Expedicao is not null and Old.Data_Expedicao is Null) then
      Begin
        FOR Select TABELA_ID, TAB_ITEM_ID, SALDO, TIPO, ID
        From TBREMESSA_ITEM_ALOCACAO
        WHERE ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_CODIGO
          AND REMESSA = OLD.REMESSA
          AND TALAO = OLD.CONTROLE
          AND SALDO > 0
          and TIPO_REMESSA <> '22600'
        INTO :TABELA_ID, :TAB_ITEM_ID, :SALDO, :TIPO, :ID
        
        DO
        Begin
        
           if (:TABELA_ID > 0) then
               Begin
                 Insert into TBESTOQUE_DETALHE_ALOCACAO (
                 Estabelecimento_id,Tabela_id,Tab_item_id,Tipo,
                 Localizacao_id, Produto_id, Tamanho, Quantidade,
                 Saldo, Alocacao_Id) values (OLD.Estabelecimento_Codigo, :TABELA_ID,
                 :TAB_ITEM_ID, :Tipo, OLD.Localizacao_Codigo, OLD.Produto_Codigo,
                 OLD.Tamanho, :SALDO, :SALDO, :ID);
              End

           if (:ID > 0) then
               Begin
                 Update TBREMESSA_ITEM_ALOCACAO Set SALDO = 0
                  Where ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_CODIGO
                    and REMESSA = OLD.REMESSA and TALAO = OLD.CONTROLE
                    and ID = :ID;
               End

        END
      End

  if (Old.Situacao = 3 and New.Situacao < 3 and
      New.Data_Expedicao is null and Old.Data_Expedicao is not Null) then
      Begin
        FOR Select TABELA_ID, TAB_ITEM_ID, SALDO, TIPO, ID
        From TBREMESSA_ITEM_ALOCACAO
        WHERE ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_CODIGO
          AND REMESSA = OLD.REMESSA
          AND TALAO = OLD.CONTROLE
          AND SALDO = 0
          and TIPO_REMESSA <> '22600'
        INTO :TABELA_ID, :TAB_ITEM_ID, :SALDO, :TIPO, :ID
        DO
        Begin
        if (:TABELA_ID > 0) then
            Begin
             Delete From TBESTOQUE_DETALHE_ALOCACAO
             Where Estabelecimento_id = OLD.Estabelecimento_Codigo
               and Tabela_id = :TABELA_ID
               and Tab_item_id = :TAB_ITEM_ID
               and Tipo = :Tipo
               and Localizacao_id = OLD.Localizacao_Codigo
               and Produto_id = OLD.Produto_Codigo
               and Tamanho = OLD.Tamanho
               and Alocacao_Id = :ID;
            End
        if (:ID > 0) then
            Begin
             Update TBREMESSA_ITEM_ALOCACAO Set SALDO = QUANTIDADE
              Where ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_CODIGO
                and REMESSA = OLD.REMESSA and TALAO = OLD.CONTROLE
                AND ID = :ID;
            END
        END
      END

  if (Old.Situacao < 6 and New.Situacao = 6) then
      Begin
        FOR Select TABELA_ID, TAB_ITEM_ID, SALDO, TIPO, ID
        From TBREMESSA_ITEM_ALOCACAO
        WHERE ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_CODIGO
          AND REMESSA = OLD.REMESSA
          AND TALAO = OLD.CONTROLE
          AND SALDO > 0
          and TIPO_REMESSA <> '22600'
        INTO :TABELA_ID, :TAB_ITEM_ID, :SALDO, :TIPO, :ID
        DO
        Begin
           if (:TABELA_ID > 0) then
               Begin
               Exception "..." 'TALÃO NÃO PODE SER ENCERRADO, HÁ ITENS DE PEDIDO ALOCADOS A ELE. PEDIDO: '||:TABELA_ID||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
               End
        End
      End

  if (New.Situacao = Old.Situacao and New.Quantidade_Pedido < Old.Quantidade_Pedido) then
      Begin
        FOR Select Sum(SALDO)
        From TBREMESSA_ITEM_ALOCACAO
        WHERE ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_CODIGO
          AND REMESSA = OLD.REMESSA
          AND TALAO = OLD.CONTROLE
          AND TABELA_ID > 0
          AND SALDO > 0
          and TIPO_REMESSA <> '22600'
        INTO :SALDO
        
        DO
        Begin
        
           if (:SALDO > New.Quantidade_Pedido) then
               Begin
               Exception "..." 'QUANTIDADE MÍNIMA PARA ALTERAÇÃO DEVE SER: '||Cast(:SALDO as VarChar(15))||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
               End
        END

        QUANT = Old.Quantidade_Pedido - New.Quantidade_Pedido;

        FOR Select SALDO, ID
        From TBREMESSA_ITEM_ALOCACAO
        WHERE ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_CODIGO
          AND REMESSA = OLD.REMESSA
          AND TALAO = OLD.CONTROLE
          AND TABELA_ID = 0
          AND SALDO > 0
          and TIPO_REMESSA <> '22600'
        INTO :SALDO, :ID
        
        DO
        Begin
        
        if (:QUANT > 0) Then
            BEGIN
            if (:QUANT <= :SALDO) then
                Begin
                 Update TBREMESSA_ITEM_ALOCACAO Set
                  QUANTIDADE = QUANTIDADE - :QUANT,
                  SALDO = SALDO - :QUANT
                  Where ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_CODIGO
                    and REMESSA = OLD.REMESSA
                    and TALAO = OLD.CONTROLE
                    AND ID = :ID;

                QUANT = 0;
                End else
            if (:QUANT > :SALDO) then
                Begin
                 Update TBREMESSA_ITEM_ALOCACAO Set
                  QUANTIDADE = QUANTIDADE - SALDO, SALDO = 0
                  Where ESTABELECIMENTO_ID = OLD.ESTABELECIMENTO_CODIGO
                    and REMESSA = OLD.REMESSA
                    and TALAO = OLD.CONTROLE
                    AND ID = :ID;

                QUANT = :QUANT - :SALDO;
                End
            End
        END

   -- if (:QUANT > 0) then
   --      Begin
   --      Exception "..." 'FALHA AO ALTERAR A QUANTIDADE DO TALÃO! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
   --      End

      End
  if (New.Situacao = Old.Situacao and New.Quantidade_Pedido > Old.Quantidade_Pedido) then
      Begin
     -- Exception "..." 'QUANTIDADE DO TALÃO NÃO PODE SER ALTERADA PARA MAIOR! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      End


End
^

SET TERM ; ^

SET TERM ^ ;


/* Trigger: TTBAGRUP_CARGA_SKU_UP_B0I */
CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B0I FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gTBAGRUPAMENTO_CARGA_SKU_UP,1);
end
^


/* Trigger: TTBAGRUP_CARGA_SKU_UP_B1D_01 */
CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B1D_01 FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE DELETE POSITION 1
AS
begin

    UPDATE tbagrupamento_carga_up set
    --Quantidade = Quantidade - OLD.Quantidade,
    Saldo = Saldo + OLD.Necessidade
      Where AGRUPAMENTO_ID = OLD.Agrupamento_Id
        and ID = OLD.AGRUP_UP_ID;

End
^


/* Trigger: TTBAGRUP_CARGA_SKU_UP_B1I_01 */
CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B1I_01 FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE INSERT POSITION 1
AS
Begin

  UPDATE tbagrupamento_carga_up set
  --Quantidade = Quantidade + NEW.Quantidade,
  Saldo = Saldo - NEW.Necessidade
  Where AGRUPAMENTO_ID = New.Agrupamento_Id
    and ID = New.AGRUP_UP_ID;

End
^


/* Trigger: TTBAGRUP_CARGA_SKU_UP_B1U_01 */
CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B1U_01 FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE UPDATE POSITION 1
AS
declare variable vUP_id integer;
declare variable vSubUP_id integer;
declare variable vPerfil varchar(10);

declare variable vMinutos integer;
declare variable vAGRUP_UP_ID  integer;
Begin
  if (NEW.Agrupamento_Id = OLD.Agrupamento_Id) then
      Begin
      if (NEW.Quantidade < OLD.Quantidade) then
          Begin
           UPDATE tbagrupamento_carga_up set
           --Quantidade = Quantidade - (Old.Quantidade - New.Quantidade),
           Saldo = Saldo + Abs(New.Necessidade - Old.Necessidade)
           Where AGRUPAMENTO_ID = New.Agrupamento_Id
             and ID = New.AGRUP_UP_ID;
          End else
      if (NEW.Quantidade > OLD.Quantidade) then
          Begin
           UPDATE tbagrupamento_carga_up set
           --Quantidade = Quantidade + (New.Quantidade - Old.Quantidade),
           Saldo = Saldo - Abs(New.Necessidade - Old.Necessidade)
           Where AGRUPAMENTO_ID = New.Agrupamento_Id
             and ID = New.AGRUP_UP_ID;
          End
      End else
  if (NEW.Agrupamento_Id <> OLD.Agrupamento_Id) then
      Begin

      For
      Select First 1 F1.UP_ID
        From tbagrupamento_carga_up F1
       Where F1.agrupamento_id = Old.Agrupamento_Id
         and F1.id = Old.AGRUP_UP_ID
      Into :vUP_id
      Do Begin

          For
            Select First 1
                coalesce((
                    SELECT 
                        SUM(CAPACIDADE) CAPACIDADE
                    FROM (
                            SELECT 
                                U.ID AS UP_ID,
                                C.DATA,
                                C.MINUTOS * C.COLABORADORES AS CAPACIDADE
                            FROM TBUP U, TBCALENDARIO_UP C, TBGP_UP G
                            WHERE C.UP_ID = U.ID
                            AND U.ID = G.UP_ID
                            AND C.DATA BETWEEN a.data_inicial AND a.data_final
                            AND G.GP_ID = a.gp_id
                            AND C.MINUTOS > 0
                            AND C.COLABORADORES > 0
                            and u.id = :vUP_id
                        )
                    GROUP BY UP_ID
                ),0) as minutos,
                Coalesce(F2.ID,0) as AGRUP_UP_ID
             from TbAgrupamento A
             Left Join tbagrupamento_carga_up F2 ON F2.agrupamento_id = A.ID and F2.UP_ID = :vUP_id
            Where A.ID = New.Agrupamento_Id
            Into :vMinutos, :vAGRUP_UP_ID
          Do Begin
               if (:vAGRUP_UP_ID = 0) then
               Begin

                   Insert into tbagrupamento_carga_up
                   (AGRUPAMENTO_ID,UP_ID,CAP_PRODUTIVA,SALDO)
                    values (New.Agrupamento_Id,:vUP_id,:vMinutos,:vMinutos);
               End
           End

         End

       UPDATE tbagrupamento_carga_up set
       --Quantidade = Quantidade - Old.Quantidade,
       Saldo = Saldo + Old.Necessidade
       Where AGRUPAMENTO_ID = Old.Agrupamento_Id
         and ID = Old.AGRUP_UP_ID;

       UPDATE tbagrupamento_carga_up set
       --Quantidade = Quantidade + New.Quantidade,
       Saldo = Saldo - New.Necessidade
       Where AGRUPAMENTO_ID = New.Agrupamento_Id
         and ID = :vAGRUP_UP_ID;

       New.AGRUP_UP_ID = :vAGRUP_UP_ID;
      End
End
^

SET TERM ; ^

COMMENT ON COLUMN TBAGRUPAMENTO_CARGA_SKU_UP.TIPO IS 
'1 - pedido
2 - remessa';


SET TERM ^ ;

/* Trigger: TTBAGRUPAMENTO_CARGA_UP_B01I */
CREATE OR ALTER TRIGGER TTBAGRUPAMENTO_CARGA_UP_B01I FOR TBAGRUPAMENTO_CARGA_UP
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBAGRUPAMENTO_CARGA_UP,1);
END
^


/* Trigger: TTBAGRUPAMENTO_CARGA_UP_B02IU */
CREATE OR ALTER TRIGGER TTBAGRUPAMENTO_CARGA_UP_B02IU FOR TBAGRUPAMENTO_CARGA_UP
ACTIVE BEFORE INSERT OR UPDATE POSITION 2
AS
begin
  if(new.saldo is null)then
  begin
    exception "..." 'SALDO DA UP '||NEW.up_id||' NO AGRUPAMENTO '||NEW.agrupamento_id||' NAO PODE SER NULO';
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b05iud for tbremessa_item_alocacao
active before insert or update or delete position 5
AS
declare variable GP_ID integer;
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable NEW_TEMPO numeric(15,4);
declare variable TOTALTEMPO numeric(15,4);
declare variable colaboradores numeric(15,4);
begin

  if(inserting)then
  begin
     if(new.TIPO_REMESSA = '22600')then
     begin

         select first 1
            u.programacao_esteira,
            u.setor_codigo,
            u.modelo_codigo,
            p.cor_codigo,
            u.tamanho,
            s.colaboradores
         from tbpedido_item_processado u, tbproduto p, tbprogramacao s
         where u.controle = new.talao
             and p.codigo = u.produto_codigo
             and s.tipo = 'D'
             and s.tabela_id = u.controle
             and s.remessa_id = u.remessa
         into GP_ID, UP_ID, MODELO_ID, COR_ID, TAMANHO, colaboradores;

         UP_ID = coalesce(UP_ID,0);

         if(UP_ID = 0)then
         begin
            exception "..." 'UP DO AGRUPAMENTO '||new.agrupamento_id||' NAO FOI ENCONTRADO.';
         end

         AGRUP_UP_ID = coalesce((select first 1 u.id from TBAGRUPAMENTO_CARGA_UP u where u.up_id = :UP_ID and u.agrupamento_id = new.agrupamento_id),0);

         if(AGRUP_UP_ID = 0)then
         begin
            --exception "..." 'AGRUPAMENTO DA UP '||coalesce(:UP_ID,'')||' NAO FOI ENCONTRADO. TALAO:'||new.talao;
         end

         if( AGRUP_UP_ID > 0 )then
         begin
             select
                s.TOTAL
             from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, NEW.quantidade) s
             into :TOTALTEMPO;
    
             NEW_TEMPO = coalesce(TOTALTEMPO,0);
    
             if(NEW_TEMPO = 0)then
             begin
                exception "..." 'TEMPO DO SKU NÃO ENCONTRADO, MODELO:'||:MODELO_ID||', COR:'||:COR_ID||', TAMANHO:'||:TAMANHO||', QUANTIDADE:'||NEW.quantidade||'';
             end
    
             INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (
                AGRUPAMENTO_ID,
                AGRUP_PED_ID,
                AGRUP_UP_ID,
                QUANTIDADE,
                NECESSIDADE,
                TIPO
             ) VALUES (
                new.agrupamento_id,
                new.id,
                :AGRUP_UP_ID,
                new.QUANTIDADE,
                :NEW_TEMPO,
                2
             );
          end
      end
  end

  if(updating)then
  begin
     if(new.TIPO_REMESSA = '22600' AND NEW.quantidade IS distinct FROM OLD.quantidade)then
     begin

         select first 1
            u.programacao_esteira,
            u.setor_codigo,
            u.modelo_codigo,
            p.cor_codigo,
            u.tamanho,
            s.colaboradores
         from tbpedido_item_processado u, tbproduto p, tbprogramacao s
         where u.controle = new.talao
             and p.codigo = u.produto_codigo
             and s.tipo = 'D'
             and s.tabela_id = u.controle
             and s.remessa_id = u.remessa
         into GP_ID, UP_ID, MODELO_ID, COR_ID, TAMANHO, colaboradores;

         if(UP_ID = 0)then
         begin
            exception "..." 'UP DO AGRUPAMENTO '||new.agrupamento_id||' NAO FOI ENCONTRADO.';
         end

         select
            s.TOTAL
         from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, NEW.quantidade) s
         into :TOTALTEMPO;

         NEW_TEMPO = coalesce(TOTALTEMPO,0);

         if(NEW_TEMPO = 0)then
         begin
            --exception "..." 'TEMPO DO SKU NÃO ENCONTRADO, MODELO:'||:MODELO_ID||', COR:'||:COR_ID||', TAMANHO:'||:TAMANHO||', QUANTIDADE:'||NEW.quantidade||'';
         end

         if( NEW_TEMPO > 0 )then
         begin
             UPDATE TBAGRUPAMENTO_CARGA_SKU_UP
                SET QUANTIDADE = NEW.quantidade, NECESSIDADE = :NEW_TEMPO
             WHERE TIPO = 2
             AND AGRUPAMENTO_ID = new.agrupamento_id
             AND AGRUP_PED_ID = new.id;
         end
      end
  end

  if(deleting)then
  begin
     if(old.TIPO_REMESSA = '22600')then
     begin

         delete from TBAGRUPAMENTO_CARGA_SKU_UP
         WHERE TIPO = 2
         AND AGRUPAMENTO_ID = old.agrupamento_id
         AND AGRUP_PED_ID = old.id;

      end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b1u_02 for tbremessa_item_alocacao
active before update position 1
AS
declare variable HISTORICO VARCHAR(500);
begin

    HISTORICO = '';

  if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0 and Old.Quantidade > New.Quantidade) then
      Begin
          if(new.tipo_remessa <> '22600')then
          begin
            Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO4 (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id,Old.Quantidade-New.Quantidade);
          end
      End else
  if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0 and Old.Quantidade < New.Quantidade) then
      Begin
      --exception "..." Old.Agrupamento_Id||', '||Old.Agrup_Ped_Id||', '||Old.Quantidade||' -> '||New.Quantidade;

      Exception "..." 'QUANTIDADE DO TALAO NAO PODE SER ALTERADA PARA MAIOR! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      End

  if (Old.Tabela_Id > 0 and Old.Tabela_Id = New.Tabela_Id and Old.Saldo <> New.Saldo) then
      Begin
            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - (Old.Saldo-New.Saldo)
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.Produto_Id
                and Tamanho = Old.Tamanho;
      End else

  if (Old.Tabela_Id > 0 and New.Tabela_Id = 0) then
      Begin

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - Old.Saldo
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.Produto_Id
                and Tamanho = Old.Tamanho;

            HISTORICO = 'DESALOC.REM. PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID;

      End else

  if (Old.Tabela_Id > 0 and New.Tabela_Id > 0 and Old.Tabela_Id <> New.Tabela_Id and /*Old.Saldo = New.Saldo and*/ New.Saldo > 0) then
      Begin

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - Old.Saldo
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.Produto_Id
                and Tamanho = Old.Tamanho;

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem + New.Saldo
              Where Estabelecimento_Codigo = NEW.Estabelecimento_Id
                and Pedido = NEW.Tabela_Id
                and Controle = NEW.Tab_Item_Id
                and Produto_Codigo = NEW.Produto_Id
                and Tamanho = NEW.Tamanho;

            HISTORICO = 'TRANSF.'||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID
                                 ||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID
                                 ||' *** PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id
                                 ||' -> '||NEW.Tabela_Id||'/'||New.Tab_item_Id;
      End

  if (Old.Tab_Item_Id = 0 and New.Tab_Item_Id > 0 and New.Tab_Item_Id_Old = 0) then
      Begin
         New.Tab_Item_Id_Old = New.Tab_Item_Id;
         New.Usuario = (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection);
      End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', OLD.PRODUTO_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),
       :Historico);


       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', OLD.Tabela_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),
       :Historico);

          if (Old.Tabela_Id > 0 and New.Tabela_Id > 0 and Old.Tabela_Id <> New.Tabela_Id and New.Saldo > 0) then
              Begin
               INSERT INTO TBHISTORICO (
               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
              'TBPEDIDO_ALOCADO', NEW.Tabela_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),
               :Historico);
               End

       End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b1d_02 for tbremessa_item_alocacao
active before delete position 1
AS
declare variable HISTORICO VARCHAR(500);
begin

    HISTORICO = '';

    if (Old.Tabela_Id > 0 and Old.Saldo > 0) then
        Begin
        UPDATE tbpedido_item set
        Qtd_Rem = Qtd_Rem - Old.Saldo,
        Agp_Dt_Cli = Null,
        Agp_Dt_Prd = Null
          Where Estabelecimento_Codigo = OLD.Estabelecimento_Id
            and Pedido = OLD.Tabela_Id
            and Controle = Old.Tab_Item_Id
            and Produto_Codigo = OLD.Produto_Id
            and Tamanho = OLD.Tamanho;

        HISTORICO = 'DESALOC.REM. PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID;
        End

    if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0) then
        Begin
            if(OLD.tipo_remessa <> '22600')then
            begin
                Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO4 (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id,Old.Saldo);
            END
        End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', OLD.PRODUTO_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),
       :Historico);

       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', OLD.Tabela_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),
       :Historico);
       End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_DESALOCA_AGRUP_PEDIDO_UP (
    ESTABELECIMENTO_ID integer,
    AGRUPAMENTO_ID integer,
    AGRUP_PED_ID integer,
    AGRUP_UP_ID integer,
    QUANTIDADE numeric(15,4))
as
declare variable SALDO numeric(15,4);
declare variable CAP_SKU numeric(15,4);
declare variable PERFIL_SKU varchar(10);
declare variable PERFIL_COR varchar(10);
declare variable TABELA_ID integer;
declare variable TAB_ITEM_ID integer;
declare variable TAMANHO integer;
declare variable VSALDO_GP numeric(15,4);
declare variable VSALDO_COR numeric(15,4);
declare variable VSALDO_FER numeric(15,4);
declare variable QUANTIDADE1 numeric(15,4);
declare variable NECESSIDADE1 numeric(15,4);
declare variable QUANTIDADE2 numeric(15,4);
declare variable NECESSIDADE2 numeric(15,4);
declare variable QUANTIDADE3 numeric(15,4);
declare variable NECESSIDADE3 numeric(15,4);
declare variable ID1 integer;
declare variable ID2 integer;
declare variable ID3 integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable GP_ID integer;
declare variable NOVO_ID integer;
declare variable PRODUTO_ID integer;
BEGIN

    For

       Select A.Quantidade-A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
              A.tabela_id, A.tab_item_id, A.tamanho, P.modelo_codigo, P.cor_codigo, p.codigo
         From TbAgrupamento_Pedido A, TBPRODUTO P
        Where Estabelecimento_id = :Estabelecimento_Id 
          and Agrupamento_Id = :Agrupamento_Id
          AND P.codigo = A.produto_id
          and Id = :AGRUP_PED_ID
          and Quantidade - Saldo > 0

    Into :Saldo, :Perfil_Sku, :Perfil_Cor, :tabela_id, :tab_item_id, :tamanho,:MODELO_ID, :COR_ID, :PRODUTO_ID
    Do BEGIN
        if (:AGRUP_PED_ID > 0) then
        Begin
    
            if (QUANTIDADE < Saldo) then
            Begin
                Saldo = :QUANTIDADE;
            End
    
            if (:Saldo > 0) then
            Begin

                 GP_ID = 0;
                 GP_ID = coalesce((select first 1 A.gp_id FROM tbagrupamento A WHERE A.id = :AGRUPAMENTO_ID),0);

                 SELECT
                    coalesce(S.TOTAL,0) as TOTAL
                 FROM SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, :Saldo) S
                 INTO :Cap_Sku;
    
                 if(Cap_Sku <= 0)then
                 begin
                    --exception "..." 'MODELO '||:MODELO_ID||' SEM TEMPOS DEFINIDO, GP:'||GP_ID||', COR:'||COR_ID||', TAM:'||:TAMANHO||'';
                 end

                Update TbAgrupamento_Pedido Set
                Quantidade = Quantidade - :Saldo
                Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :AGRUP_PED_ID
                 and Saldo < Quantidade;

                AGRUP_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, NECESS_COR, REMESSA)
                VALUES (:ESTABELECIMENTO_ID, :AGRUPAMENTO_ID, :AGRUP_PED_ID, :tabela_id, :tab_item_id, :PRODUTO_ID, :tamanho, :Saldo, 'P', :Saldo, :Perfil_Sku, 0, 0, 0);

                INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (AGRUPAMENTO_ID, AGRUP_PED_ID,AGRUP_UP_ID,QUANTIDADE,NECESSIDADE, TIPO)
                    VALUES (:AGRUPAMENTO_ID,:AGRUP_PED_ID,:AGRUP_UP_ID,:Saldo,:Cap_Sku, 1);
            End
        END
    End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbagrupamento_pedido_b1d_02 for tbagrupamento_pedido
active before delete position 1
AS
declare variable HISTORICO VARCHAR(500);
begin

    HISTORICO = '';

if (Old.Id > 0) Then
    Begin

    if (Old.Tipo = 'P' and Old.Saldo > 0) then
        Begin
        UPDATE tbpedido_item set
        Qtd_Agp = Qtd_Agp - Old.Saldo,
        Agp_Dt_Cli = Null,
        Agp_Dt_Prd = Null
          Where Estabelecimento_Codigo = OLD.Estabelecimento_Id
            and Pedido = OLD.Tabela_Id
            and Controle = Old.Tab_Item_Id
            and Produto_Codigo = OLD.Produto_Id
            and Tamanho = OLD.Tamanho;

          HISTORICO = 'DESALOC.AGRUP. PED/ITEM:'||OLD.Tabela_Id||'/'||OLD.Tab_item_Id||' QTD/TAM.'||TRUNC(Old.SALDO)||'/'||Old.TAMANHO;
        End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', Old.PRODUTO_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),
       :Historico);

       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', OLD.Tabela_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),
       :Historico);
       End

      DELETE FROM TBAGRUPAMENTO_CARGA_SKU_UP
      WHERE AGRUPAMENTO_ID = OLD.AGRUPAMENTO_ID
        AND AGRUP_PED_ID = OLD.ID
        and TIPO = 1;

      DELETE FROM TBAGRUPAMENTO_CARGA_SKU_GP
      WHERE AGRUPAMENTO_ID = OLD.AGRUPAMENTO_ID
        AND AGRUP_PED_ID = OLD.ID;
    
      DELETE FROM TBAGRUPAMENTO_CARGA_SKU_FER
      WHERE AGRUPAMENTO_ID = OLD.AGRUPAMENTO_ID
        AND AGRUP_PED_ID = OLD.ID;
    
    --  DELETE FROM TBAGRUPAMENTO_CARGA_SKU_COR
   --   WHERE AGRUPAMENTO_ID = OLD.AGRUPAMENTO_ID
     --   AND AGRUP_PED_ID = OLD.ID;

    End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b1u_02 for tbremessa_item_alocacao
active before update position 3
AS
declare variable HISTORICO VARCHAR(500);
declare variable agrup_up_id integer;
begin

    HISTORICO = '';

  if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0 and Old.Quantidade > New.Quantidade) then
      Begin

          if(new.tipo_remessa <> '22600')then
          begin
            Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO4 (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id,Old.Quantidade-New.Quantidade);
          end else
          begin
             --agrup_up_id = coalesce((select first 1 AGRUP_UP_ID from TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUPAMENTO_ID = Old.agrupamento_id AND AGRUP_PED_ID = Old.id),0);
             --Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO_UP (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id, :agrup_up_id, Old.Quantidade-New.Quantidade);
          end

      End else
  if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0 and Old.Quantidade < New.Quantidade) then
      Begin
        Exception "..." 'QUANTIDADE DO TALAO NAO PODE SER ALTERADA PARA MAIOR! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      End

  if (Old.Tabela_Id > 0 and Old.Tabela_Id = New.Tabela_Id and Old.Saldo <> New.Saldo) then
      Begin
            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - (Old.Saldo-New.Saldo)
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.Produto_Id
                and Tamanho = Old.Tamanho;
      End else

  if (Old.Tabela_Id > 0 and New.Tabela_Id = 0) then
      Begin

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - Old.Saldo
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.Produto_Id
                and Tamanho = Old.Tamanho;

            HISTORICO = 'DESALOC.REM. PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID;

      End else

  if (Old.Tabela_Id > 0 and New.Tabela_Id > 0 and Old.Tabela_Id <> New.Tabela_Id and /*Old.Saldo = New.Saldo and*/ New.Saldo > 0) then
      Begin

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem - Old.Saldo
              Where Estabelecimento_Codigo = Old.Estabelecimento_Id
                and Pedido = Old.Tabela_Id
                and Controle = Old.Tab_Item_Id
                and Produto_Codigo = Old.Produto_Id
                and Tamanho = Old.Tamanho;

            UPDATE tbpedido_item set
            Qtd_Rem = Qtd_Rem + New.Saldo
              Where Estabelecimento_Codigo = NEW.Estabelecimento_Id
                and Pedido = NEW.Tabela_Id
                and Controle = NEW.Tab_Item_Id
                and Produto_Codigo = NEW.Produto_Id
                and Tamanho = NEW.Tamanho;

            HISTORICO = 'TRANSF.'||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID
                                 ||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID
                                 ||' *** PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id
                                 ||' -> '||NEW.Tabela_Id||'/'||New.Tab_item_Id;
      End

  if (Old.Tab_Item_Id = 0 and New.Tab_Item_Id > 0 and New.Tab_Item_Id_Old = 0) then
      Begin
         New.Tab_Item_Id_Old = New.Tab_Item_Id;
         New.Usuario = (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection);
      End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', OLD.PRODUTO_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),
       :Historico);


       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', OLD.Tabela_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),
       :Historico);

          if (Old.Tabela_Id > 0 and New.Tabela_Id > 0 and Old.Tabela_Id <> New.Tabela_Id and New.Saldo > 0) then
              Begin
               INSERT INTO TBHISTORICO (
               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
              'TBPEDIDO_ALOCADO', NEW.Tabela_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),
               :Historico);
               End

       End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b1d_02 for tbremessa_item_alocacao
active before delete position 0
AS
declare variable HISTORICO VARCHAR(500);
declare variable agrup_up_id integer;
begin

    HISTORICO = '';

    if (Old.Tabela_Id > 0 and Old.Saldo > 0) then
        Begin
        UPDATE tbpedido_item set
        Qtd_Rem = Qtd_Rem - Old.Saldo,
        Agp_Dt_Cli = Null,
        Agp_Dt_Prd = Null
          Where Estabelecimento_Codigo = OLD.Estabelecimento_Id
            and Pedido = OLD.Tabela_Id
            and Controle = Old.Tab_Item_Id
            and Produto_Codigo = OLD.Produto_Id
            and Tamanho = OLD.Tamanho;

        HISTORICO = 'DESALOC.REM. PED/ITEM:'||Old.Tabela_Id||'/'||Old.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(OLD.SALDO)||'/'||OLD.TAMANHO||'/'||OLD.LOCALIZACAO_ID||' REM/TALAO:'||OLD.REMESSA||'/'||OLD.TALAO||' AGRUP.'||OLD.AGRUPAMENTO_ID;
        End

    if (Old.Agrupamento_Id > 0 and Old.Agrup_Ped_Id > 0) then
        Begin
            if(OLD.tipo_remessa <> '22600')then
            begin
                Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO4 (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id,Old.Saldo);
            END else
            begin
                agrup_up_id = coalesce((select first 1 AGRUP_UP_ID from TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUPAMENTO_ID = old.agrupamento_id AND AGRUP_PED_ID = old.id),0);
                Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO_UP (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id, :agrup_up_id, Old.Saldo);
            end
        End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', OLD.PRODUTO_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),
       :Historico);

       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', OLD.Tabela_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),
       :Historico);
       End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TALAO_AGRUPAMENTO (
    REMESSA_ID integer,
    TALAO integer,
    OPERACAO integer)
as
declare variable TABELA_ID integer;
declare variable TAB_ITEM_ID integer;
declare variable QUANT numeric(15,4);
declare variable SALDO numeric(15,4);
declare variable TIPO char(1);
declare variable ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable ALOCACAO_ID integer;
declare variable TALAO_ID integer;
declare variable QUANTIDADE_PRODUCAO integer;
declare variable QUANTIDADE_ALOCACAO integer;
declare variable SALDO_PRODUCAO integer;
declare variable QTD_BAIXAR numeric(15,4);
declare variable SALDO2 numeric(15,4);
declare variable SALDO_BAIXA numeric(15,4);
declare variable AGRUP_PED_ID integer;
declare variable AGRUPAMENTO_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable NOVO_ID integer;
begin

    select
        P.QUANTIDADE_PRODUCAO,
        p.controle,
        p.estabelecimento_codigo,
        p.localizacao_codigo,
        p.tamanho,
        P.produto_codigo
    from tbpedido_item_processado p
    where p.controle = :TALAO
    and p.remessa = :REMESSA_ID
        into :QUANTIDADE_PRODUCAO, :TALAO_ID, :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :TAMANHO, :PRODUTO_ID;

    TALAO_ID = coalesce(TALAO_ID,0);

    if(TALAO_ID = 0)then
    begin
       Exception "..." 'TALAO NAO ENCONTRADO, REMESSA_ID:'||:REMESSA_ID||', TALAO:'||:TALAO||'';
    end

    SALDO_PRODUCAO = QUANTIDADE_PRODUCAO;

    --produzir
    if (OPERACAO = 1) then
    Begin
    
        FOR
            select
                agrup_ped_id,
                agrupamento_id,
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO, 
                QUANTIDADE,
                TIPO,
                ID
            from(
                Select
                    
                    agrup_ped_id,
                    agrupamento_id,
                    TABELA_ID,
                    TAB_ITEM_ID,
                    SALDO, 
                    QUANTIDADE,
                    TIPO,
                    ID,
                    IIF(TABELA_ID > 0, 2147483647 - TABELA_ID,0) ORDEM
                From TBREMESSA_ITEM_ALOCACAO a
                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                  AND REMESSA = :REMESSA_ID
                  AND TALAO   = :TALAO
                  AND SALDO   > 0

              ) order by ORDEM DESC

        INTO :agrup_ped_id, :agrupamento_id, :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID
        DO Begin
        
            IF(SALDO_PRODUCAO > SALDO)THEN
            BEGIN
                QTD_BAIXAR = SALDO;
            END ELSE
            BEGIN
                QTD_BAIXAR = SALDO_PRODUCAO;
            END

            SALDO_PRODUCAO = SALDO_PRODUCAO - QTD_BAIXAR;

            IF(QTD_BAIXAR > 0)THEN
            BEGIN
                if (:TABELA_ID > 0) then
                Begin
                    Insert into TBESTOQUE_DETALHE_ALOCACAO (
                        Estabelecimento_id,Tabela_id,Tab_item_id,Tipo,
                        Localizacao_id, Produto_id, Tamanho, Quantidade,
                        Saldo, Alocacao_Id) values (:ESTABELECIMENTO_ID, :TABELA_ID,
                        :TAB_ITEM_ID, :Tipo, :LOCALIZACAO_ID, :PRODUTO_ID,
                        :TAMANHO, :QTD_BAIXAR, :QTD_BAIXAR, :ID);
                End

                if((:SALDO - :QTD_BAIXAR) = 0)then
                begin
                    Update TBREMESSA_ITEM_ALOCACAO Set QTD_BAIXA = :QTD_BAIXAR, SALDO_BAIXA = 0 /*SALDO - :QTD_BAIXAR*/, SALDO = 0
                    Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        and REMESSA = :REMESSA_ID and TALAO = :TALAO
                        and ID = :ID;
                end else
                begin
                    Update TBREMESSA_ITEM_ALOCACAO Set QUANTIDADE = QUANTIDADE - (:SALDO - :QTD_BAIXAR), QTD_BAIXA = :QTD_BAIXAR, SALDO_BAIXA = 0, SALDO = 0
                    Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        and REMESSA = :REMESSA_ID and TALAO = :TALAO
                        and ID = :ID;

                    NOVO_ID = GEN_ID(Gtbremessa_item_alocacao,1);

                    INSERT INTO TBREMESSA_ITEM_ALOCACAO (
                        ID,
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        TABELA_ID,
                        TAB_ITEM_ID,
                        REMESSA,
                        TALAO,
                        PRODUTO_ID,
                        TAMANHO,
                        QUANTIDADE,
                        TIPO,
                        SALDO,
                        STATUS,
                        AGRUPAMENTO_ID,
                        AGRUP_PED_ID,
                        DATAHORA,
                        TAB_ITEM_ID_OLD,
                        USUARIO,
                        TEMPO,
                        QTD_BAIXA,
                        SALDO_BAIXA,
                        TIPO_REMESSA
                    ) SELECT
                        :NOVO_ID AS ID,
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        0 TABELA_ID,
                        0 TAB_ITEM_ID,
                        REMESSA,
                        TALAO,
                        PRODUTO_ID,
                        TAMANHO,
                        (:SALDO - :QTD_BAIXAR) AS QUANTIDADE,
                        'R' TIPO,
                        (:SALDO - :QTD_BAIXAR) AS SALDO,
                        STATUS,
                        AGRUPAMENTO_ID,
                        0 AGRUP_PED_ID,
                        DATAHORA,
                        TAB_ITEM_ID_OLD,
                        USUARIO,
                        TEMPO,
                        0 AS QTD_BAIXA,
                        0 SALDO_BAIXA,
                        '22600'
                    FROM TBREMESSA_ITEM_ALOCACAO WHERE ID = :ID;

                    --ENCERRAR QTD NAO PRODUZIDA
                    UPDATE TBREMESSA_ITEM_ALOCACAO SET ENCERRADO = 1 WHERE ID = :NOVO_ID;

                    if(Agrup_Ped_Id > 0)then
                    begin
                        agrup_up_id = coalesce((select first 1 AGRUP_UP_ID from TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUPAMENTO_ID = :agrupamento_id AND AGRUP_PED_ID = :id),0);
                        Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO_UP (:ESTABELECIMENTO_ID,:Agrupamento_Id,:Agrup_Ped_Id, :agrup_up_id, (:SALDO - :QTD_BAIXAR));
                    end
                end

            END ELSE
            BEGIN
                Update TBREMESSA_ITEM_ALOCACAO Set TABELA_ID = 0, TAB_ITEM_ID = 0, QTD_BAIXA = SALDO, SALDO_BAIXA = 0, SALDO = 0, TIPO = 'R', AGRUP_PED_ID = 0
                Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                    and REMESSA = :REMESSA_ID and TALAO = :TALAO
                    and ID = :ID;

                --ENCERRAR QTD NAO PRODUZIDA
                UPDATE TBREMESSA_ITEM_ALOCACAO SET ENCERRADO = 1 WHERE ID = :ID;
           END
        
        END
    End

    --desproduzir
    if (OPERACAO = 2) then
    Begin

        FOR
            Select
                coalesce(SALDO_BAIXA,0) AS SALDO_BAIXA,
                coalesce(QTD_BAIXA,0) AS QTD_BAIXA,
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO,
                QUANTIDADE,
                TIPO,
                ID
            From TBREMESSA_ITEM_ALOCACAO
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND REMESSA = :REMESSA_ID
              AND TALAO   = :TALAO
              AND coalesce(ENCERRADO,0) = 0
            INTO :SALDO_BAIXA, :QTD_BAIXAR, :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID
        DO Begin

            SALDO2      = 0;
            QUANT       = 0;
            ALOCACAO_ID = 0;

            select
                l.id,
                Quantidade,
                Saldo
            from TBESTOQUE_DETALHE_ALOCACAO l
            where Estabelecimento_id = :ESTABELECIMENTO_ID
            and Tabela_id = :TABELA_ID
            and Tab_item_id = :TAB_ITEM_ID
            and Tipo = 'P'
            and Localizacao_id = :LOCALIZACAO_ID
            and PRODUTO_ID = :PRODUTO_ID
            and Tamanho = :TAMANHO
            and Alocacao_Id = :ID
                into :ALOCACAO_ID, :QUANT, :SALDO2;
            
            if (:ALOCACAO_ID > 0 and :SALDO2 > 0 AND :TABELA_ID > 0) then
            Begin

                Delete From TBESTOQUE_DETALHE_ALOCACAO
                 where Estabelecimento_id = :ESTABELECIMENTO_ID
                    and Tabela_id = :TABELA_ID
                    and Tab_item_id = :TAB_ITEM_ID
                    and Tipo = 'P'
                    and Localizacao_id = :LOCALIZACAO_ID
                    and PRODUTO_ID = :PRODUTO_ID
                    and Tamanho = :TAMANHO
                    and Alocacao_Id = :ID;

                Update TBREMESSA_ITEM_ALOCACAO Set SALDO = :SALDO2, QUANTIDADE = :SALDO2, QTD_BAIXA = 0, SALDO_BAIXA = 0
                  Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                    and REMESSA = :REMESSA_ID and TALAO = :TALAO
                    and ID = :ID;

                IF((:QTD_BAIXAR + :SALDO_BAIXA) > :SALDO2)THEN
                BEGIN
                    INSERT INTO TBREMESSA_ITEM_ALOCACAO (
                        ID,
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        TABELA_ID,
                        TAB_ITEM_ID,
                        REMESSA,
                        TALAO,
                        PRODUTO_ID,
                        TAMANHO,
                        QUANTIDADE,
                        TIPO,
                        SALDO,
                        STATUS,
                        AGRUPAMENTO_ID,
                        AGRUP_PED_ID,
                        DATAHORA,
                        TAB_ITEM_ID_OLD,
                        USUARIO,
                        TEMPO,
                        QTD_BAIXA,
                        SALDO_BAIXA,
                        TIPO_REMESSA
                    ) SELECT
                        GEN_ID(Gtbremessa_item_alocacao,1),
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        0 TABELA_ID,
                        0 TAB_ITEM_ID,
                        REMESSA,
                        TALAO,
                        PRODUTO_ID,
                        TAMANHO,
                        (:QTD_BAIXAR + :SALDO_BAIXA) - :SALDO2 AS QUANTIDADE,
                        'R' TIPO,
                        (:QTD_BAIXAR + :SALDO_BAIXA) - :SALDO2 AS SALDO,
                        STATUS,
                        AGRUPAMENTO_ID,
                        AGRUP_PED_ID,
                        DATAHORA,
                        TAB_ITEM_ID_OLD,
                        USUARIO,
                        TEMPO,
                        0 QTD_BAIXA,
                        0 SALDO_BAIXA,
                        '22600'
                    FROM TBREMESSA_ITEM_ALOCACAO WHERE ID = :ID;

                END

            End else
            begin
                if (:ID > 0) then
                Begin
                     Update TBREMESSA_ITEM_ALOCACAO Set TIPO = 'R', SALDO = (QTD_BAIXA + SALDO_BAIXA), SALDO_BAIXA = 0, QTD_BAIXA = 0, TABELA_ID = 0, TAB_ITEM_ID = 0
                      Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        and REMESSA = :REMESSA_ID and TALAO = :TALAO
                        and ID = :ID;
                End
            End
        
        END

        --DESZENCERRAR QTD NAO PRODUZIDA
        FOR
            Select
                coalesce(SALDO_BAIXA,0) AS SALDO_BAIXA,
                coalesce(QTD_BAIXA,0) AS QTD_BAIXA,
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO,
                QUANTIDADE,
                TIPO,
                ID
            From TBREMESSA_ITEM_ALOCACAO
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND REMESSA = :REMESSA_ID
              AND TALAO   = :TALAO
              AND coalesce(ENCERRADO,0) = 1
            INTO :SALDO_BAIXA, :QTD_BAIXAR, :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID
        DO Begin
           UPDATE TBREMESSA_ITEM_ALOCACAO SET ENCERRADO = 0 WHERE ID = :ID;
        END

    End


    --encerrar
    if (OPERACAO = 3) then
    Begin

        Exception "..." 'TALÃO NÃO PODE SER ENCERRADO';

        FOR
            Select
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO,
                QUANTIDADE,
                TIPO,
                ID
            From TBREMESSA_ITEM_ALOCACAO
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND REMESSA = :REMESSA_ID
              AND TALAO = :TALAO
              AND SALDO > 0
        INTO :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID
        DO Begin
           if (:TABELA_ID > 0) then
           Begin
               --Exception "..." 'TALÃO NÃO PODE SER ENCERRADO, HÁ ITENS DE PEDIDO ALOCADOS A ELE. PEDIDO: '||:TABELA_ID||'';
                if (:ID > 0) then
                Begin
                     DELETE FROM TBREMESSA_ITEM_ALOCACAO
                      Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        and REMESSA = :REMESSA_ID and TALAO = :TALAO
                        and ID = :ID;
                End
           End
        End
    End

end
^

SET TERM ; ^

COMMENT ON PARAMETER SPU_TALAO_AGRUPAMENTO.OPERACAO IS
'1 - produzir, 2 - desproduzir, 3 - encerrar';


SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b05iud for tbremessa_item_alocacao
active before insert or update or delete position 1
AS
declare variable GP_ID integer;
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable NEW_TEMPO numeric(15,4);
declare variable TOTALTEMPO numeric(15,4);
declare variable colaboradores numeric(15,4);
declare variable data_inicio_agrupamento date;
begin

  if(inserting)then
  begin
     if(new.TIPO_REMESSA = '22600')then
     begin

         select first 1
            u.programacao_esteira,
            u.setor_codigo,
            u.modelo_codigo,
            p.cor_codigo,
            u.tamanho,
            s.colaboradores
         from tbpedido_item_processado u, tbproduto p, tbprogramacao s
         where u.controle = new.talao
             and p.codigo = u.produto_codigo
             and s.tipo = 'D'
             and s.tabela_id = u.controle
             and s.remessa_id = u.remessa
         into GP_ID, UP_ID, MODELO_ID, COR_ID, TAMANHO, colaboradores;

         UP_ID = coalesce(UP_ID,0);

         if(UP_ID = 0)then
         begin
            exception "..." 'UP DO AGRUPAMENTO '||new.agrupamento_id||' NAO FOI ENCONTRADO.';
         end

         AGRUP_UP_ID = coalesce((select first 1 u.id from TBAGRUPAMENTO_CARGA_UP u where u.up_id = :UP_ID and u.agrupamento_id = new.agrupamento_id),0);

         if(AGRUP_UP_ID = 0)then
         begin
            --exception "..." 'AGRUPAMENTO DA UP '||coalesce(:UP_ID,'')||' NAO FOI ENCONTRADO. TALAO:'||new.talao;
         end

         if( AGRUP_UP_ID > 0 )then
         begin
             select
                s.TOTAL
             from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, NEW.quantidade) s
             into :TOTALTEMPO;
    
             NEW_TEMPO = coalesce(TOTALTEMPO,0);
    
             if(NEW_TEMPO = 0)then
             begin
                exception "..." 'TEMPO DO SKU NÃO ENCONTRADO, MODELO:'||:MODELO_ID||', COR:'||:COR_ID||', TAMANHO:'||:TAMANHO||', QUANTIDADE:'||NEW.quantidade||'';
             end
    
             INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (
                AGRUPAMENTO_ID,
                AGRUP_PED_ID,
                AGRUP_UP_ID,
                QUANTIDADE,
                NECESSIDADE,
                TIPO
             ) VALUES (
                new.agrupamento_id,
                new.id,
                :AGRUP_UP_ID,
                new.QUANTIDADE,
                :NEW_TEMPO,
                2
             );
          end
      end
  end

  if(updating)then
  begin
     if(new.TIPO_REMESSA = '22600' AND NEW.quantidade IS distinct FROM OLD.quantidade)then
     begin

         select first 1
            u.programacao_esteira,
            u.setor_codigo,
            u.modelo_codigo,
            p.cor_codigo,
            u.tamanho,
            s.colaboradores
         from tbpedido_item_processado u, tbproduto p, tbprogramacao s
         where u.controle = new.talao
             and p.codigo = u.produto_codigo
             and s.tipo = 'D'
             and s.tabela_id = u.controle
             and s.remessa_id = u.remessa
         into GP_ID, UP_ID, MODELO_ID, COR_ID, TAMANHO, colaboradores;

         if(UP_ID = 0)then
         begin
            exception "..." 'UP DO AGRUPAMENTO '||new.agrupamento_id||' NAO FOI ENCONTRADO.';
         end

         select
            s.TOTAL
         from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, NEW.quantidade) s
         into :TOTALTEMPO;

         NEW_TEMPO = coalesce(TOTALTEMPO,0);

         if(NEW_TEMPO = 0)then
         begin
            --exception "..." 'TEMPO DO SKU NÃO ENCONTRADO, MODELO:'||:MODELO_ID||', COR:'||:COR_ID||', TAMANHO:'||:TAMANHO||', QUANTIDADE:'||NEW.quantidade||'';
         end

         if( NEW_TEMPO > 0 )then
         begin
             UPDATE TBAGRUPAMENTO_CARGA_SKU_UP
                SET QUANTIDADE = NEW.quantidade, NECESSIDADE = :NEW_TEMPO
             WHERE TIPO = 2
             AND AGRUPAMENTO_ID = new.agrupamento_id
             AND AGRUP_PED_ID = new.id;
         end
      end

      if(new.TIPO_REMESSA = '22600' AND NEW.ENCERRADO IS distinct FROM OLD.ENCERRADO)then
      begin

         if(coalesce(NEW.ENCERRADO,0) = 0 and coalesce(OLD.ENCERRADO,0) = 1)then
         begin

            if(new.encerramento_tipo = 1)then
            begin
                NEW.SALDO = OLD.QTD_BAIXA;
                NEW.QTD_BAIXA = 0;
                NEW.saldo_baixa = 0;

                select first 1
                    u.programacao_esteira,
                    u.setor_codigo,
                    u.modelo_codigo,
                    p.cor_codigo,
                    u.tamanho,
                    s.colaboradores
                 from tbpedido_item_processado u, tbproduto p, tbprogramacao s
                 where u.controle = new.talao
                     and p.codigo = u.produto_codigo
                     and s.tipo = 'D'
                     and s.tabela_id = u.controle
                     and s.remessa_id = u.remessa
                 into GP_ID, UP_ID, MODELO_ID, COR_ID, TAMANHO, colaboradores;
        
                 UP_ID = coalesce(UP_ID,0);
        
                 if(UP_ID = 0)then
                 begin
                    exception "..." 'UP DO AGRUPAMENTO '||new.agrupamento_id||' NAO FOI ENCONTRADO.';
                 end
        
                 AGRUP_UP_ID = coalesce((select first 1 u.id from TBAGRUPAMENTO_CARGA_UP u where u.up_id = :UP_ID and u.agrupamento_id = new.agrupamento_id),0);
        
                 if(AGRUP_UP_ID = 0)then
                 begin
                    --exception "..." 'AGRUPAMENTO DA UP '||coalesce(:UP_ID,'')||' NAO FOI ENCONTRADO. TALAO:'||new.talao;
                 end
        
                 if( AGRUP_UP_ID > 0 )then
                 begin
                     select
                        s.TOTAL
                     from SPC_TEMPO_GP(:GP_ID, :MODELO_ID, :COR_ID, :TAMANHO, NEW.quantidade) s
                     into :TOTALTEMPO;
            
                     NEW_TEMPO = coalesce(TOTALTEMPO,0);
            
                     if(NEW_TEMPO = 0)then
                     begin
                        exception "..." 'TEMPO DO SKU NÃO ENCONTRADO, MODELO:'||:MODELO_ID||', COR:'||:COR_ID||', TAMANHO:'||:TAMANHO||', QUANTIDADE:'||NEW.quantidade||'';
                     end
            
                     INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (
                        AGRUPAMENTO_ID,
                        AGRUP_PED_ID,
                        AGRUP_UP_ID,
                        QUANTIDADE,
                        NECESSIDADE,
                        TIPO
                     ) VALUES (
                        new.agrupamento_id,
                        new.id,
                        :AGRUP_UP_ID,
                        new.QUANTIDADE,
                        :NEW_TEMPO,
                        2
                     );
                  end
              end

              new.encerramento_tipo = 0;
         end

         if(coalesce(NEW.ENCERRADO,0) = 1 and coalesce(OLD.ENCERRADO,0) = 0)then
         begin

             data_inicio_agrupamento = coalesce((select first 1 f.data_final from TBAGRUPAMENTO f where f.id = Old.Agrupamento_Id),'01.01.2000');

             if(current_date < data_inicio_agrupamento)then
             begin
                 new.encerramento_tipo = 1;

                 if(new.agrup_ped_id > 0)then
                 begin
                    agrup_up_id = coalesce((select first 1 AGRUP_UP_ID from TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUPAMENTO_ID = Old.agrupamento_id AND AGRUP_PED_ID = Old.id),0);
                    Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO_UP (Old.Estabelecimento_Id,Old.Agrupamento_Id,Old.Agrup_Ped_Id, :agrup_up_id, Old.Quantidade);
                 end

                 NEW.QTD_BAIXA = NEW.saldo;
                 NEW.saldo = 0;
                 NEW.saldo_baixa = 0;
                 new.tabela_id = 0;
                 new.tab_item_id = 0;
                 new.agrup_ped_id = 0;
    
                 delete from TBAGRUPAMENTO_CARGA_SKU_UP
                 WHERE TIPO = 2
                 AND AGRUPAMENTO_ID = old.agrupamento_id
                 AND AGRUP_PED_ID = old.id;

             end ELSE
             begin
                new.encerramento_tipo = 2;
             end

         end

      end
  end

  if(deleting)then
  begin
     if(old.TIPO_REMESSA = '22600')then
     begin

         delete from TBAGRUPAMENTO_CARGA_SKU_UP
         WHERE TIPO = 2
         AND AGRUPAMENTO_ID = old.agrupamento_id
         AND AGRUP_PED_ID = old.id;

      end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b14u for tbpedido_item_processado
active before update position 14
AS
begin
  if(new.situacao is distinct from old.situacao)then
  begin
     if(coalesce(new.situacao,0) = 6 and coalesce(old.situacao,0) <> 6)then
     begin
        update TBREMESSA_ITEM_ALOCACAO f set encerrado = 1 where f.remessa = new.remessa and f.talao = new.controle;
     end

     if(coalesce(new.situacao,0) <> 6 and coalesce(old.situacao,0) = 6)then
     begin
        update TBREMESSA_ITEM_ALOCACAO f set encerrado = 0 where f.remessa = new.remessa and f.talao = new.controle;
     end
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b0u_01 for tbremessa_item_alocacao
active before update position 2
AS
BEGIN

  IF (NEW.SALDO > 0) THEN
      BEGIN
      NEW.STATUS = '1';
      END ELSE
      BEGIN
      NEW.STATUS = '0';
      END

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b0i_01 for tbremessa_item_alocacao
active before insert position 0
AS
BEGIN

  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(Gtbremessa_item_alocacao,1);

  NEW.TAB_ITEM_ID_OLD = NEW.TAB_ITEM_ID;

END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_alocacao_b1i_02 for tbremessa_item_alocacao
active before insert position 2
AS
declare variable HISTORICO VARCHAR(500);
begin

    HISTORICO = '';

    if (New.Agrup_Ped_Id > 0) then
        Begin
        UPDATE tbagrupamento_pedido set
        Saldo = Saldo - New.Saldo
          Where Estabelecimento_Id = NEW.Estabelecimento_Id
            and Agrupamento_Id = NEW.Agrupamento_Id
            and Id = NEW.Agrup_Ped_Id
            and Produto_Id = NEW.Produto_Id
            and Tamanho = NEW.Tamanho
        --  and Tipo = 'P'
            and Saldo > 0;--New.Saldo;
        End

    if (New.Tabela_Id > 0 and New.Saldo > 0) then
        Begin
        UPDATE tbpedido_item set
        Qtd_Rem = Qtd_Rem + New.Saldo
          Where Estabelecimento_Codigo = NEW.Estabelecimento_Id
            and Pedido = NEW.Tabela_Id
            and Controle = NEW.Tab_Item_Id
            and Produto_Codigo = NEW.Produto_Id
            and Tamanho = NEW.Tamanho;

        HISTORICO = 'ALOC.REM - PED/ITEM:'||New.Tabela_Id||'/'||New.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(New.SALDO)||'/'||New.TAMANHO||'/'||NEW.LOCALIZACAO_ID||' REM/TALAO:'||New.REMESSA||'/'||New.TALAO||' AGRUP.'||New.AGRUPAMENTO_ID;
        End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', New.PRODUTO_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),
       :Historico);


       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', NEW.Tabela_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),
       :Historico);
       End

End
^

SET TERM ; ^

