Unit da Nossa Caixa estadual homologado - GBBOLETO

Delphi

14/05/2008

[quote:725b188942=´Moderação´][color=red:725b188942]Título editado por Massuda

Por favor, não use apenas letras maiúsculas no título/texto.

No caso de reincidência, seus tópicos poderão vir a ser bloqueados.

Leia as :arrow: [url=http://forum.clubedelphi.net/viewtopic.php?t=6689]Regras de Conduta[/url] do fórum.[/color:725b188942][/quote:725b188942]
Por favor alguem usa o GBBOLETO E possui a UNIT da NOSSA CAIXA homologado, por favor é urgente.... cso alguem tenha, me envie por e-mail, eu agradeço muito!!!

frostlost@yahoo.com.br


Frostlost

Frostlost

Curtidas 0

Respostas

Talisjonatas

Talisjonatas

14/05/2008

Aqui esta a Unit que utilizo (Banco 151), eu fiz as alterações necessárias para funcionar.



unit gbCob151;

interface

uses
   classes, SysUtils, {DateUtils,} gbCobranca
   {$IFDEF VER150}
      , Variants, MaskUtils, DateUtils, contnrs
   {$ELSE}
      {$IFDEF VER140}
         , Variants, MaskUtils, DateUtils, contnrs
      {$ELSE}
         {$IFDEF VER130}
            , Mask, contnrs
         {$ELSE}
            , Mask
         {$ENDIF}
      {$ENDIF}
   {$ENDIF}
   ;

const
   CodigoBanco = ´151´;
   NomeBanco = ´Nossa Caixa´;

type

   TgbBanco151 = class(TPersistent)
   private

   published
      function  GetNomeBanco   : string; {Retorna o nome do banco}
      function  GetCampoLivreCodigoBarra(ATitulo: TgbTitulo) : string; {Retorna o conteúdo da parte variável do código de barras}
      function  CalcularDigitoNossoNumero(ATitulo: TgbTitulo) : string; {Calcula o dígito do NossoNumero, conforme critérios definidos por cada banco}
      procedure FormatarBoleto(ATitulo: TgbTitulo; var AAgenciaCodigoCedente, ANossoNumero, ACarteira, AEspecieDocumento: string); {Define o formato como alguns valores serão apresentados no boleto }
      function  Digito1ASBACE(Valor: String): string; {Calcula o 1 digito da CHAVE ASBACE}
      function  Digito2ASBACE(var Valor: String): string; {Calcula o 2 digito da CHAVE ASBACE}

      function  GerarRemessaCNAB240(var ACobranca: TgbCobranca; var Remessa: TStringList) : boolean;
      function  GerarRemessaCNAB400(var ACobranca: TgbCobranca; var Remessa: TStringList) : boolean;
      function  LerRetornoCNAB240(var ACobranca: TgbCobranca; Retorno: TStringList) : boolean;
      function  LerRetornoCNAB400(var ACobranca: TgbCobranca; Retorno: TStringList) : boolean;
{$IFNDEF VER120}
      function  LerRetorno(var ACobranca: TgbCobranca; Retorno: TStringList) : boolean; {Lê o arquivo retorno recebido do banco}
      function  GerarRemessa(var ACobranca: TgbCobranca; var Remessa: TStringList) : boolean; {Gerar arquivo remessa para enviar ao banco}
{$ENDIF}
   end;


implementation


function TgbBanco151.GetNomeBanco : string;
begin
   Result := NomeBanco;
end;

function TgbBanco151.CalcularDigitoNossoNumero(ATitulo: TgbTitulo) : string;
var
   ACodigoAgencia,
   ANumeroConta,
   ADigitoConta,
   ANossoNumero,
   AComposicao,
   APesos: string;
   ASoma,
   AResto,
   AContador: integer;
   Qtd_Digitos_Conta: Integer;
begin
   Result := ´0´;

   Qtd_Digitos_Conta:= length(ATitulo.Cedente.ContaBancaria.NumeroConta);

   ACodigoAgencia := Formatar(ATitulo.Cedente.ContaBancaria.CodigoAgencia,4,false,´0´);
   ANumeroConta   := Formatar(copy(ATitulo.Cedente.ContaBancaria.NumeroConta, Qtd_Digitos_Conta-9+1,9),9,false,´0´);
   ADigitoConta   := Formatar(ATitulo.Cedente.ContaBancaria.DigitoConta,1,false,´0´);
   ANossoNumero   := Formatar(ATitulo.NossoNumero,9,false,´0´);
   AComposicao := ACodigoAgencia + ANumeroConta + ADigitoConta + ANossoNumero;
   {
    Multiplicar os algarismos da composição, iniciando da direita para a esquerda
    pelos pesos: 3, 7, 9, 1, com exceção do campo "Dígito da Conta", que deve ser
    multiplicado sempre por 1
   }
   APesos := ´31973197319731319731973´;

   ASoma := 0;
   for AContador := 1 to Length(AComposicao) do
      ASoma := ASoma + ( StrToInt(AComposicao[AContador]) * StrToInt(APesos[AContador]) );

   AResto := (ASoma mod 10);
   if AResto = 0 then
      Result := ´0´
   else
      Result := IntToStr(10 - AResto);
end;

function TgbBanco151.Digito1ASBACE(Valor: String) : string;
var
   Pesos: string;
   Soma,
   Produto,
   Resto,
   Contador: integer;
begin
   Result := ´0´;

   { Multiplicar os pesos 2 e 1 pelos números da composição,
     iniciando da direita para a esquerda.
   }
   Pesos := ´21212121212121212121212´;

   Soma := 0;
   for Contador := 1 to Length(Valor) do begin
   {  Somar os resultados da muttiplicação e da subtração; se o produto da multiplicação
   de qualquer dos números da composição for maior que 9, deve-se subtrair o produto de 9.
   }
      Produto := ( StrToInt(Valor[Contador]) * StrToInt(Pesos[Contador]) );
      If Produto > 9 then Produto := Produto - 9;
      Soma := Soma + Produto;
   end;

   Resto := (Soma mod 10);
   if Resto = 0 then {Quando o resto for "0" (zero), o dígito também será zero.}
      Result := ´0´
   else
      Result := IntToStr(10 - Resto);
end;

function TgbBanco151.Digito2ASBACE(var Valor: String) : string;
var
   Pesos: string;
   Soma,
   Resto,
   Contador: integer;
begin
   Result := ´0´;

   { Multiplicar posicao pela sequencia de 2 a 7
     iniciando da direita para a esquerda.
   }
   Pesos := ´765432765432765432765432´;

   Soma := 0;
   for Contador := 1 to Length(Valor) do
   {  Somar os resultados da muttiplicação. }
      Soma := Soma + ( StrToInt(Valor[Contador]) * StrToInt(Pesos[Contador]) );

   Resto := (Soma mod 11);
   case Resto of
      1 : Begin
         Valor := Copy(Valor,1,23)+IntToStr(StrToInt(Copy(Valor,24,1))+1);
         Result := Digito2ASBACE(Valor);
      end;
      0 : Result := ´0´;
   else
      Result := IntToStr(11 - Resto);
   end;
end;

function TgbBanco151.GetCampoLivreCodigoBarra(ATitulo: TgbTitulo) : string;
var
   CampoLivre,
   ACarteira,
   ANossoNumero,
   ACodigoAgencia,
   AContaCorrente,
   AModalidadeConta,
   ABancoCedente : string;
   Qtd_Digitos_Conta: Integer;
begin

    {
    A primeira parte do código de barras será calculada automaticamente.
    Ela é composta por:
    Código do banco (3 posições)
    Código da moeda = 9 (1 posição)
    Dígito do código de barras (1 posição) - Será calculado e incluído pelo componente
    Fator de vencimento (4 posições) - Obrigatório a partir de 03/07/2000
    Valor do documento (10 posições) - Sem vírgula decimal e com ZEROS à esquerda

    A segunda parte do código de barras é um campo livre, que varia de acordo
    com o banco. Esse campo livre será calculado por esta função (que você deverá
    alterar de acordo com as informações fornecidas pelo banco).
   }

   {Segunda parte do código de barras - Campo livre - Varia de acordo com o banco}

   Qtd_Digitos_Conta:= length(ATitulo.Cedente.ContaBancaria.NumeroConta);

   with ATitulo do
   begin
      ACarteira := ´9´; // Identificação do Sistema
//      ACarteira := Formatar(Carteira,1,false,´0´);
      ANossoNumero := Copy(Formatar(NossoNumero,8,false,´0´),1,8);
      ACodigoAgencia := Formatar(Cedente.ContaBancaria.CodigoAgencia,4,false,´0´);
      AModalidadeConta := Copy(Formatar(IntToStr(STRTOINT(COPY(copy(ATitulo.Cedente.ContaBancaria.NumeroConta, Qtd_Digitos_Conta-9+1,9),1,2))),2,false,´0´),2,1);
      //AModalidadeConta := ´4´;
      AContaCorrente := Formatar(COPY(Cedente.ContaBancaria.NumeroConta,3,99),6,false,´0´);
      ABancoCedente  := Formatar(Cedente.ContaBancaria.Banco.Codigo,3,false,´0´);
   end;

   CampoLivre := ACarteira + ANossoNumero + ACodigoAgencia + AModalidadeConta + AContaCorrente + ABancoCedente;
   CampoLivre := CampoLivre + Digito1ASBACE(CampoLivre);
   Result     := CampoLivre + Digito2ASBACE(CampoLivre);
end;

procedure TgbBanco151.FormatarBoleto(ATitulo: TgbTitulo; var AAgenciaCodigoCedente, ANossoNumero, ACarteira, AEspecieDocumento: string);
begin
   with ATitulo do
   begin
      LocalPagamento := ´Pague preferencialmente na Nossa Caixa´;
      AAgenciaCodigoCedente := Formatar(Cedente.ContaBancaria.CodigoAgencia,4,false,´0´) + ´ ´ +Cedente.CodigoCedente;
      ANossoNumero := NossoNumero+´ ´+DigitoNossoNumero;
      ACarteira := Formatar(Carteira,6);
      case EspecieDocumento of
         edAluguel                      : AEspecieDocumento := ´AL´;
         edApoliceSeguro                : AEspecieDocumento := ´AP´;
         edContribuicaoConfederativa    : AEspecieDocumento := ´CC´;
         edDuplicataMercantil           : AEspecieDocumento := ´DM´;
         edDuplicataRural               : AEspecieDocumento := ´DR´;
         edDuplicataServico             : AEspecieDocumento := ´DS´;
         edFatura                       : AEspecieDocumento := ´FT´;
         edLetraCambio                  : AEspecieDocumento := ´LC´;
         edNotaDebito                   : AEspecieDocumento := ´ND´;
         edNotaPromissoria              : AEspecieDocumento := ´NP´;
         edNotaPromissoriaRural         : AEspecieDocumento := ´NPR´;
         edNotaSeguro                   : AEspecieDocumento := ´NS´;
         edRecibo                       : AEspecieDocumento := ´RC´;
         edTriplicataMercantil          : AEspecieDocumento := ´TM´;
         edTriplicataServico            : AEspecieDocumento := ´TS´
      else
         AEspecieDocumento := ´´;
      end;
   end;
end;


{$IFNDEF VER120}

function TgbBanco151.GerarRemessa(var ACobranca: TgbCobranca; var Remessa: TStringList) : boolean;
begin
   case ACobranca.LayoutArquivo of
      laCNAB240 : Result := GerarRemessaCNAB240(ACobranca, Remessa);
      laCNAB400 : Result := GerarRemessaCNAB400(ACobranca, Remessa);
   end;
end;

function TgbBanco151.GerarRemessaCNAB240(var ACobranca: TgbCobranca; var Remessa: TStringList) : boolean;
var
   ACedenteTipoInscricao, ASacadoTipoInscricao,
   Registro : string;
   NumeroRegistro, NumeroLote : integer;
begin
   Result := FALSE;
   NumeroRegistro := 0;
   NumeroLote := 1;
   Registro := ´´;
   Remessa.Clear;

   if ACobranca.Titulos.Count < 1 then
      Exception.Create(´Não há títulos para gerar remessa´);

   with ACobranca do
   begin

      { GERAR REGISTRO-HEADER DO ARQUIVO }

      case Titulos[NumeroRegistro].Cedente.TipoInscricao of
         tiPessoaFisica  : ACedenteTipoInscricao := ´1´;
         tiPessoaJuridica: ACedenteTipoInscricao := ´2´;
         tiOutro         : ACedenteTipoInscricao := ´3´;
      end;

      if Formatar(CodigoBanco,3,false,´0´) <> Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.Banco.Codigo,3,false,´0´) then
         Raise Exception.CreateFmt(´O título (Nosso Número: ¬s) não pertence ao banco ¬s (¬s)´,[Titulos[NumeroRegistro].NossoNumero,CodigoBanco,NomeBanco]);

      Registro := Formatar(CodigoBanco,3,false,´0´); {Código do banco}
      Registro := Registro + ´0000´; {Lote de serviço}
      Registro := Registro + ´0´; {Tipo de registro - Registro header de arquivo}
      Registro := Registro + Formatar(´´,9); {Uso exclusivo FEBRABAN/CNAB}
      Registro := Registro + ACedenteTipoInscricao; {Tipo de inscrição do cedente}
      Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.NumeroCPFCGC,14,false,´0´); {Número de inscrição do cedente}
      Registro := Registro + Formatar(´´,20); 
      Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.CodigoAgencia,5,false,´0´); {Código da agência do cedente}
      Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.DigitoAgencia,1,false,´0´); {Dígito da agência do cedente}
      Registro := Registro + ´0000´+Formatar(inttostr(3),2,false,´0´); {Modalidade da conta}
      Registro := Registro + Formatar(COPY(Titulos[NumeroRegistro].Cedente.ContaBancaria.NumeroConta,3,99),6,false,´0´); {Número da conta do cedente}
      Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.DigitoConta,1,false,´0´); {Dígito da conta do cedente}
      Registro := Registro + Formatar(´´,1); 
      Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.Nome,30,true,´ ´); {Nome do cedente}
      Registro := Registro + Formatar(´NOSSA CAIXA-NOSSO BANCO´,30,true,´ ´); {Nome do banco}
      Registro := Registro + Formatar(´´,10); {Uso exclusivo FEBRABAN/CNAB}
      Registro := Registro + ´1´; {Código de Remessa (1) / Retorno (2)}
      Registro := Registro + FormatDateTime(´ddmmyyyy´,DataArquivo); {Data do de geração do arquivo}
      Registro := Registro + FormatDateTime(´hhmmss´,DataArquivo);  {Hora de geração do arquivo}
      Registro := Registro + Formatar(IntToStr(NumeroArquivo),6,false,´0´); {Número seqüencial do arquivo}
      Registro := Registro + ´020´; {Número da versão do layout do arquivo}
      Registro := Registro + Formatar(´´,5,false,´0´); 
      Registro := Registro + Formatar(´´,69); 
      Remessa.Add(Registro);
      Registro := ´´;

      {GERAR REGISTRO HEADER DO LOTE}
      Registro := Formatar(CodigoBanco,3,false,´0´); {Código do banco}
      Registro := Registro + Formatar(IntToStr(NumeroLote),4,false,´0´); {Número do lote de serviço}
      Registro := Registro + ´1´; {Tipo do registro - Registro header de lote}
      Registro := Registro + ´R´; {Tipo de operação: R (Remessa) ou T (Retorno)}
      Registro := Registro + ´01´; {Tipo de serviço: 01 (Cobrança)}
      Registro := Registro + ´00´; {Forma de lançamento: preencher com ZEROS no caso de cobrança}
      Registro := Registro + ´020´; {Número da versão do layout do lote}
      Registro := Registro + ´ ´; {Uso exclusivo FEBRABAN/CNAB}
      Registro := Registro + ACedenteTipoInscricao; {Tipo de inscrição do cedente}
      Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.NumeroCPFCGC,15,false,´0´); {Número de inscrição do cedente}
      Registro := Registro + Formatar(´´,20); 
      Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.CodigoAgencia,5,false,´0´); {Código da agência do cedente}
      Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.DigitoAgencia,1,false,´0´); {Dígito da agência do cedente}
      Registro := Registro + ´0000´+Formatar(inttostr(3),2,false,´0´); {Modalidade da conta}
      Registro := Registro + Formatar(COPY(Titulos[NumeroRegistro].Cedente.ContaBancaria.NumeroConta,3,99),6,false,´0´); {Número da conta do cedente}
      Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.DigitoConta,1,false,´0´); {Dígito da conta do cedente}
      Registro := Registro + ´ ´; 
      Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.Nome,30,true,´ ´); {Nome do cedente}

      // VERIFICAR CODIFICAÇÃO DA MENSAGENS NA AGÊNCIA ORIGEM.
      Registro := Registro + Formatar(´´,3,false,´0´); {Mensagem 1 (Codificada)}
      Registro := Registro + Formatar(´´,3,false,´0´); {Mensagem 2 (Codificada)}

      Registro := Registro + Formatar(´´,40); {Instrução Adicional (Mensagem Descritiva)}
      Registro := Registro + Formatar(´´,34); 
      Registro := Registro + Formatar(IntToStr(NumeroArquivo),8,false,´0´); {Número da remessa}
      Registro := Registro + FormatDateTime(´ddmmyyyy´,DataArquivo); {Data de geração do arquivo}
      Registro := Registro + Formatar(´´,8,false,´0´); 
      Registro := Registro + Formatar(´´,33); {Uso exclusivo FEBRABAN/CNAB}

      Remessa.Add(Registro);
      Registro := ´´;

      { GERAR TODOS OS REGISTROS DETALHE DA REMESSA }
      while NumeroRegistro <= (Titulos.Count - 1) do
      begin

         if Formatar(CodigoBanco,3,false,´0´) <> Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.Banco.Codigo,3,false,´0´) then
            Raise Exception.CreateFmt(´O título (Nosso Número: ¬s) não pertence ao banco ¬s (¬s)´,[Titulos[NumeroRegistro].NossoNumero,CodigoBanco,NomeBanco]);

         {SEGMENTO P}
         if Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.Banco.Codigo,3,false,´0´) <> Formatar(CodigoBanco,3,false,´0´) then
            Raise Exception.CreateFmt(´Titulo não pertence ao banco ¬s - ¬s´,[CodigoBanco,NomeBanco]);

         case Titulos[NumeroRegistro].Cedente.TipoInscricao of
            tiPessoaFisica  : ACedenteTipoInscricao := ´1´;
            tiPessoaJuridica: ACedenteTipoInscricao := ´2´;
            tiOutro         : ACedenteTipoInscricao := ´9´;
         end;

         Registro := Formatar(CodigoBanco,3,false,´0´); // Código do banco
         Registro := Registro + ´0001´; // Lote de Serviço
         Registro := Registro + ´3´; // Tipo do registro: Registro transação
         Registro := Registro + Formatar(IntToStr(2*NumeroRegistro+1),5,false,´0´); // Número seqüencial do registro no lote - Cada título tem 2 registros (P e Q)
         Registro := Registro + ´P´; // Código do segmento do registro transação
         Registro := Registro + ´ ´; // Vago
         case Titulos[NumeroRegistro].TipoOcorrencia of // Código Movimento
            toRemessaRegistrar                 : Registro := Registro + ´01´;
            toRemessaBaixar                    : Registro := Registro + ´02´;
            toRemessaConcederAbatimento        : Registro := Registro + ´04´;
            toRemessaCancelarAbatimento        : Registro := Registro + ´05´;
            toRemessaAlterarVencimento         : Registro := Registro + ´06´;
//            toRemessaConcederDesconto          : Registro := Registro + ´07´;
//            toRemessaCancelarDesconto          : Registro := Registro + ´08´;
            toRemessaProtestar                 : Registro := Registro + ´09´;
            toRemessaCancelarInstrucaoProtesto : Registro := Registro + ´10´;

//            toRemessaDispensarJuros            : Registro := Registro + ´31´;
            toRemessaAlterarNomeEnderecoSacado : Registro := Registro + ´31´;
         else
            Raise Exception.CreateFmt(´Ocorrência inválida em remessa - Nosso número: ¬s / Seu número: ¬s´,[Titulos[NumeroRegistro].NossoNumero,Titulos[NumeroRegistro].SeuNumero]);
         end; {case Titulos[NumeroRegistro].TipoOcorrencia}

         Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.CodigoAgencia,5,false,´0´); // Agência mantenedora da conta
         Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.DigitoAgencia,1,false,´0´); // Dígito verificador da agência
         Registro := Registro + ´0000´+Formatar(IntToStr(3),2,false,´0´); // Modalidade da conta
         Registro := Registro + Formatar(COPY(Titulos[NumeroRegistro].Cedente.ContaBancaria.NumeroConta,3,99),6,false,´0´); // Número da conta corrente
         Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBancaria.DigitoConta,1,false,´0´); // Dígito verificador da conta
         Registro := Registro + ´00´; // Modelo do Bloquete - 00: JAC002, 03: JAC011, 08: JAC010
         Registro := Registro + Formatar(´´,3); // Vago
         Registro := Registro + Formatar(´´,6,false,´0´); // Vago
         Registro := Registro + Formatar(Titulos[NumeroRegistro].NossoNumero,9,false,´0´); // Nosso Numero
         Registro := Registro + Formatar(Titulos[NumeroRegistro].DigitoNossoNumero,1,false,´0´); // Digito Nosso Numero
         Registro := Registro + ´06´; // Codigo da Carteira
         Registro := Registro + ´2´;  // Forma de cadastramento do título no banco 1-Com Registro; 2-Emissão de bloquete; 5-Registra e emite bloquete

         case Titulos[NumeroRegistro].EmissaoBoleto of // Quem emite e quem distribui o boleto?
            ebBancoEmite      : Registro := Registro + ´1´ + ´0´;
            ebClienteEmite    : Registro := Registro + ´2´ + ´0´;
//            ebBancoReemite    : Registro := Registro + ´4´ + ´0´;
//            ebBancoNaoReemite : Registro := Registro + ´5´ + ´0´;
         else
            Raise Exception.CreateFmt(´Identificação inválida de emissão de boleto em remessa - Nosso número: ¬s / Seu número: ¬s´,[Titulos[NumeroRegistro].NossoNumero,Titulos[NumeroRegistro].SeuNumero]);
         end; //case Titulos[NumeroRegistro].EmissaoBoleto

         Registro := Registro + Formatar(´´,3); // Vago
         Registro := Registro + Formatar(Titulos[NumeroRegistro].SeuNumero,13,false,´0´); // Número que identifica o título na empresa
         Registro := Registro + FormatDateTime(´ddmmyyyy´,Titulos[NumeroRegistro].DataVencimento); // Data de vencimento do título
         Registro := Registro + FormatCurr(´000000000000000´,Titulos[NumeroRegistro].ValorDocumento * 100); // Valor nominal do título
         Registro := Registro + Formatar(´´,5,false,´0´); // Agência cobradora. Se ficar em branco, o banco determina automaticamente pelo CEP do sacado
         Registro := Registro + ´ ´; // Dígito da agência cobradora

         case Titulos[NumeroRegistro].EspecieDocumento of // Código do documento
//            edCheque                       : Registro := Registro + ´01´; // CH  CHEQUE
            edDuplicataMercantil           : Registro := Registro + ´02´; // DM  DUPLICATA MERCANTIL
//            edDuplicataMercantialIndicacao : Registro := Registro + ´03´; // DMI DUPLICATA MERCANTIL P/ INDICAÇÃO
            edDuplicataServico             : Registro := Registro + ´04´; // DS  DUPLICATA DE SERVIÇO
//            edDuplicataServicoIndicacao    : Registro := Registro + ´05´; // DSI DUPLICATA DE SERVIÇO P/ INDICAÇÃO
            edDuplicataRural               : Registro := Registro + ´06´; // DR  DUPLICATA RURAL
            edLetraCambio                  : Registro := Registro + ´07´; // LC  LETRA DE CÂMBIO
//            edNotaCreditoComercial         : Registro := Registro + ´08´; // NCC NOTA DE CRÉDITO COMERCIAL
//            edNotaCreditoExportacao        : Registro := Registro + ´09´; // NCE NOTA DE CRÉDITO A EXPORTAÇÃO
//            edNotaCreditoIndustrial        : Registro := Registro + ´10´; // NCI NOTA DE CRÉDITO INDUSTRIAL
//            edNotaCreditoRural             : Registro := Registro + ´11´; // NCR NOTA DE CRÉDITO RURAL
            edNotaPromissoria              : Registro := Registro + ´12´; // NP  NOTA PROMISSÓRIA
            edNotaPromissoriaRural         : Registro := Registro + ´13´; // NPR NOTA PROMISSÓRIA RURAL
            edNotaSeguro                   : Registro := Registro + ´16´; // NS  NOTA DE SEGURO
            edRecibo                       : Registro := Registro + ´17´; // RC  RECIBO
            edFatura                       : Registro := Registro + ´18´; // FAT FATURA
            edNotaDebito                   : Registro := Registro + ´19´; // ND  NOTA DE DÉBITO
            edApoliceSeguro                : Registro := Registro + ´20´; // AP  APÓLICE DE SEGURO
//            edMensalidadeEscolar           : Registro := Registro + ´21´; // ME  MENSALIDADE ESCOLAR
            edTriplicataMercantil          : Registro := Registro + ´22´; // TM  TRIPLICATA MERCANTIL
            edTriplicataServico            : Registro := Registro + ´23´  // TS  TRIPLICATA DE SERVIÇO
         else
            Registro := Registro + ´99´; // OUTROS
         end; // case Titulos[NumeroRegistro].EspecieDocumento

         case Titulos[NumeroRegistro].AceiteDocumento of // Identificação de título Aceito / Não aceito
            adSim : Registro := Registro + ´A´;
            adNao : Registro := Registro + ´N´;
         end; // case Titulos[NumeroRegistro].AceiteDocumento

         Registro := Registro + FormatDateTime(´ddmmyyyy´,Titulos[NumeroRegistro].DataDocumento); // Data da emissão do documento

         // Posicao 119
         if Titulos[NumeroRegistro].ValorMoraJuros > 0 then
         begin
            Registro := Registro + ´1´; // Código de juros de mora: Valor por dia
            Registro := Registro + Formatar(´´,8); // Vago
            Registro := Registro + FormatCurr(´000000000000000´,Titulos[NumeroRegistro].ValorMoraJuros * 100); //Valor de juros de mora por dia
         end
         else
         begin
            Registro := Registro + ´3´; // Código de juros de mora: // 1-Valor diário; 2-Taxa mensal em percentagem; 3-Isento
            Registro := Registro + Formatar(´´,8); // Vago
            Registro := Registro + Formatar(´´,15,false,´0´); // Juros de Mora por Dia / Taxa Mensal
         end;

         // Posicao 143
         if Titulos[NumeroRegistro].ValorDesconto > 0 then
         begin
            Registro := Registro + ´1´; // Código de desconto: Valor fixo até a data informada
            {if Titulos[NumeroRegistro].DataDesconto <> null then
               Registro := Registro + FormatDateTime(´ddmmyyyy´,Titulos[NumeroRegistro].DataDesconto) // Data do desconto
            else}
               Registro := Registro + Formatar(´´,8,false,´0´); // Data até a qual será concedido desconto
            Registro := Registro + FormatCurr(´000000000000000´,Titulos[NumeroRegistro].ValorDesconto * 100); // Valor do desconto por dia
         end
         else
         begin
            Registro := Registro + ´1´; // Código de desconto: Sem desconto
            Registro := Registro + Formatar(´´,8,false,´0´); // Data até a qual será concedido desconto
            Registro := Registro + Formatar(´´,15,false,´0´); // Valor do desconto por dia
         end;
         Registro := Registro + Formatar(´´,30); // Vago
         Registro := Registro + Formatar(Titulos[NumeroRegistro].SeuNumero,25); // Uso da Empresa - numero do registro

         // Posicao 223
         Registro := Registro + ´00´; // Numero de dias para protesto - 00: Prazo de protesto negociado na Agencia.
         Registro := Registro + Formatar(´´,4); // Vago
         Registro := Registro + ´00´; // Código da moeda: Real
         Registro := Registro + Formatar(´´,3); // Vago
         Registro := Registro + Formatar(´´,3,false,´0´); // Codigo de Investimento
         Registro := Registro + Formatar(´´,4); // Vago

         Remessa.Add(Registro);
         Registro := ´´;

         // TRANSAÇÃO 3 - SEGMENTO Q (OBRIGATÓRIO PARA MOVIMENTO 01)
         case Titulos[NumeroRegistro].Sacado.TipoInscricao of
            tiPessoaFisica  : ASacadoTipoInscricao := ´1´;
            tiPessoaJuridica: ASacadoTipoInscricao := ´2´;
            tiOutro         : ASacadoTipoInscricao := ´9´;
         end;

         Registro := Formatar(CodigoBanco,3,false,´0´); {Código do banco}
         Registro := Registro + ´0001´; {Lote de Serviço}
         Registro := Registro + ´3´; {Tipo do registro: Registro transação}
         Registro := Registro + Formatar(IntToStr(2*NumeroRegistro+2),5,false,´0´); {Número seqüencial do registro no lote - Cada título tem 2 registros (P e Q)}
         Registro := Registro + ´Q´; {Código do segmento do registro transação}
         Registro := Registro + ´ ´; {Uso exclusivo FEBRABAN/CNAB: Branco}

         case Titulos[NumeroRegistro].TipoOcorrencia of {Código de movimento}
            toRemessaRegistrar                 : Registro := Registro + ´01´;
            toRemessaBaixar                    : Registro := Registro + ´02´;
            toRemessaConcederAbatimento        : Registro := Registro + ´04´;
            toRemessaCancelarAbatimento        : Registro := Registro + ´05´;
            toRemessaAlterarVencimento         : Registro := Registro + ´06´;
//            toRemessaConcederDesconto          : Registro := Registro + ´07´;
//            toRemessaCancelarDesconto          : Registro := Registro + ´08´;
            toRemessaProtestar                 : Registro := Registro + ´09´;
            toRemessaCancelarInstrucaoProtesto : Registro := Registro + ´10´;

//            toRemessaDispensarJuros            : Registro := Registro + ´31´;
            toRemessaAlterarNomeEnderecoSacado : Registro := Registro + ´31´;
         else
            Raise Exception.CreateFmt(´Ocorrência inválida em remessa - Nosso número: ¬s / Seu número: ¬s´,[Titulos[NumeroRegistro].NossoNumero,Titulos[NumeroRegistro].SeuNumero]);
         end; {case Titulos[NumeroRegistro].TipoOcorrencia}

         // Dados do sacado - Posicao 18
         Registro := Registro + Formatar(ASacadoTipoInscricao,1,false,´0´);
         Registro := Registro + Formatar(Titulos[NumeroRegistro].Sacado.NumeroCPFCGC,15,false,´0´);
         Registro := Registro + Formatar(Titulos[NumeroRegistro].Sacado.Nome,40);
         Registro := Registro + Formatar(Titulos[NumeroRegistro].Sacado.Endereco.Rua+´ ´+Titulos[NumeroRegistro].Sacado.Endereco.Numero+´ ´+Titulos[NumeroRegistro].Sacado.Endereco.Complemento,40);
         Registro := Registro + Formatar(Titulos[NumeroRegistro].Sacado.Endereco.Bairro,15);
         Registro := Registro + Formatar(Titulos[NumeroRegistro].Sacado.Endereco.CEP,8,true,´0´);
         Registro := Registro + Formatar(Titulos[NumeroRegistro].Sacado.Endereco.Cidade,15,true);
         Registro := Registro + Formatar(Titulos[NumeroRegistro].Sacado.Endereco.Estado,2,false);
         // Dados do sacador/avalista - Posicao 154
         Registro := Registro + ´0´; {Tipo de inscrição: Não informado}
         Registro := Registro + Formatar(´´,15,false,´0´); {Número de inscrição}
         Registro := Registro + Formatar(´´,40); {Nome do sacador/avalista}
         Registro := Registro + Formatar(´´,31); // Vago

         Remessa.Add(Registro);
         NumeroRegistro := NumeroRegistro + 1;
      end; {GERAR TODOS OS REGISTROS DETALHE DA REMESSA}

      {REGISTRO TRAILER DO LOTE}
      Registro := Formatar(CodigoBanco,3,false,´0´); {Código do banco}
      Registro := Registro + ´0001´; {Lote de Serviço}
      Registro := Registro + ´5´; {Tipo do registro: Registro trailer do lote}
      Registro := Registro + Formatar(´´,9); // Vago
      {Quantidade de registros do lote, incluindo header e trailer do lote.
       Até este momento Remessa contém:
       1 registro header de arquivo - É preciso excluí-lo desta contagem
       1 registro header de lote
       Diversos registros detalhe
       Falta incluir 1 registro trailer de lote
       Ou seja Quantidade = Remessa.Count - 1 header de arquivo + 1 trailer de lote = Remessa.Count}
      Registro := Registro + Formatar(IntToStr(Remessa.Count),6,false,´0´);
      Registro := Registro + Formatar(´´,217); // Vago

      Remessa.Add(Registro);
      Registro := ´´;

      {GERAR REGISTRO TRAILER DO ARQUIVO}
      Registro := Formatar(CodigoBanco,3,false,´0´); {Código do banco}
      Registro := Registro + ´9999´; {Lote de serviço}
      Registro := Registro + ´9´; {Tipo do registro: Registro trailer do arquivo}
      Registro := Registro + Formatar(´´,9); {Uso exclusivo FEBRABAN/CNAB}
      Registro := Registro + Formatar(IntToStr(NumeroLote),6,false,´0´); {Quantidade de lotes do arquivo}
      Registro := Registro + Formatar(IntToStr(Remessa.Count + 1),6,false,´0´); {Quantidade de registros do arquivo, inclusive este registro que está sendo criado agora}
      Registro := Registro + Formatar(´´,6,false,´0´); // Vago
      Registro := Registro + Formatar(´´,205); // Vago

      Remessa.Add(Registro);
   end;

   Result := TRUE;
end;

function TgbBanco151.GerarRemessaCNAB400(var ACobranca: TgbCobranca; var Remessa: TStringList) : boolean;
begin
   Raise Exception.CreateFmt(´Processamento de arquivo remessa CNAB400 não está disponível para o banco ¬s - ¬s´,[CodigoBanco, NomeBanco]);
end;

function TgbBanco151.LerRetorno(var ACobranca: TgbCobranca; Retorno: TStringList) : boolean;
var
   ACodigoBanco,
   ANomeCedente,
   ATipoInscricao : string;
   NumeroRegistro : integer;
   ATitulo : TgbTitulo;
begin
   NumeroRegistro := 0;
   ATitulo := TgbTitulo.Create(nil);
   with ACobranca do
   begin
      Titulos.Clear; // Zera o conjunto de títulos, antes de incluir os títulos do arquivo retorno

      if Retorno.Count <= 0 then
         Raise Exception.Create(´O retorno está vazio. Não há dados para processar´);

      case length(Retorno[0]) of
         240 :
            begin
               LayoutArquivo := laCNAB240;
               Result := LerRetornoCNAB240(ACobranca, Retorno);
            end;
         400 :
            begin
               LayoutArquivo := laCNAB400;
               Result := LerRetornoCNAB400(ACobranca, Retorno);
            end
      else
         begin
            LayoutArquivo := laOutro;
            Raise Exception.CreateFmt(´Tamanho de registro inválido: ¬d´,[length(Retorno[0])]);
         end;
      end;
   end;
end;

function TgbBanco151.LerRetornoCNAB240(var ACobranca: TgbCobranca; Retorno: TStringList) : boolean;
var
   ACodigoBanco,
   ANomeCedente,
   ATipoInscricao,
   ANumeroCPFCGC,
   ACodigoCedente,
   ACodigoAgencia,
   ADigitoCodigoAgencia,
   AModalidade,
   ANumeroConta,
   ADigitoNumeroConta,
   ATipoOcorrencia : string;
   NumeroRegistro : integer;
   ATitulo : TgbTitulo;
begin
   NumeroRegistro := 0;
   ATitulo := TgbTitulo.Create(nil);

   TRY

      with ACobranca do
      begin
         Titulos.Clear; {Zera o conjunto de títulos, antes de incluir os títulos do arquivo retorno}

         if Retorno.Count <= 0 then
            Raise Exception.Create(´O retorno está vazio. Não há dados para processar´);

         if length(Retorno[0]) <> 240 then
         begin
            LayoutArquivo := laOutro;
            Raise Exception.CreateFmt(´Tamanho de registro diferente de 240 bytes. Tamanho = ¬d bytes´,[length(Retorno[0])]);
         end;

         LayoutArquivo := laCNAB240;

         {Ver se o arquivo é mesmo RETORNO DE COBRANÇA}
         if Copy(Retorno.Strings[NumeroRegistro],143,1) <> ´2´ then
            Raise Exception.Create(NomeArquivo+´ não é um arquivo de retorno de cobrança com layout CNAB240´);

         { Lê registro HEADER}
         ACodigoBanco := Copy(Retorno.Strings[NumeroRegistro],1,3);
         if ACodigoBanco <> CodigoBanco then
            Raise Exception.CreateFmt(´Este não é um retorno de cobrança do banco ¬s - ¬s´,[CodigoBanco,NomeBanco]);

         if Copy(Retorno.Strings[NumeroRegistro],8,1) <> ´0´ then
            Raise Exception.Create(´Este não é um registro HEADER válido para arquivo de retorno de cobrança com layout CNAB240´);

         {Dados do cedente do título}
         ATipoInscricao := Copy(Retorno.Strings[NumeroRegistro],18,1); // Código do tipo de Inscrição
         ANumeroCPFCGC := Copy(Retorno.Strings[NumeroRegistro],19,14); // Numero Inscrição da Empresa
//         ACodigoCedente := Copy(Retorno.Strings[NumeroRegistro],33,16);
         ACodigoAgencia := Copy(Retorno.Strings[NumeroRegistro],53,5); // Código da Agência da Empresa
         ADigitoCodigoAgencia := Copy(Retorno.Strings[NumeroRegistro],58,1); // Digito da Agência
         AModalidade  := Copy(Retorno.Strings[NumeroRegistro],63,2); // Modalidade da Conta
         ANumeroConta := Copy(Retorno.Strings[NumeroRegistro],65,6); // Numero da Conta
         ADigitoNumeroConta := Copy(Retorno.Strings[NumeroRegistro],71,1); // Digito da Conta
         ANomeCedente := Trim(Copy(Retorno.Strings[NumeroRegistro],73,30)); // Nome da Empresa

         NumeroRegistro := 1;

         {Lê registro HEADER DE LOTE}
         {Verifica se é um lote de retorno de cobrança}
         if Copy(Retorno.Strings[NumeroRegistro],9,3) <> ´T01´ then
            Raise Exception.Create(´Este não é um lote de retorno de cobrança´);

         DataArquivo := EncodeDate(StrToInt(Copy(Retorno.Strings[NumeroRegistro],196,4)),StrToInt(Copy(Retorno.Strings[NumeroRegistro],194,2)),StrToInt(Copy(Retorno.Strings[NumeroRegistro],192,2)));
         NumeroArquivo := StrToInt(Trim(Copy(Retorno.Strings[NumeroRegistro],184,8)));

         {Lê os registros DETALHE}
         NumeroRegistro := NumeroRegistro + 1;
         {Lê até o antepenúltimo registro porque o penúltimo contém apenas o TRAILER DO LOTE e o último contém apenas o TRAILER DO ARQUIVO}
         while (NumeroRegistro < Retorno.Count - 2) do
         begin
            {Registro detalhe com tipo de segmento = T}
            if Copy(Retorno.Strings[NumeroRegistro],14,1) = ´T´ then
            begin
               {Dados do titulo}
               with ATitulo do
               begin
                  {Tipo de ocorrência}
                  ATipoOcorrencia := Copy(Retorno.Strings[NumeroRegistro],16,2);
                  case StrToInt(ATipoOcorrencia) of
                     2 : TipoOcorrencia := toRetornoRegistroConfirmado;
                     3 : TipoOcorrencia := toRetornoRegistroRecusado;
                     6 : TipoOcorrencia := toRetornoLiquidado;
                     7 : TipoOcorrencia := toRetornoLiquidado;
                     9 : TipoOcorrencia := toRetornoBaixado;
                     12: TipoOcorrencia := toRetornoRecebimentoInstrucaoConcederAbatimento;
                     13: TipoOcorrencia := toRetornoRecebimentoInstrucaoCancelarAbatimento;
                     14: TipoOcorrencia := toRetornoRecebimentoInstrucaoAlterarVencimento;
                     17: TipoOcorrencia := toRetornoLiquidado;
                     19: TipoOcorrencia := toRetornoRecebimentoInstrucaoProtestar;
                     20: TipoOcorrencia := toRetornoRecebimentoInstrucaoSustarProtesto;
                     23: TipoOcorrencia := toRetornoEncaminhadoACartorio;
                     24: TipoOcorrencia := toRetornoRetiradoDeCartorio;
                     25: TipoOcorrencia := toRetornoProtestado;
                     26: TipoOcorrencia := toRetornoComandoRecusado;
                     27: TipoOcorrencia := toRetornoRecebimentoInstrucaoAlterarDados;
                     28: TipoOcorrencia := toRetornoDebitoTarifas;
                     30: TipoOcorrencia := toRetornoRegistroRecusado;
                     36: TipoOcorrencia := toRetornoRecebimentoInstrucaoConcederDesconto;
                     37: TipoOcorrencia := toRetornoRecebimentoInstrucaoCancelarDesconto;
                     43: TipoOcorrencia := toRetornoProtestoOuSustacaoEstornado;
                     44: TipoOcorrencia := toRetornoBaixaOuLiquidacaoEstornada;
                     45: TipoOcorrencia := toRetornoDadosAlterados;
                  else
                     TipoOcorrencia := toRetornoOutrasOcorrencias;
                  end; {case StrToInt(ATipoOcorrencia)}
                  
                  {Nosso número SEM DÍGITO}
                  NossoNumero := Copy(Retorno.Strings[NumeroRegistro],47,10);
                  SeuNumero := Copy(Retorno.Strings[NumeroRegistro],59,11);
                  DataVencimento := EncodeDate(StrToInt(Copy(Retorno.Strings[NumeroRegistro],76,4)),StrToInt(Copy(Retorno.Strings[NumeroRegistro],74,2)),StrToInt(Copy(Retorno.Strings[NumeroRegistro],72,2)));
                  ValorDocumento := StrToFloat(Copy(Retorno.Strings[NumeroRegistro],80,15))/100;

                  {Dados do cedente do título}
                  with Cedente do
                  begin
                     if ATipoInscricao = ´1´ then
                        TipoInscricao := tiPessoaFisica
                     else if ATipoInscricao = ´2´ then
                        TipoInscricao := tiPessoaJuridica
                     else
                        TipoInscricao := tiOutro;
                     NumeroCPFCGC := ANumeroCPFCGC;
                     CodigoCedente := ACodigoCedente;
                     with ContaBancaria do
                     begin
                        Banco.Codigo := ACodigoBanco;
                        CodigoAgencia := ACodigoAgencia;
                        DigitoAgencia := ADigitoCodigoAgencia;
                        NumeroConta := ANumeroConta;
                        DigitoConta := ADigitoNumeroConta;
                     end;
                     Nome := ANomeCedente;
                  end; {with ACedente}

                  {Dados do sacado do título}
                  with Sacado do
                  begin
                     if Copy(Retorno.Strings[NumeroRegistro],131,1) = ´1´ then
                        TipoInscricao := tiPessoaFisica
                     else if Copy(Retorno.Strings[NumeroRegistro],131,1) = ´2´ then
                        TipoInscricao := tiPessoaJuridica
                     else
                        TipoInscricao := tiOutro;
                     NumeroCPFCGC := Copy(Retorno.Strings[NumeroRegistro],132,15);
                     Nome := Trim(Copy(Retorno.Strings[NumeroRegistro],147,40));
                  end; {with ACedente}

//                  ValorDespesaCobranca := StrToFloat(Copy(Retorno.Strings[NumeroRegistro],199,15))/100;
//                  MotivoRejeicaoComando := Copy(Retorno.Strings[NumeroRegistro],214,10);
               end; {with ATitulo}

               NumeroRegistro := NumeroRegistro + 1;
            end; {if Copy(Retorno.Strings[NumeroRegistro],14,1) = ´T´}

            {Registro detalhe com tipo de segmento = U}
            if Copy(Retorno.Strings[NumeroRegistro],14,1) = ´U´ then
            begin
               with ATitulo do
               begin
                  ValorMoraJuros := StrToFloat(Copy(Retorno.Strings[NumeroRegistro],18,15))/100;
                  ValorDesconto := StrToFloat(Copy(Retorno.Strings[NumeroRegistro],33,16))/100;
                  ValorAbatimento := StrToFloat(Copy(Retorno.Strings[NumeroRegistro],49,16))/100;
                  ValorIOF := StrToFloat(Copy(Retorno.Strings[NumeroRegistro],65,15))/100;
                  ValorOutrasDespesas := StrToFloat(Trim(Copy(Retorno.Strings[NumeroRegistro],110,16)))/100;
                  ValorOutrosCreditos := StrToFloat(Trim(Copy(Retorno.Strings[NumeroRegistro],126,15)))/100;
//                  DataRecebimento := EncodeDate(StrToInt(Copy(Retorno.Strings[NumeroRegistro],145,4)),StrToInt(Copy(Retorno.Strings[NumeroRegistro],143,2)),StrToInt(Copy(Retorno.Strings[NumeroRegistro],141,2)));
                  DataCredito := EncodeDate(StrToInt(Copy(Retorno.Strings[NumeroRegistro],153,4)),StrToInt(Copy(Retorno.Strings[NumeroRegistro],151,2)),StrToInt(Copy(Retorno.Strings[NumeroRegistro],149,2)))
               end; {with ATitulo}

               NumeroRegistro := NumeroRegistro + 1;
            end; {if Copy(Retorno.Strings[NumeroRegistro],14,1) = ´U´}


            {Insere o título}
            Titulos.Add(ATitulo);
         end;
      end;

      ATitulo.Free;
      Result := TRUE
   EXCEPT
      ATitulo.Free;
      Result := FALSE;
      Raise; {Propaga o erro}
   END;
end;

function TgbBanco151.LerRetornoCNAB400(var ACobranca: TgbCobranca; Retorno: TStringList) : boolean;
begin
   Raise Exception.CreateFmt(´Processamento de arquivo retorno CNAB400 não está disponível para o banco ¬s - ¬s´,[CodigoBanco, NomeBanco]);
end;

{$ENDIF}

initialization
RegisterClass(TgbBanco151);

end.



Qualquer duvida estamos à disposição.



Abraços.


GOSTEI 0
Frostlost

Frostlost

14/05/2008

Muito obrigado, valeu mesmo!!!!!

Qual versão do gbboleto vc está usando com esta unit?

Abraços


GOSTEI 0
Talisjonatas

Talisjonatas

14/05/2008

Uso para Delphi 2006 (mas compilamos para Delphi 2007).


Abraços


GOSTEI 0
Frostlost

Frostlost

14/05/2008

Valeu, funciona no delphi 7?

Uso para Delphi 2006 (mas compilamos para Delphi 2007). Abraços



GOSTEI 0
Talisjonatas

Talisjonatas

14/05/2008

Amigo, nao sei o que esta acontecendo, o nosso numero esta gerando errado: ele gera 9900000005-5, quando deveria gerar 9900000005-7 Depois nesse número: 15.199.90004 00050.293406 02111.15128 6 38910000001528 quando deveria sair o de baixo, ou seja estou errando por um numero, o que pode ser? 15.199.90004 00050.293406 02111.15128 5 38910000001528


Para que gere com o numero correto na Unit que te passei, coloque o num. da conta nesta disposições, Exatamente com estes digitos: Exemplo de uma C/C: 000040102138-3 onde este 04 é o cod. ´carteira´ e 0102138 é num. da conta.


Poste aqui se der tudo certo.


Abraços


GOSTEI 0
Helio Nascimento

Helio Nascimento

14/05/2008

talisjonatas

Caro colega esta função FORMATAR() não está inserida na UNIT , voce poderia nos fornecer?

Grato/Hélio


GOSTEI 0
Talisjonatas

Talisjonatas

14/05/2008

Aí esta a função Formatar()


function Formatar(Texto : string; TamanhoDesejado : integer; AcrescentarADireita : boolean = true; CaracterAcrescentar : char = ´ ´) : string;
{
   OBJETIVO: Eliminar caracteres inválidos e acrescentar caracteres à esquerda ou à direita do texto original para que a string resultante fique com o tamanho desejado

   Texto : Texto original
   TamanhoDesejado: Tamanho que a string resultante deverá ter
   AcrescentarADireita: Indica se o carácter será acrescentado à direita ou à esquerda
      TRUE - Se o tamanho do texto for MENOR que o desejado, acrescentar carácter à direita
             Se o tamanho do texto for MAIOR que o desejado, eliminar últimos caracteres do texto
      FALSE - Se o tamanho do texto for MENOR que o desejado, acrescentar carácter à esquerda
             Se o tamanho do texto for MAIOR que o desejado, eliminar primeiros caracteres do texto
   CaracterAcrescentar: Carácter que deverá ser acrescentado
}
var
   QuantidadeAcrescentar,
   TamanhoTexto,
   PosicaoInicial,
   i : integer;

begin
   case CaracterAcrescentar of
      ´0´..´9´,´a´..´z´,´A´..´Z´ : ;{Não faz nada}
      else
         CaracterAcrescentar := ´ ´;
   end;


   Texto := Trim(AnsiUpperCase(Texto));
   TamanhoTexto := Length(Texto);
   for i := 1 to (TamanhoTexto) do
   begin
      if Pos(Texto[i],´ 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ´~´´"!@$¬^&*()_-+=|/\{}[]:;,.<>´) = 0 then
      begin
         case Texto[i] of
            ´Á´,´À´,´Â´,´Ä´,´Ã´ : Texto[i] := ´A´;
            ´É´,´È´,´Ê´,´Ë´ : Texto[i] := ´E´;
            ´Í´,´Ì´,´Î´,´Ï´ : Texto[i] := ´I´;
            ´Ó´,´Ò´,´Ô´,´Ö´,´Õ´ : Texto[i] := ´O´;
            ´Ú´,´Ù´,´Û´,´Ü´ : Texto[i] := ´U´;
            ´Ç´ : Texto[i] := ´C´;
            ´Ñ´ : Texto[i] := ´N´;
            else Texto[i] := ´ ´;
         end;
      end;
   end;

   QuantidadeAcrescentar := TamanhoDesejado - TamanhoTexto;
   if QuantidadeAcrescentar < 0 then
      QuantidadeAcrescentar := 0;
   if CaracterAcrescentar = ´´ then
      CaracterAcrescentar := ´ ´;
   if TamanhoTexto >= TamanhoDesejado then
      PosicaoInicial := TamanhoTexto - TamanhoDesejado + 1
   else
      PosicaoInicial := 1;

   if AcrescentarADireita then
      Texto := Copy(Texto,1,TamanhoDesejado) + StringOfChar(CaracterAcrescentar,QuantidadeAcrescentar)
   else
      Texto := StringOfChar(CaracterAcrescentar,QuantidadeAcrescentar) + Copy(Texto,PosicaoInicial,TamanhoDesejado);

   Result := AnsiUpperCase(Texto);
end;



Abraços


GOSTEI 0
Frostlost

Frostlost

14/05/2008

Ola, tentei fazer da forma que falou, mas continua dando errado, a carteira utilizada é CIDENT, e a conta que utilizo é 002111-3, mas passo o valor sem o -3 para a conta corrente. Qual é oc ódigo correspondente a CIDENT, outra coisa, a modalidade é 04.

Valeu!

[quote:eb6dc3704b] Amigo, nao sei o que esta acontecendo, o nosso numero esta gerando errado: ele gera 9900000005-5, quando deveria gerar 9900000005-7 Depois nesse número: 15.199.90004 00050.293406 02111.15128 6 38910000001528 quando deveria sair o de baixo, ou seja estou errando por um numero, o que pode ser? 15.199.90004 00050.293406 02111.15128 5 38910000001528


Para que gere com o numero correto na Unit que te passei, coloque o num. da conta nesta disposições, Exatamente com estes digitos: Exemplo de uma C/C: 000040102138-3 onde este 04 é o cod. ´carteira´ e 0102138 é num. da conta.


Poste aqui se der tudo certo.


Abraços[/quote:eb6dc3704b]


GOSTEI 0
Talisjonatas

Talisjonatas

14/05/2008

Coloque o num. da sua conta assim: 000040002111 e o dig. como 3


Atenciosamente



Talis


GOSTEI 0
Frostlost

Frostlost

14/05/2008

Quase deu certo, está dando errado por um número:

Os valores que estou passando:

valor: 15,28
vencimento: 02/06/2008
nosso número: 990000005
conta 000040002111
digito 3
banco 151
agencia 0293
digito 3

o codigo certo é:
15199.9004 00050.293406 02111.151128 5 38910000001528

estou obtendo:

15199.9004 00050.293406 02111.151128 6 38910000001528

ou seja errando por um numero,

nao sei o que pode ser....

obrigado....


Coloque o num. da sua conta assim: 000040002111 e o dig. como 3 Atenciosamente Talis



GOSTEI 0
Frostlost

Frostlost

14/05/2008

Ainda não deu certo, ainda preciso de ajuda!

Coloque o num. da sua conta assim: 000040002111 e o dig. como 3 Atenciosamente Talis



GOSTEI 0
POSTAR