⚡ Cotizador CLI Python

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.

[![Donar via PayPal](https://img.shields.io/badge/Donar-PayPal-0070ba?logo=paypal&logoColor=white)](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/**

← Volver al Catálogo Central