DROP INDEX ITBPEDIDO_10;

CREATE OR ALTER trigger ttbpedido_b0ui_02dlf for tbpedido
active before insert or update position 0
AS
Begin

end;

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

end;

CREATE OR ALTER procedure spc_email_pedidos_atrasados 
returns (
    html blob sub_type 0 segment size 80,
    email varchar(200),
    old_representante_email varchar(300))
as
declare variable corpo1 varchar(8150);
declare variable corpo2 varchar(8150);
declare variable tabela varchar(8150);
declare variable tabela2 varchar(8150);
declare variable tabela3 varchar(8150);
declare variable representante varchar(200);
declare variable cliente varchar(200);
declare variable pedido integer;
declare variable data varchar(20);
declare variable data_cliente varchar(20);
declare variable dias_atraso integer;
declare variable quantidade integer;
declare variable saldo_a_faturar integer;
declare variable percent numeric(15,2);
declare variable representante_id integer;
declare variable cont_linhas integer;
declare variable disponivel integer;
declare variable perc_disponivel numeric(15,2);
declare variable representante_email varchar(300);
declare variable old_representante_id integer;
declare variable html_geral blob sub_type 0 segment size 80;
BEGIN

end;

CREATE OR ALTER procedure spu_trata_pedido_estoque4 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

end;

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 char(1),
    perfil_cor char(1),
    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);
BEGIN

end;


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 char(1),
    perfil_cor char(1),
    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);
BEGIN

end;

CREATE OR ALTER procedure spu_trata_ped_item_estoque3 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    modelo_codigo integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    qtd_mult integer,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
BEGIN

end;

CREATE OR ALTER procedure spu_trata_ped_item_remessa5 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku char(1),
    perfil_cor char(1),
    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;
BEGIN

end;

CREATE OR ALTER trigger ttbpedido_b0u_01 for tbpedido
active before update position 0
AS
DECLARE VARIABLE DataInicial Date;
DECLARE VARIABLE DataFinal Date;
DECLARE VARIABLE MODULO_CODIGO INTEGER;
DECLARE VARIABLE DATA1 VARCHAR(10);
DECLARE VARIABLE DATA2 VARCHAR(10);
DECLARE VARIABLE DATA3 VARCHAR(23);
Begin

end;

ALTER TABLE TBPEDIDO ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBPEDIDO set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBPEDIDO DROP CLASSIFICACAO;
ALTER TABLE TBPEDIDO ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBPEDIDO set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBPEDIDO DROP OLD_PERFIL;

CREATE INDEX ITBPEDIDO_10 ON TBPEDIDO (CLASSIFICACAO);
SET STATISTICS INDEX ITBPEDIDO_10;

CREATE OR ALTER trigger ttbpedido_b0u_01 for tbpedido
active before update position 0
AS
DECLARE VARIABLE DataInicial Date;
DECLARE VARIABLE DataFinal Date;
DECLARE VARIABLE MODULO_CODIGO INTEGER;
DECLARE VARIABLE DATA1 VARCHAR(10);
DECLARE VARIABLE DATA2 VARCHAR(10);
DECLARE VARIABLE DATA3 VARCHAR(23);
Begin
  if (old.SALESFORCE = new.SALESFORCE) Then
      Begin
        For
        Select 
        (Select First 1 A.DataInicial   From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 8),
        (Select First 1 A.DataFINAL     From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 8),
        Coalesce((Select First 1 A.MODULO_CODIGO From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 8),0),
        
        extract(day from OLD.DATA)||'/'||extract(month from OLD.DATA)||'/'||extract(year from OLD.DATA),
        extract(day from NEW.DATA)||'/'||extract(month from NEW.DATA)||'/'||extract(year from NEW.DATA),
        (Select First 1 extract(day from A.DataInicial)||'/'||extract(month from A.DataInicial)||'/'||extract(year from A.DataInicial)
                        ||' A '||extract(day from A.DataFINAL)||'/'||extract(month from A.DataFINAL)||'/'||extract(year from A.DataFINAL)
           From TbConfiguracao_Periodo A Where A.Estabelecimento_Codigo = OLD.ESTABELECIMENTO_CODIGO and A.Modulo_Codigo = 8)
        
        FROM RDB$DATABASE
        
        Into :DataInicial,:DataFinal,:MODULO_CODIGO,:DATA1,:DATA2,:DATA3
        Do
        begin
          if (:MODULO_CODIGO = 0) Then Exception "..." 'MÓDULO DE PEDIDOS[8] NÃO LOCALIZADO PARA ESSE ESTABELECIMENTO. ID.'||OLD.ESTABELECIMENTO_CODIGO||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (OLD.DATA < :DATAINICIAL) Then Exception "..." 'MÓDULO DE PEDIDOS[8]. DATA '||:DATA1||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (OLD.DATA > :DATAFINAL)   Then Exception "..." 'MÓDULO DE PEDIDOS[8]. DATA '||:DATA1||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (NEW.DATA < :DATAINICIAL) Then Exception "..." 'MÓDULO DE PEDIDOS[8]. DATA '||:DATA2||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          if (NEW.DATA > :DATAFINAL)   Then Exception "..." 'MÓDULO DE PEDIDOS[8]. DATA '||:DATA2||' FORA DO PERÍODO LIBERADO: '||:DATA3||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
        end
    End
End;

CREATE OR ALTER procedure spu_trata_ped_item_remessa5 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku char(1),
    perfil_cor char(1),
    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;
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
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                and B.Saldo >= :Qtd_Mult
                Order By R.Data
                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    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
                                            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)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_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)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_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;

CREATE OR ALTER procedure spu_trata_ped_item_estoque3 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    modelo_codigo integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    qtd_mult integer,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
BEGIN
FOR 
Select First 1 A.Estabelecimento_Codigo, A.Pedido, a.modelo_codigo, A.Controle, A.Produto_Codigo,
               A.Localizacao_Id, A.Tamanho,
               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, :modelo_codigo, :Controle,
     :Produto_Id, :Localizacao_Id, :Tamanho, :Rem_Status, :Qtd_Prd, :Qtd_Mult, :aloc_mult
Do

if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Delete from TBESTOQUE_DETALHE_ALOCACAO
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
              and Tipo = 'P'
              and Produto_Id = :Produto_Id
              and Tamanho = :Tamanho
              and Saldo > 0;
          End
        
      if (:AlocDesaloc = 'A') then
           Begin
    
            IF(:Qtd_Mult = 0)THEN
            BEGIN
               exception "..." 'Modelo '||:modelo_codigo||' sem cota definida no tamanho '||:Tamanho;
            END
            
           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
        
              For
              Select First 1
                Cast(IIF(:Tamanho =  0, A.Saldo,
                     IIF(:Tamanho =  1, A.T01_Saldo,IIF(:Tamanho =  2, A.T02_Saldo,
                     IIF(:Tamanho =  3, A.T03_Saldo,IIF(:Tamanho =  4, A.T04_Saldo,
                     IIF(:Tamanho =  5, A.T05_Saldo,IIF(:Tamanho =  6, A.T06_Saldo,
                     IIF(:Tamanho =  7, A.T07_Saldo,IIF(:Tamanho =  8, A.T08_Saldo,
                     IIF(:Tamanho =  9, A.T09_Saldo,IIF(:Tamanho = 10, A.T10_Saldo,
                     IIF(:Tamanho = 11, A.T11_Saldo,IIF(:Tamanho = 12, A.T12_Saldo,
                     IIF(:Tamanho = 13, A.T13_Saldo,IIF(:Tamanho = 14, A.T14_Saldo,
                     IIF(:Tamanho = 15, A.T15_Saldo,IIF(:Tamanho = 16, A.T16_Saldo,
                     IIF(:Tamanho = 17, A.T17_Saldo,IIF(:Tamanho = 18, A.T18_Saldo,
                     IIF(:Tamanho = 19, A.T19_Saldo,IIF(:Tamanho = 20, A.T20_Saldo,
                     0))))))))))))))))))))) As Numeric(15,4))
              -(Coalesce(
               (Select First 1 ESA.QUANTIDADE
                  From TBESTOQUE_SALDO_ALOCACAO ESA
                 Where ESA.ESTABELECIMENTO_ID = A.Estabelecimento_Codigo
                   and ESA.LOCALIZACAO_ID = A.Localizacao_Codigo
                   and ESA.PRODUTO_ID = A.Produto_Codigo
                   and ESA.TAMANHO = :Tamanho),0))
        
                  From TbEstoque_Saldo A
                 Where A.Estabelecimento_Codigo = :Estabelecimento_Id
                   and A.Localizacao_Codigo = :Localizacao_Id
                   and A.Produto_Codigo = :Produto_Id
                  Into :Qtd_Disp
                    Do
                       Begin

                       if (:Qtd_Disp > 0) then
                            Begin

                            vQtd_Disp = Qtd_Disp;
        
                            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 <= :vQtd_Disp and :vQtd_Disp > 0) Then
                               Begin
                                insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                produto_id, tamanho, Quantidade, Saldo)
                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                :localizacao_id, :produto_id, :tamanho, :vQtd_Prd, :vQtd_Prd);
        
                                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 and :vQtd_Disp > 0) Then
                               Begin
                                insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                produto_id, tamanho, Quantidade, Saldo)
                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                :localizacao_id, :produto_id, :tamanho, :vQtd_Disp, :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;


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 char(1),
    perfil_cor char(1),
    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);
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
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                and B.Saldo >= :Qtd_Mult
                Order By R.Data

                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    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
                                            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)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_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)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_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;


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 char(1),
    perfil_cor char(1),
    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);
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
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                Order By R.Data

                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    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
                                            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)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_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)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_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;

CREATE OR ALTER procedure spu_trata_pedido_estoque4 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
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,
       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, :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do

if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Delete from TBESTOQUE_DETALHE_ALOCACAO
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
              and Tipo = 'P'
              and Produto_Id = :Produto_Id
              and Tamanho = :Tamanho
              and Saldo > 0;
          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
        
              For
              Select First 1
                Cast(IIF(:Tamanho =  0, A.Saldo,
                     IIF(:Tamanho =  1, A.T01_Saldo,IIF(:Tamanho =  2, A.T02_Saldo,
                     IIF(:Tamanho =  3, A.T03_Saldo,IIF(:Tamanho =  4, A.T04_Saldo,
                     IIF(:Tamanho =  5, A.T05_Saldo,IIF(:Tamanho =  6, A.T06_Saldo,
                     IIF(:Tamanho =  7, A.T07_Saldo,IIF(:Tamanho =  8, A.T08_Saldo,
                     IIF(:Tamanho =  9, A.T09_Saldo,IIF(:Tamanho = 10, A.T10_Saldo,
                     IIF(:Tamanho = 11, A.T11_Saldo,IIF(:Tamanho = 12, A.T12_Saldo,
                     IIF(:Tamanho = 13, A.T13_Saldo,IIF(:Tamanho = 14, A.T14_Saldo,
                     IIF(:Tamanho = 15, A.T15_Saldo,IIF(:Tamanho = 16, A.T16_Saldo,
                     IIF(:Tamanho = 17, A.T17_Saldo,IIF(:Tamanho = 18, A.T18_Saldo,
                     IIF(:Tamanho = 19, A.T19_Saldo,IIF(:Tamanho = 20, A.T20_Saldo,
                     0))))))))))))))))))))) As Numeric(15,4))
              -(Coalesce(
               (Select First 1 ESA.QUANTIDADE
                  From TBESTOQUE_SALDO_ALOCACAO ESA
                 Where ESA.ESTABELECIMENTO_ID = A.Estabelecimento_Codigo
                   and ESA.LOCALIZACAO_ID = A.Localizacao_Codigo
                   and ESA.PRODUTO_ID = A.Produto_Codigo
                   and ESA.TAMANHO = :Tamanho),0))
        
                  From TbEstoque_Saldo A
                 Where A.Estabelecimento_Codigo = :Estabelecimento_Id
                   and A.Localizacao_Codigo = :Localizacao_Id
                   and A.Produto_Codigo = :Produto_Id
                  Into :Qtd_Disp
                    Do
                       Begin

                       if (:Qtd_Disp > 0) then
                            Begin

                                vQtd_Disp = :Qtd_Disp;

                                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 <= :vQtd_Disp and :vQtd_Disp > 0) Then
                                   Begin
                                    insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                    estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                    produto_id, tamanho, Quantidade, Saldo)
                                    values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                    :localizacao_id, :produto_id, :tamanho, :vQtd_Prd, :vQtd_Prd);
            
                                    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 and :vQtd_Disp > 0) Then
                                   Begin
                                    insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                    estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                    produto_id, tamanho, Quantidade, Saldo)
                                    values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                    :localizacao_id, :produto_id, :tamanho, :vQtd_Disp, :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;

CREATE OR ALTER procedure spc_email_pedidos_atrasados 
returns (
    html blob sub_type 0 segment size 80,
    email varchar(200),
    old_representante_email varchar(300))
as
declare variable corpo1 varchar(8150);
declare variable corpo2 varchar(8150);
declare variable tabela varchar(8150);
declare variable tabela2 varchar(8150);
declare variable tabela3 varchar(8150);
declare variable representante varchar(200);
declare variable cliente varchar(200);
declare variable pedido integer;
declare variable data varchar(20);
declare variable data_cliente varchar(20);
declare variable dias_atraso integer;
declare variable quantidade integer;
declare variable saldo_a_faturar integer;
declare variable percent numeric(15,2);
declare variable representante_id integer;
declare variable cont_linhas integer;
declare variable disponivel integer;
declare variable perc_disponivel numeric(15,2);
declare variable representante_email varchar(300);
declare variable old_representante_id integer;
declare variable html_geral blob sub_type 0 segment size 80;
BEGIN

    tabela =  '<table class="tbl"><thead><tr>'||
                '<th class="col-0">Representante</th>'||
                '<th class="col-1">Cliente</th>'||
                '<th class="col-2">Pedido</th>'||
                '<th class="col-3">Data Pedido</th>'||
                '<th class="col-4">Data Cliente</th>'||
                '<th class="col-5">Dias Atraso</th>'||
                '<th class="col-6">Quantidade</th>'||
                '<th class="col-7">Saldo a Faturar</th>'||
                '<th class="col-8">% a Faturar</th>'||
                '<th class="col-9">Disponível</th>'||
                '<th class="col-10">% Disponível</th>'||
              '</tr></thead>';

    tabela2 = '';
    tabela3 = '';
    CONT_LINHAS = 0;
    HTML_GERAL  = '';

    corpo1 = ((select cast(e.conteudo as varchar(8100)) as corpo from tbhtml_elemento e where e.id = 11));
    corpo2 = ((select cast(e.conteudo as varchar(8100)) as corpo from tbhtml_elemento e where e.id = 10));

    OLD_REPRESENTANTE_ID = 0;

    EMAIL  = 'comercial2@delfa.com.br,haroldo@delfa.com.br';
    --EMAIL  = 'anderson@delfa.com.br';

        FOR
    
            select
                REPRESENTANTE_ID,
                REPRESENTANTE_EMAIL,
                REPRESENTANTE,
                CLIENTE,
                PEDIDO,
                formatdate(DATA) as DATA,
                formatdate(DATA_CLIENTE) as DATA_CLIENTE,
                DIAS_ATRASO,
                QUANTIDADE,
                SALDO_A_FATURAR,
                PERCENT,
                DISPONIVEL,
                PERC_DISPONIVEL
            from(
                Select
                    codigo as REPRESENTANTE_ID,
                    EMAIL as REPRESENTANTE_EMAIL,
                    REPRESENTANTE,
                    CLIENTE,
                    PEDIDO,
                    DATA,
                    DATA_CLIENTE,
                    datediff(day,data_cliente, CURRENT_DATE ) DIAS_ATRASO,
                    SUM(QUANTIDADE) QUANTIDADE,
                    SUM(SALDO) SALDO_A_FATURAR,
                    CAST(SUM(SALDO) / SUM(QUANTIDADE) * 100.00 AS NUMERIC(15,2)) AS PERCENT,
                    SUM(DISPONIVEL) DISPONIVEL,
                    CAST(SUM(DISPONIVEL) / SUM(SALDO) * 100.00 AS NUMERIC(15,2)) AS PERC_DISPONIVEL
                
                From (
                Select R.codigo,
                       r.email,
                       R.NomeFantasia||' ('||R.UF||')' REPRESENTANTE,
                       E.NomeFantasia||' ('||E.UF||')' CLIENTE,
                       PI.Pedido, P.Data, P.Data_Cliente,
                       PI.Quantidade, PI.Valor,
                       PI.Qtd_est   Disponivel,
                       S.quantidade Saldo,
                       PI.Valor * S.quantidade VALOR_A_FATURAR 
                
                  From TbPedido_Item PI, TbPedido P, TBProduto PD, TBEmpresa E, tbpedido_item_saldo S, TbEmpresa R
                 Where P.Pedido = PI.Pedido
                   and PI.controle = S.pedido_item_controle
                   and R.Codigo = P.Representante_Codigo
                   and PI.Produto_Codigo = PD.Codigo
                   and P.Cliente_Codigo = E.Codigo
                   and (P.Data_Cliente = CURRENT_DATE - 1 or P.Data_Cliente = CURRENT_DATE - 3)
                   and P.Classificacao = ' '
                   and P.Status = '1'
                   and P.Situacao = 1
                   and PI.Situacao = 1
                )
                GROUP BY 1,2,3,4,5,6,7
            )
    
        INTO
            :REPRESENTANTE_ID,
            :REPRESENTANTE_EMAIL,
            :REPRESENTANTE,
            :CLIENTE,
            :PEDIDO,
            :DATA,
            :DATA_CLIENTE,
            :DIAS_ATRASO,
            :QUANTIDADE,
            :SALDO_A_FATURAR,
            :PERCENT,
            :DISPONIVEL,
            :PERC_DISPONIVEL
        DO
        BEGIN


                if((:OLD_REPRESENTANTE_ID <> :REPRESENTANTE_ID) and :OLD_REPRESENTANTE_ID > 0)then
                begin
                     html = coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'');
                     HTML_GERAL = HTML_GERAL || coalesce(coalesce(:tabela2,'')||coalesce(:tabela3,''),'');
                     suspend;
            
                     if((CHAR_LENGTH(:OLD_REPRESENTANTE_EMAIL) > 0) and (CHAR_LENGTH(coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 ) and CONT_LINHAS > 0) then
                     begin
                        INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO)
                        VALUES (:OLD_REPRESENTANTE_EMAIL, 0, 'DELFA : PEDIDOS EM ATRASO', 0, current_timestamp,:corpo1||coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')||:corpo2);
                     end

                    :tabela2     = '';
                    :tabela3     = '';
                    :CONT_LINHAS = 0;
                end

                :OLD_REPRESENTANTE_ID    = :REPRESENTANTE_ID;
                :OLD_REPRESENTANTE_EMAIL = :REPRESENTANTE_EMAIL;
                
                CONT_LINHAS = CONT_LINHAS + 1;

                if (CHAR_LENGTH (tabela2) < 6000) then
                begin
                    tabela2 =  tabela2||'<tr class="--">';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(REPRESENTANTE     ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(CLIENTE           ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(PEDIDO            ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(DATA              ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-String" id="col-String">'      ||coalesce(DATA_CLIENTE      ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DIAS_ATRASO       ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(QUANTIDADE        ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(SALDO_A_FATURAR   ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERCENT           ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DISPONIVEL        ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERC_DISPONIVEL   ,'') ||'</td>';
                    tabela2 =  tabela2||'</tr>';
                end else
                begin
                    tabela3 =  tabela3||'<tr class="--">';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(REPRESENTANTE     ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(CLIENTE           ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(PEDIDO            ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(DATA              ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-String" id="col-String">'      ||coalesce(DATA_CLIENTE      ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DIAS_ATRASO       ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(QUANTIDADE        ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(SALDO_A_FATURAR   ,'') ||'</td>';
                    tabela3 =  tabela3||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERCENT           ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(DISPONIVEL        ,'') ||'</td>';
                    tabela2 =  tabela2||'<td class="col-numerica" id="col-numerica">'  ||coalesce(PERC_DISPONIVEL   ,'') ||'</td>';
                    tabela3 =  tabela3||'</tr>';
                end

         END

         html       = coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'');
         HTML_GERAL = coalesce(:tabela,'')|| HTML_GERAL || coalesce(coalesce(:tabela2,'')||coalesce(:tabela3,''),'');
         suspend;

         if((CHAR_LENGTH(:OLD_REPRESENTANTE_EMAIL) > 0) and (CHAR_LENGTH(coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 ) and CONT_LINHAS > 0) then
         begin
            INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO)
            VALUES (:OLD_REPRESENTANTE_EMAIL, 0, 'DELFA : PEDIDOS EM ATRASO', 0, current_timestamp,:corpo1||coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')||:corpo2);
         end

         if((CHAR_LENGTH(:EMAIL) > 0) and (CHAR_LENGTH(coalesce(:tabela,'')||coalesce(:tabela2,'')||coalesce(:tabela3,'')) > 0 )) then
         begin
            INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO)
            VALUES (:OLD_REPRESENTANTE_EMAIL, 0, 'DELFA : PEDIDOS EM ATRASO', 0, current_timestamp,:corpo1||coalesce(:HTML_GERAL,'')||:corpo2);
         end

END;



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

   HISTORICO = '';

   if (OLD.Cliente_Codigo <> NEW.Cliente_Codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Cliente:'||OLD.Cliente_Codigo||'->'||NEW.Cliente_Codigo;
       END
   if (OLD.Cliente_Id_Amostra <> NEW.Cliente_Id_Amostra) then
       BEGIN
       HISTORICO = HISTORICO||' Cli.Amostra:'||OLD.Cliente_Id_Amostra||'->'||NEW.Cliente_Id_Amostra;
       END
   if (OLD.Data <> NEW.Data) then
       BEGIN
       HISTORICO = HISTORICO||' Dt.Emiss.'||OLD.Data||'->'||NEW.Data;
       END
   if (OLD.Data_Cliente <> NEW.Data_Cliente) then
       BEGIN
       HISTORICO = HISTORICO||' Dt.Cli.'||OLD.Data_Cliente||'->'||NEW.Data_Cliente;
       END
   if (OLD.Programado<> NEW.Programado) then
       BEGIN
       HISTORICO = HISTORICO||' Prog.'||OLD.Programado||'->'||NEW.Programado;
       END
   if (OLD.Data_Entrega <> NEW.Data_Entrega) then
       BEGIN
       HISTORICO = HISTORICO||' Prev.Fat.'||OLD.Data_Entrega||'->'||NEW.Data_Entrega;
       END
   if (OLD.Pedido_Cliente <> NEW.Pedido_Cliente) then
       BEGIN
       HISTORICO = HISTORICO||' Ped.Cli.'||OLD.Pedido_Cliente||'->'||NEW.Pedido_Cliente;
       END
   if (OLD.Transportadora_Codigo<> NEW.Transportadora_Codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Transp.'||OLD.Transportadora_Codigo||'->'||NEW.Transportadora_Codigo;
       END
   if (OLD.Prioridade<> NEW.Prioridade) then
       BEGIN
       HISTORICO = HISTORICO||' Prior.'||OLD.Prioridade||'->'||NEW.Prioridade;
       END
   if (OLD.Frete<> NEW.Frete) then
       BEGIN
       HISTORICO = HISTORICO||' Frete.'||OLD.Frete||'->'||NEW.Frete;
       END
   if (OLD.Pagamento_Forma<> NEW.Pagamento_Forma) then
       BEGIN
       HISTORICO = HISTORICO||' Form.Pg.'||OLD.Pagamento_Forma||'->'||NEW.Pagamento_Forma;
       END
   if (OLD.Pagamento_Condicao<> NEW.Pagamento_Condicao) then
       BEGIN
       HISTORICO = HISTORICO||' Cond.Pg.'||OLD.Pagamento_Condicao||'->'||NEW.Pagamento_Condicao;
       END

   if (OLD.Valor_Frete <> NEW.Valor_Frete) then
       BEGIN
       HISTORICO = HISTORICO||' Vr.Frt.'||OLD.Valor_Frete||'->'||NEW.Valor_Frete;
       END
   if (OLD.Peso <> NEW.Peso) then
       BEGIN
       HISTORICO = HISTORICO||' Peso:'||OLD.Peso||'->'||NEW.Peso;
       END
   if (OLD.Tipo_Pedido <> NEW.Tipo_Pedido) then
       BEGIN
       HISTORICO = HISTORICO||' Tp.Ped.'||OLD.Tipo_Pedido||'->'||NEW.Tipo_Pedido;
       END
   if (OLD.Classificacao <> NEW.Classificacao) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.'||OLD.Classificacao||'->'||NEW.Classificacao;
       END
   if (OLD.Classificacao_Financeira <> NEW.Classificacao_Financeira) then
       BEGIN
       HISTORICO = HISTORICO||' Class.Fin.'||OLD.Classificacao_Financeira||'->'||NEW.Classificacao_Financeira;
       END
   if (OLD.CCusto <> NEW.CCusto) then
       BEGIN
       HISTORICO = HISTORICO||' C.Custo:'||OLD.CCusto||'->'||NEW.CCusto;
       END
   if (OLD.Tabela_Uf <> NEW.Tabela_Uf) then
       BEGIN
       HISTORICO = HISTORICO||' Tab.Uf:'||OLD.Tabela_Uf||'->'||NEW.Tabela_Uf;
       END
   if (OLD.Codigo_Rastreio <> NEW.Codigo_Rastreio) then
       BEGIN
       HISTORICO = HISTORICO||' Cód.Rastreio:'||OLD.Codigo_Rastreio||'->'||NEW.Codigo_Rastreio;
       END
   if (OLD.Embalagem <> NEW.Embalagem) then
       BEGIN
       HISTORICO = HISTORICO||' Emb.'||OLD.Embalagem||'->'||NEW.Embalagem;
       END
   if (OLD.Tabela_Preco_Id <> NEW.Tabela_Preco_Id) then
       BEGIN
       HISTORICO = HISTORICO||' Tab.Preço:'||OLD.Tabela_Preco_Id||'->'||NEW.Tabela_Preco_Id;
       END
   if (OLD.Desconto1 <> NEW.Desconto1) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.1:'||OLD.Desconto1||'->'||NEW.Desconto1;
       END
   if (OLD.Desconto2 <> NEW.Desconto2) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.2:'||OLD.Desconto2||'->'||NEW.Desconto2;
       END


   if (OLD.Observacao<> NEW.Observacao) then
       BEGIN
       HISTORICO = HISTORICO||' Observ.'||OLD.Observacao||'->'||NEW.Observacao;
       END

   if (OLD.Volumes<> NEW.Volumes) then
       BEGIN
       HISTORICO = HISTORICO||' Vol.'||OLD.Volumes||'->'||NEW.Volumes;
       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 (OLD.SITUACAO <> NEW.SITUACAO) then
       BEGIN
       if (NEW.SITUACAO = '0') then
           HISTORICO = HISTORICO||' Pedido Desconfirmado';
           new.status_ecommerce = 2;
       if (NEW.SITUACAO = '1') then
           HISTORICO = HISTORICO||' Pedido Confirmado';
           new.status_ecommerce = 3;
       END

   if (OLD.FORMA_ANALISE <> NEW.FORMA_ANALISE) then
       BEGIN
       HISTORICO = HISTORICO||' F.Analise:'||OLD.FORMA_ANALISE ||'->'||NEW.FORMA_ANALISE;
       END
    
   if (OLD.CHAVE_LIBERACAO <> NEW.CHAVE_LIBERACAO) then
       BEGIN
       HISTORICO = HISTORICO||' Chave:'||OLD.CHAVE_LIBERACAO||'->'||NEW.CHAVE_LIBERACAO;
       END
 
   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO', OLD.PEDIDO,
      (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 ttbpedido_b0ui_02dlf for tbpedido
active before insert or update position 0
AS
Begin
  if (NEW.CLASSIFICACAO = 'A') Then
      NEW.TIPO_PEDIDO = 2;

  if (NEW.DATA_CLIENTE IS NULL) Then
      NEW.DATA_CLIENTE = NEW.DATA_ENTREGA;

  if (NEW.DATA_CLIENTE < NEW.DATA_ENTREGA and NEW.CLASSIFICACAO <> ' ') Then
      NEW.DATA_CLIENTE = NEW.DATA_ENTREGA;

  if (INSERTING) then
      Begin
      if (NEW.DATA_CLIENTE < NEW.DATA_ENTREGA) Then Exception "..." 'DATA DO CLIENTE NAO PODE SER MENOR QUE PREVISAO DE FATURAMENTO! DT.CLIENTE:'||NEW.DATA_CLIENTE||' DT.PREV.FAT:'||NEW.DATA_ENTREGA||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      End

  if (UPDATING) then
      Begin
      if (NEW.DATA_CLIENTE <> OLD.DATA_CLIENTE or NEW.DATA_ENTREGA <> OLD.DATA_ENTREGA) Then
          Begin
          if (NEW.DATA_CLIENTE < NEW.DATA_ENTREGA) Then Exception "..." 'DATA DO CLIENTE NAO PODE SER MENOR QUE PREVISAO DE FATURAMENTO! DT.CLIENTE:'||NEW.DATA_CLIENTE||' DT.PREV.FAT:'||NEW.DATA_ENTREGA||'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          End
      End

end;




