Dinaup.Validations

ValidationUtils, Municipios y CodigosPostales comprueban NIF y VAT, consultan VIES y AEAT, clasifican el IVA y resuelven países, provincias y municipios del INE.

ValidationUtils, Municipios y CodigosPostales (namespace Dinaup) comprueban datos fiscales y geográficos antes de guardarlos. Las consultas a VIES y a la AEAT se hacen con un DinaupClientC conectado, desde el servidor de Dinaup.

Antes de empezar

  • Paquete Dinaup instalado. Ver SDK .NET.
  • Para CheckVATViesAsync y CheckVATAEATAsync, un cliente conectado. Ver Cliente Dinaup.

Códigos postales, provincias y municipios

MétodoQué hace
ValidationUtils.IsSpanishPostalCode(postalCode)true si son cinco dígitos y los dos primeros corresponden a una provincia.
ValidationUtils.GetSpainProvinceFromPostalCode(postalCode)Nombre de la provincia, o cadena vacía.
CodigosPostales.GetMunicipiosByCP(cp)Los municipios del INE que comparten ese código postal.
Municipios.AllMunicipiosTodos los municipios del INE.
Municipios.GetMunicipioByCodigoINE(codigoINE)Un municipio por su código de cinco dígitos, o null.
Municipios.GetMunicipio(nombre, codigoProvincia = null)Un municipio por nombre, sin distinguir mayúsculas ni acentos y con formas bilingües (Alicante encuentra Alicante/Alacant).
Municipios.SearchMunicipio(query, codigoProvincia = null)Municipios cuyo nombre contiene las palabras de query.
Municipios.GetMunicipiosByProvincia(codigoProvincia)Los municipios de una provincia ("03" para Alicante).
Municipios.IsValidMunicipio(nombre, codigoProvincia = null)true si es un municipio real, y de esa provincia si la indicas.
ValidationUtils.NormalizeLocationName(name)El nombre en castellano (elx a Elche, Bilbo a Bilbao, Girona a Gerona). De Alicante/Alacant toma el primer tramo; lo que no reconoce vuelve en minúsculas.
ValidationUtils.GetNormalizedAddressDataWithGoogleMaps(codigoPostal, pais, provincia, municipio, apiKey, language = "es")Consulta Google Maps con tu clave y devuelve un NormalizedAddress con Country, CountryCode, Province, City y PostalCode.

Cada MunicipioData trae CodigoProvincia (dos dígitos), CodigoMunicipio (tres), DigitoControl, Nombre como lo publica el INE, CodigoINE (cinco dígitos) y CodigoINEConDC (seis).

ValidationUtils.GetSpainProvinceFromPostalCode("28013");   // Madrid
Municipios.GetMunicipio("Elche", "03").CodigoINE;          // 03065

Países

ValidationUtils.AllCountryData es la lista de CountryData (ISO2, ENName, ESName, AllNames) y ValidationUtils.CountryEuCodes, los códigos de la Unión Europea.

MétodoQué hace
ValidationUtils.SearchCountry(query)Coincidencias parciales por nombre en inglés o español, o por ISO2.
ValidationUtils.GetCountry(countryCodeOrNAme)Un país por ISO2 o nombre completo.
ValidationUtils.IsEuCountryCode(countryCode)true si el ISO2 es de la Unión Europea, sin distinguir mayúsculas.

Reglas de región

ValidationUtils.IsLocationMatched(regionRule, isIncludeMode, inputCountryCode, inputProvinceCode, inputPostalCode) decide si una ubicación cumple una regla. regionRule es una lista separada por comas de patrones: ES (país), ES[Tenerife] (provincia, por nombre o por código postal), ES[Canarias] (códigos postales 35 y 38) y ES[!Tenerife] para negar una provincia.

  • Con isIncludeMode en true solo pasan las ubicaciones que coinciden; en false, todas salvo esas.
  • Una regla vacía deja pasar todo y un país vacío no pasa nunca.
  • La negación se evalúa antes y gana en los dos modos.
ValidationUtils.IsLocationMatched("ES[!Canarias]", false, "ES", "Alicante", "03201");     // True
ValidationUtils.IsLocationMatched("ES[!Canarias]", false, "ES", "Las Palmas", "35001");   // False
ValidationUtils.IsLocationMatched("ES,PT", true, "FR", "", "75001");                      // False

NIF y VAT

MétodoQué hace
ValidationUtils.IsVIESVatFormat(vatNumber)true si tiene al menos cinco caracteres y empieza por el código de un país de la UE. Solo valida la estructura.
ValidationUtils.IsSpanishBusinessNIFFormat(taxID)true si parece un NIF de empresa española: no empieza por un código de país de la UE, ni por dígito, ni por X, Y, Z, K, L o M. Es un filtro rápido, no una validación.
dinaupClient.CheckVATViesAsync(vatid)Pregunta a VIES si es operador intracomunitario. bool?: true confirmado, false no lo es (o formato inválido, o país no comunitario) y null si VIES no responde.
dinaupClient.CheckVATAEATAsync(vatid, name)Pregunta a la AEAT si el NIF y el nombre coinciden. Devuelve un CheckVATAEATResponse con Identificado, Nif, Nombre y Resultado; Identificado es true cuando Resultado vale IDENTIFICADO.

Si la AEAT no contesta, CheckVATAEATAsync no lanza: devuelve Resultado vacío, que significa "sin veredicto", no un rechazo. Con un NIF vacío o de menos de 4 caracteres devuelve la respuesta vacía sin preguntar.

Territorialidad del IVA

ValidationUtils.ClassifyVatTerritoriality(nif, countryCode, postalCode, isVies) clasifica una operación por el lugar de tributación y devuelve un VatTerritoriality:

ValorCuándo
SimplifiedSin NIF: venta simplificada, típica de TPV.
ExportPaís fuera de la UE.
OutOfVatTerritoryEspaña con código postal de Canarias (35, 38), Ceuta (51) o Melilla (52).
NationalResto de España.
IntraCommunityOtro país de la UE con isVies en true.
OneStopShopOtro país de la UE sin VIES: régimen de ventanilla única.
UnknownReservado para datos insuficientes.
ValidationUtils.ClassifyVatTerritoriality("DE123456789", "DE", "81549", true);   // IntraCommunity

El campo de impuestos de una venta está en el Catálogo de secciones del núcleo.

En esta página