Ir al contenido

Conceptos SUNAT

Antes de crear tu primer documento, conviene repasar los conceptos básicos del ecosistema de facturación electrónica en el Perú y cómo los modela openUBL.

UBL (Universal Business Language) es un estándar internacional mantenido por OASIS que define formatos XML reutilizables para documentos de negocio: facturas, notas de crédito, guías de remisión, etc.

La versión UBL 2.1 es la que exige SUNAT para los Comprobantes de Pago Electrónicos (CPE). openUBL genera XML que incluye obligatoriamente:

  • UBLVersionID con valor 2.1.
  • CustomizationID con valor 2.0 (personalización para Perú).

La Superintendencia Nacional de Aduanas y de Administración Tributaria (SUNAT) es la entidad encargada de recibir, validar y dar constancia de los comprobantes electrónicos emitidos en el Perú. Las empresas deben enviar sus documentos a SUNAT —directamente o a través de un OSE (Operador de Servicios Electrónicos)— dentro de los plazos que establece la normativa vigente.

Un Comprobante de Pago Electrónico (CPE) es la representación digital de facturas, boletas, notas y otros documentos tributarios. Tiene validez legal si cumple con:

  1. Estructura XML UBL 2.1.
  2. Firma digital con certificado válido.
  3. Envío y aceptación por parte de SUNAT (CDR).

openUBL puede generar los siguientes documentos. Los códigos de tipo de comprobante provienen del Catálogo N.° 01 de SUNAT:

DocumentoCódigoNombre del modelo en openUBL
Factura01Invoice
Boleta03Invoice (con serie boleta)
Nota de Crédito07CreditNote
Nota de Débito08DebitNote
Resumen DiarioRCSummaryDocuments
Comunicación de BajaRAVoidedDocuments
Percepción40Perception
Retención20Retention
  • Factura (01): ventas a contribuyentes (RUC) que requieren crédito fiscal.
  • Boleta (03): ventas al público final; se pueden declarar individualmente o consolidar en un Resumen Diario.
  • Nota de Crédito (07): anulación, descuentos o devoluciones sobre una factura o boleta ya emitida.
  • Nota de Débito (08): cobros adicionales o correcciones que aumentan el monto de una factura o boleta.
  • Resumen Diario (RC): comunicación diaria de boletas y notas asociadas, dentro de los plazos que SUNAT establece.
  • Comunicación de Baja (RA): anulación de facturas ya comunicadas a SUNAT dentro del plazo permitido.
  • Percepción (40): comprobante de percepción de IGV en ventas internas o adquisición de combustible.
  • Retención (20): comprobante de retención de IGV a proveedores.

openUBL Server es una capa puramente técnica: recibe JSON, enriquece, renderiza a UBL, valida opcionalmente contra SUNAT y firma opcionalmente. No emite correlativos, no genera ZIP, no envía a SUNAT ni recibe CDR.

JSON → Schema → UBL → Validación SUNAT (opcional) → Firma (opcional) → XML

El cliente envía un documento Pydantic (Invoice, CreditNote, …) junto con los flags firmar y validar_sunat. FastAPI valida el JSON contra el esquema del modelo.

ContentEnricher calcula totales, impuestos y precios de venta. renderer convierte el modelo en XML UBL 2.1.

Si validar_sunat=true, el servidor ejecuta validación XSD más las reglas de negocio de SUNAT evaluables localmente. Si falla, responde HTTP 422 con una lista de errores [{"code": "...", "message": "..."}].

Si firmar=true, el XML se firma con el certificado y clave privada enviados en credenciales. La firma se valida estructuralmente según las reglas SUNAT de la hoja Firma.

El servidor devuelve el XML firmado o sin firmar. El cliente operativo es responsable de:

  • Asignar y enviar numero, series y otros datos operativos.
  • Empaquetar el XML en ZIP con la nomenclatura SUNAT.
  • Enviar el ZIP a SUNAT o a su OSE.
  • Recibir y procesar el CDR.
TipoCódigoSerie requeridaFrecuencia de envío
Factura01Serie electrónica que inicia con F (por ejemplo, F001)En tiempo real
Boleta03Serie electrónica que inicia con B (por ejemplo, B001)En tiempo real, o consolidada en Resumen Diario
Nota de Crédito07Serie que inicia con F o B, según el comprobante modificadoEn tiempo real
Nota de Débito08Serie que inicia con F o B, según el comprobante modificadoEn tiempo real
Resumen DiarioRCRCYYYYMMDD-NNNNDiaria, dentro del plazo máximo establecido por SUNAT
Comunicación de BajaRARAYYYYMMDD-NNNNDentro del plazo máximo establecido por SUNAT
Percepción40Serie que inicia con P (por ejemplo, P001)En tiempo real
Retención20Serie que inicia con R (por ejemplo, R001)En tiempo real

openUBL implementa los catálogos más utilizados en src/openubl/models/catalog.py:

  • Catálogo N.° 01: tipo de comprobante.
  • Catálogo N.° 02: moneda (PEN, USD, EUR).
  • Catálogo N.° 05: tipo de tributo (1000 IGV, 7152 ICBPER, etc.).
  • Catálogo N.° 06: tipo de documento de identidad (1 DNI, 6 RUC, etc.).
  • Catálogo N.° 07: tipo de afectación del IGV (10 gravado, 20 exonerado, 30 inafecto).
  • Catálogo N.° 16: tipo de precio (01 precio unitario).
  • Catálogo N.° 19: tipo de operación del Resumen Diario (1 adicionar, 2 modificar, 3 anulado).
  • Catálogo N.° 20: motivo de traslado.
  • Catálogos N.° 22 y 23: régimenes de percepción y retención.

Usar los códigos correctos de cada catálogo es responsabilidad del emisor. openUBL valida que los valores existan y que los XML resultantes cumplan con las reglas de SUNAT documentadas en el validador.