Ir al contenido

Ejemplos de uso

Los siguientes ejemplos asumen que el servidor está corriendo en http://localhost:8000. El primer ejemplo usa httpx, pero puedes reemplazarlo por requests sin cambiar la lógica.

import os
import httpx
from openubl.models import Invoice, Proveedor, Cliente, DocumentoVentaDetalle
BASE_URL = "http://localhost:8000"
invoice = Invoice(
serie="F001",
numero=1,
proveedor=Proveedor(
ruc="20100111111",
razonSocial="Mi Empresa S.A.C.",
),
cliente=Cliente(
nombre="Juan Perez",
numeroDocumentoIdentidad="12345678",
tipoDocumentoIdentidad="1",
),
detalles=[
DocumentoVentaDetalle(
descripcion="Producto A",
cantidad=2,
precio=100.00,
)
],
moneda="PEN",
)
request_body = {
"documento": invoice.model_dump(mode="json"),
"firmar": True,
"validar_sunat": True,
"credenciales": {
"cert_pem": os.getenv("CERT_PEM", ""),
"key_pem": os.getenv("KEY_PEM", ""),
},
"signature_id": "SignSUNAT",
}
def main():
with httpx.Client(base_url=BASE_URL) as client:
r = client.post("/api/v1/invoice/create", json=request_body)
r.raise_for_status()
data = r.json()
print("XML firmado:
", data["xml"])
print("Validado SUNAT:", data["validado_sunat"], data["valid"])
if __name__ == "__main__":
main()
import requests
from openubl.models import Invoice, Proveedor, Cliente, DocumentoVentaDetalle
invoice = Invoice(
serie="F001",
numero=1,
proveedor=Proveedor(
ruc="20100111111",
razonSocial="Mi Empresa S.A.C.",
),
cliente=Cliente(
nombre="Juan Perez",
numeroDocumentoIdentidad="12345678",
tipoDocumentoIdentidad="1",
),
detalles=[
DocumentoVentaDetalle(
descripcion="Producto A",
cantidad=2,
precio=100.00,
)
],
moneda="PEN",
)
with requests.Session() as s:
r = s.post(
"http://localhost:8000/api/v1/invoice/create",
json={
"documento": invoice.model_dump(mode="json"),
"firmar": False,
"validar_sunat": True,
},
)
r.raise_for_status()
data = r.json()
print(data["xml"])
print(data["firmado"], data["validado_sunat"], data["valid"], data["errors"])
import httpx
from openubl.models import CreditNote, Proveedor, Cliente, DocumentoVentaDetalle
BASE_URL = "http://localhost:8000"
proveedor = Proveedor(
ruc="20100111111",
razonSocial="Mi Empresa S.A.C.",
)
cliente = Cliente(
nombre="Juan Perez",
numeroDocumentoIdentidad="12345678",
tipoDocumentoIdentidad="1",
)
detalles = [
DocumentoVentaDetalle(
descripcion="Producto A",
cantidad=2,
precio=100.00,
)
]
credit_note = CreditNote(
serie="BC01",
numero=1,
comprobanteAfectadoSerieNumero="F001-1",
sustentoDescripcion="Anulación de venta",
proveedor=proveedor,
cliente=cliente,
detalles=detalles,
moneda="PEN",
)
with httpx.Client(base_url=BASE_URL) as client:
r = client.post(
"/api/v1/credit-note/create",
json={
"documento": credit_note.model_dump(mode="json"),
"firmar": False,
"validar_sunat": True,
},
)
r.raise_for_status()
print(r.json()["xml"])
import httpx
from openubl.models import VoidedDocuments, VoidedDocumentsItem, Proveedor
from datetime import date
BASE_URL = "http://localhost:8000"
proveedor = Proveedor(
ruc="20100111111",
razonSocial="Mi Empresa S.A.C.",
)
voided = VoidedDocuments(
numero=1,
fechaEmisionComprobantes=date(2024, 1, 15),
proveedor=proveedor,
comprobantes=[
VoidedDocumentsItem(
serie="F001",
numero=1,
tipoComprobante="01",
descripcionSustento="Error en datos del cliente",
)
],
)
with httpx.Client(base_url=BASE_URL) as client:
r = client.post(
"/api/v1/voided-documents/create",
json={
"documento": voided.model_dump(mode="json"),
"firmar": False,
"validar_sunat": True,
},
)
r.raise_for_status()
print(r.json()["xml"])
import httpx
from openubl.models import DebitNote, Proveedor, Cliente, DocumentoVentaDetalle
BASE_URL = "http://localhost:8000"
debit_note = DebitNote(
serie="BD01",
numero=1,
comprobanteAfectadoSerieNumero="F001-1",
sustentoDescripcion="Intereses moratorios",
proveedor=Proveedor(ruc="20100111111", razonSocial="Mi Empresa S.A.C."),
cliente=Cliente(nombre="Juan Perez", numeroDocumentoIdentidad="12345678", tipoDocumentoIdentidad="1"),
detalles=[DocumentoVentaDetalle(descripcion="Producto A", cantidad=2, precio=100.00)],
moneda="PEN",
)
with httpx.Client(base_url=BASE_URL) as client:
r = client.post(
"/api/v1/debit-note/create",
json={
"documento": debit_note.model_dump(mode="json"),
"firmar": False,
"validar_sunat": True,
},
)
r.raise_for_status()
print(r.json()["xml"])
import httpx
from datetime import date
from openubl.models import (
SummaryDocuments, SummaryDocumentsItem, Comprobante,
ComprobanteImpuestos, ComprobanteValorVenta, Proveedor, Cliente
)
BASE_URL = "http://localhost:8000"
summary = SummaryDocuments(
numero=1,
fechaEmisionComprobantes=date(2024, 1, 15),
proveedor=Proveedor(ruc="20100111111", razonSocial="Mi Empresa S.A.C."),
comprobantes=[
SummaryDocumentsItem(
tipoOperacion="1",
comprobante=Comprobante(
tipoComprobante="03",
serieNumero="B001-1",
cliente=Cliente(nombre="Juan Perez", numeroDocumentoIdentidad="12345678", tipoDocumentoIdentidad="1"),
impuestos=ComprobanteImpuestos(igv=18.00),
valorVenta=ComprobanteValorVenta(importeTotal=118.00),
),
)
],
)
with httpx.Client(base_url=BASE_URL) as client:
r = client.post(
"/api/v1/summary-documents/create",
json={
"documento": summary.model_dump(mode="json"),
"firmar": False,
"validar_sunat": True,
},
)
r.raise_for_status()
print(r.json()["xml"])
import httpx
from datetime import date
from decimal import Decimal
from openubl.models import (
Perception, PercepcionRetencionOperacion, ComprobanteAfectado, Proveedor, Cliente
)
BASE_URL = "http://localhost:8000"
perception = Perception(
serie="P001",
numero=1,
fechaEmision=date(2024, 1, 15),
proveedor=Proveedor(ruc="20100111111", razonSocial="Mi Empresa S.A.C."),
cliente=Cliente(nombre="Juan Perez", numeroDocumentoIdentidad="12345678", tipoDocumentoIdentidad="1"),
importeTotalPercibido=Decimal("2.00"),
importeTotalCobrado=Decimal("102.00"),
tipoRegimen="01",
tipoRegimenPorcentaje=Decimal("2.00"),
operaciones=[
PercepcionRetencionOperacion(
numeroOperacion=1,
fechaOperacion=date(2024, 1, 15),
importeOperacion=Decimal("100.00"),
comprobante=ComprobanteAfectado(
tipoComprobante="01",
serieNumero="F001-1",
fechaEmision=date(2024, 1, 15),
importeTotal=Decimal("100.00"),
moneda="PEN",
),
)
],
)
with httpx.Client(base_url=BASE_URL) as client:
r = client.post(
"/api/v1/perception/create",
json={
"documento": perception.model_dump(mode="json"),
"firmar": False,
"validar_sunat": True,
},
)
r.raise_for_status()
print(r.json()["xml"])
import httpx
from datetime import date
from decimal import Decimal
from openubl.models import (
Retention, PercepcionRetencionOperacion, ComprobanteAfectado, Proveedor, Cliente
)
BASE_URL = "http://localhost:8000"
retention = Retention(
serie="R001",
numero=1,
fechaEmision=date(2024, 1, 15),
proveedor=Proveedor(ruc="20100111111", razonSocial="Mi Empresa S.A.C."),
cliente=Cliente(nombre="Juan Perez", numeroDocumentoIdentidad="12345678", tipoDocumentoIdentidad="1"),
importeTotalRetenido=Decimal("3.00"),
importeTotalPagado=Decimal("97.00"),
tipoRegimen="01",
tipoRegimenPorcentaje=Decimal("3.00"),
operaciones=[
PercepcionRetencionOperacion(
numeroOperacion=1,
fechaOperacion=date(2024, 1, 15),
importeOperacion=Decimal("100.00"),
comprobante=ComprobanteAfectado(
tipoComprobante="01",
serieNumero="F001-1",
fechaEmision=date(2024, 1, 15),
importeTotal=Decimal("100.00"),
moneda="PEN",
),
)
],
)
with httpx.Client(base_url=BASE_URL) as client:
r = client.post(
"/api/v1/retention/create",
json={
"documento": retention.model_dump(mode="json"),
"firmar": False,
"validar_sunat": True,
},
)
r.raise_for_status()
print(r.json()["xml"])