Validar el comprobante electrónico

Para verificar que nuestros comprobantes sean válidos, existen 2 tipos de validaciones:

  1. Validación de esquema (UBL 2.1 - XSD)
  2. Validación de contenido (Reglas de validación de SUNAT - XSL)

Herramientas#

Para completar esta sección necesitaremos utilizar algunas herramientas.

Tambien necesitaremos un comprobante XML a validar, utilizaremos el XML creado en la sección anterior.

Windows

Puedes descargar las herramientas desde este enlace.

Validación de Esquema (XSD)#

Para verificar que el XML construido cumple con el esquema del estándar UBL, debemos primero contar con los archivos XSD (XML Schema Definition) que describe los elementos que puede contener el comprobante XML, para el caso de SUNAT esto se pueden descargar desde aquí.

Esta será la estructura del directorio de trabajo.

/
├── 2.1/
│ ├─ common/
│ └─ maindoc/
│ ├─ ...
│ └─ UBL-Invoice-2.1.xsd
├── 20123456789-01-F001-1.xml

xmllint#

Esta herramienta nos permitirá validar el comprobante XML, con el esquema XSD relacionado. En este caso validaremos una factura, el archivo xml será 20123456789-01-F001-1.xml y el esquema XSD, UBL-Invoice-2.1.xsd.

Comando para validar el comprobante XML con su esquema XSD.

xmllint --schema ./2.1/maindoc/UBL-Invoice-2.1.xsd 20123456789-01-F001-1.xml --noout

Resultado:

20123456789-01-F001-1.xml validates

Parámetros:

  • --schema: Indica la ruta del archivo XSD.
  • --noout: Solo muestra los errores encontrados.

Errores#

Como nuestro comprobante XML fue elaborado correctamente, no tenemos errores, así que para probar escenarios de error, haremos algunos cambios en el XML.

Eliminaremos el nodo cbc:PriceAmount (Valor venta unitario).

<cac:Price>
<!-- <cbc:PriceAmount currencyID="PEN">50</cbc:PriceAmount> -->
</cac:Price>
</cac:InvoiceLine>
</Invoice>

Volvemos a ejecutar la validación

xmllint --schema ./2.1/maindoc/UBL-Invoice-2.1.xsd 20123456789-01-F001-1.xml --noout

Resultado:

20123456789-01-F001-1.xml:190: element Price: Schemas validity error : Element '{urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2}Price': Missing child element(s). Expected is ( {urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2}PriceAmount ).
20123456789-01-F001-1.xml fails to validate

Podemos interpretar del mensaje que falta el elemento PriceAmount en el nodo Price.

Validación de contenido (XSL)#

La validación de contenido de nuestro comprobante XML, proviene de las Reglas de validación - SUNAT, en la cual se define valores, formatos, cálculos que deberia cumplir el comprobante electrónico, y que en general son propios de la tributación peruana; por ejemplo que la serie inicie con F para facturas, el cálculo del IGV sea correcto, que los codigos de catálogo utilizados se encuentren en la lista definida por SUNAT, etc.

Las reglas de validación que SUNAT presenta en un archivo excel, ha sido representada en archivos XSL para poder utilizarlos programáticamente, SUNAT la pone a disposición en este enlace, pero no esta completo; existe otra forma de obtener estos archivos XSL, y es descargando el facturador SFS de SUNAT, los archivos XSL se encontraran en la carpeta sunat_archivos\sfs\VALI\commons.

Esta será la estructura del directorio de trabajo.

/
├── sunat_archivos/sfs/VALI/commons/
│ ├─ cpe/
│ │ └─ catalogo/
│ ├─ error/
│ │ ├─ error_utils.xsl
│ │ └─ validate_utils.xsl
│ └─ xsl/validation/2.X/
│ ├─ ...
│ └─ ValidaExprRegFactura-2.0.1.xsl
├── 20123456789-01-F001-1.xml
XSLT Patch

Aunque los archivos XSL que SUNAT ofrece siguen la version XSLT 1.0, no es totalmente compatible, para este ejemplo hemos corregido el XSL de factura y los xsl referenciados, puedes descargarlo aquí.

xsltproc#

Esta herramienta nos permitirá validar el comprobante XML, con el archivo XSL según el tipo de comprobante. En este ejemplo validaremos una factura, el archivo xml será 20123456789-01-F001-1.xml y el archivo XSL, ValidaExprRegFactura-2.0.1.xsl.

Comando para validar el comprobante XML usando las reglas de validación SUNAT.

xsltproc --noout --stringparam nombreArchivoEnviado 20123456789-01-F001-1.xml sunat_archivos/sfs/VALI/commons/xsl/validation/2.X/ValidaExprRegFactura-2.0.1.xsl 20123456789-01-F001-1.xml

Parámetros:

  • --noout: Solo muestra los errores.
  • --stringparam: Parámetros utilizados en el archivo XSL, SUNAT requiere el parámetro nombreArchivoEnviado que es el nombre del comprobante xml.

Errores#

El comprobante XML utilizado no contiene errores, haremos algunos cambios en el XML para conseguirlo.

La moneda utilizada era PEN, la cambiaremos por BTC.

<cbc:DocumentCurrencyCode
listID="ISO 4217 Alpha"
listName="Currency"
listAgencyName="United Nations Economic Commission for Europe">BTC</cbc:DocumentCurrencyCode>

Ejecutando la validación.

xsltproc --noout --stringparam nombreArchivoEnviado 20123456789-01-F001-1.xml sunat_archivos/sfs/VALI/commons/xsl/validation/2.X/ValidaExprRegFactura-2.0.1.xsl 20123456789-01-F001-1.xml

Resultado:

error: : errorCode 3088: Valor no se encuentra en el catalogo: 02 (nodo: "Invoice/cbc:DocumentCurrencyCode" valor: "BTC")

Según los códigos de retorno de SUNAT:

CódigoDescripción
3088El valor ingresado como moneda del comprobante no es valido (catalogo nro 02).

Todas las validaciones se pueden constatar con en el archivo excel de Reglas de validación, allí podremos tener mayor información de cada codigo de error y como resolverlo.