Ir al contenido

Resumen Diario

El Resumen Diario (tipo RC) consolida las boletas de venta (03) y notas asociadas emitidas en un día. SUNAT lo exige para dar validez a las boletas electrónicas.

CampoTipoDescripciónValidación
numerointNúmero correlativo del resumen diario.> 0
fechaEmisionComprobantesdateFecha de emisión de los comprobantes incluidos.Obligatorio
proveedorProveedorDatos del emisor.RUC válido
comprobanteslist[SummaryDocumentsItem]Lista de comprobantes a declarar.Mínimo 1

El modelo SummaryDocuments no tiene campos opcionales a nivel raíz. Los totales se declaran explícitamente por comprobante.

CampoTipoDescripciónValidación
tipoOperacionstrTipo de operación: 1 adicionar, 2 modificar, 3 anular.Catálogo 19
comprobanteComprobanteDatos del comprobante resumido.Obligatorio
CampoTipoDescripciónValidación
tipoComprobantestrTipo de comprobante (03, 07, 08).Catálogo 1
serieNumerostrSerie y número (B001-123).Formato SUNAT
clienteClienteAdquirente o usuario.Obligatorio
impuestosComprobanteImpuestosIGV e ISC.Obligatorio
valorVentaComprobanteValorVentaValor de venta por tipo.Obligatorio
CampoTipoDescripción
tipoComprobantestrTipo de comprobante afectado.
serieNumerostrSerie y número del comprobante afectado.
Código / ReglaDescripción
RCResumen diario de boletas electrónicas.
Tipo de operación1 Adicionar, 2 Modificar, 3 Anular.
ValidezLas boletas solo tienen validez tras ser comunicadas en un RC aceptado por SUNAT.
from openubl.models import (
SummaryDocuments, SummaryDocumentsItem, Comprobante,
ComprobanteImpuestos, ComprobanteValorVenta,
Proveedor, Cliente,
)
from openubl.renderer import render_summary_documents
from openubl.validator import SunatValidator
from decimal import Decimal
from datetime import date
summary = SummaryDocuments(
numero=1,
fechaEmisionComprobantes=date(2025, 6, 10),
proveedor=Proveedor(
ruc="20100100100",
razonSocial="Mi Empresa S.A.C.",
),
comprobantes=[
SummaryDocumentsItem(
tipoOperacion="1", # Adicionar
comprobante=Comprobante(
tipoComprobante="03",
serieNumero="B001-45",
cliente=Cliente(
nombre="Juan Pérez",
numeroDocumentoIdentidad="46779327",
tipoDocumentoIdentidad="1",
),
impuestos=ComprobanteImpuestos(igv=Decimal("27.00")),
valorVenta=ComprobanteValorVenta(importeTotal=Decimal("177.00")),
),
),
],
)
xml = render_summary_documents(summary)
errors = SunatValidator().validate_schema(
xml,
"sunat_schemas/xsd_2.1/2.0/maindoc/UBLPE-SummaryDocuments-1.0.xsd",
)
assert errors == []
print(xml)

openUBL expone validate_schema para validar el XML generado contra el XSD de SUNAT:

from openubl.validator import SunatValidator
errors = SunatValidator().validate_schema(
xml,
"sunat_schemas/xsd_2.1/2.0/maindoc/UBLPE-SummaryDocuments-1.0.xsd",
)
print(errors) # [] si es válido
from openubl.models import (
SummaryDocuments, SummaryDocumentsItem, Comprobante,
ComprobanteImpuestos, ComprobanteValorVenta,
Proveedor, Cliente,
)
from openubl.renderer import render_summary_documents
from decimal import Decimal
from datetime import date
summary = SummaryDocuments(
numero=1,
fechaEmisionComprobantes=date(2025, 6, 10),
proveedor=Proveedor(
ruc="20100100100",
razonSocial="Mi Empresa S.A.C.",
),
comprobantes=[
SummaryDocumentsItem(
tipoOperacion="1",
comprobante=Comprobante(
tipoComprobante="03",
serieNumero="B001-45",
cliente=Cliente(
nombre="Juan Pérez",
numeroDocumentoIdentidad="46779327",
tipoDocumentoIdentidad="1",
),
impuestos=ComprobanteImpuestos(igv=Decimal("27.00")),
valorVenta=ComprobanteValorVenta(importeTotal=Decimal("177.00")),
),
),
],
)
xml = render_summary_documents(summary)
print(xml)

Además de adicionar (tipoOperacion: "1"), puedes modificar ("2") o anular ("3") boletas previamente comunicadas en un resumen diario.

from openubl.models import (
SummaryDocuments, SummaryDocumentsItem, Comprobante,
ComprobanteImpuestos, ComprobanteValorVenta,
Proveedor, Cliente,
)
from openubl.renderer import render_summary_documents
from openubl.validator import SunatValidator
from decimal import Decimal
from datetime import date
cliente = Cliente(
nombre="Juan Pérez",
numeroDocumentoIdentidad="46779327",
tipoDocumentoIdentidad="1",
)
summary = SummaryDocuments(
numero=2,
fechaEmisionComprobantes=date(2025, 6, 10),
proveedor=Proveedor(ruc="20100100100", razonSocial="Mi Empresa S.A.C."),
comprobantes=[
SummaryDocumentsItem(
tipoOperacion="2", # Modificar
comprobante=Comprobante(
tipoComprobante="03",
serieNumero="B001-45",
cliente=cliente,
impuestos=ComprobanteImpuestos(igv=Decimal("28.00")),
valorVenta=ComprobanteValorVenta(importeTotal=Decimal("178.00")),
),
),
SummaryDocumentsItem(
tipoOperacion="3", # Anular
comprobante=Comprobante(
tipoComprobante="03",
serieNumero="B001-46",
cliente=cliente,
impuestos=ComprobanteImpuestos(igv=Decimal("0.00")),
valorVenta=ComprobanteValorVenta(importeTotal=Decimal("0.00")),
),
),
],
)
xml = render_summary_documents(summary)
errors = SunatValidator().validate_schema(
xml,
"sunat_schemas/xsd_2.1/2.0/maindoc/UBLPE-SummaryDocuments-1.0.xsd",
)
assert errors == [], errors
print(xml)
{
"xml": "<?xml version='1.0' encoding='UTF-8'?\u003e...",
"document_type": "RC",
"document_id": "20100100100-RC-20250610-1"
}

Si validate=true y el cuerpo no cumple las reglas, la API devuelve un error 422 con el detalle de la validación. `,