main
Medicion de 3 vueltas mas contra datos reales. El aplanado del commit anterior NO redujo los reintentos: subieron de 3 a 10. Se mantiene porque quitar ese nivel es correcto de todos modos, pero no cumplio su proposito. Lo que si salio de esa medicion son dos restricciones mias que provocaban el rechazo: - min(5) en los textos de materiales, decisiones, menciones y red flags. Con una transcripcion pobre no hay nada que listar, asi que el modelo mete "N/A" o un guion para rellenar y falla. Ocurrio 4 veces SEGUIDAS en una vuelta. Baja a min(3), y el prompt ahora dice explicitamente que devolver el array vacio es la respuesta correcta y que no rellene. - beneficios.etiqueta.max(40) se pasaba en 2 de 3 vueltas. Sube a 70. Es el mismo patron que el tope de 40 partidas: el schema peleandose con la realidad, no el modelo fallando. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Cotizador E3
Sistema de generación de cotizaciones para Consultoría E3 (marketing digital, Querétaro MX). Servicios organizados en 4 fases, dos tipos de pago (único / mensual), planes CRM Bucéfalo y financiamiento opcional. Exporta a PDF y Excel.
Stack
- Frontend / app web: Next.js 16 (App Router) + React 19 + Tailwind CSS v4 + Zustand
- ORM: Prisma 7 (cliente generado en
src/generated/prisma, driver adapterPrismaPg) - Base de datos: PostgreSQL 16 (vía Docker)
- Auth: JWT (
jose) en cookie httpOnly, contraseñas conbcryptjs - API alterna: servicio Python FastAPI en
api/(para n8n / integraciones)
Requisitos
- Node.js 20+
- Docker (para PostgreSQL)
- Un archivo
.enven la raíz — copia .env.example y define al menosJWT_SECRET
Arranque rápido (Windows)
start.bat :: levanta PostgreSQL en Docker, aplica migraciones y arranca Next.js
stop.bat :: detiene todo
Arranque manual
docker compose up -d postgres # base de datos
npx prisma migrate deploy # aplica migraciones
npx tsx prisma/seed.ts # carga catálogo (idempotente)
npm run dev # http://localhost:3000
Comandos
| Comando | Propósito |
|---|---|
npm run dev |
Servidor de desarrollo (puerto 3000) |
npm run build |
Build de producción (incluye chequeo de tipos) |
npm run lint |
ESLint |
npm run db:migrate |
prisma migrate dev |
npm run db:seed |
Carga de datos semilla |
npm run db:studio |
Prisma Studio |
npm run db:generate |
Regenera el cliente Prisma |
API Python (opcional)
cd api
pip install -r requirements.txt
uvicorn main:app --reload --port 8000 # Swagger en /docs
Referencia completa de endpoints en api/COTIZADOR_API_SKILL.md.
Despliegue en Coolify
El stack de producción está en docker-compose.coolify.yml: postgres + web (Next.js) + api (FastAPI). El contenedor web aplica las migraciones de Prisma automáticamente en cada arranque.
Pasos
- Sube el repo a GitHub (privado recomendado).
- En Coolify: + New Resource → Docker Compose, conecta el repo y la rama.
- En la configuración del recurso, define Docker Compose Location =
/docker-compose.coolify.yml. - Coolify detecta los servicios y asigna dominio a
web(puerto 3000) yapi(puerto 8000) vía las variablesSERVICE_FQDN_*— configura los dominios deseados en la UI. - Define las variables de entorno en Coolify:
| Variable | Obligatoria | Notas |
|---|---|---|
JWT_SECRET |
Sí | openssl rand -base64 32 |
API_KEY |
Sí (para el API) | Clave para agentes/n8n |
DB_PASSWORD |
Recomendada | Password de PostgreSQL (default postgres) |
RUN_SEED |
Primer deploy | true solo la primera vez; luego false |
SEED_ADMIN_EMAIL / SEED_ADMIN_PASSWORD / SEED_ADMIN_NAME |
Primer deploy | Usuario admin inicial |
SEED_ASESOR_EMAIL / SEED_ASESOR_PASSWORD / SEED_ASESOR_NAME |
No | Asesor opcional |
- Deploy. Orden de arranque:
postgres(healthy) →web(migra + seed + sirve) →api. - Después del primer despliegue exitoso, cambia
RUN_SEEDafalsey redeploya (el seed es idempotente, pero no hace falta correrlo cada vez).
Healthchecks
- Web:
GET /api/health(verifica también la conexión a la BD) - API:
GET /health
Notas
- No expongas el puerto 5432: los servicios se comunican por la red interna del compose.
- El volumen
postgres_datapersiste la base de datos entre deploys. No lo borres. - El API expone REST en
https://<dominio-api>con auth porX-API-Keyo JWT. El servidor MCP se retiro el 2026-07-28 (verAGENTS.md). - Las versiones de
api/requirements.txtestan fijas a proposito: un rango abierto dejo entrarmcp2.0.0 y tumbo el API en produccion. Sube dependencias a proposito, no al redesplegar. - La fórmula de financiamiento y los cálculos viven duplicados en
src/lib/calculators.tsyapi/app/services/calculators.py— mantenlos en paridad.
Documentación para agentes
Las convenciones del proyecto, gotchas de Prisma 7 / PDFKit / Next.js 16 y el modelo de datos
están en AGENTS.md (importado por CLAUDE.md).
Languages
TypeScript
78%
Python
21.2%
Dockerfile
0.3%
Batchfile
0.2%
CSS
0.2%