ALTER TABLE TBREMESSA_ITEM_ALOCACAO
    ADD ORIGEM_PRODUTO_ID INTEGER;

CREATE INDEX ITBREMESSA_ITEM_ALOCACAO_14
ON TBREMESSA_ITEM_ALOCACAO (ORIGEM_PRODUTO_ID);

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;
  NEW.origem_produto_id = IIF(new.tipo_remessa <> '22600', NEW.produto_id, coalesce(NEW.origem_produto_id,0));

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

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.ORIGEM_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.ORIGEM_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.ORIGEM_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.ORIGEM_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.ORIGEM_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 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,
                        ORIGEM_PRODUTO_ID
                    ) 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',
                        ORIGEM_PRODUTO_ID
                    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,
                        ORIGEM_PRODUTO_ID
                    ) 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',
                        ORIGEM_PRODUTO_ID
                    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 procedure SPU_TRANSF_ALOCACAO_ESTOQUE (
    PEDIDO_REC integer,
    PED_ITEM_ID_REC integer,
    PEDIDO_PAG integer,
    PED_ITEM_ID_PAG integer)
as
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable DATA_DISPONIVEL date;
declare variable DATA_DISPONIVEL_REC date;
declare variable NECESSIDADE numeric(15,4);
declare variable DISPONIBILIDADE numeric(15,4);
declare variable QTD_TRANSF numeric(15,4);
declare variable ID integer;
declare variable SALDO numeric(15,4);
declare variable REM_STATUS char(1);
declare variable FLAG char(1);
declare variable HISTORICO varchar(500);
Begin
  
  Necessidade = 0;
  Disponibilidade = 0;

  Flag = '0';

  For
  Select a.estabelecimento_codigo,
         a.localizacao_id,
         a.produto_codigo,
         a.tamanho,
         b.quantidade - a.qtd_est,
         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,
         a.data_disponivel

    from tbpedido_item A, TbPedido_item_Saldo b
   where a.controle = b.pedido_item_controle
     and A.Pedido = b.pedido
     and a.pedido = :pedido_rec
     and a.controle = :ped_item_id_rec
     and b.quantidade > 0
    Into :estabelecimento_id,
         :localizacao_id,
         :produto_id,
         :tamanho,
         :Necessidade,
         :Rem_Status,
         :data_disponivel_rec
      Do Begin

      Flag = '1';

      if (Rem_Status = '1') then
          begin
          Exception "..." 'ITEM DO PEDIDO DE ORIGEM BLOQUEADO PELO PPCP, GERACAO DE REMESSA EM ANDAMENTO. OPERACAO CANCELADA!';
          End

      if (Necessidade <= 0) then
          begin
          Exception "..." 'ITEM DO PEDIDO DE ORIGEM SEM NECESSIDADE DE ALOCACAO DE ESTOQUE. OPERACAO CANCELADA!';
          end

              For
              Select a.qtd_est, a.data_disponivel
                from tbpedido_item A
               where a.estabelecimento_codigo = :estabelecimento_id
                 and a.localizacao_id = :localizacao_id
                 and a.pedido = :pedido_pag
                 and a.controle = :ped_item_id_pag
                 and a.produto_codigo = :produto_id
                 and a.tamanho = :Tamanho
                Into :Disponibilidade, :Data_disponivel
                  Do
                  Begin
            
                  Flag = '2';

                  if (Disponibilidade <= 0) then
                      begin
                      Exception "..." 'ITEM DO PEDIDO DE DESTINO SEM DISPONIBILIDADE PARA TRANSFERIR ALOCACAO DE ESTOQUE. OPERACAO CANCELADA!';
                      end

                      if (Necessidade > Disponibilidade) then
                          Begin
                          Necessidade = Disponibilidade;
                          Disponibilidade = 0;  /* Resto do pedido de destino (pagador) */
                          Data_Disponivel = null;
                          end else
                      if (Necessidade <= Disponibilidade) then
                          Begin
                          Disponibilidade = Disponibilidade - Necessidade; /* Resto do pedido de destino (pagador), essa qtd voltará ao pedido pagador */
                          end
            
                            /* Baixa estoque alocado da tabela que vai ceder o saldo */
                            Update TbEstoque_Detalhe_Alocacao Set Saldo = 0
                            Where Tabela_Id = :pedido_pag and Tab_item_Id = :ped_item_id_pag;
        
                            HISTORICO = 'SALDO ESTOQUE DESALOCADO PARA TRANSFERÊNCIA.'
                                      ||' *** PED/ITEM:'||:pedido_pag||'/'||:ped_item_id_pag;

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

                            /* Transfere talões em aberto da tabela que vai receber o estoque para a tabela que vai ceder o estoque */
                            qtd_transf = Necessidade;
        
                              For
                              Select a.id, a.saldo
                                from TBREMESSA_ITEM_ALOCACAO A
                               where A.Saldo > 0
                                 and A.tabela_id = :pedido_rec
                                 and A.tab_item_id = :ped_item_id_rec
                                Into :id, :saldo
                                  Do
                                  begin
                                  if (qtd_transf > 0) then
                                      Begin
                                      if (saldo <= qtd_transf) then
                                          Begin
                                            Update TBREMESSA_ITEM_ALOCACAO Set
                                            Tabela_Id = :pedido_pag,
                                            Tab_item_Id = :ped_item_id_pag
                                            Where id = :ID;
        
                                            qtd_transf = :qtd_transf - :saldo;
                                          End else
                                      if (saldo > qtd_transf) then
                                          Begin
        
                                               insert into TBREMESSA_ITEM_ALOCACAO (estabelecimento_id,
                                                                               localizacao_id,
                                                                               tabela_id,
                                                                               tab_item_id,
                                                                               produto_id,
                                                                               tamanho,
                                                                               quantidade,
                                                                               tipo,
                                                                               remessa,
                                                                               talao, 
                                                                               agrupamento_id,
                                                                               agrup_ped_id, 
                                                                               saldo,
                                                                               ORIGEM_PRODUTO_ID)
                                               select estabelecimento_id, 
                                                      localizacao_id, 
                                                      0,
                                                      0,
                                                      produto_id,
                                                      tamanho, 
                                                     (:saldo - :qtd_transf),
                                                      tipo,
                                                      remessa,
                                                      talao,
                                                      agrupamento_id,
                                                      agrup_ped_id,
                                                     (:saldo - :qtd_transf),
                                                     ORIGEM_PRODUTO_ID
                                               from TBREMESSA_ITEM_ALOCACAO
                                               Where ID = :ID;
        
                                            Update TBREMESSA_ITEM_ALOCACAO Set
                                            Tabela_Id = :pedido_pag,
                                            Tab_item_Id = :ped_item_id_pag,
                                            Quantidade = :qtd_transf,
                                            Saldo = :qtd_transf
                                            Where id = :ID;
        
                                            qtd_transf = 0;
                                          End
                                      End
                                  End
        
                          /* AJUSTAR PROCEDIMENTO, CRIAR LAÇO NA TABELA DE AGRUPAMENTO DETALHADO */
                          /* Transfere os agrupamentos em aberto da tabela que vai receber o estoque para a tabela que vai ceder o estoque */
                          if (qtd_transf > 0) Then
                              Begin
                              Delete from TBAGRUPAMENTO_PEDIDO A
                               where A.Saldo > 0 and A.tabela_id = :pedido_rec
                                 and A.tab_item_id = :ped_item_id_rec;

                              Delete from TBPEDIDO_CONSUMO A
                               where A.pedido_id = :pedido_rec
                                 and A.pedido_item_id = :ped_item_id_rec;

                              /*
                              For Select a.id, a.saldo
                                from TBAGRUPAMENTO_PEDIDO A
                               where A.Saldo > 0
                                 and A.tabela_id = :pedido_rec
                                 and A.tab_item_id = :ped_item_id_rec
                                Into :id, :saldo
                                  Do
                                  begin
                                  if (qtd_transf > 0) then
                                      Begin                                                              
                                      if (saldo <= qtd_transf) then
                                          Begin
                                            Update TBAGRUPAMENTO_PEDIDO Set
                                            Tabela_Id = :pedido_pag,
                                            Tab_item_Id = :ped_item_id_pag
                                            Where id = :ID;
                                            qtd_transf = :qtd_transf - :saldo;
                                          End else
                                      if (saldo > qtd_transf) then
                                          Begin
        
                                            Update TBAGRUPAMENTO_PEDIDO Set
                                            Tabela_Id = :pedido_pag,
                                            Tab_item_Id = :ped_item_id_pag,
                                            Quantidade = :qtd_transf,
                                            Saldo = :qtd_transf
                                            Where id = :ID;
        
                                            qtd_transf = 0;
                                          End
                                      End
                                  end */
                              End
        
                            /* Aloca o saldo de estoque transferido no pedido destino*/
                            Insert into TBESTOQUE_DETALHE_ALOCACAO (
                            estabelecimento_id,tabela_id,tab_item_id,tipo,
                            localizacao_id, produto_id, tamanho, quantidade,
                            saldo) values (:estabelecimento_id,
                            :pedido_rec, :ped_item_id_rec, 'P', :localizacao_id,
                            :produto_id, :tamanho, :Necessidade, :Necessidade);
            
                            HISTORICO = 'TRANSF.ALOC.ESTOQUE' 
                                      ||' QTD/TAM/LOC.'||TRUNC(:Necessidade)||'/'||:TAMANHO||'/'||:LOCALIZACAO_ID
                                      ||' *** PED/ITEM:'||:pedido_pag||'/'||:ped_item_id_pag
                                      ||' -> '||:pedido_rec||'/'||:ped_item_id_rec;

                              INSERT INTO TBHISTORICO (
                               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
                              'TBPEDIDO_ALOCADO', :pedido_rec,
                              (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', :pedido_pag,
                              (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 (Disponibilidade > 0) then
                                begin
                                  /* Volta a aloca do saldo de estoque residual para pedido de origem*/
                                  insert into TBESTOQUE_DETALHE_ALOCACAO (
                                  estabelecimento_id,tabela_id,tab_item_id,tipo,
                                  localizacao_id, produto_id, tamanho, quantidade,
                                  saldo) values (:estabelecimento_id,
                                  :pedido_pag, :ped_item_id_pag, 'P', :localizacao_id,
                                  :produto_id, :tamanho, :Disponibilidade, :Disponibilidade);
                                end
        
                            /* Transfere data de disponibilidade entre pedidos*/
                            if (Data_Disponivel is not null) then
                                begin
                                  update tbpedido_item Set Data_Disponivel = null
                                   where Pedido = :pedido_pag and controle = :ped_item_id_pag;

                                if (Data_Disponivel_Rec is null or Data_Disponivel_Rec < :Data_Disponivel) then
                                    begin
                                      update tbpedido_item Set Data_Disponivel = :Data_disponivel
                                       where Pedido = :pedido_rec and controle = :ped_item_id_rec;
                                    end
                                End
        
                  End
         End

  if (Flag = '0') then
      begin
      Exception "..." 'ITEM DO PEDIDO DE ORIGEM NAO LOCALIZADO. OPERACAO CANCELADA!';
      end
  if (Flag = '1') then
      begin
      Exception "..." 'ITEM DO PEDIDO DE DESTINO NAO LOCALIZADO. OPERACAO CANCELADA!';
      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);
declare variable OUTRO_PRODUTO_ID integer;
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, b.produto_id as OUTRO_PRODUTO_ID
                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.ORIGEM_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, :OUTRO_PRODUTO_ID
                    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, ORIGEM_PRODUTO_ID
                                            ) values (
                                                :estabelecimento_id, :Pedido, :Controle, 'P',
                                                :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Prd,
                                                :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID
                                            );
                                            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, ORIGEM_PRODUTO_ID)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID);
                                            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 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;
declare variable ORIGEM_PRODUTO_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
                SETOR_CODIGO,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                TABELA_ID,
                TAB_ITEM_ID,
                REMESSA,
                TALAO,
                PRODUTO_ID,
                TAMANHO,
                QUANTIDADE,
                TIPO,
                SALDO,
                DATAHORA,
                USUARIO,
                QUANTIDADE_ORIGINAL,
                TEMPO,
                ORIGEM_PRODUTO_ID
            from(
                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,
                    P.remessa_acumulado_controle,
                    p.produto_codigo as ORIGEM_PRODUTO_ID
                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'
                and coalesce(p.modelo_origem,0) = 0
                and p.peca_conjunto_id = 0
        
                union all
    
                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,
                    k1.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,
                    P.remessa_acumulado_controle,
                    coalesce(k2.codigo,0) as ORIGEM_PRODUTO_ID
                FROM tbremessa R, tbprogramacao s, tbproduto k1, tbpedido_item_processado P
                left join tbproduto k2 on k2.modelo_codigo = p.modelo_origem and p.cor_id = k2.cor_codigo

                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'
                and k1.modelo_codigo = p.modelo_codigo
                and p.cor_id = k1.cor_codigo
                and p.peca_conjunto_id > 0

            ) ORDER BY 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,
            ORIGEM_PRODUTO_ID
        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,
                ORIGEM_PRODUTO_ID
           ) 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',
                :ORIGEM_PRODUTO_ID
           );
    
        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);
declare variable OUTRO_PRODUTO_ID integer;
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, b.produto_id as OUTRO_PRODUTO_ID
                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.ORIGEM_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, :OUTRO_PRODUTO_ID
                    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, ORIGEM_PRODUTO_ID)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID);
                                            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, ORIGEM_PRODUTO_ID)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID);
                                            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),
    OUTRO_PRODUTO_ID integer)
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, b.produto_id as OUTRO_PRODUTO_ID
                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.ORIGEM_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, :OUTRO_PRODUTO_ID
                    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, ORIGEM_PRODUTO_ID)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID);
                                            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, ORIGEM_PRODUTO_ID)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :OUTRO_PRODUTO_ID, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id, :TIPO_REMESSA, :PRODUTO_ID);
                                            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 ; ^

update TBREMESSA_ITEM_ALOCACAO a set a.origem_produto_id = a.produto_id;


CREATE OR ALTER trigger ttbagrupamento_carga_up_b02iu for tbagrupamento_carga_up
active before insert position 2
AS
BEGIN
    NEW.SALDO = NEW.CAP_PRODUTIVA;

    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;

CREATE OR ALTER trigger ttbpedido_item_processado_b14u for tbpedido_item_processado
active before update position 14
AS
DECLARE VARIABLE AGRUPAMENTO_ID INTEGER;
DECLARE VARIABLE REMESSA_ITEM_ALOCACAO_ID INTEGER;

DECLARE VARIABLE AGRUP_PED_ID INTEGER;
DECLARE VARIABLE AGRUP_UP_ID INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE QUANTIDADE NUMERIC(15,4);
DECLARE VARIABLE NECESSIDADE NUMERIC(15,4);

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

  IF(NEW.SETOR_CODIGO IS DISTINCT FROM OLD.SETOR_CODIGO) THEN
  BEGIN
        :AGRUPAMENTO_ID = COALESCE((SELECT R.AGRUPAMENTO_ID FROM TBREMESSA R WHERE R.NUMERO = NEW.REMESSA), 0);

        IF(:AGRUPAMENTO_ID > 0)THEN
        BEGIN
            :AGRUP_UP_ID = COALESCE((SELECT FIRST 1 U.ID FROM TBAGRUPAMENTO_CARGA_UP U WHERE U.UP_ID = NEW.SETOR_CODIGO AND U.AGRUPAMENTO_ID = :AGRUPAMENTO_ID),0);

            IF(:AGRUP_UP_ID = 0)THEN
            BEGIN
               EXCEPTION "..." 'AGRUPAMENTO DA UP '||COALESCE(NEW.SETOR_CODIGO,'')||' NAO FOI ENCONTRADO. TALAO:'||NEW.CONTROLE;
            END

            FOR SELECT
                    I.ID
                FROM TBREMESSA_ITEM_ALOCACAO I
                WHERE I.REMESSA = NEW.REMESSA
                AND I.TALAO = NEW.CONTROLE
            INTO :REMESSA_ITEM_ALOCACAO_ID
            DO BEGIN
                FOR SELECT
                        J.AGRUP_PED_ID,
                        J.ID,
                        J.QUANTIDADE,
                        J.NECESSIDADE
                    FROM TBAGRUPAMENTO_CARGA_SKU_UP J
                    WHERE J.AGRUP_PED_ID = :REMESSA_ITEM_ALOCACAO_ID
                    AND J.TIPO = 2
                    AND J.AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                INTO :AGRUP_PED_ID, :ID, :QUANTIDADE, :NECESSIDADE
                DO BEGIN

                    DELETE FROM TBAGRUPAMENTO_CARGA_SKU_UP WHERE  (ID = :ID);

                    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,
                        :QUANTIDADE,
                        :NECESSIDADE,
                        2
                     );

    
                END

            END

        END


  END
END;