Boa noite, segue a solução para o problema. Já testei e foi homologado pelo banco.
Caso seja interessante, favor adicionar no trunc2 do projeto.
2 units sofrerão modificações ACBrBancoBradesco.pas e ACBrBoleto.pas
ACBrBancoBradesco.pas
function MontaInstrucoesCNAB400(const ACBrTitulo :TACBrTitulo; const nRegistro: Integer ): String; override;
function TACBrBancoBradesco.MontaInstrucoesCNAB400(
const ACBrTitulo: TACBrTitulo; const nRegistro: Integer): String;
var
lNossoNumero, lDigNossoNumero: String;
begin
Result := '';
ValidaNossoNumeroResponsavel(lNossoNumero, lDigNossoNumero, ACBrTitulo);
with ACBrTitulo, ACBrBoleto do
begin
{Primeira instrução vai no registro 1}
if Mensagem.Count <= 1 then
begin
Result := '';
Exit;
end;
Result := '2' + // IDENTIFICAÇÃO DO LAYOUT PARA O REGISTRO
Copy(PadRight(TiraAcentos(Mensagem[1]), 80, ' '), 1, 80); // CONTEÚDO DA 1ª LINHA DE IMPRESSÃO DA ÁREA "INSTRUÇÕES” DO BOLETO
if Mensagem.Count >= 3 then
Result := Result +
Copy(PadRight(TiraAcentos(Mensagem[2]), 80, ' '), 1, 80) // CONTEÚDO DA 2ª LINHA DE IMPRESSÃO DA ÁREA "INSTRUÇÕES” DO BOLETO
else
Result := Result + PadRight('', 80, ' '); // CONTEÚDO DO RESTANTE DAS LINHAS
if Mensagem.Count >= 4 then
Result := Result +
Copy(PadRight(TiraAcentos(Mensagem[3]), 80, ' '), 1, 80) // CONTEÚDO DA 3ª LINHA DE IMPRESSÃO DA ÁREA "INSTRUÇÕES” DO BOLETO
else
Result := Result + PadRight('', 80, ' '); // CONTEÚDO DO RESTANTE DAS LINHAS
if Mensagem.Count >= 5 then
Result := Result +
Copy(PadRight(TiraAcentos(Mensagem[4]), 80, ' '), 1, 80) // CONTEÚDO DA 4ª LINHA DE IMPRESSÃO DA ÁREA "INSTRUÇÕES” DO BOLETO
else
Result := Result + PadRight('', 80, ' '); // CONTEÚDO DO RESTANTE DAS LINHAS
Result := Result +
IfThen(DataDesconto2 < EncodeDate(2000,01,01),PadLeft('', 6, '0'),
FormatDateTime( 'ddmmyy', DataDesconto2)) + // 322 a 327 - Data limite para concessão de Desconto 2
IntToStrZero( round( ValorDesconto2 * 100 ), 13) + // 328 a 340 - Valor do Desconto 2
IfThen(DataDesconto3 < EncodeDate(2000,01,01),PadLeft('', 6, '0'),
FormatDateTime( 'ddmmyy', DataDesconto3)) + // 341 a 346 - Data limite para concessão de Desconto 3
IntToStrZero( round( ValorDesconto3 * 100 ), 13) + // 347 a 359 - Valor do Desconto 3
space(7) + // 360 a 366 - Reserva
IntToStrZero(StrToIntDef(trim(Carteira), 0), 3) +
IntToStrZero(StrToIntDef(OnlyNumber(ACBrBoleto.Cedente.Agencia), 0), 5) +
IntToStrZero(StrToIntDef(OnlyNumber(ACBrBoleto.Cedente.Conta) , 0), 7) +
Cedente.ContaDigito +
lNossoNumero + lDigNossoNumero +
IntToStrZero( nRegistro + 1, 6); // Nº SEQÜENCIAL DO REGISTRO NO ARQUIVO
end;
end;
function TACBrBancoBradesco.GerarRegistroTransacao240(ACBrTitulo: TACBrTitulo): String;
var
ATipoOcorrencia,
ATipoBoleto,
ADataMoraJuros,
ACodigoMoraJuros,
ACodigoDesconto: String;
ADataDesconto,
ACodigoMulta,
ADataMulta,
ATipoAceite,
AEspecieDoc: String;
Fsequencia:Integer;
FdigitoNossoNumero: String;
FcodCarteira: String;
ACodProtesto: String;
ListTransacao: TStringList;
begin
Fsequencia := 3 * ACBrTitulo.ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo);
//Caracteristica Título
FcodCarteira := DefineCaracTitulo(ACBrTitulo);
//Digito Nosso Número
FdigitoNossoNumero := CalcularDigitoVerificador(ACBrTitulo);
{Código para Protesto}
ACodProtesto := DefineTipoDiasProtesto(ACBrTitulo);
{Tipo de Ocorrencia}
ATipoOcorrencia := TipoOcorrenciaToCodRemessa(ACBrTitulo.OcorrenciaOriginal.Tipo);
{Aceite do Titulo }
ATipoAceite := DefineAceite(ACBrTitulo);
{Especie Documento}
AEspecieDoc := DefineEspecieDoc(ACBrTitulo);
{Responsavel Emissão}
ATipoBoleto := DefineResponsEmissao;
{Código Mora}
ACodigoMoraJuros := DefineCodigoMoraJuros(ACBrTitulo);
{Data Mora}
ADataMoraJuros := DefineDataMoraJuros(ACBrTitulo);
{Código Desconto}
ACodigoDesconto := DefineCodigoDesconto(ACBrTitulo);
{Data Desconto}
ADataDesconto := DefineDataDesconto(ACBrTitulo);
{Código Multa}
ACodigoMulta := DefineCodigoMulta(ACBrTitulo);
{Data Multa}
ADataMulta := DefineDataMulta(ACBrTitulo);
ListTransacao:= TStringList.Create;
try
with ACBrTitulo do
begin
{REGISTRO P}
ListTransacao.Add(IntToStrZero(ACBrBanco.Numero, 3) + //1 a 3 - Código do banco
'0001' + //4 a 7 - Lote de serviço
'3' + //8 - Tipo do registro: Registro detalhe
IntToStrZero(Fsequencia+1,5) + //Nº Sequencial do Registro no Lote 9 13 5 - Num *G038
'P' + //14 - Código do segmento do registro detalhe
' ' + //15 - Uso exclusivo FEBRABAN/CNAB: Branco
ATipoOcorrencia + //Código de Movimento Remessa 16 17 2 - Num *C004
PadLeft(OnlyNumber(ACBrTitulo.ACBrBoleto.Cedente.Agencia), 5, '0') + //18 a 22 - Agência mantenedora da conta
PadRight(ACBrBoleto.Cedente.AgenciaDigito, 1 , '0') + //23 -Dígito verificador da agência
PadLeft(ACBrBoleto.Cedente.conta, 12, '0') + //24 a 35 - Número da Conta Corrente
Padleft(ACBrBoleto.Cedente.ContaDigito, 1 , '0') + //36 a 36 Dígito Verificador da Conta Alfa *G011
' ' + //Retornaram que deve gravar vazio .. contrario ao layout
//PadLeft(Copy(Fconta,Length(Fconta) ,1 ),1, ' ') + //37-37Dígito Verificador da Ag/Conta 37 37 1 - Alfa *G012
PadLeft(ACBrTitulo.Carteira, 3, '0') + //38-40 Identificação do Produto 38 40 3 Num *G069
PadLeft('0', 5, '0') + //Zeros 41 45 5 Num *G069
PadLeft(NossoNumero, 11, '0') + //Nosso Número 46 56 11 Num *G069
PadLeft(FdigitoNossoNumero,1,'0') + //Digito do nosso Número 57 57 1 Num *G069
PadLeft(FcodCarteira,1,'0' ) + //Código da Carteira 58 58 1 - Num *C006
'1' + //Forma de Cadastr. do Título no Banco 59 59 1 - Num *C007 1-cobrança Registrada
'1' + //Tipo de Documento 60 60 1 - Alfa C008 -1-Tradicional
ATipoBoleto + //Identificação da Emissão do Bloqueto 61 61 1 - Num *C009
ATipoBoleto +//Identificação da Distribuição 62 62 1 - Alfa C010 -Quem emite que distribua...
PadRight(NumeroDocumento, 15, ' ') + //Número do Documento de Cobrança 63 77 15 - Alfa *C011
FormatDateTime('ddmmyyyy', Vencimento) + //Data de Vencimento do Título 78 85 8 - Num *C012
IntToStrZero( round( ValorDocumento * 100), 15) + //Valor Nominal do Título 86 100 13 2 Num *G070
Padleft('0', 5, '0') + //Agência Encarregada da Cobrança 101 105 5 - Num *C014
'0' + //Dígito Verificador da Agência 106 106 1 - Alfa *G009
PadRight(AEspecieDoc, 2) + //Espécie do Título 107 108 2 - Num *C015
ATipoAceite + //Identific. de Título Aceito/Não Aceito 109 109 1 - Alfa C016
FormatDateTime('ddmmyyyy', DataDocumento) + //Data da Emissão do Título 110 117 8 - Num G071
ACodigoMoraJuros + //Código do Juros de Mora 118 118 1 - Num *C018 '1' = Valor por Dia'2' = Taxa Mensal '3' = Isento
ADataMoraJuros + //Data do Juros de Mora 119 126 8 - Num *C019
IfThen(ValorMoraJuros > 0, IntToStrZero(round(ValorMoraJuros * 100), 15),PadRight('', 15, '0')) + //juros de Mora por Dia/Taxa 127 141 13 2 Num C020
ACodigoDesconto + //Código do Desconto 1 142 142 1 - Num *C021
ADataDesconto + //Data do Desconto 1 143 150 8 - Num C022
IfThen(ValorDesconto > 0, IntToStrZero(
round(ValorDesconto * 100), 15),PadRight('', 15, '0'))
+ //Valor/Percentual a ser Concedido 151 165 13 2 Num C023
IntToStrZero( round(ValorIOF * 100), 15) + //Valor do IOF a ser Recolhido 166 180 13 2 Num C024
IntToStrZero( round(ValorAbatimento * 100), 15) + //Valor do Abatimento 181 195 13 2 Num G045
PadRight(IfThen(SeuNumero <> '',SeuNumero,NumeroDocumento), 25, ' ') + //Identificação do Título na Empresa 196 220 25 - Alfa G072
IfThen((DataProtesto <> 0) and (DiasDeProtesto > 0), ACodProtesto, '3') + //Código para Protesto 221 221 1 - Num C026
IfThen((DataProtesto <> 0) and (DiasDeProtesto > 0),
PadLeft(IntToStr(DiasDeProtesto), 2, '0'), '00') + //Número de Dias para Protesto 222 223 2 - Num C027
IfThen((DataBaixa <> 0) and (DataBaixa > Vencimento), '1', '2') + //Código para Baixa/Devolução 224 224 1 - Num C028
IfThen((DataBaixa <> 0) and (DataBaixa > Vencimento),PadLeft(IntToStr(DaysBetween(DataBaixa, Vencimento)), 3, '0'), '000') + //Número de Dias para Baixa/Devolução 225 227 3 - Alfa C029
'09' + //Código da Moeda 228 229 2 - Num *G065 '09' = Real
PadRight('', 10 , '0') + //Nº do Contrato da Operação de Créd. 230 239 10 - Num C030
' '); //240 - Uso exclusivo FEBRABAN/CNAB
{SEGMENTO Q}
ListTransacao.Add(IntToStrZero(ACBrBanco.Numero, 3) + //Código do Banco na Compensação 1 3 3 - Num G001
'0001' + //Lote Lote de Serviço 4 7 4 - Num *G002
'3' + //Tipo de Registro 8 8 1 - Num ‘3’ *G003
IntToStrZero(Fsequencia+ 2 ,5) + //Nº Sequencial do Registro no Lote 9 13 5 - Num *G038
'Q' + //Cód. Segmento do Registro Detalhe 14 14 1 - Alfa ‘Q’ *G039
' ' + //Uso Exclusivo FEBRABAN/CNAB 15 15 1 - Alfa Brancos G004
ATipoOcorrencia + //Código de Movimento Remessa 16 17 2 - Num *C004
{Dados do sacado}
IfThen(Sacado.Pessoa = pJuridica,'2','1') + //Tipo Tipo de Inscrição 18 18 1 - Num *G005
PadLeft(OnlyNumber(Sacado.CNPJCPF), 15, '0') + //Número Número de Inscrição 19 33 15 - Num *G006
PadRight(Sacado.NomeSacado, 40, ' ') + //Nome 34 73 40 - Alfa G013
PadRight(Sacado.Logradouro + ' ' + Sacado.Numero +' ' + Sacado.Complemento , 40, ' ') + //Endereço 74 113 40 - Alfa G032
PadRight(Sacado.Bairro, 15, ' ') + //Bairro 114 128 15 - Alfa G032
PadLeft(copy(OnlyNumber(ACBrTitulo.Sacado.CEP),0,5), 5, '0') + //CEP 129 133 5 - Num G034
PadRight(copy(OnlyNumber(ACBrTitulo.Sacado.CEP),length(OnlyNumber(ACBrTitulo.Sacado.CEP))-2,3), 3, ' ') + //Sufixo do CEP 134 136 3 - Num G035
PadRight(Sacado.Cidade, 15, ' ') + // Cidade 137 151 15 - Alfa G033
PadRight(Sacado.UF, 2, ' ') + //Unidade da Federação 152 153 2 - Alfa G036
{Dados do sacador/avalista}
'0' + // 154 a 154 - Tipo de Inscrição 154 154 1 - Num *G005
PadRight('', 15, '0') + // Número de Inscrição 155 169 15 - Num *G006
PadRight('', 40, ' ') + // Nome do Pagadorr/Avalista 170 209 40 - Alfa G013
PadRight('0', 3, '0') + // Cód. Bco. Corresp. na Compensação 210 212 3 - Num *C031
PadRight('',20, ' ') + // Nosso Nº no Banco Correspondente 213 232 20 - Alfa *C032
PadRight('', 8, ' ')); // FEBRABAN/CNAB 233 240 8 - Alfa Brancos G004
{SEGMENTO R OPCIONAL }
ListTransacao.Add(IntToStrZero(ACBrBanco.Numero, 3) + //Código do Banco na Compensação 1 3 3 - Num G001
'0001' + //Lote de Serviço 4 7 4 - Num *G002
'3' + //Tipo de Registro 8 8 1 - Num ‘3’ *G003
IntToStrZero(Fsequencia+ 3 ,5) + //Nº Sequencial do Registro no Lote 9 13 5 - Num *G038
'R' + //Cód. Segmento do Registro Detalhe 14 14 1 - Alfa ‘R’ *G039
' ' + //CNAB Uso Exclusivo FEBRABAN/CNAB 15 15 1 - Alfa Brancos G004
ATipoOcorrencia + //Código de Movimento Remessa 16 17 2 - Num *C004
TipoDescontoToString(TipoDesconto2) + //Código do Desconto 2 18 18 1 - Num *C021
IfThen(TipoDesconto2<>tdNaoConcederDesconto,
IfThen(DataDesconto2 < EncodeDate(2000,01,01),
PadLeft('',8,'0'),
FormatDateTime( 'ddmmyyyy', DataDesconto2)),
PadLeft('',8,'0')) + //Data do Desconto 2 19 26 8 - Num C022
IfThen(TipoDesconto2<>tdNaoConcederDesconto,
IfThen(ValorDesconto2>0,
IntToStrZero(round(ValorDesconto2 * 100), 15),
PadLeft('',15,'0'))) + //Valor/Percentual a ser Concedido 27 41 13 2 Num C023
TipoDescontoToString(TipoDesconto3) + //Código do Desconto 3 42 42 1 - Num *C021
IfThen(TipoDesconto3<>tdNaoConcederDesconto,
IfThen(DataDesconto3 < EncodeDate(2000,01,01),
PadLeft('', 8, '0'),
FormatDateTime( 'ddmmyyyy', DataDesconto3)),
PadLeft('',8,'0')) + //Data do Desconto 3 43 50 8 - Num C022
IfThen(TipoDesconto3<>tdNaoConcederDesconto,
IfThen(ValorDesconto3>0,
IntToStrZero(round(ValorDesconto3 * 100), 15),
PadLeft('',15,'0'))) + //Valor/Percentual a Ser Concedido 51 65 13 2 Num C023
ADataMulta + //Data da Multa 67 74 8 - Num G074
IfThen(PercentualMulta > 0,
IntToStrZero(round(PercentualMulta * 100), 15),
PadRight('', 15, '0')) + //Multa Valor/Percentual a Ser Aplicado 75 89 13 2 Num G075
PadRight('', 10, ' ') + //Informação ao Pagador Informação ao Pagador 90 99 10 - Alfa *C036
PadRight('', 40, ' ') + //Informação 3 Mensagem 3 100 139 40 - Alfa *C037
PadRight('', 40, ' ') + //Mensagem 4 140 179 40 - Alfa *C037
PadRight('', 20, ' ') + //CNAB Uso Exclusivo FEBRABAN/CNAB 180 199 20 - Alfa Brancos G004
PadLeft('', 8, '0') +//Cód. Ocor. do Pagador 200 207 8 - Num *C038
PadLeft('', 3, '0') +//Cód. do Banco na Conta do Débito 208 210 3 - Num G001
PadLeft('', 5, '0') +//Código da Agência do Débito 211 215 5 - Num *G008
PadLeft('', 1, ' ') +//Dígito Verificador da Agência 216 216 1 - Alfa *G009
PadLeft('', 12, '0') +//Corrente para Débito 217 228 12 - Num *G010
PadLeft('', 1, ' ') +//Dígito Verificador da Conta 229 229 1 - Alfa *G011
PadLeft('', 1, ' ') +//DV Dígito Verificador Ag/Conta 230 230 1 - Alfa *G012
PadLeft('', 1, '3') +//Ident. da Emissão do Aviso Déb. Aviso para Débito Automático 231 231 1 - Num *C039
PadLeft('',9, ' ')); //CNAB Uso Exclusivo FEBRABAN/CNAB 232 240 9 - Alfa Brancos G004
end;
Result := RemoverQuebraLinhaFinal(ListTransacao.Text);
finally
ListTransacao.Free;
end;
end;
ACBrBoleto.pas
Na classe
TACBrTitulo adicionar o field:
fTipoDesconto3 : TACBrTipoDesconto;
Depois adicionar a propety
property TipoDesconto3 : TACBrTipoDesconto read fTipoDesconto3 write fTipoDesconto3;