Metadata-Version: 2.4
Name: ruraldte
Version: 0.2.0
Summary: SDK Python del API v1 de RuralDTE — emisión de DTE ante el SII de Chile (emitir = encolar), folios/CAF, webhooks, pagos, cesiones, conectores y más.
Project-URL: Homepage, https://ruraldte.cl
Project-URL: Documentation, https://ruraldte.cl/docs
License-Expression: MIT
License-File: LICENSE
Keywords: boleta-electronica,chile,dte,factura-electronica,facturacion,sii
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Office/Business :: Financial
Requires-Python: >=3.9
Description-Content-Type: text/markdown

# ruraldte (Python)

SDK Python del API v1 de [RuralDTE](https://ruraldte.cl) — emisión de documentos
tributarios electrónicos (DTE) ante el SII de Chile. Cero dependencias (solo stdlib).

## Instalación

```bash
pip install ruraldte
```

> Desde 0.2.0 cubre **los 13 recursos del API**, a la par con el SDK TypeScript
> ([`@ruraldte/sdk`](https://www.npmjs.com/package/@ruraldte/sdk)): mismas rutas,
> métodos en `snake_case`. Un test compara ambas superficies para que no vuelvan
> a divergir.

```python
import os
from ruraldte import RuralDte, RuralDteError

rd = RuralDte(api_key=os.environ["RURALDTE_API_KEY"])

# Emitir = encolar (202 { "status": "queued" }). El SII confirma asíncrono.
try:
    doc = rd.documents.emit({
        "emisorId": "…",
        "tipo": 33,                 # factura electrónica
        "ambiente": "cert",
        "receptor": {"rut": "11111111-1", "razonSocial": "ACME SpA"},
        "montos": {"total": 1190, "neto": 1000, "iva": 190},  # CLP enteros
    }, idempotency_key="orden-123")
    print(doc["id"], doc["status"])

    # Pollear el desenlace (o suscribir un webhook a dte.aceptado/dte.rechazado).
    print(rd.documents.states(doc["id"]))
except RuralDteError as e:
    print(e.status, e.code, e.detail, "retryable:", e.is_retryable)
```

## Recursos

| | |
|---|---|
| `documents` | `emit`, `emit_batch`, `batch_status`, `recuperar_iva`, `list`, `get`, `states`, `get_xml`, `get_pdf`, `share` |
| `folios` | `stock`, `request`, `sync`, `autopilot`, `gaps` |
| `emisores` | `list`, `create`, `upload_credential`, `revoke_credential` |
| `webhooks` | `list`, `register`, `disable`, `enable`, `stats` |
| `keys` | `list`, `create`, `revoke` |
| `reportes` | `ventas`, `top_receptores`, `folios_bajos` |
| `scheduled` | `create`, `list`, `disable`, `enable` |
| `certification` | `start`, `list`, `status` |
| `connectors` | `list`, `create`, `set_secret`, `pause`, `resume`, `revoke`, `events` |
| `payments` | `create_link`, `list`, `get`, `ledger`, `get_bank_account`, `set_bank_account`, `payouts` |
| `cesiones` | `elegibles`, `batch`, `get`, `registrar`, `estado` |
| `intercambio` | `receive` |
| `status` | `sii` |

```python
xml = rd.documents.get_xml(doc["id"])   # str, decodificado con el charset real (ISO-8859-1)
pdf = rd.documents.get_pdf(doc["id"])   # bytes
open("dte.pdf", "wb").write(pdf)

rd.folios.request(emisor_id="…", tipo=33)          # cantidad omitida = el máximo que autoriza el SII
rd.webhooks.register("https://tu.cl/hook", ["pago.pagado"])
```

Config: `RuralDte(api_key, base_url=…, timeout=30)`. La key fija el ambiente
permitido (`rdte_test_*` → test/cert, `rdte_live_*` → prod).

Docs y OpenAPI: <https://ruraldte.cl/docs>

Tests: `python3 -m unittest discover -s tests -t .`

MIT © Comunidad Rural SpA
