
DROP INDEX ITBAGRUPAMENTO_05;

CREATE OR ALTER trigger ttbagrupamento_b0i_01 for tbagrupamento
active before insert position 9
AS
DECLARE VARIABLE Agrup_Id Integer;
DECLARE VARIABLE Agrup_Desc VARCHAR(50);
begin

end;

CREATE OR ALTER trigger ttbagrupamento_b0u_01 for tbagrupamento
active before update position 9
AS
DECLARE VARIABLE Agrup_Id Integer;
DECLARE VARIABLE Agrup_Desc VARCHAR(50);
DECLARE VARIABLE Pedidos Integer;
begin

end;

CREATE OR ALTER trigger ttbagrupamento_b9u for tbagrupamento
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;


CREATE OR ALTER procedure spu_trata_pedido_data10 (
    pedido_1 integer,
    data_emissao_1 date,
    data_cliente_1 date,
    perfil_1 varchar(10),
    programado_1 char(1))
returns (
    controle integer,
    data_cliente date,
    data_producao date,
    agp_dt_prd date,
    agp_dt_cli date,
    est_min char(1),
    data_agrupamento date,
    rem_status char(1),
    qtd_prd numeric(15,4),
    qtd_est numeric(15,4),
    qtd_agp numeric(15,4),
    qtd_rem numeric(15,4),
    tipo_pedido char(1))
as
declare variable rem_stat char(1);
declare variable registros char(1);
declare variable tratamento_ped char(1);
declare variable maior_data_cliente date;
declare variable maior_data_producao date;
BEGIN

end;

CREATE OR ALTER procedure spu_trata_pedido_data11 (
    pedido_1 integer,
    data_emissao_1 date,
    data_cliente_1 date,
    perfil_1 varchar(10),
    programado_1 char(1))
returns (
    controle integer,
    data_cliente date,
    data_producao date,
    agp_dt_prd date,
    agp_dt_cli date,
    est_min char(1),
    data_agrupamento date,
    rem_status char(1),
    qtd_prd numeric(15,4),
    qtd_est numeric(15,4),
    qtd_agp numeric(15,4),
    qtd_rem numeric(15,4),
    tipo_pedido char(1))
as
declare variable rem_stat char(1);
declare variable registros char(1);
declare variable tratamento_ped char(1);
declare variable maior_data_cliente date;
declare variable maior_data_producao date;
declare variable vhora time;
BEGIN

end;

ALTER TABLE TBAGRUPAMENTO ADD OLD_PERFIL VARCHAR(10);
update TBAGRUPAMENTO set OLD_PERFIL = PERFIL;
ALTER TABLE TBAGRUPAMENTO DROP PERFIL;
ALTER TABLE TBAGRUPAMENTO ADD PERFIL VARCHAR(10) DEFAULT '';
update TBAGRUPAMENTO set PERFIL = OLD_PERFIL;
ALTER TABLE TBAGRUPAMENTO DROP OLD_PERFIL;

CREATE INDEX ITBAGRUPAMENTO_05 ON TBAGRUPAMENTO (PERFIL,DATA_INICIAL);

CREATE OR ALTER procedure spu_trata_pedido_data11 (
    pedido_1 integer,
    data_emissao_1 date,
    data_cliente_1 date,
    perfil_1 varchar(10),
    programado_1 char(1))
returns (
    controle integer,
    data_cliente date,
    data_producao date,
    agp_dt_prd date,
    agp_dt_cli date,
    est_min char(1),
    data_agrupamento date,
    rem_status char(1),
    qtd_prd numeric(15,4),
    qtd_est numeric(15,4),
    qtd_agp numeric(15,4),
    qtd_rem numeric(15,4),
    tipo_pedido char(1))
as
declare variable rem_stat char(1);
declare variable registros char(1);
declare variable tratamento_ped char(1);
declare variable maior_data_cliente date;
declare variable maior_data_producao date;
declare variable vhora time;
BEGIN

  Tratamento_Ped = '1';
  Maior_Data_Cliente  = Cast('01.01.2000' as Date);
  Maior_Data_Producao = Cast('01.01.2000' as Date);
  Registros = '0';
  Rem_Stat = '0';

  vHora = Cast((Select First 1 Valor_Ext From TbControle_n Where ID = 234) as Time);

if (Pedido_1 > 0) then
  Begin
    FOR 
    Select A.Controle,
           A.Data_Cliente, A.Data_Producao, A.Agp_Dt_Prd, A.Agp_Dt_Cli, A.Est_Min,

           Coalesce((Select First 1 Max(AGP.DATA_FINAL) From TbAgrupamento_Pedido T, TbAgrupamento AGP
                      Where T.ESTABELECIMENTO_ID = AGP.ESTABELECIMENTO_ID
                        AND T.Agrupamento_Id = AGP.Id
                        and T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and AGP.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Saldo > 0
                        and T.Tipo in ('P','M')),
                   (Select
                    (Select First 1 AGP.Data_Final From TbAgrupamento AGP
                      Where AGP.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                        and AGP.data_inicial <= X.Data
                        and AGP.data_final >= X.Data
                        and AGP.status = '1'
                        and AGP.simulacao = '0'
                        and AGP.perfil = :perfil_1) Data
                    From (
                    Select Max(Cast(R.Data_Bsc as Date)) Data
                      From tbremessa_item_alocacao T, TbRemessa R
                     Where T.ESTABELECIMENTO_ID = R.Estabelecimento_codigo
                       and T.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                       and t.Remessa = R.Numero
                       and T.Tabela_Id = A.Pedido
                       and T.Tab_Item_Id = A.Controle
                       AND T.TAMANHO = A.TAMANHO
                       and T.Tipo in ('P','M')
                       and T.Saldo > 0
                    ) X)) Data_Agrupamento,

           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, A.Qtd_Est, A.Qtd_Agp, A.Qtd_Rem,

           (Select First 1 P.Tipo_Pedido From TbPedido P Where a.pedido = p.pedido) Tipo_Pedido

      From TbPedido_Item A
     Where A.Pedido = :Pedido_1
       and A.Situacao = 1
       and A.Tamanho > 0
    -- For Update
     With Lock
    
    Into :Controle, :Data_Cliente, :Data_Producao, :Agp_Dt_Prd, :Agp_Dt_Cli,
         :Est_Min, :Data_Agrupamento, :Rem_Status,
         :Qtd_Prd, :Qtd_Est, :Qtd_Agp, :Qtd_Rem, :Tipo_Pedido
    Do
        
    if (:Tipo_Pedido = '1') then --Pedido Normal
        begin
        if (:Rem_Status = '0') then
             Begin
             Registros = '1';
             -- Tratamento via Est.Minimo --
             if (:Est_Min = '1') then
                  Begin
                     -- Em Estoque
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                         if (Current_Time <= :vHora and Current_Date = :Data_Emissao_1 and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                             Begin
                                 if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                             End else
                             Begin
                             if (Current_Date+1 >= :Maior_Data_Cliente and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                                 Begin
                                 if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                                 End else
                             if (:Data_Cliente >= :Maior_Data_Cliente) then
                                 Begin
                                  if (Maior_Data_Producao < :Data_Producao) then Maior_Data_Producao = :Data_Producao;
                                  if (Maior_Data_Cliente  < :Data_Cliente ) then Maior_Data_Cliente  = :Data_Cliente;
                                 End
                             End

                  End else
              -- Tratamento via Agrupamento --
             if (:Est_Min = '0') then
                  Begin
                     -- Em Estoque
                     if (:Qtd_Prd = 0 and :Qtd_Agp = 0 and :Qtd_Rem = 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Current_Time <= :vHora and Current_Date = :Data_Emissao_1) then
                              Begin
                               if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                              End else
                              Begin
                               if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                              End

                          End else
                     -- Em Agrupamento ou Producao
                     if ((:Qtd_Prd = 0) and (:Qtd_Agp > 0 or :Qtd_Rem > 0)) then
                          Begin

                          --
                          --if (Agp_Dt_Prd is not null) then
                          if (Data_Producao is not null) then
                              begin
                          --  Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Agp_Dt_Prd));
                              Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Data_Producao));
                              end

                          Update TbPedido_Item Set
                          Agp_Dt_Prd = :Data_Agrupamento,
                          Agp_Dt_Cli = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Maior_Data_Producao < :Data_Agrupamento) then
                              Maior_Data_Producao = :Data_Agrupamento;
                          if (Maior_Data_Cliente  < :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))) then
                              Maior_Data_Cliente  = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao));

                          if (Maior_Data_Producao <= :Data_Emissao_1) then
                              Begin
                              Maior_Data_Producao = :Data_Producao;
                              Maior_Data_Cliente  = :Data_Cliente;
                              End

                          End else
                     -- A Produzir > 0
                     if (:Qtd_Prd > 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          Tratamento_Ped = '0'; --Pedido precisa ser tratado
                          End
                  End
             End

        End
  End

  if (:Registros = '1' and :Rem_Stat = '0') then
      Begin

      if (:Tratamento_Ped = '0') Then
           Begin
           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBPEDIDO', :PEDIDO_1,
          (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),
           'Ha itens com pendencias que evitaram a conclusao no tratamento do pedido');
           End
    
      if (:Tratamento_Ped = '1') Then
           Begin

           If ((:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) or (:Programado_1 = '0' )) Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao,
               Data_Cliente = :Maior_Data_Cliente
               Where Pedido = :Pedido_1;
               End else

           If (:Programado_1 = '1') Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao
               Where Pedido = :Pedido_1
                 and Data_Entrega < :Maior_Data_Producao;
               End

           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
           'TBPEDIDO', :PEDIDO_1,
           (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),
           'Pedido tratado por completo');

           if (:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) Then
               Begin
               INSERT INTO TBHISTORICO (
               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
              'TBPEDIDO', :PEDIDO_1,
              (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),
               'O tratamento de itens forcou a alteracao da data do cliente no Pedido Programado');
               End
           End

      End

End;

CREATE OR ALTER procedure spu_trata_pedido_data10 (
    pedido_1 integer,
    data_emissao_1 date,
    data_cliente_1 date,
    perfil_1 varchar(10),
    programado_1 char(1))
returns (
    controle integer,
    data_cliente date,
    data_producao date,
    agp_dt_prd date,
    agp_dt_cli date,
    est_min char(1),
    data_agrupamento date,
    rem_status char(1),
    qtd_prd numeric(15,4),
    qtd_est numeric(15,4),
    qtd_agp numeric(15,4),
    qtd_rem numeric(15,4),
    tipo_pedido char(1))
as
declare variable rem_stat char(1);
declare variable registros char(1);
declare variable tratamento_ped char(1);
declare variable maior_data_cliente date;
declare variable maior_data_producao date;
BEGIN

  Tratamento_Ped = '1';
  Maior_Data_Cliente  = Cast('01.01.2000' as Date);
  Maior_Data_Producao = Cast('01.01.2000' as Date);
  Registros = '0';
  Rem_Stat = '0';

if (Pedido_1 > 0) then
  Begin
    FOR 
    Select A.Controle,
           A.Data_Cliente, A.Data_Producao, A.Agp_Dt_Prd, A.Agp_Dt_Cli, A.Est_Min,

           Coalesce((Select First 1 Max(AGP.DATA_FINAL) From TbAgrupamento_Pedido T, TbAgrupamento AGP
                      Where T.ESTABELECIMENTO_ID = AGP.ESTABELECIMENTO_ID
                        AND T.Agrupamento_Id = AGP.Id
                        and T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and AGP.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Saldo > 0
                        and T.Tipo in ('P','M')),
                   (Select
                    (Select First 1 AGP.Data_Final From TbAgrupamento AGP
                      Where AGP.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                        and AGP.data_inicial <= X.Data
                        and AGP.data_final >= X.Data
                        and AGP.status = '1'
                        and AGP.simulacao = '0'
                        and AGP.perfil = :perfil_1) Data
                    From (
                    Select Max(Cast(R.Data_Bsc as Date)) Data
                      From tbremessa_item_alocacao T, TbRemessa R
                     Where T.ESTABELECIMENTO_ID = R.Estabelecimento_codigo
                       and T.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                       and t.Remessa = R.Numero
                       and T.Tabela_Id = A.Pedido
                       and T.Tab_Item_Id = A.Controle
                       AND T.TAMANHO = A.TAMANHO
                       and T.Tipo in ('P','M')
                       and T.Saldo > 0
                    ) X)) Data_Agrupamento,

           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, A.Qtd_Est, A.Qtd_Agp, A.Qtd_Rem,

           (Select First 1 P.Tipo_Pedido From TbPedido P Where a.pedido = p.pedido) Tipo_Pedido

      From TbPedido_Item A
     Where A.Pedido = :Pedido_1
       and A.Situacao = 1
       and A.Tamanho > 0
    -- For Update
     With Lock
    
    Into :Controle, :Data_Cliente, :Data_Producao, :Agp_Dt_Prd, :Agp_Dt_Cli,
         :Est_Min, :Data_Agrupamento, :Rem_Status,
         :Qtd_Prd, :Qtd_Est, :Qtd_Agp, :Qtd_Rem, :Tipo_Pedido
    Do
        
    if (:Tipo_Pedido = '1') then --Pedido Normal
        begin
        if (:Rem_Status = '0') then
             Begin
             Registros = '1';
             -- Tratamento via Est.Minimo --
             if (:Est_Min = '1') then
                  Begin
                     -- Em Estoque
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                         if (Current_Time <= Cast('15:00:59' as Time) and Current_Date = :Data_Emissao_1 and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                             Begin
                                 if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                             End else
                             Begin
                             if (Current_Date+1 >= :Maior_Data_Cliente and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                                 Begin
                                 if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                                 End else
                             if (:Data_Cliente >= :Maior_Data_Cliente) then
                                 Begin
                                  if (Maior_Data_Producao < :Data_Producao) then Maior_Data_Producao = :Data_Producao;
                                  if (Maior_Data_Cliente  < :Data_Cliente ) then Maior_Data_Cliente  = :Data_Cliente;
                                 End
                             End

                  End else
              -- Tratamento via Agrupamento --
             if (:Est_Min = '0') then
                  Begin
                     -- Em Estoque
                     if (:Qtd_Prd = 0 and :Qtd_Agp = 0 and :Qtd_Rem = 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Current_Time <= Cast('15:00:59' as Time) and Current_Date = :Data_Emissao_1) then
                              Begin
                               if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                              End else
                              Begin
                               if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                              End

                          End else
                     -- Em Agrupamento ou Producao
                     if ((:Qtd_Prd = 0) and (:Qtd_Agp > 0 or :Qtd_Rem > 0)) then
                          Begin

                          --
                          --if (Agp_Dt_Prd is not null) then
                          if (Data_Producao is not null) then
                              begin
                          --  Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Agp_Dt_Prd));
                              Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Data_Producao));
                              end

                          Update TbPedido_Item Set
                          Agp_Dt_Prd = :Data_Agrupamento,
                          Agp_Dt_Cli = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Maior_Data_Producao < :Data_Agrupamento) then
                              Maior_Data_Producao = :Data_Agrupamento;
                          if (Maior_Data_Cliente  < :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))) then
                              Maior_Data_Cliente  = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao));

                          if (Maior_Data_Producao <= :Data_Emissao_1) then
                              Begin
                              Maior_Data_Producao = :Data_Producao;
                              Maior_Data_Cliente  = :Data_Cliente;
                              End

                          End else
                     -- A Produzir > 0
                     if (:Qtd_Prd > 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          Tratamento_Ped = '0'; --Pedido precisa ser tratado
                          End
                  End
             End

        End
  End

  if (:Registros = '1' and :Rem_Stat = '0') then
      Begin

      if (:Tratamento_Ped = '0') Then
           Begin
           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBPEDIDO', :PEDIDO_1,
          (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),
           'Ha itens com pendencias que evitaram a conclusao no tratamento do pedido');
           End
    
      if (:Tratamento_Ped = '1') Then
           Begin

           If ((:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) or (:Programado_1 = '0' )) Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao,
               Data_Cliente = :Maior_Data_Cliente
               Where Pedido = :Pedido_1;
               End else

           If (:Programado_1 = '1') Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao
               Where Pedido = :Pedido_1
                 and Data_Entrega < :Maior_Data_Producao;
               End

           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
           'TBPEDIDO', :PEDIDO_1,
           (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),
           'Pedido tratado por completo');

           if (:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) Then
               Begin
               INSERT INTO TBHISTORICO (
               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
              'TBPEDIDO', :PEDIDO_1,
              (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),
               'O tratamento de itens forcou a alteracao da data do cliente no Pedido Programado');
               End
           End

      End

End;

CREATE OR ALTER trigger ttbagrupamento_b9u for tbagrupamento
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.ESTABELECIMENTO_ID <> NEW.ESTABELECIMENTO_ID) then
       BEGIN
       HISTORICO = HISTORICO||' Est:'||OLD.ESTABELECIMENTO_ID||'->'||NEW.ESTABELECIMENTO_ID;
       END
   if (OLD.LOCALIZACAO_ID <> NEW.LOCALIZACAO_ID) then
       BEGIN
       HISTORICO = HISTORICO||' Loc:'||OLD.LOCALIZACAO_ID||'->'||NEW.LOCALIZACAO_ID;
       END
   if (OLD.DESCRICAO <> NEW.DESCRICAO) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.'||OLD.DESCRICAO||'->'||NEW.DESCRICAO;
       END

   if (OLD.DATA_INICIAL <> NEW.DATA_INICIAL or OLD.DATA_FINAL <> NEW.DATA_FINAL) then
       BEGIN
       HISTORICO = HISTORICO||' Período:'||OLD.DATA_INICIAL||'a'||OLD.DATA_FINAL||'->'||NEW.DATA_INICIAL||'a'||NEW.DATA_FINAL;
       END
   if (OLD.Perfil <> NEW.Perfil) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.'||OLD.Perfil||'->'||NEW.Perfil;
       END
   if (OLD.MINUTOS_PRODUTIVOS <> NEW.MINUTOS_PRODUTIVOS) then
       BEGIN
       HISTORICO = HISTORICO||' Min.Prd.'||OLD.MINUTOS_PRODUTIVOS||'->'||NEW.MINUTOS_PRODUTIVOS;
       END
   if (OLD.SIMULACAO <> NEW.SIMULACAO) then
       BEGIN
       HISTORICO = HISTORICO||' Simulação '||OLD.SIMULACAO||'->'||NEW.SIMULACAO;
       END
/*
   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Status Inativado';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Status Ativado';
       END
*/
   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBAGRUPAMENTO', OLD.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;

CREATE OR ALTER trigger ttbagrupamento_b0u_01 for tbagrupamento
active before update position 9
AS
DECLARE VARIABLE Agrup_Id Integer;
DECLARE VARIABLE Agrup_Desc VARCHAR(50);
DECLARE VARIABLE Pedidos Integer;
begin

   if (New.Simulacao <> Old.Simulacao or New.Data_Inicial <> Old.Data_Inicial or New.Data_Final <> Old.Data_Final) Then
       Begin
       if (New.Simulacao = '1') then
           Begin
            Pedidos = Coalesce((Select First 1 Id From TbAgrupamento_Pedido Where Agrupamento_Id = Old.Id and Tipo = 'P'),0);
            if (:Pedidos > 0) Then
                Begin
                Exception "..." 'TIPO DE AGRUPAMENTO NAO PODE SER ALTERADO, JA EXISTEM PEDIDOS VINCULADOS!'||
                                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                End
           End
       if (New.Simulacao = '0') then
           Begin
            Agrup_Id = Coalesce((Select First 1 Id From TbAgrupamento
                                  Where ((Data_Inicial <= New.Data_Inicial and Data_Final >= New.Data_Inicial) or
                                         (Data_Inicial <= New.Data_Final and Data_Final >= New.Data_Final))
                                    and Simulacao = '0' and Id <> Old.Id and Perfil = New.Perfil
                                    and localizacao_Id = New.Localizacao_Id
                                    ),0);
            if (:Agrup_Id > 0) Then
                Begin
                Agrup_Desc = (Select First 1 Id||'-'||Descricao From TbAgrupamento Where Id = :Agrup_Id);
                Exception "..." 'PERIODO INFORMADO SOBREPONDO PERIODO DE OUTRO AGRUPAMENTO: '||:AGRUP_DESC||
                                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                End
           End
       End

end;

CREATE OR ALTER trigger ttbagrupamento_b0i_01 for tbagrupamento
active before insert position 9
AS
DECLARE VARIABLE Agrup_Id Integer;
DECLARE VARIABLE Agrup_Desc VARCHAR(50);
begin

   if (New.Simulacao = '0') Then
      Begin
        Agrup_Id = Coalesce((Select First 1 Id From TbAgrupamento
                              Where ((Data_Inicial <= New.Data_Inicial and Data_Final >= New.Data_Inicial) or
                                     (Data_Inicial <= New.Data_Final and Data_Final >= New.Data_Final))
                                and Simulacao = '0' and Perfil = New.Perfil
                                and localizacao_Id = New.Localizacao_Id),0);
        if (:Agrup_Id > 0) Then
            Begin
            Agrup_Desc = (Select First 1 Id||'-'||Descricao From TbAgrupamento Where Id = :Agrup_Id);
            Exception "..." 'PERIODO INFORMADO SOBREPONDO PERIODO DE OUTRO AGRUPAMENTO: '||:AGRUP_DESC||
                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
            End
      End

end;

