unit CBR_641;
{==================================
   Alterado em 08-2010

  Passe os valores de Data e Monetario no formato Padrao
  Date e float
  o tratamento do formato sera feito dentro de cada procedure

  EX: DATA = 01/01/2010
      Monetario = 12,33 ou 125.66

===================================}


interface
   function CBR_641_Header (Extenso_Tipo_Operacao_Remessa_Teste, Prefixo_Agencia, Agencia_DV, Conta_Corrente,
                            Conta_Corrente_DV, Nome_empresa, Data_Gravacao, Sequencial_Remessa,
                            Numero_Convenio_Lider : string
                            ) : string;

   function CBR_641_Detalhe(  Tipo_Inscricao_empresa  , CPF_CNPJ_empresa , Agencia, Agencia_DV, Conta_Corrente
                             , Conta_Corrente_DV, Convenio_Cobranca, Num_Controle_Participante, Nosso_Numero
                             , Indicativo_Mens_Sacado_Avalista, Variacao_Carteira, Tipo_Cobranca, Carteira_Cobranca
                             , Comando, Seu_Numero, Data_Vencimento, Valor_Titulo, Numero_Banco, Agencia_Cobradora
                             , Agencia_Cobradora_DV, Especie_Titulo, Aceite, Data_Emissao, Primeira_Instrucao, Segunda_Instrucao
                             , Juros_Mora, Data_Limite_Concessao_Desc, Valor_Desconto, Valor_IOF, Valor_Abatimento, Tipo_Inscricao_Sacado
                             , CNPJ_CPF_Sacado, Nome_Sacado, Endereco_Sacado, CEP_Sacado, Cidade_Sacado, UF_Sacado, Observacoes_Mensagem
                             , Dias_Para_Protesto, Bairro_Sacado, Sequencial_Registro: string
                             ):string;

   function CBR_641_Trailler(Sequencial : String) : string;

   procedure CBR_641_Retorno_HEADER(linha : string; var Tipo_Operacao, Tipo_Servico,Agencia,Agencia_DV,
                                    Conta,Nome_Cedente, DataGravacao ,Conta_DV,Convenio : string );

   procedure CBR_641_Retorno_Detalhe(linha : string ; Var Nosso_Numero , Natureza_recebimento , Prefixo_Titulo , Taxa_desconto ,
                                     Taxa_IOF , Carteira, Comando , Data_liquidacao , Numero_titulo , 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: string );

  procedure Processa_Retorno_CBR641( Linha : string;
                                      var codigo_cedente, Sequencial_Retorno,DataGravacao,
                                      Nosso_Numero, Motivo_baixa, Agencia_Recebedora, Seu_Numero,
                                      Data_Entrada, Data_Vencimento,  Data_credito,
                                      Valor_Titulo, Valor_Tarifa, Outras_despesas, Desconto, Valor_Recebido,
                                         Juros_Mora, Outros_Recebimentos, Valor_Lancamento : string);
   //==================== Funcoes auxiliares =============
   function FormatoDataValida(data : string) : string;
   function FormatarMoeda(Numero:string) : string;

implementation

uses Rotinas, SysUtils;

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;
begin
   if Numero = '' then
   begin
      Result := '0,00';
   end
   else
   try
      Result := formatfloat('###,###,##0.00', StrToFloat(numero))
      except
      Result := '0,00';
   end;
end;


function CBR_641_Header (Extenso_Tipo_Operacao_Remessa_Teste, Prefixo_Agencia, Agencia_DV, Conta_Corrente,
                         Conta_Corrente_DV, Nome_empresa, Data_Gravacao, Sequencial_Remessa,
                         Numero_Convenio_Lider : string
                         ) : string;
var Complemento_Registro_1,
    Complemento_Registro_2,
    Complemento_Registro_3,
    Complemento_Registro_4,
    BANCODOBRASIL,
    Identificacao_Registro,
    Extenso_Tipo_Servico,
    Sequencial_Registro : string;
    Tipo_Operacao,Tipo_Servico:String;
begin

   //==================== Campos Fixos =============
   Identificacao_Registro := '0';
   Tipo_Operacao          := '1';
   Complemento_Registro_1 := '';
   Complemento_Registro_2 := '';
   Complemento_Registro_3 := '';
   Complemento_Registro_4 := '';
   BANCODOBRASIL          := '001BANCODOBRASIL';
   Tipo_Servico           := '01';
   Extenso_Tipo_Servico   := 'COBRANCA';
   Sequencial_Registro    := '000001';

   //==================== Formata os campos de datas e valore monetarios =============
   Data_Gravacao := FormatDateTime('ddmmyy', StrToDate(Data_Gravacao));

   Identificacao_Registro := FormatarTexto( Identificacao_Registro,   1   , False, '0');
   Tipo_Operacao          := FormatarTexto( Tipo_Operacao         ,   1   , False, '0');

   Extenso_Tipo_Operacao_Remessa_Teste:= FormatarTexto( Extenso_Tipo_Operacao_Remessa_Teste ,   7   , True , ' ');

   Tipo_Servico           := FormatarTexto( Tipo_Servico           , 2  , False, '0');
   Extenso_Tipo_Servico   := FormatarTexto( Extenso_Tipo_Servico   , 8  , True , ' ');
   Complemento_Registro_1 := FormatarTexto( Complemento_Registro_1 , 7  , True , ' ');
   Prefixo_Agencia        := FormatarTexto( Prefixo_Agencia        , 4  , False, '0');
   Agencia_DV             := FormatarTexto( Agencia_DV             , 1  , True , ' ');
   Conta_Corrente         := FormatarTexto( Conta_Corrente         , 8  , False, '0');
   Conta_Corrente_DV      := FormatarTexto( Conta_Corrente_DV      , 1  , True , ' ');
   Complemento_Registro_2 := FormatarTexto( Complemento_Registro_2 , 6  , False, '0');
   Nome_empresa           := FormatarTexto( Nome_empresa           , 30 , True , ' ');
   BANCODOBRASIL          := FormatarTexto( BANCODOBRASIL          , 18 , True , ' ');
   Data_Gravacao          := FormatarTexto( Data_Gravacao          , 6  , False, '0');
   Sequencial_Remessa     := FormatarTexto( Sequencial_Remessa     , 7  , False, '0');
   Complemento_Registro_3 := FormatarTexto( Complemento_Registro_3 , 22 , True , ' ');
   Numero_Convenio_Lider  := FormatarTexto( Numero_Convenio_Lider  , 7  , False, '0');
   Complemento_Registro_4 := FormatarTexto( Complemento_Registro_4 , 258, True , ' ');
   Sequencial_Registro    := FormatarTexto( Sequencial_Registro    , 6  , False, '0');

   Result :=  Identificacao_Registro + Tipo_Operacao + Extenso_Tipo_Operacao_Remessa_Teste + Tipo_Servico
              + Extenso_Tipo_Servico + Complemento_Registro_1 + Prefixo_Agencia + Agencia_DV
              + Conta_Corrente + Conta_Corrente_DV + Complemento_Registro_2 + Nome_empresa
              + BANCODOBRASIL + Data_Gravacao + Sequencial_Remessa + Complemento_Registro_3
              + Numero_Convenio_Lider + Complemento_Registro_4 + Sequencial_Registro ;
end;

function CBR_641_Detalhe(  Tipo_Inscricao_empresa  , CPF_CNPJ_empresa , Agencia, Agencia_DV, Conta_Corrente
                          , Conta_Corrente_DV, Convenio_Cobranca, Num_Controle_Participante, Nosso_Numero
                          , Indicativo_Mens_Sacado_Avalista, Variacao_Carteira, Tipo_Cobranca, Carteira_Cobranca
                          , Comando, Seu_Numero, Data_Vencimento, Valor_Titulo, Numero_Banco, Agencia_Cobradora
                          , Agencia_Cobradora_DV, Especie_Titulo, Aceite, Data_Emissao, Primeira_Instrucao, Segunda_Instrucao
                          , Juros_Mora, Data_Limite_Concessao_Desc, Valor_Desconto, Valor_IOF, Valor_Abatimento, Tipo_Inscricao_Sacado
                          , CNPJ_CPF_Sacado, Nome_Sacado, Endereco_Sacado, CEP_Sacado, Cidade_Sacado, UF_Sacado, Observacoes_Mensagem
                          , Dias_Para_Protesto, Bairro_Sacado, Sequencial_Registro: string
                          ):string;
var
    Identificacao_Registro,
    Complemento_Registro_1,
    Complemento_Registro_2,
    Complemento_Registro_3,
    Complemento_Registro_4,
    Numero_Prestacao,
    Grupo_Valor     ,
    Prefixo_Titulo  ,
    Conta_Caucao    ,
    Numero_Bordero  : string;

begin
   //==================== Campos com valores fixos =============
   Identificacao_Registro := '7';
   Complemento_Registro_1 := '';
   Complemento_Registro_2 := '';
   Complemento_Registro_3 := Bairro_Sacado;{ CONFORME EMAIL RECEBIDO DO CSO.BH EM 02/09/2010
                                            Posição 315 a 326: o Banco considera esse campo para a indicação do bairro.
                                            É recomendável a  sua inclusão,  no arquivo remessa, a fim de evitar, por exemplo, que cartórios
                                            se recusem a executar as instruções de protesto por motivo de endereço incompleto.}
   Complemento_Registro_4 := '';
   Numero_Prestacao       := '00';
   Grupo_Valor            := '00';
   Prefixo_Titulo         := '';
   Conta_Caucao           := '0';
   Numero_Bordero         := '000000';

   //==================== Formata os campos de datas e valore monetarios =============
   Data_Vencimento           := FormatDateTime('ddmmyy', StrToDate(Data_Vencimento));
   if Data_Limite_Concessao_Desc <> '' then
     Data_Limite_Concessao_Desc:= FormatDateTime('ddmmyy', StrToDate(Data_Limite_Concessao_Desc));
   Data_Emissao              := FormatDateTime('ddmmyy', StrToDate(Data_Emissao));

   Valor_Titulo := TiraCaracter(Valor_Titulo,'.');
   Valor_Titulo := TiraCaracter(Valor_Titulo,',');

   Juros_Mora := TiraCaracter(Juros_Mora,'.');
   Juros_Mora := TiraCaracter(Juros_Mora,',');

   Valor_Desconto := TiraCaracter(Valor_Desconto,'.');
   Valor_Desconto := TiraCaracter(Valor_Desconto,',');

   Valor_IOF := TiraCaracter(Valor_IOF,'.');
   Valor_IOF := TiraCaracter(Valor_IOF,',');

   Valor_Abatimento := TiraCaracter(Valor_Abatimento,'.');
   Valor_Abatimento := TiraCaracter(Valor_Abatimento,',');

   //==================== Formata outros campos =============
   CPF_CNPJ_empresa := LimpaTexto(CPF_CNPJ_empresa);
   CNPJ_CPF_Sacado  := LimpaTexto(CNPJ_CPF_Sacado);
   CEP_Sacado       := LimpaTexto(CEP_Sacado);

   Identificacao_Registro         := FormatarTexto( Identificacao_Registro         , 1 ,  False , '0');
   Tipo_Inscricao_empresa         := FormatarTexto( Tipo_Inscricao_empresa         , 2 ,  False , '0');
   CPF_CNPJ_empresa               := FormatarTexto( CPF_CNPJ_empresa               , 14,  False , '0');
   Agencia                        := FormatarTexto( Agencia                        , 4 ,  False , '0');
   Agencia_DV                     := FormatarTexto( Agencia_DV                     , 1 ,  True  , ' ');
   Conta_Corrente                 := FormatarTexto( Conta_Corrente                 , 8 ,  False , '0');
   Conta_Corrente_DV              := FormatarTexto( Conta_Corrente_DV              , 1 ,  True  , ' ');
   Convenio_Cobranca              := FormatarTexto( Convenio_Cobranca              , 7 ,  False , '0');
   Num_Controle_Participante      := FormatarTexto( Num_Controle_Participante      , 25,  True  , ' ');
   Nosso_Numero                   := FormatarTexto( Nosso_Numero                   , 17,  False , '0');
   Numero_Prestacao               := FormatarTexto( Numero_Prestacao               , 2 ,  False , '0');
   Grupo_Valor                    := FormatarTexto( Grupo_Valor                    , 2 ,  False , '0');
   Complemento_Registro_1         := FormatarTexto( Complemento_Registro_1         , 3 ,  True  , ' ');
   Indicativo_Mens_Sacado_Avalista:= FormatarTexto( Indicativo_Mens_Sacado_Avalista, 1 ,  True  , ' ');
   Prefixo_Titulo                 := FormatarTexto( Prefixo_Titulo                 , 3 ,  True  , ' ');
   Variacao_Carteira              := FormatarTexto( Variacao_Carteira              , 3 ,  False , '0');
   Conta_Caucao                   := FormatarTexto( Conta_Caucao                   , 1 ,  False , '0');
   Numero_Bordero                 := FormatarTexto( Numero_Bordero                 , 6 ,  False , '0');
   Tipo_Cobranca                  := FormatarTexto( Tipo_Cobranca                  , 5 ,  True  , ' ');
   Carteira_Cobranca              := FormatarTexto( Carteira_Cobranca              , 2 ,  False , '0');
   Comando                        := FormatarTexto( Comando                        , 2 ,  False , '0');
   Seu_Numero                     := FormatarTexto( Seu_Numero                     , 10,  True  , ' ');
   Data_Vencimento                := FormatarTexto( Data_Vencimento                , 06,  False , '0');
   Valor_Titulo                   := FormatarTexto( Valor_Titulo                   , 13,  False , '0');
   Numero_Banco                   := FormatarTexto( Numero_Banco                   , 3 ,  False , '0');
   Agencia_Cobradora              := FormatarTexto( Agencia_Cobradora              , 4 ,  False , '0');
   Agencia_Cobradora_DV           := FormatarTexto( Agencia_Cobradora_DV           , 1 ,  True  , ' ');
   Especie_Titulo                 := FormatarTexto( Especie_Titulo                 , 2 ,  False , '0');
   Aceite                         := FormatarTexto( Aceite                         , 1 ,  True  , ' ');
   Data_Emissao                   := FormatarTexto( Data_Emissao                   , 6 ,  False , '0');
   Primeira_Instrucao             := FormatarTexto( Primeira_Instrucao             , 2 ,  False , '0');
   Segunda_Instrucao              := FormatarTexto( Segunda_Instrucao              , 2 ,  False , '0');
   Juros_Mora                     := FormatarTexto( Juros_Mora                     , 13,  False , '0');
   Data_Limite_Concessao_Desc     := FormatarTexto( Data_Limite_Concessao_Desc     , 6 ,  False , '0');
   Valor_Desconto                 := FormatarTexto( Valor_Desconto                 , 13,  False , '0');
   Valor_IOF                      := FormatarTexto( Valor_IOF                      , 13,  False , '0');
   Valor_Abatimento               := FormatarTexto( Valor_Abatimento               , 13,  False , '0');
   Tipo_Inscricao_Sacado          := FormatarTexto( Tipo_Inscricao_Sacado          , 2 ,  False , '0');
   CNPJ_CPF_Sacado                := FormatarTexto( CNPJ_CPF_Sacado                , 14,  False , '0');
   Nome_Sacado                    := FormatarTexto( Nome_Sacado                    , 37,  True  , ' ');
   Complemento_Registro_2         := FormatarTexto( Complemento_Registro_2         , 3 ,  True  , ' ');
   Endereco_Sacado                := FormatarTexto( Endereco_Sacado                , 37,  True  , ' ');
   Complemento_Registro_3         := FormatarTexto( Complemento_Registro_3         , 15,  True  , ' ');
   CEP_Sacado                     := FormatarTexto( CEP_Sacado                     , 8 ,  False , '0');
   Cidade_Sacado                  := FormatarTexto( Cidade_Sacado                  , 15,  True  , ' ');
   UF_Sacado                      := FormatarTexto( UF_Sacado                      , 2 ,  True  , ' ');
   Observacoes_Mensagem           := FormatarTexto( Observacoes_Mensagem           , 40,  True  , ' ');
   Dias_Para_Protesto             := FormatarTexto( Dias_Para_Protesto             , 2 ,  True  , ' ');
   Complemento_Registro_4         := FormatarTexto( Complemento_Registro_4         , 1 ,  True  , ' ');
   Sequencial_Registro            := FormatarTexto( Sequencial_Registro            , 6 ,  False , '0');

   Result := Identificacao_Registro + Tipo_Inscricao_empresa + CPF_CNPJ_empresa + Agencia + Agencia_DV
             + Conta_Corrente + Conta_Corrente_DV + Convenio_Cobranca + Num_Controle_Participante + Nosso_Numero
             + Numero_Prestacao + Grupo_Valor + Complemento_Registro_1 + Indicativo_Mens_Sacado_Avalista + Prefixo_Titulo
             + Variacao_Carteira + Conta_Caucao + Numero_Bordero + Tipo_Cobranca + Carteira_Cobranca + Comando + Seu_Numero
             + Data_Vencimento + Valor_Titulo + Numero_Banco + Agencia_Cobradora + Agencia_Cobradora_DV + Especie_Titulo
             + Aceite + Data_Emissao + Primeira_Instrucao + Segunda_Instrucao + Juros_Mora + Data_Limite_Concessao_Desc + Valor_Desconto
             + Valor_IOF + Valor_Abatimento + Tipo_Inscricao_Sacado + CNPJ_CPF_Sacado + Nome_Sacado + Complemento_Registro_2
             + Endereco_Sacado + Complemento_Registro_3 + CEP_Sacado + Cidade_Sacado + UF_Sacado + Observacoes_Mensagem + Dias_Para_Protesto
             + Complemento_Registro_4 + Sequencial_Registro
end;

function CBR_641_Trailler(Sequencial : String) : string;
var Identificacao_Registro
  , Complemento_Registro : string;
begin
   Identificacao_Registro:='9';
   Identificacao_Registro := FormatarTexto(Identificacao_Registro , 1  , False , '0');
   Complemento_Registro   := FormatarTexto(Complemento_Registro   , 393, True  , ' ');
   Sequencial             := FormatarTexto(Sequencial             , 6  , False , '0');

   Result := Identificacao_Registro + Complemento_Registro + Sequencial;
end;


procedure CBR_641_Retorno_HEADER(linha : string; var Tipo_Operacao, Tipo_Servico,Agencia,Agencia_DV,
                                 Conta,Nome_Cedente, DataGravacao ,Conta_DV,Convenio : string );
begin
   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);
   Convenio      := Copy( Linha, 150 , 007);

  //==================== Formata os campos =============
   Nome_Cedente  := Trim (Nome_Cedente);
   DataGravacao  := FormatoDataValida(DataGravacao);
end;

procedure CBR_641_Retorno_Detalhe(linha : string ; Var Nosso_Numero , Natureza_recebimento , Prefixo_Titulo , Taxa_desconto ,
                                  Taxa_IOF , Carteira, Comando , Data_liquidacao , Numero_titulo , 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: 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);
  Numero_titulo                    :=  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);
  Numero_titulo                    := Trim(Numero_titulo);
  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);

end;

procedure Processa_Retorno_CBR641( Linha : string;
                                    var codigo_cedente, Sequencial_Retorno,DataGravacao,
                                    Nosso_Numero, Motivo_baixa, Agencia_Recebedora, Seu_Numero,
                                    Data_Entrada, Data_Vencimento,  Data_credito,
                                    Valor_Titulo, Valor_Tarifa, Outras_despesas, Desconto, Valor_Recebido,
                                       Juros_Mora, Outros_Recebimentos, Valor_Lancamento : string);

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

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

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

    //==================== processa o Header do Arquivo =============
   if TipoArquivo = '0' then
      CBR_641_Retorno_HEADER(linha,Tipo_Operacao, Tipo_Servico,Agencia,Agencia_DV,Conta,Nome_Cedente, DataGravacao ,Conta_DV,Convenio);

    //==================== Processa os detalhes do Arquivo =============
   if TipoArquivo = '7' then
      CBR_641_Retorno_Detalhe(linha , Nosso_Numero , Natureza_recebimento , Prefixo_Titulo , Taxa_desconto ,
                                     Taxa_IOF , Carteira, Comando , Data_liquidacao , Numero_titulo , 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);

end;

end.

