Ir al contenido

Ejemplos de uso

Los siguientes ejemplos asumen que el servidor está corriendo en http://localhost:8000.

import httpx
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 httpx.Client(base_url="http://localhost:8000") as client:
r = client.post("/api/v1/invoice/create", json=invoice.model_dump(mode="json"))
r.raise_for_status()
print(r.json()["xml"])

Respuesta esperada:

{
"xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>..."
}

Para omitir la validación SUNAT, añade ?validate=false a la URL.

import os
import httpx
xml = "<?xml version="1.0" encoding="UTF-8"?>..."
with httpx.Client(base_url="http://localhost:8000") as client:
r = client.post(
"/api/v1/sign",
json={
"xml": xml,
"cert_pem": os.getenv("CERT_PEM", ""),
"key_pem": os.getenv("KEY_PEM", ""),
"signature_id": "SignSUNAT",
},
)
r.raise_for_status()
print(r.json()["signed_xml"])

Respuesta esperada:

{
"signed_xml": "<?xml version=\"1.0\"?>...<ds:Signature>..."
}
import httpx
from openubl.models import CreditNote, Proveedor, Cliente, DocumentoVentaDetalle
credit_note = CreditNote(
serie="BC01",
numero=1,
comprobanteAfectadoSerieNumero="F001-1",
sustentoDescripcion="Anulación de venta",
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="http://localhost:8000") as client:
r = client.post("/api/v1/credit-note/create", json=credit_note.model_dump(mode="json"))
r.raise_for_status()
print(r.json()["xml"])

Puedes redirigir la salida y extraer el XML con jq:

import httpx
import json
with httpx.Client(base_url="http://localhost:8000") as client:
r = client.post(
"/api/v1/invoice/create",
json=json.load(open("invoice.json")),
)
r.raise_for_status()
with open("invoice.xml", "w", encoding="utf-8") as f:
f.write(r.json()["xml"])