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.
¿Qué es UBL 2.1?
Sección titulada «¿Qué es UBL 2.1?»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:
UBLVersionIDcon valor2.1.CustomizationIDcon valor2.0(personalización para Perú).
¿Qué es SUNAT?
Sección titulada «¿Qué es SUNAT?»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.
¿Qué es un CPE?
Sección titulada «¿Qué es un CPE?»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:
- Estructura XML UBL 2.1.
- Firma digital con certificado válido.
- Envío y aceptación por parte de SUNAT (CDR).
Documentos soportados
Sección titulada «Documentos soportados»openUBL puede generar los siguientes documentos. Los códigos de tipo de comprobante provienen del Catálogo N.° 01 de SUNAT:
| Documento | Código | Nombre del modelo en openUBL |
|---|---|---|
| Factura | 01 | Invoice |
| Boleta | 03 | Invoice (con serie boleta) |
| Nota de Crédito | 07 | CreditNote |
| Nota de Débito | 08 | DebitNote |
| Resumen Diario | RC | SummaryDocuments |
| Comunicación de Baja | RA | VoidedDocuments |
| Percepción | 40 | Perception |
| Retención | 20 | Retention |
Casos de uso
Sección titulada «Casos de uso»- 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.
Flujo en openUBL Server
Sección titulada «Flujo en openUBL Server»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) → XML1. JSON y Schema
Sección titulada «1. JSON y Schema»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.
2. Enriquecimiento y renderizado
Sección titulada «2. Enriquecimiento y renderizado»ContentEnricher calcula totales, impuestos y precios de venta. renderer convierte el modelo en XML UBL 2.1.
3. Validación SUNAT
Sección titulada «3. Validación SUNAT»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": "..."}].
4. Firma digital
Sección titulada «4. Firma digital»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.
5. XML resultante
Sección titulada «5. XML resultante»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.
Tabla comparativa de documentos
Sección titulada «Tabla comparativa de documentos»| Tipo | Código | Serie requerida | Frecuencia de envío |
|---|---|---|---|
| Factura | 01 | Serie electrónica que inicia con F (por ejemplo, F001) | En tiempo real |
| Boleta | 03 | Serie electrónica que inicia con B (por ejemplo, B001) | En tiempo real, o consolidada en Resumen Diario |
| Nota de Crédito | 07 | Serie que inicia con F o B, según el comprobante modificado | En tiempo real |
| Nota de Débito | 08 | Serie que inicia con F o B, según el comprobante modificado | En tiempo real |
| Resumen Diario | RC | RCYYYYMMDD-NNNN | Diaria, dentro del plazo máximo establecido por SUNAT |
| Comunicación de Baja | RA | RAYYYYMMDD-NNNN | Dentro del plazo máximo establecido por SUNAT |
| Percepción | 40 | Serie que inicia con P (por ejemplo, P001) | En tiempo real |
| Retención | 20 | Serie que inicia con R (por ejemplo, R001) | En tiempo real |
Relación con los catálogos SUNAT
Sección titulada «Relación con los catálogos SUNAT»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 (
1000IGV,7152ICBPER, etc.). - Catálogo N.° 06: tipo de documento de identidad (
1DNI,6RUC, etc.). - Catálogo N.° 07: tipo de afectación del IGV (
10gravado,20exonerado,30inafecto). - Catálogo N.° 16: tipo de precio (
01precio unitario). - Catálogo N.° 19: tipo de operación del Resumen Diario (
1adicionar,2modificar,3anulado). - 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.