Ir para conteúdo
  • Cadastre-se

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

Recommended Posts

Postado

Bom dia.

 

Estou tentando transmitir esta nota e sempre dá esta mensagem de alerta:

TAG:<det nItem="1"><prod><DI> ID:I19/nDI(Numero do Documento de Importação DI/DSI/DA) - Conteúdo inválido.

 

Já atualizei schemas, já atualizei o ACBR e nada de transmitir. Se alguém puder ajudar. No emissor gratuito transmite normal só que fica sem a data de registro e a data de desembaraço da DI.

 

Agradeço qualquer atenção.

Patrícia.

31131238465803000194550010000188661000188665-nfe.xml

Postado

Sim, os schemas estão atualizados.

 

Olhei os fontes do Acbr e descobri uma validação do número da DI:

 

class function DFeUtil.ValidaDIDSI(AValue: string): Boolean;
var
 ano: Integer;
begin
 // AValue = TAANNNNNNND
 // Onde: T Identifica o tipo de documento ( 2 = DI e 4 = DSI )
 //       AA Ano corrente da geração do documento
 //       NNNNNNN Número sequencial dentro do Ano ( 7 dígitos )
 //       D Dígito Verificador, Módulo 11, Pesos de 2 a 9
 AValue := LimpaNumero(AValue);
 ano := StrToInt(Copy(IntToStr(YearOf(Date)), 3, 2));
 if length(AValue) <> 11 then
   Result := False
 else if (copy(Avalue, 1, 1) <> '2') and (copy(Avalue, 1, 1) <> '4') then
        Result := False
      else if not ((StrToInt(copy(Avalue, 2, 2)) >= ano -1) and (StrToInt(copy(Avalue, 2, 2)) <= ano +1)) then
             Result := False
           else
             Result := copy(AValue, 11, 1) = Modulo11(AValue);
end;

 

O problema esta ai: if length(AValue) <> 11 then

com a mudança na NT2011/004 o número da DI pode ser de 12 dígitos.

Dá uma conferida neste código por favor. Vou mudar aqui e ver se funciona.

 

Obrigada.

Patrícia

  • Moderadores
Postado

Verifiquei é a validação é feita sempre, e realmente está validando os 11 digitos, eu pedi ao Italo para verificar a validação pois ele tem mais conhecimento nesse processo.

Mesmo alterando para 12 o tamanho, ainda o número não passa em outra validação que checa o início do documento, então é melhor verificar com calma.

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Postado

Pessoal, bom dia.

 

Fiz uma comparação entre as Notas Técnicas 2013.005 e 2013.005 v1.02.

 

A validação do Numero do DI, da forma como o componente está fazendo, está na primeira versão.

 

Já na v1.02 esta validação não consta mais e acredito que agora seja desnecessário "ValidaDIDSI"

 

Tive que desativar manualmente a função DFeUtil.ValidaDIDSI para conseguir validar a NF-e de importação de um cliente meu.

 

Me corrijam se eu estiver enganado.

 

Obrigado.

Danny

Danny Andrade

Postado

Olá Régys, 

 

Meus fontes estão atualizados.

 

A questão agora é a diferença nessas Notas Técnicas.

 

Por que a NT mais recente não informa que a DI deve ser validada?

Danny Andrade

  • 3 anos depois...
Postado (editado)

O mesmo erro tenho quase certeza que nao esta dando, pois erro anterior falava justamente que nAdicao nao poderia ser 0...

Posta o erro novo ai, ou entao dá uma lida nele pra tentar entender o porque

Editado por sossystem
  • 2 meses depois ...
Postado

Boa tarde!

Nos fontes do acbr na validação do número da DI hoje está:

function ValidaDIDSI(AValue: String): Boolean;
var
  ano: integer;
  sValue: String;
begin
  // AValue = TAANNNNNNND
  // Onde: T Identifica o tipo de documento ( 2 = DI e 4 = DSI )
  //       AA Ano corrente da geração do documento
  //       NNNNNNN Número sequencial dentro do Ano ( 7 ou 8 dígitos )
  //       D Dígito Verificador, Módulo 11, Pesos de 2 a 9
  AValue := OnlyNumber(AValue);
  ano := StrToInt(Copy(IntToStr(YearOf(Date)), 3, 2));

  if (length(AValue) < 11) or (length(AValue) > 12) then
    Result := False
  else if (copy(Avalue, 1, 1) <> '2') and (copy(Avalue, 1, 1) <> '4') then
    Result := False
  else if not ((StrToInt(copy(Avalue, 2, 2)) >= ano - 1) and
    (StrToInt(copy(Avalue, 2, 2)) <= ano + 1)) then
    Result := False
  else
  begin
    sValue := copy(AValue, 1, length(AValue) - 1);
    Result := copy(AValue, length(AValue), 1) = Modulo11(sValue);
  end;
end;

O problema é que a linha:

 AValue := OnlyNumber(AValue);

vai deixar somente os números e meu cliente tem uma DI = 17/1597985-0 e assim deixando apenas os números ficamos com 1715979850 e com 10 dígitos e por isso não passa pela validação:   

if (length(AValue) < 11) or (length(AValue) > 12) then
    Result := False

e tambem a linha:

  else if (copy(Avalue, 1, 1) <> '2') and (copy(Avalue, 1, 1) <> '4') then
    Result := False

acredito que não passaria pois a DI inicia com 1.

Este processo de DI é novo para nós, será que alguém poderia por favor nos orientar sobre estas dúvidas?

Desde já agradecemos a atenção!

 

 

 

 

  • 7 meses depois ...
  • Consultores
Postado

Bom dia a todos,

Pessoal, primeiramente vamos a página 185 do Manual da NF-e (manual versão 6.0), campo #118 - nDI temos a seguinte descrição: 

Número do Documento de Importação (DI, DSI, DIRE, ...)

Isso nos leva a crer que a tag nDI pode ser usada para informar o numero da DI ou DSI ou DIRE entre outros.

Vamos agora a Function que o Marcelo postou responsável por validar a informação informada na tag nDI:

// AValue = TAANNNNNNND
  // Onde: T Identifica o tipo de documento ( 2 = DI e 4 = DSI )
  //       AA Ano corrente da geração do documento
  //       NNNNNNN Número sequencial dentro do Ano ( 7 ou 8 dígitos )
  //       D Dígito Verificador, Módulo 11, Pesos de 2 a 9
  AValue := OnlyNumber(AValue);

Notem que o primeiro digito do numero indica o tipo de informação, ou seja, se for 2 é uma DI, caso seja 4 se trata de uma DSI.

Os próximos dois digitos se refere ao ano, por exemplo: 17 se refere a 2017, em seguida temos o numero propriamente dito com 7 ou 8 dígitos e por fim o digito verificador.

Vamos agora ao numero que o Pedro postou: 201721432843.

Supondo que 2017 seja o ano então o restante 21432843 é o numero sequencial dentro do ano.

Note que o numero sequencial tem 8 dígitos que esta dentro do esperado que é de 7 a 8.

Vamos reduzir 2017 para 17 para ficar com apenas 2 dígitos e vamos acrescentar o digito 2 no inicio para indicar que se trata de um DI.

"2" + "17" + "21432843"  = "21721432843".

Mas ainda falta calcular o digito verificar e acrescentar no final.

Resultado final: 21721432843D, onde D é o digito verificador.

O digito verificador é calculado através do módulo 11 com pesos variando de 2 a 9.

function ValidaDIDSI(AValue: String), foi implementada com base na página 94 da Nota Técnica 2013/005, nessa NT consta como é feito o calculo do digito verificador.

Espero ter ajudado.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Bom dia!

Italo obrigado por responder.

Fiz o teste passando o "D"  como digito mas ele continua retornando a mensagem  que esta incompleto.

Alguma outra dica para eu tentar informar.

           with Prod.DI.Add do begin
                nDi        := '21721432843D';
                dDi        := 11/12/2017;
                dDesemb    := '14/12/2017';
                xLocDesemb := 'PORTO DE SANTOS';
                UFDesemb   := 'SP';
                cExportador:= '0000000'
            end;

Teria que informar alguma outra TAG ?

Desde já agradeço.

 

  • Membros Pro
Postado

Emiti uma nota de importação ontem e passou normal, o número da DI realmente tem 10 dígitos, passa somente os números.

with Prod.DI.Add do
begin
  nDi := qDINUMERO_DI.AsString;
  dDi := qDIDATAREG_DI.AsDateTime;
  xLocDesemb := qDILOCALDESEMB_DI.AsString;
  UFDesemb := qDIUFDESEMB_DI.AsString;
  dDesemb := qDIDATADESEMB_DI.AsDateTime;
  cExportador := qDICODEXPORTADOR_DI.AsString;

  qAdicoes.Close;
  qAdicoes.Open;

  while not qAdicoes.Eof do
  begin

  with adi.Add do
  begin
    nAdicao := qAdicoesNUMERO_ADI.AsInteger;
    nSeqAdi := qAdicoesSEQ_ADI.AsInteger;
    cFabricante := qAdicoesCODFAB_ADI.AsString;
    vDescDI := qAdicoesVALORDESC_ADI.AsCurrency;
  end;

  qAdicoes.Next;
  end;
end;


with Imposto do
begin
  // imposto de importação

  II.vBc := qImpressaoItensBCII_ITEM.AsCurrency;
  II.vII := qImpressaoItensVALORII_ITEM.AsCurrency;
  II.vDespAdu := qImpressaoItensVALORDESPADU_ITEM.AsCurrency;
  II.vIOF := qImpressaoItensVALORIOF_ITEM.AsCurrency;

end;

 

Londrina - PR

  • Consultores
Postado

Pedro,

O "D" no final representa o digito verificador que deve ser calculado conforme o exemplo que consta na página 94 da Nota Técnica 2013/005.

A tag nDI tem que receber uma informação numérica e não alfa-numérica.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

  • 3 semanas depois ...
  • Este tópico foi criado há 2759 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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...