urieljarethandClaude Opus 5 0ff783fd65 Spec: diseño de Fase 0 y Fase 1 del plugin de propuesta consultiva con IA
Convierte el análisis de negocio de docs/BI-propuesta-consultiva-IA.md en una
especificación cerrada para las dos primeras fases del roadmap.

El análisis previo destapó cuatro problemas que el documento de negocio no
anticipaba, los cuatro verificados en disco:

- POST /mcp no tiene autenticación (api/main.py:107) y _obtener_cotizacion hace
  SELECT c.* sin lista blanca, con dominio público en producción. Publicaría la
  columna de notas internas sin tocar una línea de código.
- No existe una fuente de verdad para los totales: el cálculo está duplicado en
  siete consumidores y el IVA está hardcodeado como * 1.16 en PDF y Excel.
- El Excel es un documento del cliente, no una herramienta interna. El diseño
  inicial proponía poner ahí las notas internas; se corrigió.
- Las transcripciones se sincronizarían a la nube de MEGA: .megaignore solo
  excluye .next, node_modules y .turbo.

También reconcilia nueve contradicciones de contrato entre los diseños
explorados (clave de partida, forma de la evidencia, nombres del valor anual)
que habrían hecho que la capa de validación validara el vacío.

Actualiza AGENTS.md, que había quedado desfasado: 14 modelos y 10 migraciones
(decía 13 y 3), el registro de horas, la doble propuesta, los modelos de cobro
y la convención de no usar diálogos nativos del navegador.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-07-28 14:20:03 -06:00
1
2026-06-10 02:15:05 -06:00
1
2026-06-10 02:16:08 -06:00
1
2026-06-10 02:15:05 -06:00
1
2026-06-10 02:15:05 -06:00
2026-04-27 02:36:51 -06:00
1
2026-06-10 02:16:08 -06:00
1
2026-06-10 02:04:37 -06:00
1
2026-06-10 02:04:37 -06:00
1
2026-06-10 02:04:37 -06:00
1
2026-06-10 02:04:37 -06:00
1
2026-06-10 02:04:37 -06:00

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 adapter PrismaPg)
  • Base de datos: PostgreSQL 16 (vía Docker)
  • Auth: JWT (jose) en cookie httpOnly, contraseñas con bcryptjs
  • API alterna: servicio Python FastAPI + servidor MCP en api/ (para n8n / agentes de IA)

Requisitos

  • Node.js 20+
  • Docker (para PostgreSQL)
  • Un archivo .env en la raíz — copia .env.example y define al menos JWT_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, MCP en /mcp

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

  1. Sube el repo a GitHub (privado recomendado).
  2. En Coolify: + New Resource → Docker Compose, conecta el repo y la rama.
  3. En la configuración del recurso, define Docker Compose Location = /docker-compose.coolify.yml.
  4. Coolify detecta los servicios y asigna dominio a web (puerto 3000) y api (puerto 8000) vía las variables SERVICE_FQDN_* — configura los dominios deseados en la UI.
  5. Define las variables de entorno en Coolify:
Variable Obligatoria Notas
JWT_SECRET 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
  1. Deploy. Orden de arranque: postgres (healthy) → web (migra + seed + sirve) → api.
  2. Después del primer despliegue exitoso, cambia RUN_SEED a false y 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_data persiste la base de datos entre deploys. No lo borres.
  • El servidor MCP queda en https://<dominio-api>/mcp (auth por X-API-Key).
  • La fórmula de financiamiento y los cálculos viven duplicados en src/lib/calculators.ts y api/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).

S
Description
Cotizador E3
Readme
5.6 MiB
Languages
TypeScript 78%
Python 21.2%
Dockerfile 0.3%
Batchfile 0.2%
CSS 0.2%