Ao gerar uma nota de importação com dispensa da emissão da DI, DSI ou outro documento controlado pela RFB deve ser gerada a TAG <nDI> com a descrição NIHIL, porém ao informar este valor o ACBr acaba por não permitir gerando exceção.
Também na mesma função está ocorrendo erro ao validar o número da DI, a validação executada pelo módulo 11 está sendo efetuada com o carácter de identificação (2=DI ou 4=DSI), porém na aduana o cálculo é realizado sem o mesmo, para resolver os problemas identificados foram efetuados as seguintes alterações:
unit ACBrDFeUtil.pas Repositório: class function DFeUtil.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 := LimpaNumero(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;
Ajuste: class function DFeUtil.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 { Validação conforme orientação (Orientacao_da_NF-e_versao_2015.pdf) esta trata-se da dispensa da emissão da DI, DSI ou outro documento controlado pela RFB } if (UpperCase(AValue) = 'NIHIL') then Result := True else begin AValue := LimpaNumero(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 {Alterado para não calcular o módulo 11 com o dígito identificador do tipo de documento, pois a aduana não calcula com este o dígito verificador} sValue := copy(AValue, 2, length(AValue)- 1); Result := copy(AValue, length(AValue), 1) = Modulo11(sValue); end; end; end;
Caso alguém tenha passado pelo mesmo problema e puder informar uma possível solução para contribuir com os ajustes e se possível gostaria que fosse ajustado no ACBR.
Orientacao_da_NF-e_versao_2015.pdf
ACBrDFeUtil.pas