Fórum Unit da Nossa Caixa estadual homologado - GBBOLETO #358468
14/05/2008
0
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
Curtir tópico
+ 0Posts
14/05/2008
Talisjonatas
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
14/05/2008
Frostlost
Qual versão do gbboleto vc está usando com esta unit?
Abraços
Gostei + 0
14/05/2008
Talisjonatas
Abraços
Gostei + 0
14/05/2008
Frostlost
Gostei + 0
15/05/2008
Talisjonatas
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
16/05/2008
Helio Nascimento
Caro colega esta função FORMATAR() não está inserida na UNIT , voce poderia nos fornecer?
Grato/Hélio
Gostei + 0
16/05/2008
Talisjonatas
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
17/05/2008
Frostlost
Valeu!
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
19/05/2008
Talisjonatas
Atenciosamente
Talis
Gostei + 0
19/05/2008
Frostlost
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....
Gostei + 0
26/05/2008
Frostlost
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)