Ir para conteúdo
  • Cadastre-se

dev botao

BoleCode Itau (Arquivo de Remessa)


Recommended Posts

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.
image.thumb.png.9db9aa15c5b66f41bb27a45d4b6a3d00.png

Abaixo com as mudanças que realizei

 

image.thumb.png.649d77307b9bbade2508b3020fb8d9bb.png

 

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

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 conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...