Ir para conteúdo
  • Cadastre-se

dev botao

Erro "cnpj Deve Ter 14 Dígitos" Ao Processar Retorno Do Banco Santander


Ver Solução Respondido por leotelles,
  • Este tópico foi criado há 2595 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Boa tarde, fui processar um arquivo de retorno do banco Santander e ao processar recebi a seguinte mensagem:

 

 

CNPJ Deve ter 14 Dígitos. (Apenas números)

 

Debugando o código vi que ao executar esta rotina:

procedure TACBrCedente.SetCNPJCPF ( const AValue: String ) ;
var
   ACbrValidador: TACBrValidador;
   aux : String;
begin
   if trim(AValue) = '' then
   begin
      fCNPJCPF:= AValue;
      exit;
   end;

   if fCNPJCPF = AValue then
      exit;

   ACbrValidador := TACBrValidador.Create(Self);
   try
     with ACbrValidador do
     begin
        if TipoInscricao = pFisica then
           TipoDocto := docCPF
        else
           TipoDocto := docCNPJ;

        IgnorarChar := './-';
        RaiseExcept := True;

         Documento   := AValue;

        Validar;    // Dispara Exception se Documento estiver errado

        fCNPJCPF := Formatar;
     end;
   finally
      ACbrValidador.Free;
   end;
end;

A const AValue que estar sendo passada por parâmetro, tá vindo com um 0 antes do CNPJ o que acaba resultando em um CNPJ de tamanho 15. Para contornar o problema tive que deixar a função da seguinte forma:

procedure TACBrCedente.SetCNPJCPF ( const AValue: String ) ;
var
   ACbrValidador: TACBrValidador;
   aux : String;
begin
   if trim(AValue) = '' then
   begin
      fCNPJCPF:= AValue;
      exit;
   end;

   if fCNPJCPF = AValue then
      exit;

   ACbrValidador := TACBrValidador.Create(Self);
   try
     with ACbrValidador do
     begin
        if TipoInscricao = pFisica then
           TipoDocto := docCPF
        else
           TipoDocto := docCNPJ;

        //Verifica se o cpnj estar com o tamanho errado e copia somente a parte correta.
        if Length(AValue) = 15 then
           aux := copy(AValue,2,Length(AValue));

        IgnorarChar := './-';
        RaiseExcept := True;


        if aux <> '' then
            Documento := aux
        else
            Documento   := AValue;

        Validar;    // Dispara Exception se Documento estiver errado

        fCNPJCPF := Formatar;
     end;
   finally
      ACbrValidador.Free;
   end;
end;

post-3538-0-47777100-1423072646_thumb.pn

João Leno

Developer In Lunar Tecnologia
Formação: Bacharel em Sistemas de Informação
Pós Graduação: Infraestrutura e aplicações em redes de computadores (Cursando)
Cell: (84) 8135-9585
Skype: joaolenosi
Site: http://lunartecnologia.com.br/

Se não puder vencer pelo o talento, vença pelo o esforço.

Postado

Talvez, mas eu debugei todo o código e quando chegou nesse trecho de código vi, que ele estava acrescentando um 0 antes do CNPJ.

João Leno

Developer In Lunar Tecnologia
Formação: Bacharel em Sistemas de Informação
Pós Graduação: Infraestrutura e aplicações em redes de computadores (Cursando)
Cell: (84) 8135-9585
Skype: joaolenosi
Site: http://lunartecnologia.com.br/

Se não puder vencer pelo o talento, vença pelo o esforço.

  • Administradores
Postado

Bom dia.

 

Em nenhum momento o setCNPJCPF adiciona dígitos ao valor informado.

 

Att.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • 4 meses depois ...
Postado
Pessoal, eu consegui corrigir o problema.
 
Acontecia o seguinte:
 
No método LerRetorno240 da ACBrBancoSantander, o campo referente ao documento (CNPJ/CPF) é alimentado da seguinte maneira:
 
rCNPJCPF := OnlyNumber(Copy(ARetorno[0], 18, 15));
 
Só que há um problema nisso. o CNPJ tem 14 dígitos. da maneira que ACBrBoleto está tratando, ele está "pegando" do arquivo de retorno, um número que contém 15 dígitos.
 
No caso que eu estou testando, o CNPJ do cedente é "17718254000142".
A variável Cedente.CNPJCPF estava sendo alimentada com "017718254000142", o que acabava disparando a mensagem "CNPJ deve ter 14 dígitos. (Apenas números)" (que está no método ValidarCNPJ da ACBrValidador).
 
Quando alimentar a variável Cedente.CNPJCPF, a rCNPJCPF, que contém 15 caracteres, deve ser "cortada" para que passe a conter apenas 14 caracteres, eliminando o primeiro que é um zero. No caso do CPF, ela deve ser cortada para que passe a conter 11 caracteres.
 
Fiz algumas modificações no método LerRetorno240 da ACBrBancoSantander para resolver o problema. Em anexo está a unit modificada. Para facilitar a visualização das modificações, comentei os trechos alterados com a data de hoje (09/06/2015) e uma breve descrição. 
Abaixo estão descritas as mudanças.
 
- Criei a variável iNumDigitos para armazenar o número de dígitos do documento;
- Criei um if para alimentar a variável iNumDigitos de acordo com o Cedente.TipoInscricao: 11 para pessoa física (CPF) e 14 para pessoa jurídica (CNPJ);
- Na alimentação do Cedente.CNPJCPF, em vez de passar direto a rCnpjCpf, eu usei a função RightStr para cortar de acordo com o número de dígitos, ficando assim:
 
Cedente.CNPJCPF := RightStr(rCnpjCpf, iNumDigitos);
 
Isso resolveu o problema apresentado na postagem.
 
Se estiver tudo ok, peço, por gentileza, que subam essa alteração para o SVN.

ACBrBancoSantander.pas

  • Membros Pro
Postado (editado)

Olá, 

 

Tenho Santander Homologado a dois meses pelo ACBr, carteira registrada com remessa e retorno. Faço tratamento do retorno e não tenho esse problema relatado não. Pode ser que você esteja com o fonte desatualizado, pois no meu método LerRetorno240 do Santander a linha está assim:

 

  rCNPJCPF       := RightStr(OnlyNumber(Copy(ARetorno[0], 18, 15)), 14);
 
Que dispensaria todas as outras alterações, ao meu ver é claro.
 

Até mais,

Editado por aocampioni

-- 

Alexandre de Oliveira

Diretor de T.I.

xx16 3811 0155

www.consultatec.com.br - [email protected]

image.png.744a897bbf36127e428c6e687ef05731.png

 

  • Solution
Postado

Alexandre, meu fonte realmente estava desatualizado e a linha em questão estava diferente. Atualizei e funcionou. Conforme você disse, a linha estando da maneira como você postou, dispensa as alterações que eu fiz. Muito obrigado pela ajuda.

  • Curtir 1
  • 2 anos depois...
Postado

Boa tarde,

Como já existe um tópico estou reabrindo, pois estou passando por esse problema.

Por via das duvidas apaguei o ACBBancoSantander.pas e atualizei, e a leitura esta desta maneira :

  case StrToIntDef(Copy(ARetorno[0],17,1),0) of
    1: rCNPJCPF := Copy(ARetorno[0],22,11);
    2: rCNPJCPF := Copy(ARetorno[0],18,15);
  else
   rCNPJCPF := Copy(ARetorno[0],18,15);
  end;

 

Restaurei os fontes de 14/08/2017 e a linha esta dessa maneira :

rCNPJCPF       := RightStr(OnlyNumber(Copy(ARetorno[0], 18, 15)), 14);

Acredito que nas ultimas atualizações ouve alguma mudança.

 

Dercide.

 

 

Já existe um tópico novo relatando esse problema.

Dercide.

  • Este tópico foi criado há 2595 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

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.