Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 2183 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

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?

  • 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.

 

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á 2183 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...