WashingtonFelipe Postado 23 Abril Compartilhar Postado 23 Abril Bom dia, Recentemente, finalizei a homologação com o Itau em relação ao BoleCode por envio de arquivo de remessa. Aonde é gerada uma location (Vazia) e passo essa location no arquivo de remessa e o banco faz o registro. Abaixo o link aonde fiz a implementação da location vazia. Ao iniciar a homologação do arquivo de remessa, tive que fazer algumas mudanças. Segundo o pessoal do banco, existia 3 situações. 1° Posição da Identificação do registro bolecode estava após a identificação 5 e ela tem que ser antes, pois é a 3. 2° Quando vai enviar a location no arquivo de remessa não pode enviar a chave PIX. 3° A Posição aonde gera a location, tem que utilizar 100% de sua posição, completando com zeros a esquerda. Exemplo: Location é 123 Então tem que ficar 000000123(Colocando zeros a esquerda até a utilização total do campo). Porem, essa situação tratei direto em meu sistema ou seja, ele que vai gerar os zeros a esquerda e enviar para o arquivo de remessa já com os zeros. Abaixo uma imagem de como é hoje. Abaixo com as mudanças que realizei Abaixo o código completo e em anexo a unit alterada. procedure TACBrBancoItau.GerarRegistroTransacao400( ACBrTitulo: TACBrTitulo; aRemessa: TStringList); var ATipoCedente, ATipoSacado, ATipoSacadoAvalista, ATipoOcorrencia :String; ADataMoraJuros, ADataDesconto, ATipoAceite :String; ATipoEspecieDoc, ANossoNumero,wLinha,wCarteira :String; wLinhaMulta,LCPFCNPJBeneciciario :String; iSequencia : integer; begin with ACBrTitulo do begin {Tipo de Ocorrencia} ATipoOcorrencia := TipoOcorrenciaToCodRemessa(ACBrTitulo.OcorrenciaOriginal.Tipo); {Aceite do Titulo } ATipoAceite := DefineAceite(ACBrTitulo); {Especie Documento} ATipoEspecieDoc := DefineEspecieDoc(ACBrTitulo); {Data Mora} ADataMoraJuros := DefineDataMoraJuros(ACBrTitulo, 'ddmmyy'); {Descontos} ADataDesconto := DefineDataDesconto(ACBrTitulo, 'ddmmyy'); {Pegando Tipo de Cedente} ATipoCedente := DefineTipoBeneficiario(ACBrTitulo); if (StrToIntDef(ATipoCedente,0) in [3..4]) then LCPFCNPJBeneciciario := OnlyNumber(ACBrTitulo.Sacado.SacadoAvalista.CNPJCPF) else LCPFCNPJBeneciciario := ACBrBoleto.Cedente.CNPJCPF; {Pegando Tipo de Sacado} ATipoSacado:= DefineTipoSacado(ACBrTitulo); {Pegando Tipo de Sacado Avalista} ATipoSacadoAvalista := DefineTipoSacadoAvalista(ACBrTitulo); {Pegando campo Intruções conforme código protesto} InstrucoesProtesto(ACBrTitulo); DefineDataProtestoNegativacao(ACBrTitulo); with ACBrBoleto do begin wCarteira:= Trim(Carteira); {Cobrança sem registro com opção de envio de arquivo remessa} if (wCarteira = '102') or (wCarteira = '103') or (wCarteira = '107') or (wCarteira = '172') or (wCarteira = '173') or (wCarteira = '196') then begin ANossoNumero := MontarCampoNossoNumero(ACBrTitulo); wLinha:= '6' + // 6 - FIXO '1' + // 1 - FIXO PadLeft(OnlyNumber(Cedente.Agencia), 4, '0') + // AGÊNCIA MANTENEDORA DA CONTA '00' + // COMPLEMENTO DE REGISTRO PadLeft(OnlyNumber(Cedente.Conta), 5, '0') + // NÚMERO DA CONTA CORRENTE DA EMPRESA PadRight(Cedente.ContaDigito, 1) + // DÍGITO DE AUTO CONFERÊNCIA AG/CONTA EMPRESA PadLeft(Carteira,3,' ') + // NÚMERO DA CARTEIRA NO BANCO PadLeft(NossoNumero, 8, '0') + // IDENTIFICAÇÃO DO TÍTULO NO BANCO Copy(ANossoNumero, Length(ANossoNumero), 1) + // DAC DO NOSSO NÚMERO '0' + // 0 - R$ PadRight('R$', 4, ' ') + // LITERAL DE MOEDA IntToStrZero( round( ValorDocumento * 100), 13) + // VALOR NOMINAL DO TÍTULO PadRight(SeuNumero, 10, ' ') + // IDENTIFICAÇÃO DO TÍTULO NA EMPRESA FormatDateTime('ddmmyy', Vencimento) + // DATA DE VENCIMENTO DO TÍTULO PadLeft(ATipoEspecieDoc, 2, '0') + // ESPÉCIE DO TÍTULO ATipoAceite + // IDENTIFICAÇÃO DE TITILO ACEITO OU NÃO ACEITO FormatDateTime('ddmmyy', DataDocumento) + // DATA DE EMISSÃO {Dados do sacado} PadLeft(ATipoSacado, 2, '0') + // IDENTIFICAÇÃO DO TIPO DE INSCRIÇÃO/SACADO PadLeft(OnlyNumber(Sacado.CNPJCPF), 15, '0') + // Nº DE INSCRIÇÃO DO SACADO (CPF/CGC) PadRight(Sacado.NomeSacado, 30, ' ') + // NOME DO SACADO space(9) + // BRANCOS(COMPLEMENTO DE REGISTRO) PadRight(Sacado.Logradouro + ' ' + Sacado.Numero + ' ' + Sacado.Complemento , 40, ' ') + // RUA, NÚMERO E COMPLEMENTO DO SACADO PadRight(Sacado.Bairro, 12, ' ') + // BAIRRO DO SACADO PadLeft(OnlyNumber(Sacado.CEP), 8, '0') + // CEP DO SACADO PadRight(Sacado.Cidade, 15, ' ') + // CIDADE DO SACADO PadRight(Sacado.UF, 2, ' ') + // UF DO SACADO {Dados do sacador/avalista} PadRight(Sacado.SacadoAvalista.NomeAvalista, 30, ' ') + // NOME DO SACADOR/AVALISTA space(4) + // COMPLEMENTO DO REGISTRO PadRight(TiraAcentos(LocalPagamento), 55, ' ') + // LOCAL PAGAMENTO PadRight(' ', 55, ' ') + // LOCAL PAGAMENTO 2 '01' + // IDENTIF. TIPO DE INSCRIÇÃO DO SACADOR/AVALISTA PadRight(Sacado.SacadoAvalista.CNPJCPF, 15, '0') + // NÚMERO DE INSCRIÇÃO DO SACADOR/AVALISTA space(31) + // COMPLEMENTO DO REGISTRO IntToStrZero(aRemessa.Count + 1 , 6); // Nº SEQÜENCIAL DO REGISTRO NO ARQUIVO aRemessa.Add(UpperCase(wLinha)); wLinha := MontaInstrucoesCNAB400(ACBrTitulo, aRemessa.Count ); if not(wLinha = EmptyStr) then aRemessa.Add(UpperCase(wLinha)); //Result := DoMontaInstrucoes2(Result); // opcional end else {Carteira com registro} begin wLinha:= '1' + // 1 a 1 - IDENTIFICAÇÃO DO REGISTRO TRANSAÇÃO PadLeft(ATipoCedente,2,'0') + // TIPO DE INSCRIÇÃO DA EMPRESA PadLeft(OnlyNumber(LCPFCNPJBeneciciario),14,'0') + // Nº DE INSCRIÇÃO DA EMPRESA (CPF/CGC) PadLeft(OnlyNumber(Cedente.Agencia), 4, '0') + // AGÊNCIA MANTENEDORA DA CONTA '00' + // COMPLEMENTO DE REGISTRO PadLeft(OnlyNumber(Cedente.Conta), 5, '0') + // NÚMERO DA CONTA CORRENTE DA EMPRESA PadRight(Cedente.ContaDigito, 1) + // DÍGITO DE AUTO CONFERÊNCIA AG/CONTA EMPRESA space(4) + // COMPLEMENTO DE REGISTRO '0000' + // CÓD.INSTRUÇÃO/ALEGAÇÃO A SER CANCELADA PadRight(SeuNumero, 25, ' ') + // IDENTIFICAÇÃO DO TÍTULO NA EMPRESA PadLeft(NossoNumero, 8, '0') + // IDENTIFICAÇÃO DO TÍTULO NO BANCO '0000000000000' + // QUANTIDADE DE MOEDA VARIÁVEL PadLeft(Carteira,3,' ') + // NÚMERO DA CARTEIRA NO BANCO space(21) + // IDENTIFICAÇÃO DA OPERAÇÃO NO BANCO 'I' + // CÓDIGO DA CARTEIRA ATipoOcorrencia + // IDENTIFICAÇÃO DA OCORRÊNCIA PadRight(NumeroDocumento, 10, ' ') + // Nº DO DOCUMENTO DE COBRANÇA (DUPL.,NP ETC.) FormatDateTime('ddmmyy', Vencimento) + // DATA DE VENCIMENTO DO TÍTULO IntToStrZero( round( ValorDocumento * 100), 13) + // VALOR NOMINAL DO TÍTULO IntToStrZero(ACBrBanco.Numero, 3) + // Nº DO BANCO NA CÂMARA DE COMPENSAÇÃO '00000' + // AGÊNCIA ONDE O TÍTULO SERÁ COBRADO PadLeft(ATipoEspecieDoc, 2, '0') + // ESPÉCIE DO TÍTULO ATipoAceite + // IDENTIFICAÇÃO DE TITILO ACEITO OU NÃO ACEITO FormatDateTime('ddmmyy', DataDocumento) + // DATA DA EMISSÃO DO TÍTULO PadLeft(trim(ACBrStr(Instrucao1)), 2, '0') + // 1ª INSTRUÇÃO PadLeft(trim(ACBrStr(Instrucao2)), 2, '0') + // 2ª INSTRUÇÃO IntToStrZero( round(ValorMoraJuros * 100 ), 13) + // VALOR DE MORA POR DIA DE ATRASO ADataDesconto + // DATA LIMITE PARA CONCESSÃO DE DESCONTO IfThen(ValorDesconto > 0, IntToStrZero( round(ValorDesconto * 100), 13), PadLeft('', 13, '0')) + // VALOR DO DESCONTO A SER CONCEDIDO IntToStrZero( round(ValorIOF * 100), 13) + // VALOR DO I.O.F. RECOLHIDO P/ NOTAS SEGURO IntToStrZero( round(ValorAbatimento * 100), 13) + // VALOR DO ABATIMENTO A SER CONCEDIDO {Dados do sacado} PadLeft(ATipoSacado, 2, '0') + // IDENTIFICAÇÃO DO TIPO DE INSCRIÇÃO/SACADO PadLeft(OnlyNumber(Sacado.CNPJCPF), 14, '0') + // Nº DE INSCRIÇÃO DO SACADO (CPF/CGC) PadRight(Sacado.NomeSacado, 30, ' ') + // NOME DO SACADO space(10) + // BRANCOS(COMPLEMENTO DE REGISTRO) PadRight(Sacado.Logradouro + ' '+ Sacado.Numero + ' ' + Sacado.Complemento , 40, ' ') + // RUA, NÚMERO E COMPLEMENTO DO SACADO PadRight(Sacado.Bairro, 12, ' ') + // BAIRRO DO SACADO PadLeft(OnlyNumber(Sacado.CEP), 8, '0') + // CEP DO SACADO PadRight(Sacado.Cidade, 15, ' ') + // CIDADE DO SACADO PadRight(Sacado.UF, 2, ' ') + // UF DO SACADO {Dados do sacador/avalista} PadRight(Sacado.SacadoAvalista.NomeAvalista, 30, ' ') + // NOME DO SACADOR/AVALISTA space(4) + // COMPLEMENTO DO REGISTRO ADataMoraJuros + // DATA DE MORA IfThen((DataProtestoNegativacao <> 0) and (DataProtestoNegativacao > Vencimento), PadLeft(DiasProtestoNegativacao , 2, '0'), '00')+ // PRAZO space(1) + // BRANCOS IntToStrZero(aRemessa.Count + 1, 6); // Nº SEQÜENCIAL DO REGISTRO NO ARQUIVO iSequencia := aRemessa.Count + 1; aRemessa.Add(UpperCase(wLinha)); //Registro Complemento Detalhe - Multa if PercentualMulta > 0 then begin inc( iSequencia ); wLinhaMulta:= '2' + // Tipo de registro - 2 OPCIONAL – COMPLEMENTO DETALHE - MULTA IfThen(MultaValorFixo,'1','2') + // Cocidgo da Multa 1- Cobrar Multa Valor Fixo / 2- Percentual / 0-Não cobrar multa ifThen((DataMulta > 0), FormatDateTime('ddmmyyyy', DataMulta), Poem_Zeros('',8)) + // Data da Multa 9(008) IntToStrZero( round(PercentualMulta * 100 ), 13) + // Valor/Percentual 9(013) space(371) + // Complemento IntToStrZero(iSequencia , 6); // Sequencial aRemessa.Add(UpperCase(wLinhaMulta)); end; {Registro Híbrido - Bolecode} if (NaoEstaVazio(ACBrBoleto.Cedente.PIX.Chave)) then begin wLinha := '3' + // 001 a 001 - Identificação do registro bolecode (3) PadRight(IfThen(QrCode.txId = '', ACBrBoleto.Cedente.PIX.Chave, ''), 77, ' ') + // 002 a 078 - Chave Pix (opicional) PadRight(QrCode.txId, 64, ' ') + // 079 a 142 - ID DA URL DO QR CODE PIX (opcional) PadRight('', 252, ' ') + // 143 a 394 - Brancos IntToStrZero(ARemessa.Count + 1, 6); iSequencia := aRemessa.Count + 1; // 395 a 400 - Número sequencial do registro ARemessa.Text:= ARemessa.Text + UpperCase(wLinha); end; //OPCIONAL – COBRANÇA E-MAIL E/OU DADOS DO SACADOR AVALISTA if (Sacado.Email <> '') or (Sacado.SacadoAvalista.CNPJCPF <> '') then begin inc( iSequencia ); wLinhaMulta:= '5' + // 001 - 001 Tipo de registro - 5 IDENTIFICAÇÃO DO REGISTRO TRANSAÇÃO PadRight(Sacado.Email, 120, ' ') + // 002 - 121 ENDEREÇO DE E-MAIL ENDEREÇO DE E-MAIL DO PAGADOR PadLeft(ATipoSacadoAvalista, 2, '0') + // 122 - 123 CÓDIGO DE INSCRIÇÃO IDENT. DO TIPO DE INSCRIÇÃO DO SACADOR/AVALISTA PadLeft(OnlyNumber(Sacado.SacadoAvalista.CNPJCPF), 14, '0') + // 124 - 137 NÚMERO DE INSCRIÇÃO NÚMERO DE INSCRIÇÃO DO SACADOR AVALISTA PadRight(Sacado.SacadoAvalista.Logradouro + ' ' + Sacado.SacadoAvalista.Numero + ' ' + Sacado.SacadoAvalista.Complemento , 40, ' ') + // 138 - 177 RUA, Nº E COMPLEMENTO DO SACADOR AVALISTA PadRight(Sacado.SacadoAvalista.Bairro, 12, ' ') + // 178 - 189 BAIRRO DO SACADOR AVALISTA PadLeft(OnlyNumber(Sacado.SacadoAvalista.CEP), 8, '0') + // 190 - 197 CEP DO SACADOR AVALISTA PadRight(Sacado.SacadoAvalista.Cidade, 15, ' ') + // 198 - 212 CIDADE DO SACADOR AVALISTA PadRight(Sacado.SacadoAvalista.UF, 2, ' ') + // 213 - 214 UF (ESTADO) DO SACADOR AVALISTA space(139) + // 215 - 353 Brancos //para se operar com mais de um desconto (depende de cadastramento prévio do indicador 19.0 pelo Itaú, conforme Item 5) IfThen(ValorDesconto2>0, // Alternativamente este campo poderá ter dois outros usos (SACADOR/AVALISTA ou 2 e 3 descontos) FormatDateTime('ddmmyy', DataDesconto2), // 354 - 359 Data do 2º desconto (DDMMAA) space(6)) + IfThen(ValorDesconto2>0, IntToStrZero(round(ValorDesconto2 * 100), 13), // 360 - 372 Valor do 2º desconto space(13)) + IfThen(ValorDesconto3>0, FormatDateTime('ddmmyy', DataDesconto3), // 373 - 378 Data do 3º desconto (DDMMAA) space(6)) + IfThen(ValorDesconto3>0, IntToStrZero(round(ValorDesconto3 * 100), 13), // 379 - 391 Valor do 3º desconto space(13)) + space(3) + // 392 - 394 COMPLEMENTO DE REGISTRO IntToStrZero(iSequencia , 6); // 395 - 400 Sequencial aRemessa.Add(UpperCase(wLinhaMulta)); end; end; end; end; end; Observação, já passei pela homologação do banco com essas modificações e já realizamos testes de pagamento do QRCode do PIX e o cliente já está utilizando este processo. Lembrando que no itau existe 2 opções de Pix por aquivo de remessa. 1° é aonde informo a chave pix na identificação 3 e o banco que é responsavel por gerar o pix(copia e cola) e depois só pego essa informação no retorno e vinculo a impressão do boleto. 2° gero a location vazia e mando no arquivo de remessa, como mencionei acima, desta forma não tem a necessidade de pegar o pix(copia e cola) no retorno do boleto. No meu caso utilizei a opção 2. Link para o comentário Compartilhar em outros sites More sharing options...
Moderadores Juliomar Marchetti Postado 23 Abril Moderadores Compartilhar Postado 23 Abril Está sugerindo mudanças? se sim por favor anexe o arquivo com a alteração no fórum Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Link para o comentário Compartilhar em outros sites More sharing options...
WashingtonFelipe Postado 23 Abril Autor Compartilhar Postado 23 Abril Boa tarde, Sim, tive que realizar algumas alterações na unit ACBrBancoItau.pas para que funcionasse o boleCode por arquivo de remessa. ACBrBancoItau.pas Link para o comentário Compartilhar em outros sites More sharing options...
Recommended Posts
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora