Generador de cotizaciones y presupuestos profesionales por línea de comandos en Python.
💖 Donar / Apoyar Proyecto (0 USD)# cotizador-cli-python
Generador de cotizaciones y presupuestos profesionales por linea de comandos, en Python puro y **sin dependencias externas**.
Calcula subtotales, descuento, base gravable, impuesto por pais, total, anticipo y saldo. Exporta a **HTML A4 imprimible (PDF)** y a **texto plano** para email o WhatsApp.
[](https://www.paypal.com/ncp/payment/BCZ57ETY8EJR4)
## Por que existe
Cotizar a mano en Excel o Word provoca errores de calculo, formatos inconsistentes y horas perdidas. Este script convierte un JSON simple en una cotizacion profesional lista para enviar, en un segundo.
## Instalacion
No requiere instalacion ni `pip install`. Solo Python 3.8+:
```bash
git clone https://github.com/todoaquimismo-alt/cotizador-cli-python.git
cd cotizador-cli-python
python3 cotizador_cli.py --demo
```
## Uso rapido
```bash
# Cotizacion de ejemplo: genera cotizacion.html y cotizacion.txt
python3 cotizador_cli.py --demo
# Solo HTML (imprimible a PDF con Ctrl+P)
python3 cotizador_cli.py --demo --formato html --salida mi_cotizacion
# Desde tu propio JSON
python3 cotizador_cli.py --entrada mi_cotizacion.json --formato ambos
# Solo los totales calculados, en JSON (para integrar con otros sistemas)
python3 cotizador_cli.py --demo --json
```
## Formato del JSON de entrada
```json
{
"numero": "COT-2026-001",
"fecha": "2026-10-26",
"validez_dias": 15,
"moneda": "COP",
"impuesto_pct": 19,
"descuento_pct": 5,
"anticipo_pct": 50,
"empresa": {
"nombre": "Mi Empresa S.A.S.",
"id": "NIT 900.123.456-7",
"contacto": "hola@miempresa.com",
"direccion": "Bogota, Colombia"
},
"cliente": {
"nombre": "Cliente S.A.S.",
"contacto": "compras@cliente.co"
},
"items": [
{"descripcion": "Sitio web corporativo", "cantidad": 1, "precio": 2400000},
{"descripcion": "Horas de soporte", "cantidad": 5, "precio": 90000}
],
"notas": "Pago 50% anticipo, 50% contra entrega."
}
```
## Uso como libreria
```python
from cotizador_cli import calcular, generar_html, generar_texto
datos = {
"moneda": "USD",
"impuesto_pct": 21,
"descuento_pct": 10,
"anticipo_pct": 50,
"empresa": {"nombre": "Estudio Nova"},
"cliente": {"nombre": "Acme Inc."},
"items": [{"descripcion": "Landing page", "cantidad": 1, "precio": 1200}],
}
r = calcular(datos)
print(r["total"]) # 1306.8
print(r["saldo"]) # 653.4
html = generar_html(datos, r)
```
## Impuestos por pais (referencia)
| Pais | Impuesto | `impuesto_pct` |
|---|---|---|
| Colombia | IVA | 19 |
| Espana | IVA | 21 |
| Mexico | IVA | 16 |
| Chile | IVA | 19 |
| Argentina | IVA | 21 |
| Peru | IGV | 18 |
| Ecuador | IVA | 12 |
## Funciones principales
| Funcion | Descripcion |
|---|---|
| `calcular(datos)` | Devuelve todos los totales calculados y validados |
| `generar_html(datos, r)` | Documento HTML A4 listo para imprimir o guardar como PDF |
| `generar_texto(datos, r)` | Cotizacion en texto plano para email o WhatsApp |
| `validar(datos)` | Lanza `ErrorCotizacion` con mensajes claros |
| `formatear(monto, moneda)` | Formato latino: `1.234.567,89` |
| `cargar_json(ruta)` | Carga y valida un JSON desde disco |
## Manejo de errores
Todos los errores de datos lanzan `ErrorCotizacion` con un mensaje explicito (campo faltante, valor no numerico, porcentaje fuera de rango). La CLI los captura, imprime `[ERROR] ...` en stderr y devuelve codigo de salida `1`, lo que permite usarla en scripts y CI.
## Licencia
MIT. Uso libre, comercial o personal.
## Apoya el proyecto
Si esta herramienta te ahorro tiempo, puedes dejar una contribucion voluntaria:
**https://www.paypal.com/ncp/payment/BCZ57ETY8EJR4**
Tambien puedes probar la version web sin instalar nada:
**https://todoaquimismo-alt.github.io/generador-cotizaciones-pro/**