unit CBR_643;

interface
   function CBR_643_Retorno_HEADER(linha : string; var Tipo_Operacao, Tipo_Servico,Agencia,Agencia_DV,
                                    Conta,Nome_Cedente, DataGravacao ,Conta_DV,Convenio,Sequencial_Retorno : string ) : boolean;

   procedure CBR_643_Retorno_Detalhe(linha : string ; Var Nosso_Numero , Natureza_recebimento , Prefixo_Titulo , Taxa_desconto ,
                                     Taxa_IOF , Carteira, Comando , Data_liquidacao , Seu_Numero , Data_vencimento ,
                                     Valor_titulo , Codigo_banco_recebedor , agencia_recebedora , agencia_recebedora_DV ,
                                     Especie_titulo , Data_credito , Valor_tarifa , Outras_despesas , Juros_desconto ,
                                     IOF_desconto , Valor_batimento , Desconto_Concedido , Valor_Recebido , Juros_Mora ,
                                     Outros_recebimentos , Abatimento_NAO_aproveitado_sacado , Valor_lancamento , Indicativo_deb_cred,
                                     Indicador_valor , Valor_ajuste , Canal_pagamento, Tipo_Retorno,Cod_Evento,Descricao_Evento: string );

  function Processa_Retorno_CBR643( Linha : string;
                                      var Tipo_Lido,codigo_cedente, Convenio, Sequencial_Retorno,DataGravacao,
                                      Nosso_Numero, Motivo_baixa, Agencia_Recebedora, Seu_Numero,
                                      Data_Entrada, Data_Vencimento,  Data_credito, Data_liquidacao,
                                      Valor_Titulo, Valor_Tarifa, Outras_despesas, Desconto, Valor_Recebido,
                                         Juros_Mora, Outros_Recebimentos, Valor_Lancamento, Canal_pagamento, Tipo_Retorno,Cod_Evento,Descricao_Evento,Codigo_banco_recebedor: string) : Boolean;
   //==================== Funcoes auxiliares =============
   function FormatoDataValida(data : string) : string;
   function FormatarMoeda(Numero:string) : string;
   procedure PesquisaNaturezaComando(Natureza,Comando:String; var Acao,Evento,Descricao:String);

implementation

uses Rotinas, SysUtils,DataModulo, Dialogs;

function FormatoDataValida(data : string) : string;
begin
    //==================== Do formado DDMMYY para dd/mm/yyyy  =============
   Result := Copy(data,1,2) + '/'+Copy(data,3,2) + '/'+ Copy(data,5,2);
   if Result='00/00/00' then
     Result:=''
   else
     Result := FormatDateTime('dd/mm/yyyy', StrToDate(Result));
end;

function FormatarMoeda(Numero:string) : string;
var valor:Real;
begin
   if Numero = '' then
   begin
      Result := '0,00';
   end
   else
   try
      Result := formatfloat('########0.00', StrToFloat(numero)/100)
      except
      Result := '0,00';
   end;
end;



function CBR_643_Retorno_HEADER(linha : string; var Tipo_Operacao, Tipo_Servico,Agencia,Agencia_DV,
                                 Conta,Nome_Cedente, DataGravacao ,Conta_DV,Convenio,Sequencial_retorno : string ) : boolean;
begin
   result := true;

   Tipo_Operacao      := Copy( Linha, 002 , 001);
   Tipo_Servico       := Copy( Linha, 010 , 002);
   Agencia            := Copy( Linha, 027 , 004);
   Agencia_DV         := Copy( Linha, 031 , 001);
   Conta              := Copy( Linha, 032 , 008);
   Conta_DV           := Copy( Linha, 040 , 001);
   Nome_Cedente       := Copy( Linha, 047 , 030);
   DataGravacao       := Copy( Linha, 095 , 006);
   Sequencial_retorno := Copy( Linha, 101 , 007);
   Convenio           := Copy( Linha, 150 , 007);

  //==================== Formata os campos =============

   try
     Nome_Cedente  := Trim (Nome_Cedente);
     DataGravacao  := FormatoDataValida(DataGravacao);
   except
     result := false;
   end;

end;

procedure CBR_643_Retorno_Detalhe(linha : string ; Var Nosso_Numero , Natureza_recebimento , Prefixo_Titulo , Taxa_desconto ,
                                  Taxa_IOF , Carteira, Comando , Data_liquidacao , Seu_Numero , Data_vencimento ,
                                  Valor_titulo , Codigo_banco_recebedor , agencia_recebedora , agencia_recebedora_DV ,
                                  Especie_titulo , Data_credito , Valor_tarifa , Outras_despesas , Juros_desconto ,
                                  IOF_desconto , Valor_batimento , Desconto_Concedido , Valor_Recebido , Juros_Mora ,
                                  Outros_recebimentos , Abatimento_NAO_aproveitado_sacado , Valor_lancamento , Indicativo_deb_cred,
                                  Indicador_valor , Valor_ajuste , Canal_pagamento, Tipo_Retorno,Cod_Evento,Descricao_Evento: string );
begin
  Nosso_Numero                     :=  Copy( Linha, 064 , 017);
  Natureza_recebimento             :=  Copy( Linha, 087 , 002);
  Prefixo_Titulo                   :=  Copy( Linha, 089 , 003);
  Taxa_desconto                    :=  Copy( Linha, 096 , 005);
  Taxa_IOF                         :=  Copy( Linha, 101 , 004);
  Carteira                         :=  Copy( Linha, 107 , 002);
  Comando                          :=  Copy( Linha, 109 , 002);
  Data_liquidacao                  :=  Copy( Linha, 111 , 006);
  Seu_Numero                       :=  Copy( Linha, 117 , 010);
  Data_vencimento                  :=  Copy( Linha, 147 , 006);
  Valor_titulo                     :=  Copy( Linha, 153 , 013);
  Codigo_banco_recebedor           :=  Copy( Linha, 166 , 003);
  agencia_recebedora               :=  Copy( Linha, 169 , 004);
  agencia_recebedora_DV            :=  Copy( Linha, 173 , 001);
  Especie_titulo                   :=  Copy( Linha, 174 , 002);
  Data_credito                     :=  Copy( Linha, 176 , 006);
  Valor_tarifa                     :=  Copy( Linha, 182 , 007);
  Outras_despesas                  :=  Copy( Linha, 189 , 013);
  Juros_desconto                   :=  Copy( Linha, 202 , 013);
  IOF_desconto                     :=  Copy( Linha, 215 , 013);
  Valor_batimento                  :=  Copy( Linha, 228 , 013);
  Desconto_Concedido               :=  Copy( Linha, 241 , 013);
  Valor_Recebido                   :=  Copy( Linha, 254 , 013);
  Juros_Mora                       :=  Copy( Linha, 267 , 013);
  Outros_recebimentos              :=  Copy( Linha, 280 , 013);
  Abatimento_NAO_aproveitado_sacado:=  Copy( Linha, 293 , 013);
  Valor_lancamento                 :=  Copy( Linha, 306 , 013);
  Indicativo_deb_cred              :=  Copy( Linha, 319 , 001);
  Indicador_valor                  :=  Copy( Linha, 320 , 001);
  Valor_ajuste                     :=  Copy( Linha, 321 , 010);
  Canal_pagamento                  :=  Copy( Linha, 393 , 002);

  //==================== Formata os campos =============
  Nosso_Numero                     := Trim(Nosso_Numero);
  Natureza_recebimento             := Trim(Natureza_recebimento);
  Prefixo_Titulo                   := Trim(Prefixo_Titulo);
  Data_liquidacao                  := FormatoDataValida(Data_liquidacao);
  Seu_Numero                       := Trim(Seu_Numero);
  Data_vencimento                  := FormatoDataValida(Data_vencimento);
  Valor_titulo                     := FormatarMoeda(Valor_titulo);
  Data_credito                     := FormatoDataValida(Data_credito);
  Valor_tarifa                     := FormatarMoeda(Valor_tarifa);
  Outras_despesas                  := FormatarMoeda(Outras_despesas);
  Juros_desconto                   := FormatarMoeda(Juros_desconto);
  IOF_desconto                     := FormatarMoeda(IOF_desconto);
  Valor_batimento                  := FormatarMoeda(Valor_batimento);
  Desconto_Concedido               := FormatarMoeda(Desconto_Concedido);
  Valor_Recebido                   := FormatarMoeda(Valor_Recebido);
  Juros_Mora                       := FormatarMoeda(Juros_Mora);
  Outros_recebimentos              := FormatarMoeda(Outros_recebimentos);
  Abatimento_NAO_aproveitado_sacado:= FormatarMoeda(Abatimento_NAO_aproveitado_sacado);
  Valor_lancamento                 := FormatarMoeda(Valor_lancamento);
  Valor_ajuste                     := FormatarMoeda(Valor_ajuste);

  if Seu_Numero = '' then
    Seu_Numero:=Copy(Nosso_Numero,8,10);
  PesquisaNaturezaComando(Natureza_recebimento,Comando,Tipo_Retorno,Cod_Evento,Descricao_Evento)
end;

function Processa_Retorno_CBR643( Linha : string;
                                    var Tipo_lido,codigo_cedente, convenio, Sequencial_Retorno,DataGravacao,
                                    Nosso_Numero, Motivo_baixa, Agencia_Recebedora, Seu_Numero,
                                    Data_Entrada, Data_Vencimento,  Data_credito, Data_liquidacao,
                                    Valor_Titulo, Valor_Tarifa, Outras_despesas, Desconto, Valor_Recebido,
                                    Juros_Mora, Outros_Recebimentos, Valor_Lancamento, Canal_pagamento,Tipo_Retorno,Cod_Evento,Descricao_Evento,Codigo_banco_recebedor: string) : Boolean;

var TipoArquivo,Tipo_Operacao, Tipo_Servico,Agencia,Agencia_DV,Conta,Nome_Cedente, Conta_DV,
    Natureza_recebimento , Prefixo_Titulo , Taxa_desconto , Taxa_IOF , Carteira,
    Comando , agencia_recebedora_DV ,
    Especie_titulo , juros_desconto , IOF_desconto , Valor_batimento , Desconto_Concedido ,
    Abatimento_NAO_aproveitado_sacado , Indicativo_deb_cred, Indicador_valor , Valor_ajuste :string;

begin
    //====================  =============

   result := true;
   TipoArquivo := Copy(linha, 1,1);

    //==================== processa o Header do Arquivo =============
   if TipoArquivo = '0' then
   begin
      Tipo_lido:='H';
      if CBR_643_Retorno_HEADER(linha,Tipo_Operacao, Tipo_Servico,Agencia,Agencia_DV,Conta,Nome_Cedente,
                                DataGravacao ,Conta_DV,Convenio,Sequencial_Retorno) = false then
      begin
         result := false;
         exit;
      end;
   end;

    //==================== Processa os detalhes do Arquivo =============
   if TipoArquivo = '7' then
   begin
      Tipo_Lido:='D';
      CBR_643_Retorno_Detalhe(linha , Nosso_Numero , Natureza_recebimento , Prefixo_Titulo , Taxa_desconto ,
                                     Taxa_IOF , Carteira, Comando , Data_liquidacao , Seu_Numero , Data_vencimento ,
                                     Valor_titulo , Codigo_banco_recebedor , agencia_recebedora , agencia_recebedora_DV ,
                                     Especie_titulo , Data_credito , Valor_tarifa , Outras_despesas , Juros_desconto ,
                                     IOF_desconto , Valor_batimento , Desconto_Concedido , Valor_Recebido , Juros_Mora ,
                                     Outros_recebimentos , Abatimento_NAO_aproveitado_sacado , Valor_lancamento , Indicativo_deb_cred,
                                     Indicador_valor , Valor_ajuste , Canal_pagamento, Tipo_Retorno,Cod_Evento,Descricao_Evento);
    end;

   if TipoArquivo = '9' then
     Tipo_Lido:='T';
end;


procedure PesquisaNaturezaComando(Natureza,Comando:String; var Acao,Evento,Descricao:String);
begin
      Dados.qryPesquisa.Close;
      Dados.qryPesquisa.SQL.Clear;
      Dados.qryPesquisa.SQL.Add('select * ');
      Dados.qryPesquisa.SQL.Add('  from movimentacao_brasil ');
      Dados.qryPesquisa.SQL.Add('  where natureza_operacao=:NATUREZA AND COMANDO like:COMANDO');
      Dados.qryPesquisa.ParamByName('natureza').AsString   :=  natureza;
      Dados.qryPesquisa.ParamByName('comando').AsString    := '%'+comando+'%';
      Dados.qryPesquisa.Open;
      if Dados.qryPesquisa.RecordCount > 0 then
      begin
        Descricao :=Dados.qryPesquisa.FIeldBYName('DESCRICAO').AsString;
        Acao      :=Dados.qryPesquisa.FIeldBYName('ACAO').AsString;
        Evento    :=Dados.qryPesquisa.FIeldBYName('COD_TIPO_EVENTO').AsString;
      end
      else
      begin
        Descricao :='Faltando Cadastro de Natureza:'+Natureza+' e Comando:'+comando;
        Acao      :='';
        Evento    :='';
      end;
      Dados.qryPesquisa.Close;
end;
end.

