Initial commit: SKEEN Derma Experts - Sistema Integral de Gestión Clínica
- Frontend React (SKEEN Brand) con Vite, TypeScript, Tailwind - Frontend Homenest (versión alternativa) - Módulos Odoo 17 custom (citas, pacientes, monedero, pagos, ventas, inventario, whatsapp) - WACRM fork (Next.js 16 + Supabase) - Hermes + Bridge + Skills (Qwen3.6 via Nan Builders) - Scripts de migración y operación - Documentación extensiva en docs/
This commit is contained in:
246
docs/ESTADO_PROYECTO.md
Normal file
246
docs/ESTADO_PROYECTO.md
Normal file
@@ -0,0 +1,246 @@
|
||||
# Estado del Proyecto SKEEN Derma Experts
|
||||
## WACRM + Hermes + Odoo + Frontend
|
||||
|
||||
**Fecha:** 6 de julio de 2026 (actualizado)
|
||||
**VM:** Hetzner VPS (22 GB RAM / 6 vCPU / 77 GB SSD)
|
||||
**Objetivo:** Sistema instalado y funcionando con datos demo; análisis del sistema actual de SKEEN completado; roadmap de mejora definido.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Resumen de lo que funciona
|
||||
|
||||
| Componente | Estado | URL / Puerto | Notas |
|
||||
|------------|--------|--------------|-------|
|
||||
| Supabase self-hosted | ✅ | http://localhost:8000 (Kong), PostgreSQL :5433 | Contenedores Docker healthy. Datos persistentes en volúmenes Docker. |
|
||||
| WACRM | ✅ | http://localhost:3000 | Build Next.js 16 con endpoint `/api/v1/messages/simulate` para modo demo. |
|
||||
| Odoo 17 | ✅ | http://localhost:8069 | Datos demo y de migración importados. Nuevos modelos WACRM cachean conversaciones/mensajes/leads. |
|
||||
| Frontend React | ✅ | http://localhost:5173 / http://192.168.10.114/ | Diseño "SKEEN Brand". Menú WACRM con Mensajes y Leads. Build desplegado en nginx. |
|
||||
| Hermes Gateway | ✅ | API :8080 | Corriendo; bridge propio complementa la integración. |
|
||||
| Bridge Webhook SKEEN | ✅ | http://localhost:8090 | Recibe webhooks de WACRM, consulta Nan builders, responde como Sofía. |
|
||||
| Integración WACRM ↔ Hermes | ✅ | Via automatización `send_webhook` | Flujo end-to-end validado: mensaje de prueba → Sofía → respuesta en WACRM. |
|
||||
| Frontend ↔ Odoo | ✅ | Proxy Vite `/api/odoo` | Dashboard `medical` muestra stats reales. |
|
||||
| WACRM ↔ Odoo proxy | ✅ | `/skeen/frontend/v1/wacrm/*` | Odoo cachea contactos, conversaciones, mensajes y leads de Supabase. Frontend los consume. |
|
||||
|
||||
---
|
||||
|
||||
## 🔗 URLs de acceso
|
||||
|
||||
Desde la VM:
|
||||
- WACRM: http://localhost:3000
|
||||
- Frontend: http://localhost:5173
|
||||
- Odoo: http://localhost:8069
|
||||
- Supabase Studio: http://localhost:8000/project/default
|
||||
- Bridge health: http://localhost:8090/health
|
||||
|
||||
Desde red externa (si los puertos están abiertos):
|
||||
- Reemplaza `localhost` por la IP pública de la VM.
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Diseño de frontend
|
||||
|
||||
Se mantiene un único diseño oficial: **SKEEN Brand** (`/designs/brand`).
|
||||
|
||||
- Inspirado directamente en la identidad de marca de SKEEN.
|
||||
- Tipografía serif (Playfair Display), tonos stone/cálidos, hero con tagline, navegación redondeada, contacto visible.
|
||||
- La raíz (`/`) redirige automáticamente a `/designs/brand`.
|
||||
- Consume datos reales de Odoo vía el proxy `/api/odoo`.
|
||||
|
||||
Los otros 9 diseños experimentales fueron eliminados para enfocar el trabajo en una sola identidad visual.
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Flujo end-to-end validado
|
||||
|
||||
Se simuló un mensaje de WhatsApp entrante usando `/root/simular_meta_webhook.py` y también directamente al bridge:
|
||||
|
||||
1. Meta webhook simulado → `POST /api/whatsapp/webhook` (WACRM)
|
||||
2. WACRM crea contacto + conversación + mensaje `customer`
|
||||
3. WACRM dispara automatización `new_message_received`
|
||||
4. Automatización ejecuta `send_webhook` a `http://localhost:8090/webhook/wacrm`
|
||||
5. Bridge extrae `from`, `text`, `conversation_id`, `contact_id`
|
||||
6. Bridge consulta a Nan builders (`deepseek-v4-flash`) con el system prompt de Sofía
|
||||
7. Nan builders genera respuesta
|
||||
8. Bridge envía respuesta a WACRM `/api/v1/messages` → falla porque no hay token Meta
|
||||
9. Bridge hace fallback a `/api/v1/messages/simulate` → respuesta guardada en WACRM como mensaje `agent`
|
||||
|
||||
**Resultado:** la conversación en WACRM muestra mensaje del paciente + respuesta de Sofía.
|
||||
|
||||
## ✅ Ronda de pruebas recientes (5 jul 2026)
|
||||
|
||||
| Prueba | Resultado | Detalle |
|
||||
|--------|-----------|---------|
|
||||
| Build frontend (`npm run build`) | ✅ | CSS 56 kB, JS 816 kB, sin errores de Tailwind |
|
||||
| Linter (`npm run lint`) | ✅ | 0 warnings, 0 errors |
|
||||
| Odoo update módulos custom | ✅ | `skeen_pacientes`, `skeen_citas`, `skeen_monedero`, `skeen_pagos`, `skeen_whatsapp` actualizados |
|
||||
| Odoo endpoints | ✅ | `/health`, `/dashboard`, `/appointments`, `/patients`, `/wallets`, `/services`, `/weekly_chart` responden |
|
||||
| Frontend proxy a Odoo | ✅ | `/api/odoo/skeen/frontend/v1/health` responde vía Vite proxy |
|
||||
| 10 diseños cargan | ✅ | Diseño "brand" responde HTTP 200; los otros 9 fueron eliminados |
|
||||
| Bridge webhook | ✅ | `POST /webhook/wacrm` responde con respuesta de Sofía |
|
||||
| WACRM app | ✅ | Responde en `:3000`, modo demo con simulate endpoint |
|
||||
| Supabase self-hosted | ✅ | Todos los contenedores healthy |
|
||||
|
||||
## 🔧 Cambios técnicos recientes en Odoo
|
||||
|
||||
- **WACRM proxy en Odoo**: se agregaron modelos `skeen.wacrm.*` y controladores REST en `skeen_whatsapp/controllers/wacrm_proxy.py` para sincronizar contactos, conversaciones, mensajes, pipelines, stages y deals desde Supabase hacia Odoo.
|
||||
- **Menú WACRM en frontend**: nuevas páginas `/wacrm/messages` y `/wacrm/leads` con sincronización manual y visualización de datos.
|
||||
- **Script de migración mejorado**: `/root/migracion/importar_a_odoo.py` ahora importa pacientes, servicios, productos, médicos, citas, ventas, pagos, adeudos y monederos desde CSVs.
|
||||
- **Variables de entorno Supabase**: `skeen-start-all.sh` exporta `SUPABASE_URL` y `SUPABASE_SERVICE_ROLE_KEY` para que Odoo pueda leer WACRM directamente.
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Cómo iniciar / detener todo
|
||||
|
||||
```bash
|
||||
# Iniciar todo
|
||||
/root/skeen-start-all.sh
|
||||
|
||||
# Detener todo
|
||||
/root/skeen-stop-all.sh
|
||||
```
|
||||
|
||||
Esperar ~20-30 segundos después de iniciar. Verificar puertos:
|
||||
```bash
|
||||
ss -tlnp | grep -E "3000|5173|8069|8000|8090|8644|8080"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 Archivos clave modificados/creados
|
||||
|
||||
| Ruta | Propósito |
|
||||
|------|-----------|
|
||||
| `/root/ANALISIS_SKEEN_SISTEMA.md` | Análisis completo del sistema actual https://sistema.skeenmx.app/ |
|
||||
| `/root/ROADMAP_SKEEN_MEJORA.md` | Roadmap para replicar/mejorar el sistema actual en Odoo + WACRM + Frontend + Hermes |
|
||||
| `/root/skeen-frontend/src/App.tsx` | Rutas simplificadas: solo diseño SKEEN Brand, `/` redirige a `/designs/brand`. |
|
||||
| `/root/skeen-frontend/src/designs/brand/Dashboard.tsx` | Único diseño oficial del frontend. |
|
||||
| `/root/skeen-frontend/vite.config.ts` | Plugin `@tailwindcss/vite` configurado. |
|
||||
| `/root/skeen-odoo/addons/skeen_monedero/models/res_partner.py` | Campos `wallet_points` y `monedero_ids` en el módulo correcto. |
|
||||
| `/root/skeen-odoo/addons/skeen_citas/models/cita.py` | Campo `time_str` compute. |
|
||||
| `/root/skeen-odoo/addons/skeen_*/security/ir.model.access.csv` | Permisos de acceso completados. |
|
||||
| `/root/skeen-odoo/addons/skeen_whatsapp/controllers/wacrm_proxy.py` | Proxy/caché WACRM ↔ Odoo. |
|
||||
| `/root/skeen-odoo/addons/skeen_whatsapp/models/wacrm_sync.py` | Modelos Odoo para cachear datos de WACRM. |
|
||||
| `/root/skeen-frontend/src/pages/WacrmMessages.tsx` | Página de conversaciones/mensajes de WACRM. |
|
||||
| `/root/skeen-frontend/src/pages/WacrmLeads.tsx` | Página de leads/deals de WACRM. |
|
||||
| `/root/migracion/importar_a_odoo.py` | Script de migración CSV → Odoo. |
|
||||
| `/root/migracion/README.md` | Instrucciones y formatos de migración. |
|
||||
| `/root/skeen-start-all.sh` | Inicia todo el ecosistema (con env vars de Supabase). |
|
||||
| `/root/skeen-stop-all.sh` | Detiene todo el ecosistema. |
|
||||
|
||||
---
|
||||
|
||||
## 🔌 Datos del cliente pendientes por conectar
|
||||
|
||||
Cuando SKEEN entregue estos datos, se conectan en los siguientes lugares:
|
||||
|
||||
| Dato | Dónde se usa | Archivo / UI |
|
||||
|------|--------------|--------------|
|
||||
| Número WhatsApp Business verificado | Meta Developers + WACRM | WACRM Settings → WhatsApp |
|
||||
| Meta App ID + App Secret | WACRM webhook signature | `/root/skeen-wacrm/.env.local` (`META_APP_SECRET`) |
|
||||
| Meta Access Token + WABA ID + Phone Number ID | Envío/recepción WhatsApp | WACRM Settings → WhatsApp |
|
||||
| Templates de WhatsApp aprobados | Automatizaciones y campañas | WACRM + Meta Business Manager |
|
||||
| Lista de servicios y precios | Skill de catálogo + Odoo | `/root/skeen-roadmap-hermes/hermes/webhook-bridge.js` (SKEEN_SYSTEM_PROMPT) y Odoo `product.template` |
|
||||
| Horarios de atención | Agendamiento | Skill `skeen-agendar` (a crear) + Odoo `skeen_citas` |
|
||||
| Stripe / MercadoPago keys | Pagos | Odoo módulo `skeen_pagos` y skill `skeen-pagos` |
|
||||
| Dominio skeen.mx | DNS + Nginx | Aún no configurado; actualmente todo en localhost |
|
||||
| Logo / branding | WACRM fork + frontend | `/root/skeen-wacrm` y `/root/skeen-frontend` |
|
||||
|
||||
---
|
||||
|
||||
## 🚨 Notas técnicas importantes
|
||||
|
||||
1. **Modo demo / Meta no conectado**
|
||||
- Como no hay tokens reales de Meta, WACRM no puede enviar mensajes reales por WhatsApp.
|
||||
- Se creó el endpoint `/api/v1/messages/simulate` para que el flujo end-to-end funcione en demo.
|
||||
- Cuando Meta se conecte, el bridge usará automáticamente `/api/v1/messages` real; el fallback solo se activa ante errores de Meta.
|
||||
|
||||
2. **API key de WACRM**
|
||||
- Creada en Supabase tabla `api_keys` con scopes: `messages:send`, `messages:read`, `contacts:read`, `contacts:write`, `conversations:read`, `broadcasts:send`, `webhooks:manage`.
|
||||
- El bridge la lee de `WACRM_API_KEY` (ver `/root/skeen-roadmap-hermes/hermes/webhook-bridge.js`).
|
||||
|
||||
3. **Automatización en WACRM**
|
||||
- Nombre: "Nuevo mensaje → Webhook Hermes Bridge"
|
||||
- Trigger: `new_message_received`
|
||||
- Step: `send_webhook` a `http://localhost:8090/webhook/wacrm`
|
||||
- Body template: `{"from":"{{ vars.contact_phone }}","text":"{{ message.text }}","conversation_id":"{{ vars.conversation_id }}","contact_id":"{{ vars.contact_id }}"}`
|
||||
|
||||
4. **Supabase self-hosted**
|
||||
- PostgreSQL expuesto en puerto `5433` (no el 5432 directo).
|
||||
- Para conectar `psql` desde fuera del contenedor usar el puerto 5433 con `external_id` o conectarse por `docker exec supabase-db psql -U postgres -d postgres`.
|
||||
|
||||
5. **Hermes vs OpenClaw / Bridge actual**
|
||||
- El roadmap original usaba OpenClaw; se sustituyó por Hermes (`https://api.nan.builders/v1`).
|
||||
- El chat nativo de Hermes no se configuró; en su lugar el bridge llama directamente a la API REST de nan.builders para generar respuestas de Sofía.
|
||||
- Los skills de Hermes (`skeen-rag`, `skeen-agendar`, etc.) están creados en `/root/skeen-roadmap-hermes/hermes/skills/` y se activarán cuando el gateway de Hermes se integre formalmente como receptor de webhooks.
|
||||
|
||||
---
|
||||
|
||||
## 📝 Próximos pasos sugeridos
|
||||
|
||||
Ahora que se completó el análisis del sistema actual, el trabajo se enfoca en replicar y mejorar cada sección. Ver el roadmap completo en `/root/ROADMAP_SKEEN_MEJORA.md`.
|
||||
|
||||
1. **Migración de datos maestros (FASE 0)** — *listo para ejecutar*
|
||||
- SKEEN debe proporcionar exportación autorizada de su sistema actual.
|
||||
- Colocar CSVs en `/root/migracion/datos/` y ejecutar `python3 /root/migracion/importar_a_odoo.py`.
|
||||
|
||||
2. **Frontend fiel al sistema actual (FASE 1)**
|
||||
- El menú WACRM ya está operativo. Siguiente: replicar secciones restantes del sistema legacy (visitas, expedientes médicos, catálogos, reportes).
|
||||
|
||||
3. **Conexión Odoo ↔ Frontend (FASE 2)**
|
||||
- Extender endpoints REST de Odoo para todas las secciones.
|
||||
- Crear cliente API en React y conectar cada pantalla.
|
||||
|
||||
4. **WhatsApp + WACRM + Hermes (FASE 3)**
|
||||
- Conectar número de WhatsApp Business de SKEEN.
|
||||
- Configurar automatizaciones, skills de Hermes, templates de Meta.
|
||||
- Habilitar inbox multi-agente y handoff a humano.
|
||||
|
||||
5. **Reportes, analytics y go-live (FASES 4-5)**
|
||||
- Dashboards con Recharts, metas de ventas, exportaciones.
|
||||
- Dominios SSL, backups, capacitación y go-live gradual.
|
||||
|
||||
---
|
||||
|
||||
## 📞 Comandos útiles
|
||||
|
||||
```bash
|
||||
# Ver todos los servicios
|
||||
ss -tlnp | grep -E "3000|5173|8069|8000|8090|8644|8080|5433|6379"
|
||||
|
||||
# Logs en tiempo real
|
||||
tail -f /tmp/wacrm.log
|
||||
tail -f /tmp/hermes-bridge.log
|
||||
tail -f /tmp/odoo.log
|
||||
tail -f /tmp/frontend.log
|
||||
tail -f /tmp/hermes-gateway.log
|
||||
|
||||
# Simular mensaje de WhatsApp entrante
|
||||
python3 /root/simular_meta_webhook.py
|
||||
|
||||
# Estado de contenedores Supabase
|
||||
cd /root/skeen-supabase/docker && docker compose ps
|
||||
|
||||
# Acceder a PostgreSQL de Supabase
|
||||
docker exec supabase-db psql -U postgres -d postgres
|
||||
|
||||
# Recompilar WACRM tras cambios
|
||||
cd /root/skeen-wacrm && npm run build
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✉️ Handoff
|
||||
|
||||
El sistema está instalado y funcionando. Se completó:
|
||||
|
||||
- ✅ Menú WACRM en el frontend (Mensajes y Leads) con sincronización manual desde Supabase.
|
||||
- ✅ Modelos y endpoints proxy en Odoo para cachear contactos, conversaciones, mensajes, pipelines, stages y deals de WACRM.
|
||||
- ✅ Script de migración mejorado (`/root/migracion/importar_a_odoo.py`) probado con datos de ejemplo.
|
||||
- ✅ Frontend desplegado en nginx (`http://192.168.10.114/`).
|
||||
- ✅ Odoo actualizado y corriendo con variables de entorno de Supabase.
|
||||
|
||||
**Bloqueo ético/legal:** no se realizó extracción masiva de datos desde `https://sistema.skeenmx.app/` porque requiere autorización documentada del cliente. El script de migración está listo para ejecutarse tan pronto como SKEEN entregue una exportación autorizada (CSVs o dump SQL).
|
||||
|
||||
Próximo paso prioritario: que SKEEN proporcione exportación autorizada de pacientes, citas, historial, ventas, pagos y monederos para ejecutar la migración real.
|
||||
|
||||
Para cualquier duda, revisar los logs, `/root/ANALISIS_SKEEN_SISTEMA.md` y `/root/ROADMAP_SKEEN_MEJORA.md`.
|
||||
Reference in New Issue
Block a user