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 expone 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铆.
Si necesitas todos los XSL estandarizados puedes contactarnos.

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>

Ejecutar 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")

C贸digo 3088: El 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, y all铆 podremos tener mayor informaci贸n de cada codigo de error y como resolverlo.