- 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/
299 lines
8.2 KiB
Markdown
299 lines
8.2 KiB
Markdown
# Guía de Migración — SKEEN Derma Experts
|
|
|
|
**Versión:** 2.0
|
|
**Fecha:** 16 de julio de 2026
|
|
|
|
---
|
|
|
|
## 1. Introducción
|
|
|
|
Esta guía describe el proceso de migración de datos desde el sistema legacy de SKEEN (`https://sistema.skeenmx.app/`) hacia el nuevo sistema basado en Odoo 17.
|
|
|
|
**Importante:** La migración requiere autorización documentada del cliente. No se ha realizado extracción masiva de datos sin permiso explícito.
|
|
|
|
---
|
|
|
|
## 2. Datos a Migrar
|
|
|
|
| Entidad | Descripción | Prioridad |
|
|
|---------|-------------|-----------|
|
|
| Pacientes | Datos personales, contacto, historial médico | Alta |
|
|
| Citas | Histórico de citas, fechas, servicios | Alta |
|
|
| Servicios | Catálogo de tratamientos, precios, paquetes | Alta |
|
|
| Ventas | Histórico de ventas, pagos, adeudos | Media |
|
|
| Monedero | Puntos de fidelidad acumulados | Media |
|
|
| Inventario | Productos y consumibles | Media |
|
|
| Médicos | Personal de la clínica | Baja |
|
|
|
|
---
|
|
|
|
## 3. Formatos de Datos
|
|
|
|
### 3.1 CSV de Pacientes
|
|
|
|
```csv
|
|
name,phone,email,birthdate,gender,blood_type,allergies,address,notes
|
|
Juan Pérez,526641234567,juan@example.com,1990-01-15,male,O+,Penicilina,"Calle 123, Rosarito","Paciente frecuente"
|
|
```
|
|
|
|
**Campos:**
|
|
- `name` (required): Nombre completo
|
|
- `phone` (required): Teléfono (formato internacional sin +)
|
|
- `email`: Email
|
|
- `birthdate`: Fecha de nacimiento (YYYY-MM-DD)
|
|
- `gender`: `male`, `female`, `other`
|
|
- `blood_type`: Tipo de sangre
|
|
- `allergies`: Alergias
|
|
- `address`: Dirección
|
|
- `notes`: Notas adicionales
|
|
|
|
### 3.2 CSV de Servicios
|
|
|
|
```csv
|
|
name,code,category,price,duration_min,package_price,package_sessions,package_notes,description,service_group,color,is_favorite
|
|
Consulta Dermatologica,CONS-DERM,consulta,800,30,0,0,,Evaluación completa,Consultas,#1abc9c,true
|
|
Depilación Laser Full Body,LASER-FUL,tratamiento,2500,90,7000,3,Ahorro de $500,Depilación full body,Corporal,#e74c3c,false
|
|
```
|
|
|
|
**Campos:**
|
|
- `name` (required): Nombre del servicio
|
|
- `code` (required): Código único
|
|
- `category`: `consulta`, `tratamiento`, `procedimiento`, `paquete`
|
|
- `price` (required): Precio por sesión
|
|
- `duration_min`: Duración en minutos
|
|
- `package_price`: Precio del paquete (0 si no aplica)
|
|
- `package_sessions`: Sesiones del paquete (0 si no aplica)
|
|
- `package_notes`: Notas del paquete
|
|
- `description`: Descripción
|
|
- `service_group`: Grupo/categoría
|
|
- `color`: Color hexadecimal
|
|
- `is_favorite`: `true`/`false`
|
|
|
|
### 3.3 CSV de Inventario
|
|
|
|
```csv
|
|
name,kind,sku,category,unit,qty,qty_optimal,qty_min,cost,expiry_date,notes
|
|
Suero Vitamina C,producto,PRD-001,Skincare,pieza,24,30,5,320,2027-06-15,Suero antioxidante
|
|
Guantes Estériles,consumible,CON-003,Instrumental,caja,8,15,3,95,,Caja de 100 unidades
|
|
```
|
|
|
|
**Campos:**
|
|
- `name` (required): Nombre del item
|
|
- `kind`: `producto` o `consumible`
|
|
- `sku`: Código SKU
|
|
- `category`: Categoría
|
|
- `unit`: Unidad de medida
|
|
- `qty`: Existencia actual
|
|
- `qty_optimal`: Nivel óptimo
|
|
- `qty_min`: Stock mínimo
|
|
- `cost`: Costo unitario
|
|
- `expiry_date`: Caducidad (YYYY-MM-DD)
|
|
- `notes`: Notas
|
|
|
|
### 3.4 CSV de Citas
|
|
|
|
```csv
|
|
patient_name,patient_phone,service_code,date,time,state,notes
|
|
Juan Pérez,526641234567,CONS-DERM,2026-07-17,10:00,confirmed,Primera visita
|
|
```
|
|
|
|
### 3.5 CSV de Ventas
|
|
|
|
```csv
|
|
patient_phone,date,service_code,qty,price,payment_method,notes
|
|
526641234567,2026-07-17,CONS-DERM,1,800,cash,Pago en efectivo
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Proceso de Migración
|
|
|
|
### 4.1 Preparación
|
|
|
|
1. **Obtener autorización:** Documento firmado por SKEEN autorizando la extracción.
|
|
2. **Exportar datos:** Del sistema legacy (CSV, SQL dump, o API).
|
|
3. **Limpiar datos:** Verificar formatos, eliminar duplicados.
|
|
4. **Backup:** Respaldar base de datos actual de Odoo.
|
|
|
|
### 4.2 Ejecución
|
|
|
|
```bash
|
|
# 1. Colocar CSVs en el directorio de migración
|
|
cd /root/migracion
|
|
mkdir -p datos
|
|
cp /ruta/a/csvs/* datos/
|
|
|
|
# 2. Ejecutar migración principal (pacientes, servicios, citas, ventas)
|
|
python3 importar_a_odoo.py
|
|
|
|
# 3. Importar servicios e inventario específicos
|
|
python3 importar_servicios_inventario.py \
|
|
--servicios datos/servicios.csv \
|
|
--inventario datos/inventario.csv \
|
|
--purge-citas \
|
|
--purge-sql \
|
|
--generar-hermes
|
|
|
|
# 4. Verificar datos importados
|
|
python3 -c "
|
|
import xmlrpc.client
|
|
url='http://localhost:8069'
|
|
common=xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/common')
|
|
uid=common.authenticate('skeen_odoo','admin','skeen_admin_2026',{})
|
|
models=xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/object')
|
|
for m in ['res.partner','skeen.servicio','skeen.cita','skeen.inventario.item']:
|
|
n=models.execute_kw('skeen_odoo',uid,'skeen_admin_2026',m,'search_count',[[]])
|
|
print(m,n)
|
|
"
|
|
```
|
|
|
|
### 4.3 Validación
|
|
|
|
1. **Conteo de registros:** Comparar totales origen vs destino.
|
|
2. **Muestra aleatoria:** Verificar 10-20 registros manualmente.
|
|
3. **Pruebas funcionales:** Agendar cita, consultar saldo, redimir puntos.
|
|
4. **Reporte de errores:** Documentar registros que fallaron.
|
|
|
|
---
|
|
|
|
## 5. Scripts de Migración
|
|
|
|
### 5.1 `importar_a_odoo.py`
|
|
|
|
Script principal de migración. Importa:
|
|
|
|
- Pacientes (res.partner)
|
|
- Servicios (skeen.servicio)
|
|
- Citas (skeen.cita)
|
|
- Ventas (skeen.venta)
|
|
- Pagos (skeen.pago)
|
|
- Monederos (skeen.monedero)
|
|
|
|
**Uso:**
|
|
```bash
|
|
python3 importar_a_odoo.py
|
|
```
|
|
|
|
### 5.2 `importar_servicios_inventario.py`
|
|
|
|
Script especializado para servicios e inventario.
|
|
|
|
**Uso:**
|
|
```bash
|
|
python3 importar_servicios_inventario.py \
|
|
--servicios servicios.csv \
|
|
--inventario inventario.csv \
|
|
[--purge-citas] \
|
|
[--purge-sql] \
|
|
[--generar-hermes]
|
|
```
|
|
|
|
**Opciones:**
|
|
- `--purge-citas`: Eliminar citas existentes antes de importar
|
|
- `--purge-sql`: Usar TRUNCATE SQL para limpieza rápida
|
|
- `--generar-hermes`: Generar catálogo JSON para skills de Hermes
|
|
|
|
### 5.3 `extraer_skeen.py`
|
|
|
|
Script de extracción del sistema legacy. Requiere credenciales y autorización.
|
|
|
|
**Nota:** Este script está disponible pero no se ha ejecutado por restricciones de autorización.
|
|
|
|
---
|
|
|
|
## 6. Limpieza de Datos Demo
|
|
|
|
Antes de migrar datos reales, se recomienda limpiar datos demo:
|
|
|
|
```bash
|
|
cd /root/migracion
|
|
|
|
# Opción 1: Script de borrado
|
|
python3 borrar_datos_demo.py
|
|
|
|
# Opción 2: SQL directo (más rápido)
|
|
python3 importar_servicios_inventario.py --purge-citas --purge-sql --servicios /dev/null --inventario /dev/null
|
|
```
|
|
|
|
---
|
|
|
|
## 7. Sincronización Post-Migración
|
|
|
|
Después de la migración, es necesario sincronizar con WACRM:
|
|
|
|
```bash
|
|
# Desde el frontend o vía API
|
|
curl -X POST http://localhost:8069/skeen/frontend/v1/wacrm/sync \
|
|
-H "Authorization: Bearer <token>" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"sync_contacts":true,"sync_conversations":true,"sync_messages":true,"sync_deals":true}'
|
|
```
|
|
|
|
---
|
|
|
|
## 8. Regeneración del Catálogo Hermes
|
|
|
|
Después de importar servicios, regenerar el catálogo para Hermes:
|
|
|
|
```bash
|
|
cd /root/migracion
|
|
python3 importar_servicios_inventario.py --solo-hermes
|
|
```
|
|
|
|
Esto actualiza:
|
|
- `/root/.hermes/skills/skeen-services.json`
|
|
- `/root/skeen-roadmap-hermes/hermes/skills/skeen-services.json`
|
|
|
|
---
|
|
|
|
## 9. Problemas Comunes
|
|
|
|
### 9.1 Registros duplicados
|
|
|
|
**Problema:** Al re-ejecutar la migración, se crean duplicados.
|
|
|
|
**Solución:** Usar `--purge-citas --purge-sql` antes de importar.
|
|
|
|
### 9.2 Timeout en importación masiva
|
|
|
|
**Problema:** Miles de registros tardan demasiado.
|
|
|
|
**Solución:** Usar `--purge-sql` para limpieza rápida, y considerar dividir en lotes.
|
|
|
|
### 9.3 Campos faltantes en CSV
|
|
|
|
**Problema:** Algunos CSVs no tienen todos los campos.
|
|
|
|
**Solución:** Los scripts tienen valores por defecto. Revisar los warnings en la salida.
|
|
|
|
### 9.4 Teléfonos con formato incorrecto
|
|
|
|
**Problema:** Números de teléfono con formato local.
|
|
|
|
**Solución:** Normalizar a formato internacional sin `+` (ej. `526641234567`).
|
|
|
|
---
|
|
|
|
## 10. Checklist de Migración
|
|
|
|
- [ ] Autorización documentada del cliente
|
|
- [ ] Exportación de datos del sistema legacy
|
|
- [ ] Backup de base de datos Odoo actual
|
|
- [ ] Limpieza de datos demo
|
|
- [ ] Ejecución de scripts de migración
|
|
- [ ] Validación de conteos
|
|
- [ ] Validación de muestra aleatoria
|
|
- [ ] Pruebas funcionales
|
|
- [ ] Sincronización WACRM
|
|
- [ ] Regeneración catálogo Hermes
|
|
- [ ] Reporte de errores y resolución
|
|
- [ ] Aprobación final del cliente
|
|
|
|
---
|
|
|
|
## 11. Contacto
|
|
|
|
Para dudas sobre migración:
|
|
- **Email:** ialcarazsalazar@consultoria-as.com
|
|
- **Gitea:** https://git.consultoria-as.com/consultoria-as/SKEEN-Proyecto
|