You are on page 1of 8

unit RLCob104;

interface
{$WARNINGS OFF}
{$HINTS OFF}
uses
classes, SysUtils, RLBoleto
{$IFDEF VER150}
, Variants, MaskUtils, contnrs, DateUtils
{$ELSE}
{$IFDEF VER140}
, Variants, MaskUtils, contnrs, DateUtils
{$ELSE}
{$IFDEF VER130}
, Mask, contnrs
{$ELSE}
, Mask
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$IFDEF VER185} //Delphi 2007
, Variants, DateUtils
{$ENDIF}
;
const
CodigoBanco = '104';
NomeBanco = 'Caixa Econ. Federal';
Imagem = 4;
type
TRLBanco104 = class(TPersistent)
private
{$IFNDEF VER120}
function GerarRemessaCNAB240(var ACobranca: TRLBRemessa; var Remessa: TStr
ingList) : boolean;
function GerarRemessaCNAB400(var ACobranca: TRLBRemessa; var Remessa: TStr
ingList) : boolean;
function LerRetornoCNAB240(var ACobranca: TRLBRemessa; Retorno: TStringLis
t) : boolean;
function LerRetornoCNAB400(var ACobranca: TRLBRemessa; Retorno: TStringLis
t) : boolean;
{$ENDIF}
published
function GetNomeBanco : string; {Retorna o nome do banco}
function GetImagem : byte; {Retorna o codigo para imagem do banco}
function GetCampoLivreCodigoBarra(ATitulo: TRLBTitulo) : string; {Retorna
o conteúdo da parte variável do código de barras}
function CalcularDigitoNossoNumero(ATitulo: TRLBTitulo) : string; {Calcul
a o dígito do NossoNumero, conforme critérios definidos por cada banco}
procedure FormatarBoleto(ATitulo: TRLBTitulo; var AAgenciaCodigoCedente, A
NossoNumero, ACarteira, AEspecieDocumento: string); {Define o formato como algun
s valores serão apresentados no boleto }
{$IFNDEF VER120}
function LerRetorno(var ACobranca: TRLBRemessa; Retorno: TStringList) : b
oolean; {Lê o arquivo retorno recebido do banco}
function GerarRemessa(var ACobranca: TRLBRemessa; var Remessa: TStringLis
t) : boolean; {Gerar arquivo remessa para enviar ao banco}
{$ENDIF}
end;

implementation
function TRLBanco104.GetImagem : Byte;
begin
Result := Imagem;
end;
function TRLBanco104.GetNomeBanco : string;
begin
Result := NomeBanco;
end;
function TRLBanco104.CalcularDigitoNossoNumero(ATitulo: TRLBTitulo) : string;
var
ANossoNumero,
ADigitoNossoNumero : string;
begin
Result := '0';
ANossoNumero := '9'+Formatar(ATitulo.NossoNumero,17,false,'0');
ADigitoNossoNumero := Modulo11(ANossoNumero,9);
Result := ADigitoNossoNumero;
end;
function TRLBanco104.GetCampoLivreCodigoBarra(ATitulo: TRLBTitulo) : string;
var
ANossoNumero,
ACodigoAgencia,
ACodigoCedente: string;
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}
with ATitulo do
begin
ANossoNumero := '9'+Formatar(NossoNumero,17,false,'0');
// ACodigoAgencia := Formatar(Cedente.ContaBancaria.CodigoAgencia,4,false,
'0');
// Desabilitado conforme documento pegado 01/07/2006
ACodigoCedente := '1'+Formatar(Cedente.CodigoCedente,6,false,'0');
end;
// Result := ANossoNumero + ACodigoAgencia + ACodigoCedente;
// Desabilitado conforme documento pegado 01/07/2006
Result := ACodigoCedente + ANossoNumero ;
// Alterado o que se posiciona no campo livre
end;
procedure TRLBanco104.FormatarBoleto(ATitulo: TRLBTitulo; var AAgenciaCodigoCede
nte, ANossoNumero, ACarteira, AEspecieDocumento: string);
begin
with ATitulo do
begin
AAgenciaCodigoCedente := Formatar(Cedente.ContaBancaria.CodigoAgencia,4,fa
lse,'0') + '/' + Formatar(Cedente.CodigoCedente,6,false,'0') + '-' + Cedente.Dig
itoCodigoCedente;
ANossoNumero := '9'+Formatar(NossoNumero,17,false,'0') + '-' + DigitoNosso
Numero;
ACarteira := Formatar(Carteira,2);
case EspecieDocumento of
edApoliceSeguro : AEspecieDocumento := 'AP';
edCheque : AEspecieDocumento := 'CH';
edDuplicataMercantil : AEspecieDocumento := 'DM';
edDuplicataMercantialIndicacao : AEspecieDocumento := 'DMI';
edDuplicataRural : AEspecieDocumento := 'DR';
edDuplicataServico : AEspecieDocumento := 'DS';
edDuplicataServicoIndicacao : AEspecieDocumento := 'DSI';
edFatura : AEspecieDocumento := 'FAT';
edLetraCambio : AEspecieDocumento := 'LC';
edMensalidadeEscolar : AEspecieDocumento := 'ME';
edNotaCreditoComercial : AEspecieDocumento := 'NCC';
edNotaCreditoExportacao : AEspecieDocumento := 'NCE';
edNotaCreditoIndustrial : AEspecieDocumento := 'NCI';
edNotaCreditoRural : AEspecieDocumento := 'NCR';
edNotaDebito : AEspecieDocumento := 'ND';
edNotaPromissoria : AEspecieDocumento := 'NP';
edNotaPromissoriaRural : AEspecieDocumento := 'NPR';
edNotaSeguro : AEspecieDocumento := 'NS';
edParcelaConsorcio : AEspecieDocumento := 'PC';
edRecibo : AEspecieDocumento := 'RC';
edTriplicataMercantil : AEspecieDocumento := 'TM';
edTriplicataServico : AEspecieDocumento := 'TS'
else
AEspecieDocumento := '';
end;
end;
end;

{$IFNDEF VER120}
function TRLBanco104.GerarRemessaCNAB240(var ACobranca: TRLBRemessa; 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].C
edente.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'); {1 a 3 - Código do banco}
Registro := Registro + '0000'; {4 a 7 - Lote de serviço}
Registro := Registro + '0'; {8 - Tipo de registro - Registro header de arq
uivo}
Registro := Registro + Formatar('',9); {9 a 17 - Uso exclusivo FEBRABAN/CN
AB}
Registro := Registro + ACedenteTipoInscricao; {18 - Tipo de inscrição do ceden
te}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.NumeroCPFC
GC,14,false,'0'); {19 a 32 - Número de inscrição do cedente}
{CÓDIGO DO CONVÊNIO = AGÊNCIA + NÚMERO CONVÊNIO + DV}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBanca
ria.CodigoAgencia,4,false,'0'); {33 a 36 - Código da agência}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.CodigoCede
nte,11,false,'0'); {37 a 47 - Código do convênio no banco}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.DigitoCodi
goCedente,1,false,'0'); {48 - Dígito do código do convênio no banco}
Registro := Registro + Formatar('',4); {49 a 52 - Uso exclusivo CAIXA}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBanca
ria.CodigoAgencia,5,false,'0'); {53 a 57 - Código da agência do cedente}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBanca
ria.DigitoAgencia,1,false,'0'); {58 - Dígito do código da agência do cedente}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBanca
ria.NumeroConta,12,false,'0'); {59 a 70 - Código da conta corrente vinculada à cobra
nça / não é o número da conta corrente comum}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBanca
ria.DigitoConta,1,false,'0'); {71 - Dígito da conta corrente vinculada à cobrança}
Registro := Registro + Modulo11(Formatar(Titulos[NumeroRegistro].Cedente.C
ontaBancaria.CodigoAgencia,5,false,'0')+Formatar(Titulos[NumeroRegistro].Cedente
.ContaBancaria.NumeroConta,12,false,'0')); {72 - Dígito verificador da agência / con
ta do cedente}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.Nome,30,tr
ue,' '); {73 a 102 - Nome do cedente}
Registro := Registro + Formatar('CAIXA ECONOMICA FEDERAL',30,true,' '); {1
03 a 132 - Nome do banco}
Registro := Registro + Formatar('',10); {133 a 142 - Uso exclusivo FEBRABA
N/CNAB}
Registro := Registro + '1'; {143 - Código de Remessa (1) / Retorno (2)}
Registro := Registro + FormatDateTime('ddmmyyyy',DataArquivo); {144 a 151
- Data do de geração do arquivo}
Registro := Registro + FormatDateTime('hhmmss',DataArquivo); {152 a 157 -
Hora de geração do arquivo}
Registro := Registro + Formatar(IntToStr(NumeroArquivo),6,false,'0'); {158
a 163 Número seqüencial do arquivo}
Registro := Registro + '030'; {164 a 166 - Número da versão do layout do arqui
vo}
Registro := Registro + Formatar('',5,false,'0'); {167 a 171 - Densidade de
gravação do arquivo (BPI)}
Registro := Registro + Formatar('',20); {172 a 191 - Uso reservado do banc
o}
if TipoMovimento = tmRemessaTeste then
Registro := Registro + Formatar('REMESSA-TESTE',20) {192 a 211 - Deverá c
onter a literal REMESSA-TESTE para fase de testes}
else
Registro := Registro + Formatar('',20); {192 a 211 - Deverá conter a lite
ral REMESSA-TESTE para fase de testes}
Registro := Registro + Formatar('',29); {212 a 240 - Uso exclusivo FEBRABA
N/CNAB}
Remessa.Add(Registro);
Registro := '';
{GERAR REGISTRO HEADER DO LOTE}
Registro := Formatar(CodigoBanco,3,false,'0'); {1a 3 - Código do banco}
Registro := Registro + Formatar(IntToStr(NumeroLote),4,false,'0'); {4 a 7
- Número do lote de serviço}
Registro := Registro + '1'; {8 - Tipo do registro - Registro header de lot
e}
Registro := Registro + 'R'; {9 - Tipo de operação: R (Remessa) ou T (Retorno)}
Registro := Registro + '01'; {10 a 11 - Tipo de serviço: 01 (Cobrança)}
Registro := Registro + '00'; {12 a 13 - Forma de lançamento: preencher com Z
EROS no caso de cobrança}
Registro := Registro + '020'; {14 a 16 - Número da versão do layout do lote}
Registro := Registro + ' '; {17 - Uso exclusivo FEBRABAN/CNAB}
Registro := Registro + ACedenteTipoInscricao; {18 - Tipo de inscrição do ceden
te}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.NumeroCPFC
GC,15,false,'0'); {19 a 33 - Número de inscrição do cedente}
{CÓDIGO DO CONVÊNIO = AGÊNCIA + NÚMERO CONVÊNIO + DV}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBanca
ria.CodigoAgencia,4,false,'0'); {34 a 37 - Código da agência}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.CodigoCede
nte,11,false,'0'); {38 a 48 - Código do convênio no banco}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.DigitoCodi
goCedente,1,false,'0'); {49 - Dígito do código do convênio no banco}
Registro := Registro + Formatar('',4); {50 a 53 - Uso exclusivo CAIXA}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBanca
ria.CodigoAgencia,5,false,'0'); {54 a 58 - Código da agência do cedente}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBanca
ria.DigitoAgencia,1,false,'0'); {59 - Dígito da agência do cedente}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBanca
ria.NumeroConta,12,false,'0'); {60 a 71 - Número da conta vinculada à cobrança / não é o nú
ero da conta corrente comum}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBanca
ria.DigitoConta,1,false,'0'); {72 - Dígito do código do cedente no banco}
Registro := Registro + Modulo11(Formatar(Titulos[NumeroRegistro].Cedente.C
ontaBancaria.CodigoAgencia,5,false,'0')+Formatar(Titulos[NumeroRegistro].Cedente
.ContaBancaria.NumeroConta,12,false,'0')); {73 - Dígito verificador da agência / con
ta}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.Nome,30,tr
ue,' '); {74 a 103 - Nome do cedente}
Registro := Registro + Formatar('',40); {104 a 143 - Mensagem 1 para todos
os boletos do lote}
Registro := Registro + Formatar('',40); {144 a 183 - Mensagem 2 para todos
os boletos do lote}
Registro := Registro + Formatar(IntToStr(NumeroArquivo),8,false,'0'); {184
a 191 - Número do arquivo}
Registro := Registro + FormatDateTime('ddmmyyyy',DataArquivo); {192 a 199
- Data de geração do arquivo}
Registro := Registro + FormatDateTime('ddmmyyyy',DataArquivo); {200 a 207
- Data do crédito - Informar a mesma data da gravação do arquivo}
Registro := Registro + Formatar('',33); {208 a 240 - Uso exclusivo FEBRABA
N/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 ban
co %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',[Codi
goBanco,NomeBanco]);
case Titulos[NumeroRegistro].Cedente.TipoInscricao of
tiPessoaFisica : ACedenteTipoInscricao := '1';
tiPessoaJuridica: ACedenteTipoInscricao := '2';
tiOutro : ACedenteTipoInscricao := '9';
end;
Registro := Formatar(CodigoBanco,3,false,'0'); {1 a 3 - Código do banco}
Registro := Registro + Formatar(IntToStr(NumeroLote),4,false,'0'); {4 a
7 - Número do lote}
Registro := Registro + '3'; {8 - Tipo do registro: Registro detalhe}
Registro := Registro + Formatar(IntToStr(2*NumeroRegistro+1),5,false,'0
'); {9 a 13 - Número seqüencial do registro no lote - Cada título tem 2 registros (P e
Q)}
Registro := Registro + 'P'; {14 - Código do segmento do registro detalhe}
Registro := Registro + ' '; {15 - Uso exclusivo FEBRABAN/CNAB: Branco}
case Titulos[NumeroRegistro].TipoOcorrencia of {16 a 17 - Código de movim
ento}
toRemessaRegistrar : Registro := Registro + '01';
toRemessaBaixar : Registro := Registro + '02';
toRemessaConcederAbatimento : Registro := Registro + '04';
toRemessaCancelarAbatimento : Registro := Registro + '05';
toRemessaConcederDesconto : Registro := Registro + '07';
toRemessaCancelarDesconto : Registro := Registro + '08';
toRemessaAlterarVencimento : Registro := Registro + '06';
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.ContaBa
ncaria.CodigoAgencia,5,false,'0'); {18 a 22 - Agência mantenedora da conta}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBa
ncaria.DigitoAgencia,1,false,'0'); {23 - Dígito verificador da agência}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBa
ncaria.NumeroConta,12,false,'0'); {24 a 35 - Número da conta vinculada à cobrança / não é
o número da conta corrente comum}
Registro := Registro + Formatar(Titulos[NumeroRegistro].Cedente.ContaBa
ncaria.DigitoConta,1,false,'0'); {36 - Dígito da conta vinculada à cobrança}
Registro := Registro + Modulo11(Formatar(Titulos[NumeroRegistro].Cedent
e.ContaBancaria.CodigoAgencia,5,false,'0')+Formatar(Titulos[NumeroRegistro].Cede
nte.ContaBancaria.NumeroConta,12,false,'0')); {37 - Dígito verificador da agência /
conta}
Registro := Registro + Formatar('',9); {38 a 46 - Uso exclusivo CAIXA:
Brancos}
Registro := Registro + Formatar(Titulos[NumeroRegistro].NossoNumero,11,
false,'0'); {47 a 57 - Nosso número - identificação do título no banco}
Registro := Registro + '1'; {58 - Cobrança Simples}
Registro := Registro + '1'; {59 - Forma de cadastramento do título no ban
co: com cadastramento}
Registro := Registro + '2'; {60 - Tipo de documento: Escritural}
case Titulos[NumeroRegistro].EmissaoBoleto of {61 a 62 - Quem emite e q
uem distribui o boleto?}
ebBancoEmite : Registro := Registro + '1' + '1';
ebClienteEmite : Registro := Registro + '2' + '2';
ebBancoReemite : Registro := Registro + '4' + '1';
ebBancoNaoReemite : Registro := Registro + '5' + '2';
else
Raise Exception.CreateFmt('Identificação inválida de emissão de boleto em re
messa - Nosso número: %s / Seu número: %s',[Titulos[NumeroRegistro].NossoNumero,Titu
los[NumeroRegistro].SeuNumero]);
end; {case Titulos[NumeroRegistro].EmissaoBoleto}
Registro := Registro + Formatar(Titulos[NumeroRegistro].SeuNumero,11,fa
lse,'0'); {63 a 73 - Número que identifica o título na empresa}
Registro := Registro + Formatar('',4); {74 a 77 - Uso exclusivo CAIXA:
Brancos}
Registro := Registro + FormatDateTime('ddmmyyyy',Titulos[NumeroRegistro
].DataVencimento); {78 a 85 - Data de vencimento do título}
Registro := Registro + FormatCurr('000000000000000',Titulos[NumeroRegis
tro].ValorDocumento * 100); {86 a 100 - Valor nominal do título}
Registro := Registro + '00000'; {101 a 105 - Agência cobradora. Deixar ze
rado. A Caixa determinará automaticamente pelo CEP do sacado}
Registro := Registro + '0'; {106 - Dígito da agência cobradora}
case Titulos[NumeroRegistro].EspecieDocumento of {107 a 108 - Espécie do
documento}
edApoliceSeguro : Registro := Registro + '20'; {AP A
PÓLICE DE SEGURO}
edCheque : Registro := Registro + '01'; {CH C
HEQUE}
edDuplicataMercantil : Registro := Registro + '02'; {DM D
UPLICATA MERCANTIL}
edDuplicat

You might also like