Boa tarde pessoal
Estive tendo uns probleminhas ao gerar a remessa para o sicredi,
o validador estava rejeitando o numero sequencial do registro do lote,
no arquivo de remessa layout cnab240, quando fiz o debug reparei que o problema,
está no seguinte trecho de codigo,
// Seguimento P
(3 * ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo)) + 1 , 5) + // 009 a 013 - Nº sequencial do registro do lote
// Seguimento Q
(3 * ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo)) + 2 , 5) + // 009 a 013 - Nº sequencial do registro do lote
Da forma que está o primeiro titulo, o sistema vai multiplicar
(3 * 0) + 1 = 1 (correto)
(3 * 0) + 2 = 2 (correto)
já nos proximos acontece o erro
(3 * 1) + 1 = 4
(3 * 1) + 2 = 5
(3 * 2) + 1 = 7
(3 * 2) + 2 = 8
(3 * 3) + 1 = 10
(3 * 3) + 2 = 11
Entao, alterei o codigo para multiplicar por 2, onde ficou tudo certo,
(2 * 0) + 1 = 1
(2 * 0) + 2 = 2
(2 * 1) + 1 = 3
(2 * 1) + 2 = 4
(2 * 2) + 1 = 5
(2 * 2) + 2 = 6
(2 * 3) + 1 = 7
(2 * 3) + 2 = 8
Segue a rotina completa alterada,
Dando uma olhada na classe do banco do brasil o mesmo problema vai ocorrer.
function TACBrBancoSicredi.GerarRegistroTransacao240(
ACBrTitulo: TACBrTitulo): String;
var
AceiteStr, CodProtesto, DiasProtesto, TipoSacado: String;
DigitoNossoNumero, Especie, EndSacado: String;
TipoAvalista: Char;
begin
with ACBrBanco.ACBrBoleto.Cedente, ACBrTitulo do
begin
{Nosso Número}
DigitoNossoNumero := CalcularDigitoVerificador(ACBrTitulo);
{Aceite}
case Aceite of
atSim: AceiteStr := 'A';
atNao: AceiteStr := 'N';
end;
{Espécie}
if (EspecieDoc = 'DM') then
Especie := '03'
else if (EspecieDoc = 'DMI') then
Especie := '03'
else
Especie := '99';
{Protesto}
CodProtesto := '3';
DiasProtesto := '00';
if (DataProtesto > 0) and (DataProtesto > Vencimento) then
begin
CodProtesto := '1';
DiasProtesto := padR(IntToStr(DaysBetween(DataProtesto, Vencimento)), 2, '0');
end;
{Sacado}
case Sacado.Pessoa of
pFisica: TipoSacado := '1';
pJuridica: TipoSacado := '2';
else
TipoSacado := '9';
end;
EndSacado := Sacado.Logradouro;
if (Sacado.Numero <> '') then
EndSacado := EndSacado + ', ' + Sacado.Numero;
EndSacado := padL(trim(EndSacado), 40);
{Avalista}
case Sacado.SacadoAvalista.Pessoa of
pFisica: TipoAvalista := '1';
pJuridica: TipoAvalista := '2';
else
TipoAvalista := '9';
end;
{SEGMENTO P}
Result:= '748' + // 001 a 003 - Código do banco na compensação
'0001' + // 004 a 007 - Lote de serviço = "0001"
'3' + // 008 a 008 - Tipo de registro = "3" DETALHE
IntToStrZero(
// (3 * ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo)) + 1 , 5) + // 009 a 013 - Nº sequencial do registro do lote
// alterei aqui
(2 * ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo)) + 1 , 5) + // 009 a 013 - Nº sequencial do registro do lote
'P' + // 014 a 014 - Cód. segmento do registro detalhe
Space(1) + // 015 a 015 - Uso exclusivo FEBRABAN/CNAB
'01' + // 016 a 017 - Código de movimento remessa
padL(OnlyNumber(Agencia), 5,'0') + // 018 a 022 - Agência mantenedora da conta
Space(1) + // 023 a 023 - Dígito verificador da agência
padL(OnlyNumber(Conta), 12, '0') + // 024 a 035 - Número da conta corrente
padR(OnlyNumber(ContaDigito), 1) + // 036 a 036 - Dígito verificador da conta
Space(1) + // 037 a 037 - Dígito verificador da coop/ag/conta
padL(NossoNumero + DigitoNossoNumero, 20, '0') + // 038 a 057 - Identificação do título no banco
'1' + // 058 a 058 - Código da carteira
'1' + // 059 a 059 - Forma de cadastro do título no banco
'2' + // 060 a 060 - Tipo de documento
'2' + // 061 a 061 - Identificação de emissão do bloqueto
'2' + // 062 a 062 - Identificação da distribuição
padL(NumeroDocumento, 15) + // 063 a 077 - Nº do documento de cobrança
FormatDateTime('ddmmyyyy', Vencimento) + // 078 a 085 - Data de vencimento do título
IntToStrZero(Round(ValorDocumento * 100), 15) + // 086 a 100 - Valor nominal do título
'00000' + // 101 a 105 - Coop./Ag. encarregada da cobrança
Space(1) + // 106 a 106 - Dígito verificador da coop./agência
padR(Especie, 2, '0') + // 107 a 108 - Espécie do título
AceiteStr + // 109 a 109 - Identificação de título aceito/não aceito
FormatDateTime('ddmmyyyy', DataDocumento) + // 110 a 117 - Data da emissão do título
'1' + // 118 a 118 - Código do juro de mora
'00000000' + // 119 a 126 - Data do juro de mora
IntToStrZero(Round(ValorMoraJuros * 100), 15) + // 127 a 141 - Juros de mora por dia/taxa
'1' + // 142 a 142 - Código do desconto 1
FormatDateTime('ddmmyyyy', Vencimento) + // 143 a 150 - Data do desconto 1
IntToStrZero(Round(ValorDesconto * 100), 15) + // 151 a 165 - Valor percentual a ser concedido
IntToStrZero(Round(ValorIOF * 100), 15) + // 166 a 180 - Valor do IOF a ser recolhido
IntToStrZero(Round(ValorAbatimento * 100), 15) + // 181 a 195 - Valor do abatimento
padL(NumeroDocumento, 25) + // 196 a 220 - Identificação do título na empresa
CodProtesto + // 221 a 221 - Código para protesto
DiasProtesto + // 222 a 223 - Número de dias para protesto
'1' + // 224 a 224 - Código para baixa/devolução
'060' + // 225 a 227 - Nº de dias para baixa/devolução
'09' + // 228 a 229 - Código da moeda = "09"
padL('', 10, '0') + // 230 a 239 - Nº do contrato da operação de crédito
Space(1); // 240 a 240 - Uso exclusivo FEBRABAN/CNAB
{SEGMENTO Q}
Result:= Result + #13#10 +
'748' + // 001 a 003 - Código do banco na compensação
'0001' + // 004 a 007 - Lote de serviço = "0001"
'3' + // 008 a 008 - Tipo de registro = "3" DETALHE
IntToStrZero(
// (3 * ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo)) + 2 , 5) + // 009 a 013 - Nº sequencial do registro do lote
// alterei aqui
(2 * ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo)) + 2 , 5) + // 009 a 013 - Nº sequencial do registro do lote
'Q' + // 014 a 014 - Cód. segmento do registro detalhe
Space(1) + // 015 a 015 - Uso exclusivo FEBRABAN/CNAB
'01' + // 016 a 017 - Código de movimento de remessa
TipoSacado + // 018 a 018 - Tipo de inscrição
padR(OnlyNumber(Sacado.CNPJCPF), 15, '0') + // 019 a 033 - Número de inscrição
padL(Sacado.NomeSacado, 40) + // 034 a 073 - Nome
EndSacado + // 074 a 113 - Endereço
padL(Sacado.Bairro, 15) + // 114 a 128 - Bairro
Copy(padR(OnlyNumber(Sacado.CEP),8,'0'),1,5) + // 129 a 133 - CEP
Copy(padR(OnlyNumber(Sacado.CEP),8,'0'),6,3) + // 134 a 136 - Sufixo do CEP
padL(Sacado.Cidade, 15) + // 137 a 151 - Cidade
padR(UF, 2) + // 152 a 153 - Unidade da Federação
TipoAvalista + // 154 a 154 - Tipo de inscrição
padL(Sacado.SacadoAvalista.CNPJCPF, 15, '0') + // 155 a 169 - Número de inscrição
padL(Sacado.SacadoAvalista.NomeAvalista,40,' ') + // 170 a 209 - Nome do sacador/avalista
padL('', 3, '0') + // 210 a 212 - Cód. bco corresp. na compensação
Space(20) + // 213 a 232 - Nosso nº no banco correspondente
Space(8); // 233 a 240 - Uso exclusivo FEBRABAN/CNAB
end;
Result := UpperCase(Result);
end;