Ir al contenido

Nota de Débito

La Nota de Débito Electrónica (tipo 08) aumenta el valor de una factura o boleta previamente emitida. Se emite por intereses, recargos o ajustes que incrementan el monto original.

CampoTipoDescripciónValidación
seriestringSerie de la notaPatrón ^[BCbc][A-Za-z0-9]{2,3}$. Ej: FC01 para factura, BC01 para boleta.
numerointegerCorrelativoMayor a 0.
comprobanteAfectadoSerieNumerostringSerie-número del comprobante afectadoEj: F001-123.
sustentoDescripcionstringMotivo de la nota de débitoTexto libre.
proveedorProveedorDatos del emisorruc de 11 dígitos y razonSocial obligatorios.
clienteClienteDatos del adquirentenombre, numeroDocumentoIdentidad y tipoDocumentoIdentidad (Catálogo N.° 06).
detallesDocumentoVentaDetalle[]Líneas de ajusteAl menos una línea.
CampoTipoDefaultDescripción
monedastringPENMoneda del comprobante (Catálogo N.° 02).
fechaEmisiondatehoyFecha de emisión (YYYY-MM-DD).
igvTotalDecimalautoSuma de IGV de las líneas.
valorVentaTotalDecimalautoSuma de valores de venta.
importeTotalDecimalautovalorVentaTotal + igvTotal.
CampoTipoRequeridoDefaultDescripción
descripcionstringDescripción del bien o servicio.
cantidadDecimalCantidad.
precioDecimalValor unitario (sin IGV).
unidadMedidastringNoNIUUnidad de medida (Catálogo N.° 03).
tipoAfectacionIGVstringNo10Tipo de afectación del IGV (Catálogo N.° 07).
igvDecimalNoautoIGV de la línea.
valorVentaDecimalNoautocantidad × precio.
precioVentaDecimalNoautovalorVenta + igv.
Código / ReglaDescripción
2074UBLVersionID debe ser 2.1.
2072CustomizationID debe ser 2.0.
1001El ID del comprobante debe tener formato serie-número.
2070DocumentCurrencyCode es obligatorio.
1007schemeID del emisor debe ser 6 (RUC).
1008RUC del emisor debe tener 11 dígitos.
1037RegistrationName del emisor es obligatorio.
2015schemeID del cliente es obligatorio.
2062PayableAmount debe ser mayor a 0.
3305TaxInclusiveAmount es obligatorio.
3294El TaxTotal debe cuadrar con la sumatoria de líneas.
3278El LineExtensionAmount debe cuadrar con la sumatoria de líneas.
SerieDebe iniciar con B/C o F/E según el tipo de comprobante afectado.
OrigenSolo se puede emitir sobre comprobantes ya declarados.
MotivoEl motivo debe ser claro y justificar el incremento del monto.
from openubl.models import (
DebitNote, Proveedor, Cliente, DocumentoVentaDetalle,
)
from openubl.renderer import render_debit_note
from openubl.validator import SunatValidator
from decimal import Decimal
debit_note = DebitNote(
serie="FC01",
numero=1,
comprobanteAfectadoSerieNumero="F001-45",
sustentoDescripcion="Intereses moratorios",
proveedor=Proveedor(
ruc="20100100100",
razonSocial="Mi Empresa S.A.C.",
),
cliente=Cliente(
nombre="Juan Pérez",
numeroDocumentoIdentidad="46779327",
tipoDocumentoIdentidad="1",
),
detalles=[
DocumentoVentaDetalle(
descripcion="Intereses moratorios - Laptop Dell XPS 13",
cantidad=Decimal("1"),
precio=Decimal("150.00"),
),
],
)
xml = render_debit_note(debit_note)
errors = SunatValidator().validate_debit_note(xml)
assert errors == [], errors
print(xml)

ContentEnricher calcula fechaEmision, valorVenta, igv, precioVenta, valorVentaTotal, igvTotal e importeTotal.

from openubl.models import (
DebitNote, Proveedor, Cliente, DocumentoVentaDetalle,
)
from openubl.enricher import ContentEnricher
from openubl.renderer import render_debit_note
from openubl.validator import SunatValidator
from decimal import Decimal
debit_note = DebitNote(
serie="FC01",
numero=1,
comprobanteAfectadoSerieNumero="F001-45",
sustentoDescripcion="Intereses moratorios",
proveedor=Proveedor(
ruc="20100100100",
razonSocial="Mi Empresa S.A.C.",
),
cliente=Cliente(
nombre="Juan Pérez",
numeroDocumentoIdentidad="46779327",
tipoDocumentoIdentidad="1",
),
detalles=[
DocumentoVentaDetalle(
descripcion="Intereses moratorios - Laptop Dell XPS 13",
cantidad=Decimal("1"),
precio=Decimal("150.00"),
),
],
)
ContentEnricher().enrich(debit_note)
xml = render_debit_note(debit_note)
errors = SunatValidator().validate_debit_note(xml)
assert errors == [], errors
print(xml)
from openubl.models import (
DebitNote, Proveedor, Cliente, DocumentoVentaDetalle,
)
from openubl.renderer import render_debit_note
from decimal import Decimal
debit_note = DebitNote(
serie="FC01",
numero=1,
comprobanteAfectadoSerieNumero="F001-45",
sustentoDescripcion="Intereses moratorios",
proveedor=Proveedor(
ruc="20100100100",
razonSocial="Mi Empresa S.A.C.",
),
cliente=Cliente(
nombre="Juan Pérez",
numeroDocumentoIdentidad="46779327",
tipoDocumentoIdentidad="1",
),
detalles=[
DocumentoVentaDetalle(
descripcion="Intereses moratorios",
cantidad=Decimal("1"),
precio=Decimal("150.00"),
),
],
)
xml = render_debit_note(debit_note)
print(xml)

Puedes incluir varias líneas de débito en una sola nota. El enriquecedor suma los importes y calcula los totales.

from openubl.models import (
DebitNote, Proveedor, Cliente, DocumentoVentaDetalle,
)
from openubl.enricher import ContentEnricher
from openubl.renderer import render_debit_note
from openubl.validator import SunatValidator
from decimal import Decimal
debit_note = DebitNote(
serie="FD01",
numero=1,
comprobanteAfectadoSerieNumero="F001-45",
sustentoDescripcion="Intereses y recargos",
proveedor=Proveedor(ruc="20100100100", razonSocial="Mi Empresa S.A.C."),
cliente=Cliente(
nombre="Juan Pérez",
numeroDocumentoIdentidad="46779327",
tipoDocumentoIdentidad="1",
),
detalles=[
DocumentoVentaDetalle(
descripcion="Intereses moratorios",
cantidad=Decimal("1"),
precio=Decimal("80.00"),
),
DocumentoVentaDetalle(
descripcion="Recargo administrativo",
cantidad=Decimal("1"),
precio=Decimal("20.00"),
),
],
)
ContentEnricher().enrich(debit_note)
xml = render_debit_note(debit_note)
errors = SunatValidator().validate_debit_note(xml)
assert errors == [], errors
print(xml)
{
"xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>..."
}

Si validate=true y el XML no cumple las reglas SUNAT, la API devuelve un error 422 con la lista de errores.