Modularización de GKACHELE SaaS

This commit is contained in:
gkachele
2026-01-17 11:40:17 +01:00
commit b6820848b8
1338 changed files with 339275 additions and 0 deletions

182
memoria/COMO_CONECTAR_DB.md Normal file
View File

@@ -0,0 +1,182 @@
# 🔌 CÓMO CONECTARSE A LA BASE DE DATOS DE CLIENTES
**GKACHELE™ - Guía de Conexión a Base de Datos**
© 2025 GKACHELE™. Todos los derechos reservados.
## 📍 Ubicación de la Base de Datos
La base de datos **`main.db`** contiene TODOS los clientes (sistema multi-tenant).
### Ubicaciones:
1. **Local (Desarrollo):**
```
C:\word\demo\database\main.db
```
2. **Raspberry Pi (Producción):**
```
/home/pi/gkachele-saas/database/main.db
```
---
## 🖥️ OPCIÓN 1: DB Browser for SQLite (GUI - Recomendado)
Ya tienes **DB Browser for SQLite** abierto. Sigue estos pasos:
### Para Base de Datos Local:
1. En DB Browser, haz clic en **"Abrir base de datos"** (botón en la barra superior)
2. Navega a: `C:\word\demo\database\`
3. Selecciona `main.db`
4. ¡Listo! Verás todas las tablas
### Para Base de Datos de Raspberry (Copiar primero):
1. **Copiar DB desde Raspberry:**
```bash
# Desde PowerShell o WSL:
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no pi@192.168.1.134:/home/pi/gkachele-saas/database/main.db /mnt/c/word/demo/database/main_raspberry.db"
```
2. **Abrir en DB Browser:**
- Abre `C:\word\demo\database\main_raspberry.db`
---
## 📊 Tablas Disponibles
Una vez conectado, verás estas tablas:
### 👥 **users** - Todos los clientes
```sql
SELECT * FROM users;
```
- `id`, `email`, `password` (hash), `plan`, `rubro`, `created_at`
### 🌐 **sites** - Todos los sitios
```sql
SELECT * FROM sites;
```
- `id`, `user_id`, `slug`, `theme`, `status`, `content_json`, `created_at`
### 📋 **menus** - Menús dinámicos
```sql
SELECT * FROM menus;
```
- `id`, `user_id`, `site_id`, `location`, `title`, `url`, `order_index`, `parent_id`
### 🧩 **widgets** - Widgets dinámicos
```sql
SELECT * FROM widgets;
```
- `id`, `user_id`, `site_id`, `area`, `type`, `title`, `content`, `order_index`
### 📝 **content** - Contenido por sección
```sql
SELECT * FROM content;
```
### ⚙️ **settings** - Configuraciones
```sql
SELECT * FROM settings;
```
### 📤 **requests** - Solicitudes de publicación
```sql
SELECT * FROM requests;
```
### 📁 **media** - Archivos subidos
```sql
SELECT * FROM media;
```
---
## 🐍 OPCIÓN 2: Script Python (Terminal)
### Ver Usuarios y Sitios:
```bash
cd C:\word\demo
python ver_usuarios.py
```
### Limpiar Base de Datos:
```bash
cd C:\word\demo
python limpiar_db.py
```
---
## 🔍 Consultas Útiles
### Ver todos los clientes con sus sitios:
```sql
SELECT
u.id AS user_id,
u.email,
u.plan,
u.rubro,
COUNT(s.id) AS num_sitios
FROM users u
LEFT JOIN sites s ON u.id = s.user_id
GROUP BY u.id
ORDER BY u.id;
```
### Ver sitios de un cliente específico:
```sql
SELECT * FROM sites WHERE user_id = 1;
```
### Ver menús de un sitio:
```sql
SELECT * FROM menus WHERE site_id = 1 ORDER BY location, order_index;
```
### Ver widgets de un sitio:
```sql
SELECT * FROM widgets WHERE site_id = 1 ORDER BY area, order_index;
```
---
## 🔄 Sincronizar DB desde Raspberry
Si quieres trabajar con la base de datos más actualizada (de producción):
```bash
# Script para copiar DB desde Raspberry
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no pi@192.168.1.134:/home/pi/gkachele-saas/database/main.db /mnt/c/word/demo/database/main_raspberry.db && echo '✅ DB copiada desde Raspberry'"
```
Luego abre `main_raspberry.db` en DB Browser.
---
## ⚠️ IMPORTANTE
- **NO edites directamente la DB de producción** sin hacer backup primero
- **Usa los scripts** (`ver_usuarios.py`, `limpiar_db.py`) para operaciones comunes
- **Haz backup** antes de cambios importantes (usa `backup_completo.sh`)
---
## 🛠️ Script Rápido: Copiar DB desde Raspberry
Ejecuta este comando para copiar la DB más reciente:
```bash
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no pi@192.168.1.134:/home/pi/gkachele-saas/database/main.db /mnt/c/word/demo/database/main_raspberry_$(date +%Y%m%d_%H%M%S).db"
```
Esto creará una copia con timestamp para no sobrescribir.
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,48 @@
# 🔐 Credenciales de Clientes - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## ⚠️ ARCHIVO CONFIDENCIAL
Este archivo contiene credenciales de acceso de clientes para administración.
**MANTENER PRIVADO Y SEGURO**
---
## 📋 Credenciales Registradas
### Usuario Administrador Principal
- **ID:** 1
- **Email:** `admin@gkachele.com`
- **Password:** `admin123` ⚠️ **CAMBIAR DESPUÉS**
- **Rol:** `administrator`
- **Estado:** `active`
---
## 👥 Clientes Registrados
| ID | Email | Password | Plan | Rubro | Fecha Registro | Estado |
|----|-------|----------|------|-------|----------------|--------|
| - | - | - | - | - | - | - |
---
## 📝 Notas
- Las contraseñas están hasheadas en la base de datos
- Este archivo es solo para referencia administrativa
- **NUNCA** compartir estas credenciales
- Cambiar contraseñas después del primer acceso
---
## 🔄 Actualización
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-credenciales-20250114`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,457 @@
# 🎯 CUSTOMIZER WORDPRESS COMPLETO - DEMO PARA ADAPTAR
**© 2025 GKACHELE™. Todos los derechos reservados.**
**Fecha:** 15 Enero 2025
**Hash:** `gkachele-customizer-wordpress-completo-20250115-001`
**Estado:****DEMO COMPLETO CREADO - LISTO PARA ANALIZAR Y ADAPTAR**
---
## 📋 ARCHIVO DEMO
**Ubicación:** `c:\word\demo\templates\customizer-wordpress-COMPLETO.html`
**Tipo:** Archivo HTML independiente (no toca código actual)
**Para verlo:** Abrir directamente en navegador o usar `file:///C:/word/demo/templates/customizer-wordpress-COMPLETO.html`
---
## ✅ FUNCIONALIDADES IMPLEMENTADAS (TODO LO DE WORDPRESS)
### 1. 🎨 **DISEÑO VISUAL EXACTO WORDPRESS**
- ✅ Header: Fondo #23282d, logo "W", título "Personalizar", botón cerrar
- ✅ Sidebar: 300px de ancho, fondo blanco, borde #ddd
- ✅ Footer: Sticky, fondo #f6f7f7, botones estilo WordPress
- ✅ Colores oficiales WordPress: #2271b1 (azul), #f0f0f1 (gris), #23282d (header)
- ✅ Tipografía: -apple-system, Segoe UI, Roboto
- ✅ Scroll suave en sidebar
---
### 2. 📑 **PANELES Y SECCIONES COLAPSABLES**
**Panel: General Options** (colapsable)
- Identidad del sitio
- Top Bar Setting
- Menu Bar Setting
- Page Header Setting
- Top Scroller Setting
- Blog Setting
- Footer Setting
- Body Typography Setting
**Secciones individuales:**
- Colores
- Contenido
- Medios
- Contacto
- Redes Sociales
- Widgets
- Menús
**Funcionalidad:**
- Paneles se pueden colapsar/expandir
- Navegación lateral con menú
- Secciones activas se resaltan con borde azul izquierdo
---
### 3. 🎛️ **CONTROLES IMPLEMENTADOS**
#### **Toggle Switches (Enable/Disable)**
- Estilo WordPress exacto
- Slider animado
- Color azul cuando activo (#2271b1)
- Usado para: Enable Top Header, Enable Info 1/2/3, WhatsApp flotante
#### **Range Sliders**
- Deslizadores para valores numéricos
- Muestra valor actual (ej: "150px", "24px", "1.6")
- Usado para: Logo Size, Font Sizes, Line Height
- Estilo WordPress: thumb azul, track gris
#### **Color Pickers**
- Input type="color" + input texto sincronizado
- Muestra hex code
- Usado para: Color primario, secundario, texto, fondo
#### **Media Uploaders**
- Botón "Seleccionar imagen"
- Preview de imagen seleccionada
- Usado para: Logo, Hero Image, Favicon
- (En WordPress real abre biblioteca de medios)
#### **Text Inputs**
- Inputs de texto estándar
- Focus: borde azul + box-shadow
- Usado para: Nombres, títulos, URLs, emails, teléfonos
#### **Textareas**
- Áreas de texto multilínea
- Resizable verticalmente
- Usado para: Descripciones, contenido largo
#### **Selects (Dropdowns)**
- Selects estándar
- Estilo WordPress
- Usado para: Font Family, tipos de redes sociales
#### **Repeater Controls**
- Añadir/eliminar elementos repetidos
- Cada elemento tiene sus propios controles
- Botón "Eliminar" por elemento
- Botón "+ Añadir" para crear nuevos
- Usado para: Redes sociales múltiples
#### **Icon Pickers**
- Grid de iconos visual
- Click para seleccionar
- Visual feedback (selected state)
- Usado para: Seleccionar iconos Font Awesome
#### **Hidden Controls**
- Controles ocultos (solo labels)
- Usado para: Separadores de sección ("Info 1", "Info 2", "Setting")
#### **Dividers**
- Líneas separadoras horizontales
- Usado para: Separar grupos de controles
---
### 4. 📱 **SECCIONES ESPECÍFICAS IMPLEMENTADAS**
#### **Identidad del sitio**
- Nombre del sitio (text)
- Descripción corta (textarea)
- Logo Size (range slider)
- Site Title Font Size (range slider)
- Site Description Font Size (range slider)
#### **Top Bar Setting**
- Enable/Disable toggle
- Info 1: Enable toggle, Icon picker, Title, Link
- Info 2: Enable toggle, Icon, Title, Link
- Info 3: Enable toggle, Icon, Title, Link
#### **Colores**
- Color primario (color picker)
- Color secundario (color picker)
- Color de texto (color picker)
- Color de fondo (color picker)
#### **Body Typography Setting**
- Font Family (select)
- Font Size (range slider)
- Line Height (range slider)
#### **Medios**
- Logo (media uploader + preview)
- Imagen Hero (media uploader + preview)
- Favicon (media uploader + preview)
#### **Redes Sociales**
- WhatsApp Flotante (toggle)
- Número de WhatsApp (tel input)
- Repeater de redes sociales (añadir/eliminar)
- Tipo (select: Facebook, Instagram, Twitter, YouTube, LinkedIn)
- URL (url input)
#### **Contenido**
- Título principal (text)
- Descripción (textarea)
#### **Contacto**
- Dirección (text)
- Teléfono (tel)
- Email (email)
---
### 5. 💾 **SISTEMA DE GUARDADO (ESTILO WORDPRESS)**
#### **Botones Footer:**
- **"Descartar cambios"** (gris, solo visible si hay cambios)
- **"Guardar y Publicar"** (azul, siempre visible)
#### **Estados:**
- **"Listo"** - Sin cambios
- **"Guardando..."** - Mientras guarda (azul)
- **"Guardado"** - Guardado exitoso (verde)
- **Error** - Si falla (rojo)
#### **Indicador de cambios sin guardar:**
- Punto rojo pequeño junto a estado
- Solo visible si hay cambios sin guardar
#### **Comportamiento:**
- **NO guarda automáticamente** (solo preview en tiempo real)
- **Solo guarda cuando presionas "Guardar y Publicar"**
- **"Descartar"** restaura valores originales
- **Confirmación antes de salir** si hay cambios sin guardar
---
### 6. 🔄 **FUNCIONALIDADES JAVASCRIPT**
#### **Navegación:**
- `showSection(sectionId)` - Mostrar sección específica
- `togglePanel(element)` - Colapsar/expandir panel
- Navegación lateral actualiza sección activa
#### **Detección de cambios:**
- `markAsChanged()` - Marca que hay cambios sin guardar
- Detecta cambios en todos los inputs
- Actualiza indicador visual
#### **Guardado:**
- `saveChanges()` - Guarda cambios y actualiza estado
- Simula guardado (1 segundo)
- Actualiza valores originales
- Muestra "Guardado" temporalmente
#### **Descartar:**
- `discardChanges()` - Restaura valores originales
- Confirmación antes de descartar
- Sincroniza todos los controles (colors, ranges, toggles)
#### **Preview:**
- `updatePreview()` - Actualiza preview en tiempo real
- Se llama automáticamente al cambiar cualquier control
- (En implementación real, actualizaría iframe)
#### **Repeater:**
- `addRepeaterItem()` - Añade nuevo elemento
- `removeRepeaterItem(button)` - Elimina elemento
- Confirmación antes de eliminar
#### **Media Uploader:**
- `openMediaUploader(type)` - Abre selector de medios
- (En WordPress real, abre biblioteca de medios)
- Preview de imagen seleccionada
#### **Icon Picker:**
- Click en icono selecciona y actualiza input
- Visual feedback (selected state)
- Sincroniza con input de icono
---
### 7. 🎨 **ESTILOS CSS (COLORES WORDPRESS)**
```css
/* Colores principales */
Header: #23282d
Sidebar fondo: #fff
Sidebar borde: #ddd
Footer fondo: #f6f7f7
Botón primario: #2271b1
Botón primario hover: #135e96
Botón secundario: #f0f0f1
Botón secundario hover: #dcdcde
Texto: #23282d
Texto secundario: #646970
Borde inputs: #8c8f94
Focus inputs: #2271b1 (borde + box-shadow)
Toggle activo: #2271b1
Toggle inactivo: #c3c4c7
Range thumb: #2271b1
Estado guardado: #00a32a
Estado error: #d63638
Indicador cambios: #d63638
```
---
### 8. 📐 **ESTRUCTURA HTML**
```
customizer-header (fixed top)
├─ customizer-header-left
│ ├─ customizer-logo (W)
│ └─ customizer-title (Personalizar)
└─ customizer-close (×)
customizer-container (flex)
├─ customizer-sidebar (300px)
│ ├─ customizer-nav (menú lateral)
│ │ ├─ customizer-nav-panel (colapsable)
│ │ │ ├─ customizer-nav-panel-title
│ │ │ └─ customizer-nav-panel-items
│ │ │ └─ customizer-nav-item (secciones)
│ │ └─ customizer-nav-item-single (secciones individuales)
│ └─ customizer-sidebar-content
│ └─ customizer-section (contenido de cada sección)
│ ├─ customizer-section-title
│ └─ customizer-control (cada control)
│ ├─ customizer-control-label
│ ├─ [tipo de control]
│ └─ customizer-control-description
└─ customizer-preview (flex: 1)
└─ preview-iframe
customizer-footer (fixed bottom)
├─ customizer-footer-left
│ ├─ customizer-unsaved-indicator
│ └─ customizer-status
└─ customizer-footer-right
├─ btn-discard
└─ btn-save
```
---
### 9. 🔧 **TIPOS DE CONTROLES Y SUS CLASES CSS**
| Tipo | Clase CSS | Uso |
|------|-----------|-----|
| Toggle Switch | `.customizer-toggle` | Enable/Disable |
| Range Slider | `.customizer-range` | Valores numéricos |
| Color Picker | `.customizer-color-picker` | Colores |
| Text Input | `.customizer-control-input` | Texto |
| Textarea | `.customizer-control-textarea` | Texto largo |
| Select | `.customizer-control-select` | Dropdowns |
| Media Button | `.customizer-media-button` | Subir imágenes |
| Repeater | `.customizer-repeater` | Elementos repetidos |
| Icon Picker | `.customizer-icon-picker` | Seleccionar iconos |
| Hidden | `.customizer-control-hidden` | Separadores |
---
### 10. 📝 **ATRIBUTOS DATA-SETTING**
Todos los controles tienen `data-setting="nombre_setting"` para:
- Identificar qué control es
- Guardar/restaurar valores
- Sincronizar con backend
Ejemplos:
- `data-setting="site_name"`
- `data-setting="enable_top_header"`
- `data-setting="color_primary"`
- `data-setting="logo_size"`
---
### 11. 🎯 **COMPORTAMIENTO EXACTO WORDPRESS**
1. **Preview en tiempo real:**
- Cambios se ven inmediatamente en preview
- NO se guardan hasta presionar "Guardar y Publicar"
2. **Detección de cambios:**
- Cualquier cambio marca como "sin guardar"
- Muestra punto rojo + botón "Descartar"
3. **Guardado:**
- Solo cuando presionas botón
- Muestra "Guardando..." mientras guarda
- Muestra "Guardado" cuando termina
4. **Descartar:**
- Restaura TODOS los valores originales
- Sincroniza todos los controles
- Oculta indicador de cambios
5. **Salir:**
- Si hay cambios sin guardar, pregunta confirmación
- Si no hay cambios, sale directamente
---
### 12. 🔄 **SINCRONIZACIÓN DE CONTROLES**
#### **Color Pickers:**
- Color picker → Input texto (hex)
- Ambos sincronizados bidireccionalmente
#### **Range Sliders:**
- Range slider → Span con valor
- Muestra unidad (px, etc.)
#### **Toggles:**
- Checkbox → Slider visual
- Estado sincronizado
---
### 13. 📦 **FUNCIONALIDADES ADICIONALES**
- ✅ Scroll suave en sidebar
- ✅ Paneles colapsables
- ✅ Navegación rápida entre secciones
- ✅ Preview iframe (preparado)
- ✅ Responsive (sidebar fijo 300px)
- ✅ Confirmaciones antes de acciones destructivas
- ✅ Estados visuales claros
- ✅ Tooltips y descripciones
- ✅ Validación de inputs (type="email", "tel", "url")
---
### 14. 🎨 **DETALLES VISUALES WORDPRESS**
- Border radius: 4px (botones, inputs)
- Transitions: 0.2s (hover, focus)
- Box shadow en focus: `0 0 0 1px #2271b1`
- Font sizes: 13px (labels), 14px (inputs), 12px (descriptions)
- Padding: 8px 12px (inputs), 8px 16px (botones)
- Gap: 10px (entre elementos)
---
## 🚀 PRÓXIMOS PASOS PARA ADAPTAR
1. **Analizar qué funcionalidades necesitamos:**
- Revisar demo completo
- Identificar qué secciones/controles usar
- Decidir qué adaptar y qué no
2. **Adaptar al customizer actual:**
- Copiar diseño visual
- Implementar controles necesarios
- Integrar con backend existente
- Mantener funcionalidad actual
3. **Implementar funcionalidades faltantes:**
- Mapa automático desde dirección
- WhatsApp flotante funcional
- Upload de archivos real
- Preview iframe funcional
4. **Testing:**
- Probar todos los controles
- Verificar guardado/descartar
- Verificar preview en tiempo real
- Verificar todas las secciones
---
## 📌 NOTAS IMPORTANTES
- **Este es un DEMO independiente** - No toca código actual
- **Todo está implementado** - Listo para copiar/adaptar
- **Estilo WordPress exacto** - Colores, tipografía, espaciado
- **Funcionalidades completas** - Toggles, sliders, repeaters, etc.
- **Sistema de guardado correcto** - Como WordPress (no auto-guarda)
---
## 🔗 REFERENCIAS
- **Archivo demo:** `customizer-wordpress-COMPLETO.html`
- **Código WordPress analizado:** `wp-content/themes/abiz/core/customizer/`
- **Documentación problemas:** `PROBLEMAS_CRITICOS_CUSTOMIZER.md`
---
**Última actualización:** 2025-01-15
**Hash:** `gkachele-customizer-wordpress-completo-20250115-001`
**Estado:****DEMO COMPLETO - LISTO PARA ANALIZAR Y ADAPTAR**
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,218 @@
# 📖 Documentación del Proyecto - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🎯 ¿Qué Estamos Construyendo?
Un **SaaS (Software as a Servicio)** para que clientes creen y gestionen sus propios sitios web, similar a sistemas populares pero mejorado y personalizado.
### Funcionalidad Principal:
- Clientes se registran → Crean su sitio → Lo personalizan → Lo publican
- Todo desde una interfaz web simple
- Sistema multi-tenant (todos los clientes en una sola base de datos)
---
## 🏗️ Arquitectura Técnica
### ¿Por qué Python/Flask y NO Docker?
**Sí, es por la Raspberry Pi:**
- Raspberry Pi tiene recursos limitados
- Docker consume más memoria y CPU
- Python directo es más ligero y eficiente
- Más fácil de depurar y mantener
- **En VPS podrías usar Docker si quieres**, pero Python directo también funciona perfecto
### Stack Tecnológico:
- **Backend:** Flask (Python 3)
- **Base de Datos:** SQLite (`main.db` - multi-tenant)
- **Frontend:** HTML, CSS, JavaScript
- **Servidor Web:** Nginx (reverse proxy)
- **Hosting:** Raspberry Pi 3 (actual) / VPS (recomendado para producción)
---
## 🗄️ Base de Datos
### Estructura Multi-tenant:
**TODO en una sola base de datos (`main.db`):**
- `users` - Todos los usuarios/clientes
- `sites` - Todos los sitios (filtrados por `user_id`)
- `menus` - Menús dinámicos
- `widgets` - Widgets dinámicos
- `content` - Contenido
- `settings` - Configuraciones
- `requests` - Solicitudes de publicación
- `media` - Archivos subidos
### Acceso a Base de Datos:
- **Tu acceso:** Panel `/admin` (solo rol `administrator`)
- **Acceso clientes:** Solo ven SUS datos (filtrado por `user_id`)
- **Herramientas:** DB Browser for SQLite, scripts Python (`ver_usuarios.py`, `limpiar_db.py`)
---
## 👥 Sistema de Usuarios y Roles
### Roles (desde Base de Datos):
- `administrator` - Acceso total (tú)
- `editor` - Puede editar contenido
- `author` - Puede crear contenido
- `subscriber` - Solo lectura
### Admin para Clientes:
- **Panel `/dashboard`** - Cliente ve SUS sitios
- **Panel `/customizer/{site_id}`** - Personalizar sitio
- **Panel `/dashboard/admin`** - Admin del cliente (media, config)
---
## 🔒 Limitaciones por Plan
### Sistema Actual:
- **Planes:** `base`, `premium`, etc. (campo en tabla `users`)
- **Limitaciones posibles:**
- Número de sitios
- Subida de fotos (tamaño, cantidad)
- Modificaciones (frecuencia, tipo)
- Funcionalidades avanzadas
### Implementación:
- Verificar plan antes de acciones
- Contar recursos usados vs. límites del plan
- Bloquear acciones si excede límite
---
## 📊 Detección de Movimientos
### Sistema Actual:
- **No hay detección automática** de movimientos aún
- **Registros disponibles:**
- `created_at` - Fecha de creación
- `updated_at` - Fecha de actualización
- Logs del servidor (journalctl)
### Posibles Mejoras:
- Tabla `activity_log` para registrar acciones
- Notificaciones de cambios
- Historial de modificaciones
- Auditoría de cambios
---
## 🚀 VPS vs Raspberry Pi
### Raspberry Pi (Actual):
- ✅ Bajo costo
- ✅ Suficiente para desarrollo/pruebas
- ❌ Recursos limitados
- ❌ Puede ser lento con muchos clientes
### VPS (Recomendado para Producción):
- ✅ Más recursos (CPU, RAM, disco)
- ✅ Mejor rendimiento
- ✅ Más confiable
- ✅ Mejor para escalar
- ✅ Puedes usar Docker si quieres
- ✅ Mismo código funciona (solo cambiar configuración)
### Migración a VPS:
1. Copiar código completo
2. Instalar Python3, Nginx
3. Copiar configuración
4. Cambiar dominio
5. Configurar SSL (Let's Encrypt)
6. **Mismo código, más potencia**
---
## 🔄 Flujo Completo del Sistema
```
1. Cliente → Landing Page
2. Cliente → Registro (/register)
├── Crea usuario en `users`
├── Crea sitio automático en `sites`
└── Crea menús por defecto en `menus`
3. Cliente → Login (/login)
└── Redirige a `/customizer/{site_id}` (directo)
4. Cliente → Customizer
├── Personaliza contenido
├── Cambia colores, tipografía
└── Gestiona menús y widgets
5. Cliente → Envía para aprobación
└── Crea solicitud en `requests`
6. Admin → Aprueba desde `/admin`
└── Cambia status a `published`
7. Sitio → Público en `/site/{slug}`
```
---
## 📁 Estructura del Proyecto
```
c:\word\
├── demo/ # Código principal
│ ├── app.py # Flask backend (TODO aquí)
│ ├── database/
│ │ └── main.db # Base de datos multi-tenant
│ ├── themes/ # Templates
│ │ ├── _gkachele/ # Sistema modular (header.php, footer.php, sidebar.php)
│ │ └── {tema}/ # Temas específicos
│ ├── templates/ # HTML templates
│ └── static/ # CSS, JS
├── memoria/ # 📚 TODA LA DOCUMENTACIÓN
└── backups/ # Backups automáticos
```
---
## 🎯 Estado Actual
### ✅ Funcionando:
- Registro de clientes
- Login (redirige a customizer)
- Dashboard del cliente
- Customizer (personalización)
- Sistema de menús y widgets
- Panel admin (ver/eliminar usuarios)
- Sistema de roles basado en DB
### ⚠️ Pendiente:
- Limitaciones por plan
- Detección de movimientos/actividad
- Mejorar landing page
- Integración Gitea
- UI completa para gestionar menús
---
## 🔐 Seguridad
- Passwords hasheados (Werkzeug)
- Sesiones Flask
- Filtrado por `user_id` (cada cliente solo ve sus datos)
- Roles desde base de datos (no hardcodeados)
- Verificación de permisos en cada ruta
---
## 📝 Próximos Pasos
1. **Implementar limitaciones por plan**
2. **Sistema de actividad/logs**
3. **Mejorar UI del customizer**
4. **Optimizar para VPS**
5. **Añadir más funcionalidades**
---
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-documentacion-completa-20250114`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,280 @@
# 🎨 Editor Visual en Preview - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 📋 ANÁLISIS: Edición en Preview vs Sidebar
**Hash:** `gkachele-editor-visual-20250114-1425`
---
## 🎯 OBJETIVO
Permitir editar el contenido del sitio de dos formas:
1. **Desde el sidebar** (actual) - Controles organizados
2. **Directamente en el preview** (nuevo) - Click to edit, como sistemas modernos
---
## 🔍 ANÁLISIS DE OPCIONES
### Opción A: Click to Edit en Preview (Recomendado)
**Cómo funciona:**
- Usuario hace click en cualquier elemento del preview (título, texto, imagen)
- Se abre un modal o inline editor
- Cambios se reflejan inmediatamente
- Similar a WordPress Gutenberg o Elementor
**Ventajas:**
- ✅ Más intuitivo y visual
- ✅ El usuario ve exactamente qué está editando
- ✅ Experiencia moderna y profesional
- ✅ Reduce la necesidad de buscar en el sidebar
**Desventajas:**
- ⚠️ Requiere JavaScript más complejo
- ⚠️ Necesita identificar elementos editables
- ⚠️ Puede ser más lento en sitios grandes
**Implementación:**
```javascript
// Agregar atributos data-editable a elementos del preview
<div data-editable="hero_title" data-type="text">
{{ hero_title }}
</div>
// JavaScript para detectar clicks y abrir editor
document.querySelectorAll('[data-editable]').forEach(el => {
el.addEventListener('click', (e) => {
openInlineEditor(el);
});
});
```
---
### Opción B: Mejorar Sidebar Actual
**Cómo funciona:**
- Mantener sidebar actual
- Añadir más controles específicos
- Mejorar organización y UX
- Añadir previews visuales en el sidebar
**Ventajas:**
- ✅ Más fácil de implementar
- ✅ Ya funciona
- ✅ Controles organizados
**Desventajas:**
- ⚠️ Menos intuitivo
- ⚠️ Usuario debe buscar en el sidebar
- ⚠️ Menos visual
---
### Opción C: Híbrido (Mejor Opción)
**Cómo funciona:**
- **Sidebar:** Controles avanzados, configuración, colores, etc.
- **Preview:** Click to edit para contenido principal (títulos, textos, imágenes)
- **Ambos sincronizados:** Cambios en uno se reflejan en el otro
**Ventajas:**
- ✅ Lo mejor de ambos mundos
- ✅ Usuario elige cómo editar
- ✅ Flexible y potente
- ✅ Experiencia profesional
**Implementación:**
1. Sidebar para configuración avanzada
2. Preview con click to edit para contenido
3. Sincronización bidireccional
---
## 🚀 PLAN DE IMPLEMENTACIÓN (Opción C - Híbrido)
### Fase 1: Click to Edit en Preview
**Elementos editables:**
- `hero_title` - Título principal
- `hero_description` - Descripción
- `site_name` - Nombre del sitio (en header)
- Textos de secciones (menú, horarios, etc.)
- Imágenes (click para cambiar URL)
**Funcionalidad:**
1. Agregar `data-editable` a elementos del template
2. JavaScript detecta clicks
3. Abre editor inline (modal o input overlay)
4. Guarda cambios automáticamente
5. Actualiza preview en tiempo real
### Fase 2: Sincronización Bidireccional
**Cómo funciona:**
- Cambio en sidebar → Actualiza preview
- Cambio en preview → Actualiza sidebar
- Todo se guarda en `content_json`
### Fase 3: Mejoras del Sidebar
- Agregar previews visuales
- Mejor organización
- Búsqueda de controles
- Atajos de teclado
---
## 📝 ESTRUCTURA TÉCNICA
### Template HTML (con data-editable)
```html
<!-- En template.html -->
<h1 data-editable="hero_title" data-type="text" class="editable">
{{ hero_title or 'Bienvenido' }}
</h1>
<p data-editable="hero_description" data-type="textarea" class="editable">
{{ hero_description or '' }}
</p>
<img data-editable="media.hero_image" data-type="image"
src="{{ media.hero_image or '' }}" class="editable">
```
### JavaScript (Click to Edit)
```javascript
// Detectar clicks en elementos editables
document.querySelectorAll('[data-editable]').forEach(el => {
el.addEventListener('click', function(e) {
if (e.target.closest('.editable')) {
const field = this.dataset.editable;
const type = this.dataset.type;
openEditor(this, field, type);
}
});
// Indicador visual de que es editable
el.style.cursor = 'pointer';
el.title = 'Click para editar';
});
function openEditor(element, field, type) {
// Crear overlay con input
const overlay = createEditorOverlay(element, field, type);
document.body.appendChild(overlay);
}
function createEditorOverlay(element, field, type) {
// Modal o input inline
// Guardar al hacer blur o Enter
// Actualizar preview
}
```
### Backend (Guardar cambios)
```python
@app.route('/api/customizer/update-field', methods=['POST'])
def update_field():
"""Actualizar un campo específico desde preview"""
data = request.get_json()
site_id = data.get('site_id')
field = data.get('field') # 'hero_title', 'horarios.lunes_viernes', etc.
value = data.get('value')
# Actualizar content_json
# Retornar éxito
```
---
## 🎨 UX/UI
### Indicadores Visuales
- **Hover:** Borde punteado o sombra
- **Cursor:** Pointer
- **Tooltip:** "Click para editar"
- **Icono:** ✏️ en esquina del elemento
### Editor Inline
- **Input/Textarea:** Aparece sobre el elemento
- **Botones:** Guardar, Cancelar
- **Atajos:** Enter = Guardar, Esc = Cancelar
- **Auto-save:** Guardar después de 2 segundos sin escribir
---
## ✅ CHECKLIST DE IMPLEMENTACIÓN
### Fase 1: Click to Edit
- [ ] Agregar `data-editable` a elementos del template
- [ ] JavaScript para detectar clicks
- [ ] Crear editor inline/modal
- [ ] Guardar cambios automáticamente
- [ ] Actualizar preview en tiempo real
### Fase 2: Sincronización
- [ ] Sidebar → Preview (ya funciona)
- [ ] Preview → Sidebar (nuevo)
- [ ] Validar que ambos estén sincronizados
### Fase 3: Mejoras
- [ ] Indicadores visuales de elementos editables
- [ ] Tooltips y ayuda contextual
- [ ] Atajos de teclado
- [ ] Búsqueda en sidebar
---
## 🔄 FLUJO COMPLETO
```
1. Usuario abre customizer
2. Ve preview con elementos editables (indicados visualmente)
3. Click en "Bienvenido" (hero_title)
4. Se abre editor inline
5. Usuario escribe nuevo título
6. Presiona Enter o hace blur
7. Cambio se guarda en content_json
8. Preview se actualiza automáticamente
9. Sidebar también se actualiza (si tiene ese campo)
```
---
## 📊 COMPARACIÓN CON SISTEMAS SIMILARES
| Característica | WordPress | Elementor | GKACHELE™ (Propuesto) |
|----------------|-----------|-----------|------------------------|
| Click to Edit | ✅ | ✅ | ✅ (Fase 1) |
| Sidebar Controls | ✅ | ✅ | ✅ (Actual) |
| Preview en Tiempo Real | ✅ | ✅ | ✅ (Actual) |
| Sincronización Bidireccional | ✅ | ✅ | ✅ (Fase 2) |
| Editor Inline | ✅ | ✅ | ✅ (Fase 1) |
---
## 🎯 DECISIÓN
**Implementar Opción C (Híbrido):**
- Mantener sidebar actual (funciona bien)
- Añadir click to edit en preview
- Sincronización bidireccional
- Mejoras progresivas
---
**Última actualización:** 14 Enero 2025 - 14:25
**Hash:** `gkachele-editor-visual-20250114-1425`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

133
memoria/ESTADO_ACTUAL.md Normal file
View File

@@ -0,0 +1,133 @@
# 📊 Estado Actual del Proyecto - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🎯 Hash Actual
**Hash:** `gkachele-customizer-wordpress-adaptado-20250115-002`
**Fecha:** 15 Enero 2025
**Estado:****Demo WordPress completo creado - Listo para copiar y adaptar**
---
## ✅ FUNCIONANDO
### Flujo Completo:
1.**Landing** - Funciona correctamente
2.**Registro** - Crea usuario + sitio automático
3.**Login** - Redirige DIRECTAMENTE a `/customizer/{site_id}`
4.**Customizer** - Personalización funcional
- Cambiar contenido
- Cambiar colores
- Cambiar tipografía
- **✅ Añadir bloques (video, imagen, texto, redes sociales, mapa)**
- **✅ Eliminar bloques**
- **✅ Ver lista de bloques añadidos**
- Guardar cambios (draft)
- Enviar solicitud (pending)
5.**Dashboard Cliente** - `/dashboard` - Ve sus sitios
6.**Dashboard Admin** - `/admin` - Gestión completa
- Ver usuarios
- Eliminar usuarios
- Ver solicitudes
- Aprobar/rechazar sitios
### Sistema de Base de Datos:
- ✅ Multi-tenant en `main.db`
- ✅ Tablas: users, sites, menus, widgets, content, settings, requests, media
- ✅ Sistema de roles basado en DB (administrator, editor, author, subscriber)
- ✅ Filtrado por `user_id` (cada cliente solo ve sus datos)
### Templates:
- ✅ Sistema modular (_gkachele/header.php, footer.php, sidebar.php)
- ✅ Menús dinámicos (header, footer, sidebar)
- ✅ Widgets dinámicos
- ✅ Temas: restaurante-moderno, restaurante-elegante, gimnasio-claro
---
## ⚠️ PENDIENTE
### Funcionalidades Core:
- [x] **Añadir bloques (COMPLETADO)**
- [x] **Eliminar bloques (COMPLETADO)**
- [x] **Lista de bloques en sidebar (COMPLETADO)**
- [ ] Editar contenido de bloques existentes
- [ ] Mover bloques (drag & drop) en customizer
- [ ] Editar inline (contenteditable)
- [ ] UI completa para gestionar menús desde customizer
### Infraestructura:
- [ ] Subdominios automáticos
- [ ] Integración pagos Nominalia
- [ ] Gitea y workflows
- [ ] Control de versiones Git
### Mejoras:
- [ ] Landing optimizada para Argentina
- [ ] Limitaciones por plan
- [ ] Sistema de actividad/logs
- [ ] Mejorar UI/UX
---
## 🚀 PRÓXIMOS PASOS
1. **Probar con 1 rubro completo** (restaurante)
2. **Mejorar customizer** (mover bloques, editar inline)
3. **Gitea y workflows** (despliegues automáticos)
4. **Subdominios** (con tu dominio)
5. **Pagos Nominalia** (comodines)
---
## 📍 DEPLOYMENT
### Actual: Raspberry Pi 3
- ✅ Funcionando
- ✅ Login → Customizer funciona
- ✅ Todo operativo
### Futuro: VPS
- Si funciona 1 rubro bien → Migrar a VPS
- Mismo código
- Más recursos
- Dominio propio
---
## 🔄 ÚLTIMA ACTUALIZACIÓN
**Hash:** `gkachele-customizer-wordpress-adaptado-20250115-002`
**Fecha:** 15 Enero 2025
**Logro:****Demo WordPress completo creado - Listo para copiar y adaptar**
### Cambios en este Hash:
- ✅ Creado demo completo WordPress: `customizer-wordpress-COMPLETO.html`
- ✅ Todas las funcionalidades de WordPress implementadas (paneles, toggles, sliders, repeaters, etc.)
- ✅ Documentación completa: `CUSTOMIZER_WORDPRESS_COMPLETO.md`
- ✅ Objetivo claro documentado: `OBJETIVO_CUSTOMIZER_ADAPTADO.md`
- ✅ Identificados problemas críticos: `PROBLEMAS_CRITICOS_CUSTOMIZER.md`
### Plan para Próxima Sesión:
1. **COPIAR WordPress** (demo completo)
2. **AUTOMATIZAR** procesos (guardado, preview, etc.)
3. **CAMBIAR branding** a GKACHELE™ (logo, nombres, colores)
4. **ADAPTAR** funcionalidades con lo que ya sabemos
5. **INTEGRAR** con backend Flask existente
### Archivos Creados:
- `customizer-wordpress-COMPLETO.html` - Demo completo independiente
- `CUSTOMIZER_WORDPRESS_COMPLETO.md` - Documentación completa
- `OBJETIVO_CUSTOMIZER_ADAPTADO.md` - Objetivo claro
- `PROBLEMAS_CRITICOS_CUSTOMIZER.md` - Problemas identificados
### Estado:
- ✅ Demo WordPress completo (funcional, independiente)
- ✅ Documentación completa
- ✅ Objetivo claro definido
- ⏳ Pendiente: Copiar y adaptar al customizer real
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,71 @@
# 🗂️ Estructura de Rutas - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 📍 RUTAS DEFINIDAS
### Cliente (Usuario Normal):
1. **`/customizer/{site_id}`** - Editar antes de publicar
- Siempre disponible
- Personalizar sitio (draft)
- Guardar cambios o Enviar solicitud
- Botón "Volver" → `/admin` del cliente
2. **`/admin`** - Panel del cliente (su área de administración)
- Se crea automáticamente al aprobar sitio
- Gestionar sitio publicado
- Editar sitio publicado (con limitaciones por plan)
- Ver estadísticas
- Gestionar media, configuraciones
### Admin Principal (Tú):
3. **`/dashboard`** - Tu panel principal
- Gestión de todo el sistema
- Ver todas las solicitudes
- Aprobar/rechazar sitios
- Ver todos los usuarios
- Eliminar usuarios
- Gestionar subdominios
- Gestionar pagos
- Estadísticas generales
---
## 🔄 FLUJO COMPLETO
```
1. Cliente → Registro → Crea sitio (draft)
2. Cliente → Login → Customizer
3. Cliente → Customizer → Edita → Envía solicitud
4. Tú → Dashboard → Apruebas → Se crea automáticamente /admin del cliente
5. Cliente → /admin → Edita sitio publicado (con limitaciones por plan)
6. Si no paga → Workflow cancela/elimina
```
---
## ⚠️ IMPORTANTE
- **`/customizer`** = Editar antes de publicar (siempre)
- **`/admin`** = Panel del cliente (se crea al aprobar)
- **`/dashboard`** = Tu panel principal (gestión del sistema)
---
## 🔒 LIMITACIONES POR PLAN
En `/admin` del cliente:
- Limitar subidas de fotos según plan
- Limitar movimientos/modificaciones según plan
- Verificar plan antes de cada acción
---
**Última actualización:** 14 Enero 2025 - 11:40
**Hash:** `gkachele-estructura-rutas-20250114`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,108 @@
# 🎯 Funcionalidades Completas - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## ✅ FLUJO CORRECTO (Como Sistemas Similares)
### 1. Landing → Registro → Login → Customizer
```
Cliente → Landing
Registro (crea usuario + sitio automático)
Login (redirige DIRECTAMENTE a customizer)
Customizer (personalizar sitio)
├── Guardar cambios (draft)
└── Enviar solicitud (pending)
Admin Dashboard → Ver solicitudes → Aprobar
Sitio publicado → /site/{slug}
```
---
## 🔧 FUNCIONALIDADES REQUERIDAS
### 1. **Subdominios**
- **Opción A:** Subdominio con tu dominio (ej: `cliente1.tudominio.com`)
- **Opción B:** Cliente compra dominio (cobrar gestión)
- Configurar DNS automáticamente
- SSL automático (Let's Encrypt)
### 2. **Pagos - Nominalia**
- Integración con Nominalia para pagos
- Comodines para pagos recurrentes
- Gestión de suscripciones
- Facturación automática
### 3. **Dashboard Cliente**
- Ver sus sitios
- Acceder a customizer
- Ver estado de solicitudes
- Gestionar su admin (media, config)
### 4. **Customizer (Como Sistemas Similares)**
- Mover bloques (drag & drop)
- Editar contenido inline
- Cambiar colores, tipografía
- Gestionar menús
- Gestionar widgets
- **Guardar** (draft) o **Enviar solicitud** (pending)
### 5. **Dashboard Admin (Tú)**
- Ver todas las solicitudes
- Aprobar/rechazar sitios
- Ver todos los usuarios
- Eliminar usuarios
- Gestionar subdominios
- Gestionar pagos
- Estadísticas
---
## 🎯 ESTADO ACTUAL
### ✅ Funcionando:
- Landing
- Registro (crea usuario + sitio)
- Login (debería redirigir a customizer)
- Dashboard cliente (`/dashboard`)
- Customizer (`/customizer/{site_id}`)
- Dashboard admin (`/admin`)
### ✅ CORREGIDO:
- **✅ Login redirige correctamente a customizer**
- Funciona como sistemas similares: Login → Customizer directo
### 🔧 PENDIENTE:
- Subdominios
- Pagos Nominalia
- Mover bloques en customizer
- Editar inline
- Workflows Gitea
---
## 📋 CHECKLIST FUNCIONALIDAD
- [x] Login → Customizer (✅ FUNCIONANDO)
- [x] Customizer: Guardar cambios (✅ Funciona)
- [x] Customizer: Enviar solicitud (✅ Funciona)
- [x] Admin: Ver solicitudes (✅ Funciona)
- [x] Admin: Aprobar/rechazar (✅ Funciona)
- [ ] Subdominios automáticos (PENDIENTE)
- [ ] Pagos Nominalia (PENDIENTE)
- [ ] Mover bloques (PENDIENTE)
- [ ] Editar inline (PENDIENTE)
---
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-funcionalidades-20250114`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

100
memoria/GESTION_USUARIOS.md Normal file
View File

@@ -0,0 +1,100 @@
# 👥 Gestión de Usuarios - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🎯 Objetivo
Sistema completo para ver, gestionar y eliminar usuarios registrados desde el panel de administración.
## 📍 Ubicación
**Ruta:** `/admin` (solo usuarios con rol `administrator`)
## 🔍 Funcionalidades
### 1. Ver Todos los Usuarios
El panel muestra:
- ID del usuario
- Email
- Plan (base, premium, etc.)
- Rubro
- Fecha de registro
- Número de sitios creados
- Sitios publicados
- Solicitudes enviadas
### 2. Eliminar Usuarios
**Ruta:** `POST /admin/users/delete/<user_id>`
**Protección:**
- Solo usuarios con rol `administrator`
- No se puede eliminar al usuario ID=1 (admin principal)
**Proceso de eliminación:**
1. Elimina widgets del usuario
2. Elimina menús del usuario
3. Elimina media del usuario
4. Elimina contenido del usuario
5. Elimina configuraciones del usuario
6. Elimina solicitudes del usuario
7. Elimina sitios del usuario
8. Elimina el usuario
**Todo en una transacción** - Si falla algo, se revierte todo.
## 🛡️ Seguridad
- Verificación de rol desde la base de datos (no hardcodeado)
- Confirmación antes de eliminar
- Transacciones para integridad de datos
- Protección del admin principal
## 📊 Consultas Útiles
### Ver usuarios con estadísticas:
```sql
SELECT
u.id,
u.email,
u.plan,
u.rubro,
u.role,
u.status,
u.created_at,
COUNT(DISTINCT s.id) as num_sitios,
COUNT(DISTINCT CASE WHEN s.status = 'published' THEN s.id END) as sitios_publicados,
COUNT(DISTINCT r.id) as num_solicitudes
FROM users u
LEFT JOIN sites s ON u.id = s.user_id
LEFT JOIN requests r ON u.id = r.user_id
GROUP BY u.id
ORDER BY u.id DESC;
```
### Filtrar usuarios inactivos:
```sql
SELECT * FROM users WHERE status != 'active';
```
### Ver usuarios sin sitios:
```sql
SELECT u.* FROM users u
LEFT JOIN sites s ON u.id = s.user_id
WHERE s.id IS NULL;
```
## 🚀 Próximas Mejoras
- [ ] Filtros por rol, plan, estado
- [ ] Búsqueda de usuarios
- [ ] Editar usuario (cambiar rol, plan, estado)
- [ ] Suspender usuario (sin eliminar)
- [ ] Exportar lista de usuarios
- [ ] Estadísticas de usuarios
---
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-gestion-usuarios-20250114`

143
memoria/GITEA_WORKFLOWS.md Normal file
View File

@@ -0,0 +1,143 @@
# 🔄 Gitea y Workflows - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🎯 OBJETIVO
Integrar Gitea para automatizar despliegues, workflows y gestión de repositorios por cliente.
---
## 📋 FUNCIONALIDADES PLANEADAS
### 1. **Repositorios por Cliente**
- Crear repo automático al registrar cliente
- Un repo por sitio del cliente
- Versionado automático de cambios
- Historial completo
### 2. **Workflows Automáticos**
#### Workflow: Aceptar Petición
```
Cliente envía sitio → Admin aprueba → Workflow Gitea:
1. Commit cambios al repo del cliente
2. Generar build del sitio
3. Desplegar automáticamente
4. Notificar al cliente
```
#### Workflow: Despliegue Automático
```
Cambios en customizer → Auto-commit → Auto-deploy
```
#### Workflow: Rollback
```
Admin selecciona versión → Workflow restaura versión anterior
```
### 3. **Integración con Dashboard Admin**
- Ver repositorios de clientes
- Aceptar/rechazar peticiones desde workflows
- Ver historial de cambios
- Gestionar despliegues
- Control de versiones
---
## 🏗️ ARQUITECTURA
### Componentes:
1. **Gitea Server** - Gestión de repositorios
2. **API Gitea** - Integración con Flask
3. **Workflows** - Automatización
4. **Dashboard Admin** - Interfaz de gestión
### Flujo:
```
Cliente → Customizer → Cambios → Gitea API → Commit → Workflow → Deploy
Admin → Dashboard → Aprobar → Gitea API → Workflow → Deploy
```
---
## 🔧 IMPLEMENTACIÓN
### 1. Instalación Gitea
- En Raspberry Pi o VPS
- Configurar dominio
- API habilitada
### 2. Integración Flask
- Cliente Gitea API
- Funciones helper para repos
- Workflows automáticos
### 3. Dashboard Admin
- Sección Gitea
- Ver repositorios
- Gestionar workflows
- Control de versiones
---
## 📝 WORKFLOWS ESPECÍFICOS
### Workflow: Nuevo Cliente
```
1. Cliente se registra
2. Crear repo automático: cliente-{user_id}
3. Commit template inicial
4. Configurar webhook
```
### Workflow: Aprobar Sitio
```
1. Admin aprueba desde dashboard
2. Workflow Gitea se activa
3. Commit cambios finales
4. Build del sitio
5. Deploy a producción
6. Notificar cliente
```
### Workflow: Cambios en Customizer
```
1. Cliente guarda cambios
2. Auto-commit a repo
3. Workflow opcional: preview automático
```
---
## 🎯 BENEFICIOS
- ✅ Versionado automático
- ✅ Historial completo
- ✅ Rollback fácil
- ✅ Despliegues automáticos
- ✅ Repositorios organizados
- ✅ Integración completa
---
## 📋 CHECKLIST
- [ ] Instalar Gitea
- [ ] Configurar API
- [ ] Integrar con Flask
- [ ] Crear repos automáticos
- [ ] Workflow: Aprobar petición
- [ ] Workflow: Despliegue automático
- [ ] Dashboard admin: Sección Gitea
- [ ] Testing completo
---
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-gitea-workflows-20250114`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,98 @@
# 📌 HASH: gkachele-customizer-wordpress-adaptado-20250115-002
**© 2025 GKACHELE™. Todos los derechos reservados.**
**Fecha:** 15 Enero 2025
**Hash:** `gkachele-customizer-wordpress-adaptado-20250115-002`
---
## 🎯 ESTADO ACTUAL
### ✅ COMPLETADO
1. **Demo WordPress Completo Creado**
- Archivo: `customizer-wordpress-COMPLETO.html`
- Todas las funcionalidades de WordPress implementadas
- Paneles, secciones, controles (toggles, sliders, repeaters, icon pickers, etc.)
- Sistema de guardado correcto (como WordPress)
- Diseño visual exacto WordPress
2. **Documentación Completa**
- `CUSTOMIZER_WORDPRESS_COMPLETO.md` - Todas las funcionalidades documentadas
- `OBJETIVO_CUSTOMIZER_ADAPTADO.md` - Objetivo claro definido
- `PROBLEMAS_CRITICOS_CUSTOMIZER.md` - Problemas identificados
3. **Sistema de Bloques Funcional**
- `addNewBlock()` - Añadir bloques
- `removeBlock()` - Eliminar bloques
- `loadBlocksList()` - Cargar lista
- Integrado con backend
---
## 🎯 OBJETIVO CLARO (PLAN ORIGINAL)
### **COPIAR WORDPRESS Y ADAPTAR:**
**⚠️ ESTE FUE EL PLAN DESDE EL PRINCIPIO - DEBERÍA ESTAR YA HECHO**
1.**COPIAR** el demo completo de WordPress (pendiente)
2.**AUTOMATIZAR** procesos (guardado, preview, etc.) (pendiente)
3.**CAMBIAR branding** a GKACHELE™ (logo, nombres, colores) (pendiente)
4.**ADAPTAR** con lo que ya sabemos (pendiente)
5.**INTEGRAR** con backend Flask existente (pendiente)
### **Principios:**
- Similar a WordPress pero con branding GKACHELE™
- Automatizado (procesos automáticos)
- Adaptar, no copiar exactamente
- **DEBERÍA ESTAR YA IMPLEMENTADO** (pero no está)
---
## 📋 ARCHIVOS CLAVE
### **Demos:**
- `customizer-wordpress-COMPLETO.html` - Demo completo WordPress (referencia)
- `customizer-wordpress-demo.html` - Demo básico (anterior)
### **Documentación:**
- `CUSTOMIZER_WORDPRESS_COMPLETO.md` - Funcionalidades completas
- `OBJETIVO_CUSTOMIZER_ADAPTADO.md` - Objetivo claro
- `PROBLEMAS_CRITICOS_CUSTOMIZER.md` - Problemas identificados
### **Código Actual:**
- `customizer.html` - Customizer actual (a reemplazar/adaptar)
- `app.py` - Backend Flask (endpoints listos)
---
## 🚀 PRÓXIMOS PASOS
1. **Analizar más** (investigación adicional)
2. **Copiar WordPress** (demo completo)
3. **Automatizar** (procesos automáticos)
4. **Cambiar branding** (GKACHELE™)
5. **Adaptar** (con lo que ya sabemos)
6. **Integrar** (con backend Flask)
---
## 📌 NOTAS
- **Demo WordPress completo** está listo y funcional
- **Documentación completa** de todas las funcionalidades
- **Objetivo claro** definido
- **Pendiente:** Copiar y adaptar al customizer real
- **Hablamos luego** para continuar
---
**Última actualización:** 2025-01-15
**Hash:** `gkachele-customizer-wordpress-adaptado-20250115-002`
**Estado:****LISTO PARA COPIAR Y ADAPTAR**
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,51 @@
# 📝 Historial de Cambios - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🔄 Historial de Versiones
### Hash: `gkachele-login-customizer-20250114-v3`
**Fecha:** 14 Enero 2025 - 11:34
**Estado:** ✅ Funcionando
#### Cambios:
-**Login redirige correctamente a customizer**
- ✅ Añadido debugging completo (backend + frontend)
- ✅ Content-Type JSON explícito en respuesta
- ✅ Flush=True en todos los prints
- ✅ Console.log en frontend para debugging
- ✅ Verificación de sitios del usuario antes de redirigir
#### Funcionalidad:
- Login → Busca primer sitio del usuario
- Si tiene sitio → `/customizer/{site_id}`
- Si no tiene sitio → `/dashboard`
- Frontend recibe y procesa correctamente el redirect
---
### Hash: `gkachele-argentina-20250114-v2`
**Fecha:** 14 Enero 2025 - 11:15
#### Cambios:
- Documentación objetivos Argentina
- Gitea y workflows documentados
- Subdominios y pagos documentados
---
### Hash: `gkachele-template-system-20250114-v1`
**Fecha:** 14 Enero 2025 - 08:50
#### Cambios:
- Sistema modular de templates
- Menús y widgets dinámicos
- Sistema de roles basado en DB
---
**Última actualización:** 14 Enero 2025 - 11:34
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

237
memoria/INDICE.md Normal file
View File

@@ -0,0 +1,237 @@
# 📚 ÍNDICE DE DOCUMENTACIÓN - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🎯 IMPORTANTE: LEER SIEMPRE ESTA CARPETA ANTES DE HACER CAMBIOS
Esta carpeta contiene **TODA** la documentación del proyecto. **SIEMPRE** consulta estos archivos antes de modificar código.
---
## 📋 DOCUMENTOS PRINCIPALES
### 1. ⚠️ **REGLA_IMPORTANTE.md** - LEER PRIMERO
- **🚫 NUNCA mencionar "WordPress" en el código**
- Reglas de branding y nomenclatura
- Reemplazos correctos
- **LEER ANTES DE ESCRIBIR CUALQUIER CÓDIGO**
### 2. 📖 **MEMORIA_PROYECTO_COMPLETA.md**
- Documentación completa del proyecto
- Arquitectura del sistema
- Flujos y rutas
- Estado actual
- **Referencia principal del proyecto**
### 3. 🔐 **SISTEMA_ROLES.md**
- Sistema de roles y permisos basado en DB
- Jerarquía de roles (administrator, editor, author, subscriber)
- Funciones helper: `user_has_role()`, `user_can()`
- Migración automática
- **NUNCA hardcodear permisos**
### 4. 👥 **GESTION_USUARIOS.md**
- Sistema de gestión de usuarios
- Ver usuarios registrados
- Eliminar usuarios (con cascada)
- Consultas SQL útiles
- Panel `/admin`
### 5. 🔌 **COMO_CONECTAR_DB.md**
- Cómo conectarse a la base de datos
- DB Browser for SQLite
- Scripts Python
- Consultas útiles
- Sincronización con Raspberry
### 6. 🖥️ **MEMORIA_RASPBERRY_SAAS.md**
- Configuración de Raspberry Pi
- Servicio systemd
- Nginx
- DuckDNS
- Deployment
### 7. 🔄 **MEMORIA_SINCRONIZACION.md**
- Sincronización entre local y Raspberry
- Scripts de actualización
- Cron jobs
- Verificación
### 8. 🔐 **CREDENCIALES_CLIENTES.md**
- Credenciales de acceso de clientes
- Usuario administrador
- **ARCHIVO CONFIDENCIAL** - Mantener privado
### 9. 🎯 **METODOLOGIA_TRABAJO.md**
- Regla: Primero funcionalidad, después limpieza
- Checklist de trabajo
- Principios de desarrollo
### 10. 📖 **DOCUMENTACION_PROYECTO.md**
- Documentación completa del proyecto
- ¿Qué estamos construyendo?
- Arquitectura técnica
- Flujo completo del sistema
- Estado actual
### 11. ❓ **RESPUESTAS_PREGUNTAS.md**
- Respuestas a preguntas frecuentes
- Python vs Docker
- VPS vs Raspberry Pi
- Acceso a base de datos
- Limitaciones por plan
### 12. 🇦🇷 **OBJETIVOS_ARGENTINA.md**
- Objetivos para lanzamiento en Argentina
- Criterio de éxito (Raspberry → VPS)
- Checklist pre-argentina
- Plan de acción completo
### 13. 🔄 **GITEA_WORKFLOWS.md**
- Integración Gitea
- Workflows automáticos
- Repositorios por cliente
- Integración con dashboard admin
- Despliegues automáticos
### 14. 🎯 **FUNCIONALIDADES_COMPLETAS.md**
- Flujo correcto del sistema
- Funcionalidades requeridas
- Estado actual
- Checklist funcionalidad
### 15. 🌐 **SUBDOMINIOS_PAGOS.md**
- Sistema de subdominios
- Integración pagos Nominalia
- Comodines para pagos
- Gestión de dominios
### 16. 📊 **ESTADO_ACTUAL.md**
- Estado actual del proyecto
- Hash actual
- Funcionando vs Pendiente
- Próximos pasos
### 17. 📝 **HISTORIAL_CAMBIOS.md**
- Historial de versiones
- Hash de cada cambio
- Log de funcionalidades
### 18. 🗂️ **ESTRUCTURA_RUTAS.md**
- Estructura de rutas acordada
- /customizer - Editar antes de publicar
- /admin - Panel del cliente
- /dashboard - Panel principal admin
- Flujo completo
### 19. 🎨 **SISTEMA_TEMPLATES.md**
- Sistema de templates estilo WordPress
- Cómo añadir nuevos templates fácilmente
- Estructura de carpetas y config.json
- Endpoints API para templates
- Uso en customizer
### 20. ✏️ **EDITOR_VISUAL_PREVIEW.md**
- Análisis: Edición en preview vs sidebar
- Click to edit en preview (como WordPress)
- Sincronización bidireccional
- Plan de implementación híbrido
- Hash: `gkachele-editor-visual-20250114-1425`
### 21. 🧩 **SISTEMA_BLOQUES_EDITABLES.md**
- Sistema de bloques añadibles/eliminables
- Drag & drop para reordenar
- Videos, imágenes, texto, redes sociales, mapas
- Iconos SVG para redes sociales
- Mapa embed sin API key
- Hash: `gkachele-bloques-editables-20250115-001`
### 22. 📋 **PENDIENTES_MEJORAS.md**
- Lista de mejoras pendientes
- Bugs a arreglar
- Funcionalidades por implementar
- Prioridades y checklist
- Hash: `gkachele-pendientes-20250115-004`
### 23. 🚨 **PROBLEMAS_CRITICOS_CUSTOMIZER.md**
- **PROBLEMAS CRÍTICOS DEL CUSTOMIZER**
- Análisis completo de problemas
- Cómo funciona WordPress Customizer
- Plan para rehacer completamente
- **LEER ANTES DE TRABAJAR EN CUSTOMIZER**
- Hash: `gkachele-problemas-customizer-20250115-001`
### 24. 🎯 **CUSTOMIZER_WORDPRESS_COMPLETO.md**
- **DEMO COMPLETO DE WORDPRESS CUSTOMIZER**
- Todas las funcionalidades implementadas
- Paneles, secciones, controles (toggles, sliders, repeaters, etc.)
- Sistema de guardado correcto
- Diseño visual exacto WordPress
- **ARCHIVO DEMO:** `customizer-wordpress-COMPLETO.html`
- **LEER PARA ADAPTAR AL CUSTOMIZER REAL**
- Hash: `gkachele-customizer-wordpress-completo-20250115-001`
### 25. 🎯 **OBJETIVO_CUSTOMIZER_ADAPTADO.md**
- **OBJETIVO CLARO: CUSTOMIZER ADAPTADO**
- Similar a WordPress pero con branding GKACHELE™
- AUTOMATIZADO (procesos automáticos)
- Ver WordPress y solo ADAPTARLO (no copiar)
- Principios: Similar no igual, Automatizado, Adaptar no copiar
- **LEER ANTES DE EMPEZAR A IMPLEMENTAR**
- Hash: `gkachele-objetivo-customizer-adaptado-20250115-001`
---
## 🎯 PRINCIPIOS DEL PROYECTO
1. **Todo en Base de Datos**: Sin lógica hardcodeada
2. **Sistema Multi-tenant**: Todos los clientes en `main.db`
3. **Roles Dinámicos**: Basados en DB, no hardcodeados
4. **Branding GKACHELE™**: Sin referencias a otros sistemas
5. **Modular**: Código organizado y reutilizable
---
## 📍 ESTRUCTURA DEL PROYECTO
```
c:\word\
├── demo/ # Código del SaaS
│ ├── app.py # Flask backend
│ ├── database/ # main.db (multi-tenant)
│ ├── themes/ # Templates
│ ├── templates/ # HTML templates
│ └── static/ # CSS, JS
├── memoria/ # 📚 TODA LA DOCUMENTACIÓN AQUÍ
│ ├── INDICE.md # Este archivo
│ ├── REGLA_IMPORTANTE.md # ⚠️ LEER PRIMERO
│ ├── MEMORIA_PROYECTO_COMPLETA.md
│ ├── SISTEMA_ROLES.md
│ ├── GESTION_USUARIOS.md
│ ├── COMO_CONECTAR_DB.md
│ ├── MEMORIA_RASPBERRY_SAAS.md
│ └── MEMORIA_SINCRONIZACION.md
└── backups/ # Backups del proyecto
```
---
## ✅ CHECKLIST ANTES DE HACER CAMBIOS
- [ ] Leer `REGLA_IMPORTANTE.md` (nunca mencionar WordPress)
- [ ] Consultar `MEMORIA_PROYECTO_COMPLETA.md` para entender arquitectura
- [ ] Verificar `SISTEMA_ROLES.md` si toca permisos
- [ ] Revisar documentación relevante según el cambio
- [ ] Verificar que no haya lógica hardcodeada
- [ ] Asegurar que todo esté basado en DB
---
## 🔄 ACTUALIZACIÓN
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-docs-consolidated-20250114`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,478 @@
# 🎯 MEMORIA COMPLETA DEL PROYECTO - SaaS PageBuilder
**Fecha:** 13 Enero 2025
**Hash:** `gkachele-login-customizer-20250114-v3`
**Última actualización:** 14 Enero 2025 - 11:35
## 🇦🇷 OBJETIVO ARGENTINA
**Meta:** Lanzar GKACHELE™ SaaS en Argentina con funcionalidad completa y profesional.
**Criterio de Éxito:** Si funciona 1 rubro bien en Raspberry Pi → PAGAR VPS
**Dominio:** Ya tienes dominio configurado
**Ver:** `OBJETIVOS_ARGENTINA.md` y `GITEA_WORKFLOWS.md` para detalles completos
## 🎯 OBJETIVOS ACTUALES (Memorizado)
### 🚀 PRIORIDAD: ARGENTINA 🇦🇷
**Objetivo:** Lanzar GKACHELE™ SaaS en Argentina con funcionalidad completa.
**Criterio de Éxito:** Si funciona 1 rubro bien en Raspberry Pi → PAGAR VPS
### Objetivos Inmediatos:
1. **✅ Template y Menús Profesionales (COMPLETADO):**
- ✅ Sistema modular (_gkachele/header.php, footer.php, sidebar.php)
- ✅ Sistema de menús dinámicos
- ✅ Sistema de widgets
- ⚠️ UI completa para gestionar menús (pendiente)
2. **🔧 Funcionalidad Core (EN PROGRESO):**
- ✅ Registro de clientes
-**Login → Customizer directo (FUNCIONANDO - Hash v3)**
- ✅ Dashboard del cliente (`/dashboard`)
- ✅ Customizer básico (`/customizer/{site_id}`)
- ✅ Panel admin (`/admin`)
3. **🔄 Gitea y Workflows (PENDIENTE):**
- Integración Gitea para repos por cliente
- Workflows automáticos:
- Aceptar peticiones desde dashboard admin
- Desplegar sitios automáticamente
- Generar repositorios por cliente
- Versionado automático
- Integración con dashboard admin
4. **📝 Control de Versiones:**
- Git para landing page
- Versionado de templates
- Historial de cambios
- Rollback de versiones
5. **🎨 Mejorar Landing (PENDIENTE):**
- Diseño optimizado para Argentina
- Mejor UX/UI
- Optimización de conversión
- Performance optimizado
- Responsive mejorado
6. **📊 Workflows Dashboard Admin:**
- Aceptar/rechazar peticiones
- Gestionar usuarios
- Ver estadísticas
- Gestionar despliegues
- Control de versiones
- Integración con Gitea
## ⚠️ REQUISITOS PRINCIPALES (MEMORIZAR)
1. **Sincronización con Hash:** Raspberry y Local deben estar sincronizados con hash
2. **Modularizado:** Código debe estar modularizado
3. **PRIMERO copiar funcionalidad similar:** NO inventar, copiar funcionalidad similar primero en Raspberry, luego ver qué sirve y qué no
4. **Iterar:** Probar → Ver qué sirve → Eliminar lo que no sirve → Mejorar
**Ver:** `MEMORIA_SINCRONIZACION.md` para detalles
## 📍 CONEXIÓN RASPBERRY PI
**Credenciales SSH:**
- **Host:** `komkida.duckdns.org` o `192.168.1.134`
- **Puerto:** `2222`
- **Usuario:** `pi`
- **Password:** `Gdk1983gdk45@`
**Comandos de conexión (CON sshpass):**
```bash
# Desde WSL - CONECTAR
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134"
# COPIAR ARCHIVOS
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no /mnt/c/word/demo/app.py pi@192.168.1.134:/home/pi/gkachele-saas/app.py"
# EJECUTAR COMANDO REMOTO
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'comando aqui'"
```
## 🏗️ ARQUITECTURA
### Stack Tecnológico
- **Backend:** Flask (Python 3) - NO Docker, directo
- **Base de datos:** SQLite (main.db + cliente-X.db)
- **Web Server:** Nginx (reverse proxy)
- **Dominio:** `gk-saas.komkida.duckdns.org`
- **Puerto Flask:** 5001
- **Puerto Nginx:** 80
### Estructura en Raspberry Pi
```
/home/pi/gkachele-saas/
├── app.py # Flask backend principal
├── database/
│ ├── main.db # DB principal (users, sites, requests, media)
│ └── sites/ # DBs por cliente
│ ├── cliente-1.db
│ └── cliente-2.db
├── sites/ # Sitios compilados/publicados
├── themes/ # Templates (como WordPress)
│ ├── gimnasio-claro/
│ ├── restaurante-moderno/
│ └── restaurante-elegante/
├── static/ # CSS, JS, imágenes
├── templates/ # HTML templates
│ ├── landing_real.html # Landing GKACHELE™
│ ├── register.html
│ ├── login.html
│ ├── dashboard.html # Dashboard CLIENTE
│ ├── customizer.html # Personalizador WordPress-like
│ ├── admin.html # Dashboard PRINCIPAL (tuyo)
│ └── client_admin.html # Admin del cliente
└── uploads/ # Media subida por clientes
```
### Estructura en Local (Desarrollo)
```
C:\word\
├── demo/ # Código del SaaS
│ ├── app.py
│ ├── database/
│ ├── themes/
│ ├── templates/
│ └── static/
├── update-raspberry.sh # Script para actualizar Raspberry
└── MEMORIA_PROYECTO_COMPLETA.md # Este archivo
```
## 🔄 FLUJO COMPLETO
```
1. Cliente → Landing (gk-saas.komkida.duckdns.org)
2. Cliente elige plan + rubro → /register?plan=base&rubro=restaurante
3. Cliente se registra → POST /register
├── Crea usuario en main.db (tabla users)
├── Crea sitio automático (tema según rubro) en main.db (tabla sites)
└── Guarda sesión → Redirige a /dashboard (equivalente a wp-admin)
4. Dashboard → Cliente ve SUS sitios
5. Customizer → /customizer/{site_id} (sidebar + preview)
6. Cliente envía → POST /dashboard/submit/{site_id}
7. Admin → /admin (solo user_id=1) aprueba
8. Publicado → /site/{slug}
```
## 🗄️ BASES DE DATOS
### main.db (SQLite) - TODO EN UNA SOLA BASE DE DATOS (Multi-tenant como WordPress)
**✅ Sistema Multi-tenant:** Todos los clientes en una sola base de datos, cada cliente solo ve SUS datos a través de `/dashboard` (equivalente a wp-admin)
**Tabla: users**
- id, email (UNIQUE), password (hash), plan, rubro, created_at
- Todos los usuarios/clientes están aquí
**Tabla: sites**
- id, user_id (FK), slug (UNIQUE), theme, status (draft/pending/published), content_json, created_at
- Todos los sitios, filtrados por user_id (cada cliente solo ve los suyos)
**Tabla: requests**
- id, site_id (FK), user_id (FK), status (pending/approved/rejected), created_at
- Solicitudes de publicación
**Tabla: media**
- id, user_id (FK), site_id (FK), filename, filepath, file_type, uploaded_at
- Archivos subidos por clientes, filtrados por user_id
**Tabla: content**
- id, user_id (FK), site_id (FK), section, data_json, updated_at
- Contenido por sección (futuro uso), filtrado por user_id y site_id
**Tabla: settings**
- id, user_id (FK), site_id, key, value, created_at, updated_at
- Configuraciones (como wp_options en WordPress), filtrado por user_id y site_id
**Tabla: menus**
- id, user_id (FK), site_id (FK), location (header/footer/sidebar), title, url, order_index, parent_id, created_at
- Sistema de menús dinámicos por ubicación, filtrado por user_id y site_id
**Tabla: widgets**
- id, user_id (FK), site_id (FK), area (sidebar/footer/etc), type, title, content, order_index, created_at, updated_at
- Sistema de widgets dinámicos por área, filtrado por user_id y site_id
## 🎨 TEMPLATES (Sistema WordPress-like)
### Templates Disponibles
- **gimnasio-claro:** Tema para gimnasios (rojo/negro)
- **restaurante-moderno:** Tema moderno (rojo/naranja) - 2 variantes
- **restaurante-elegante:** Tema elegante (marrón/dorado)
### Estructura de Template (Sistema Modular GKACHELE™)
```
themes/
├── _gkachele/ # Sistema base modular (como WordPress)
│ ├── header.php # Header con menús dinámicos
│ ├── footer.php # Footer con copyright GKACHELE™
│ └── sidebar.php # Sidebar con widgets dinámicos
├── {nombre}/ # Temas específicos
│ ├── config.json # Configuración (colores, tipografía, secciones)
│ ├── template.html # HTML del template (contenido principal)
│ └── style.css # CSS (opcional)
```
**Sistema de Renderizado:**
- `render_gkachele_template()` concatena: `header.php` + `template.html` + `sidebar.php` + `footer.php`
- Menús y widgets se cargan dinámicamente desde la base de datos
- Soporte para múltiples ubicaciones de menú (header, footer, sidebar)
- Widgets por área (sidebar, footer, etc.)
### Asignación Automática
- **restaurante:** Aleatorio entre `restaurante-moderno` y `restaurante-elegante`
- **gimnasio/gimnasios:** `gimnasio-claro`
- **Otros:** `default`
## 🔧 CONFIGURACIÓN NGINX
**Archivo:** `/etc/nginx/sites-available/gk-saas.komkida.duckdns.org.conf`
```nginx
server {
listen 80;
server_name gk-saas.komkida.duckdns.org;
location / {
proxy_pass http://localhost:5001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
**Comandos:**
```bash
sudo nginx -t # Verificar configuración
sudo systemctl reload nginx # Recargar
tail -f /var/log/nginx/gk-saas-error.log # Ver logs
```
## 🔄 SERVICIO SYSTEMD
**Archivo:** `/etc/systemd/system/gkachele-saas.service`
```ini
[Unit]
Description=GKACHELE SaaS Flask App
After=network.target
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/gkachele-saas
Environment="PATH=/usr/bin:/usr/local/bin:/home/pi/.local/bin"
ExecStart=/usr/bin/python3 /home/pi/gkachele-saas/app.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
```
**Comandos:**
```bash
sudo systemctl start gkachele-saas # Iniciar
sudo systemctl stop gkachele-saas # Detener
sudo systemctl restart gkachele-saas # Reiniciar
sudo systemctl status gkachele-saas # Estado
journalctl -u gkachele-saas -f # Ver logs
```
## 🚀 ACTUALIZAR CÓDIGO EN RASPBERRY
### Método Correcto (con sshpass desde WSL):
```bash
# 1. Copiar código actualizado
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no /mnt/c/word/demo/app.py pi@192.168.1.134:/home/pi/gkachele-saas/app.py"
# 2. Reiniciar app (matar proceso y reiniciar)
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'pkill -f \"python3 app.py\" && cd ~/gkachele-saas && nohup python3 app.py > /tmp/app.log 2>&1 &'"
```
### Instalar Servicio Systemd (una vez):
```bash
# Copiar servicio
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no gkachele-saas.service pi@192.168.1.134:/tmp/"
# Instalar servicio
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'sudo mv /tmp/gkachele-saas.service /etc/systemd/system/ && sudo systemctl daemon-reload && sudo systemctl enable gkachele-saas && sudo systemctl start gkachele-saas'"
```
### Configurar Cron en Raspberry (actualizar automáticamente):
```bash
# 1. Crear script de actualización
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no update-app-raspberry.sh pi@192.168.1.134:~/scripts/update-app.sh"
# 2. Dar permisos
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'chmod +x ~/scripts/update-app.sh'"
# 3. Agregar a crontab (cada hora) - requiere permisos
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'echo \"0 * * * * /home/pi/scripts/update-app.sh\" | crontab -'"
# Verificar cron
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'crontab -l'"
```
**NOTA:** El cron actualiza cada hora. Para actualizar manualmente el código, usar el método de SCP arriba.
## 📋 RUTAS PRINCIPALES
### Públicas
- `GET /` - Landing page
- `GET /register` - Formulario registro
- `POST /register` - Crear usuario (JSON)
- `GET /login` - Formulario login
- `POST /login` - Iniciar sesión (JSON)
- `GET /site/{slug}` - Sitio público publicado
### Cliente (requiere sesión)
- `GET /dashboard` - Dashboard del cliente
- `GET /customizer/{site_id}` - Personalizador
- `POST /api/customizer/save` - Guardar cambios
- `GET /api/customizer/preview-frame/{site_id}` - Preview iframe
- `POST /dashboard/submit/{site_id}` - Enviar para aprobación
- `GET /dashboard/admin` - Admin del cliente (media, config)
### APIs de Menús y Widgets
- `GET /api/menus/<site_id>` - Obtener menús del sitio
- `POST /api/menus/<site_id>` - Guardar/actualizar menús
- `GET /api/widgets/<site_id>` - Obtener widgets del sitio
- `POST /api/widgets/<site_id>` - Guardar/actualizar widgets
### Admin Principal (solo user_id=1)
- `GET /admin` - Dashboard principal
- `POST /admin/approve/{request_id}` - Aprobar solicitud
- `POST /admin/reject/{request_id}` - Rechazar solicitud
## 🔐 SEGURIDAD
### Sesiones
- Flask `session` con `secret_key`
- Cookie `SESSION_COOKIE_SAMESITE = 'Lax'`
- Sesión se guarda después de login exitoso
### Acceso
- **Clientes:** Solo ven SUS sitios (filtrado por `user_id` en sesión)
- **Admin:** Solo `user_id = 1` puede acceder a `/admin`
- **Passwords:** Hash con `werkzeug.security.generate_password_hash`
## 🎯 ESTADO ACTUAL
### ✅ Funcionando
- Landing page (GKACHELE™ original)
- Registro de clientes → Redirige a `/login` (sin sesión automática)
- Login de clientes → Redirige a `/dashboard`
- Dashboard del cliente
- Customizer básico (sidebar + preview)
- Templates: gimnasio-claro, restaurante-moderno, restaurante-elegante
- **Sistema modular de templates (_gkachele/header.php, footer.php, sidebar.php)**
- **Sistema de menús dinámicos (header, footer, sidebar)**
- **Sistema de widgets dinámicos (sidebar, footer, etc.)**
- **Función `render_gkachele_template()` para renderizado completo**
- **APIs para gestionar menús y widgets**
- Base de datos SQLite multi-tenant (main.db con tablas menus y widgets)
- Nginx reverse proxy
- Systemd service
- DuckDNS para dominio remoto
- Scripts de gestión: `ver_usuarios.py`, `limpiar_db.py`
### ⚠️ Pendiente
- Drag & drop de secciones (SortableJS)
- Edición inline (contenteditable)
- Gitea para repos por cliente + automatización
- Dashboard principal para aprobar solicitudes
- Plugins sencillos (colores, tipografía avanzada)
- SSL/HTTPS (Let's Encrypt)
### 🎯 PRÓXIMOS OBJETIVOS (PRIORITARIOS)
1. **✅ Template y Menús Profesionales (COMPLETADO):**
- ✅ Sistema modular (_gkachele/header.php, footer.php, sidebar.php)
- ✅ Sistema de menús dinámicos (header, footer, sidebar)
- ✅ Múltiples ubicaciones de menú
- ✅ Sistema de widgets/áreas
- ⚠️ **PENDIENTE:** UI completa para gestionar menús desde customizer (actualmente solo placeholder)
2. **Mejorar Landing:**
- Diseño más profesional
- Mejor UX/UI
- Optimización de conversión
3. **Automatización con Gitea:**
- Integración Gitea para repos por cliente
- Automatización de despliegues
- Workflows automáticos
- Integración con n8n (futuro)
## 📦 DEPENDENCIAS
**Python:**
- Flask
- Werkzeug (password hashing)
- SQLite3 (built-in)
**Instalación:**
```bash
pip3 install Flask Werkzeug
```
## 🌐 DUCKDNS
**Dominios:**
- **komkida.duckdns.org:** Token `9c5cff88-b6d7-4704-9b10-4a69afdff797`
- **gkachele.duckdns.org:** Token `578331b3-ad7b-4154-835d-e496465257b0`
**Actualizar IP:**
```bash
python3 update-komkida-duckdns.py
```
## 🚀 MIGRACIÓN A VPS
**Pasos:**
1. Copiar `/home/pi/gkachele-saas/` completo
2. Instalar Python3, Nginx en VPS
3. Copiar configuración Nginx
4. Copiar servicio systemd
5. Cambiar dominio (DuckDNS o dominio real)
6. Configurar SSL (Let's Encrypt)
**Ventajas:**
- ✅ Mismo código (sin cambios)
- ✅ Misma estructura
- ✅ Más recursos
- ✅ Mejor rendimiento
## 📝 NOTAS IMPORTANTES
- **NO usar Docker:** Todo corre directamente (Python + Nginx)
- **NO usar GitHub:** Todo es independiente en Raspberry
- **SQLite es suficiente:** Para SaaS pequeño, no necesita MySQL
- **Raspberry Pi 3:** Recursos limitados, pero suficiente para desarrollo
- **VPS recomendado:** Para producción con muchos clientes
## 📦 BACKUP Y VERSIONADO
**Hash Actual:** `gkachele-template-system-20250114-v1`
**Estado Verificado:**
- ✅ Templates _gkachele en Raspberry: header.php, footer.php, sidebar.php
- ✅ Función render_gkachele_template en app.py
- ✅ Tablas menus y widgets en main.db
- ✅ Servicio gkachele-saas activo
- ✅ Flujo de registro: Registro → Login → Dashboard → Customizer
**Scripts de Gestión:**
- `ver_usuarios.py` - Ver usuarios y sitios registrados
- `limpiar_db.py` - Limpiar base de datos (con confirmación)
- `verificar_raspberry.sh` - Verificar estado en Raspberry
---
**Última actualización:** 14 Enero 2025 - 08:50

View File

@@ -0,0 +1,133 @@
# 🎯 MEMORIA: SaaS en Raspberry Pi 3 - Estado Actual
**Fecha:** 13 Enero 2025
**Hash:** `raspberry-pi3-saas-setup-20250113`
## ✅ LO QUE ESTÁ FUNCIONANDO
### 1. Flask SaaS en Raspberry Pi
- **Ubicación:** `/home/pi/gkachele-saas/`
- **Puerto:** 5001
- **Estado:** ✅ Corriendo (2 procesos)
- **Landing:** `landing_real.html` (GKACHELE™ original)
- **Base de datos:** SQLite (`database/main.db`)
### 2. Nginx Configurado
- **Configuración activa:** `gk-saas.komkida.duckdns.org`
- **Ubicación:** `/etc/nginx/sites-available/gk-saas.komkida.duckdns.org`
- **Proxy:** `localhost:5001` (SIN GitHub)
- **Estado:** ✅ Funcionando
### 3. Dominio Remoto
- **URL:** `http://gk-saas.komkida.duckdns.org`
- **DuckDNS Token:** `9c5cff88-b6d7-4704-9b10-4a69afdff797`
- **IP Raspberry:** `213.195.104.66`
- **NOTA:** Este dominio NO tiene relación con GitHub
## 📁 ESTRUCTURA EN RASPBERRY
```
/home/pi/gkachele-saas/
├── app.py # Flask backend
├── database/
│ ├── main.db # DB principal
│ └── sites/ # DBs por cliente
├── sites/ # Sitios compilados
├── themes/ # Templates
│ ├── gimnasio-claro/
│ └── restaurante-moderno/
├── static/
│ └── style.css # CSS landing real
└── templates/
├── landing_real.html # Landing GKACHELE™
├── register.html
├── login.html
├── dashboard.html
├── customizer.html
└── admin.html
```
## 🔧 CONFIGURACIÓN NGINX
### Archivo activo:
`/etc/nginx/sites-available/gk-saas.komkida.duckdns.org`
```nginx
server {
listen 80;
server_name gk-saas.komkida.duckdns.org;
location / {
proxy_pass http://localhost:5001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
## 🔐 CREDENCIALES
### Raspberry Pi
- **Host:** `komkida.duckdns.org` o `192.168.1.134`
- **Puerto SSH:** 2222
- **Usuario:** `pi`
- **Password:** `Gdk1983gdk45@`
### DuckDNS
- **komkida.duckdns.org:** Token `9c5cff88-b6d7-4704-9b10-4a69afdff797`
- **gkachele.duckdns.org:** Token `578331b3-ad7b-4154-835d-e496465257b0`
## 🚀 COMANDOS ÚTILES
### Actualizar DuckDNS
```bash
python3 -c "import urllib.request; print(urllib.request.urlopen('https://www.duckdns.org/update?domains=komkida&token=9c5cff88-b6d7-4704-9b10-4a69afdff797&ip=').read())"
```
### Verificar Flask
```bash
curl http://localhost:5001/
```
### Recargar Nginx
```bash
sudo nginx -t && sudo systemctl reload nginx
```
### Ver logs
```bash
tail -f /var/log/nginx/gk-saas-access.log
tail -f /var/log/nginx/gk-saas-error.log
```
## ⚠️ IMPORTANTE
- **NO usar GitHub:** Todo es independiente en Raspberry
- **Dominio principal:** `gk-saas.komkida.duckdns.org` (NO `gkachele.duckdns.org`)
- **Raspberry Pi 3:** Recursos suficientes para SaaS pequeño
- **SQLite:** Base de datos ligera, perfecta para Pi
## 📝 PRÓXIMOS PASOS
1. ✅ Instalar Gitea en Raspberry (opcional)
2. ✅ Automatizar DuckDNS (cron cada 5 min)
3. ✅ Crear servicio systemd para Flask
4. ✅ Configurar SSL/HTTPS (Let's Encrypt)
## 🎯 FLUJO COMPLETO
```
Cliente → gk-saas.komkida.duckdns.org
Nginx (puerto 80)
Flask (puerto 5001)
SQLite (database/)
Landing/SaaS funcionando
```
---
**Última actualización:** 13 Enero 2025 - 15:58

View File

@@ -0,0 +1,97 @@
# 🔄 MEMORIA: Sincronización y Modularización
**Fecha:** 13 Enero 2025
**Hash:** `sincronizacion-modular-wordpress-20250113`
## ✅ REQUISITOS PRINCIPALES
### 1. Sincronización con Hash
- **Raspberry y Local deben estar sincronizados**
- **Usar hash para verificar versiones**
- **Siempre verificar antes de actualizar**
### 2. Modularizado
- **Código debe estar modularizado**
- **Fácil de mantener y actualizar**
- **Separar responsabilidades**
### 3. PRIMERO: Copiar WordPress Similar en Raspberry
- **NO empezar desde cero**
- **Copiar funcionalidad similar a WordPress primero**
- **Luego ver qué sirve y qué no**
- **Iterar sobre lo que funciona**
## 🎯 PLAN DE TRABAJO
### FASE 1: Copiar WordPress Similar (AHORA)
1. Implementar registro simple como WordPress
2. Implementar login simple
3. Implementar dashboard básico
4. Implementar customizer básico
5. **TODO en Raspberry primero**
### FASE 2: Verificar qué Sirve
1. Probar cada funcionalidad
2. Identificar qué funciona bien
3. Identificar qué no sirve
4. Eliminar lo que no sirve
### FASE 3: Modularizar
1. Separar en módulos
2. Crear hash de versión
3. Sincronizar Raspberry ↔ Local
## 🔄 SISTEMA DE HASH
**Cada versión debe tener:**
- Hash único (ej: `v1.0.0-abc123`)
- Fecha de actualización
- Lista de cambios
**Verificar sincronización:**
```bash
# En local
md5sum demo/app.py > local.hash
# En Raspberry
md5sum /home/pi/gkachele-saas/app.py > raspberry.hash
# Comparar
diff local.hash raspberry.hash
```
## 📋 PRÓXIMOS PASOS
1. ✅ Memorizar requisitos
2. [ ] Copiar WordPress similar en Raspberry
3. [ ] Probar funcionalidades
4. [ ] Eliminar lo que no sirve
5. [ ] Modularizar código
6. [ ] Implementar sistema de hash
## 🖥️ INDEPENDENCIA DEL PC
**✅ SÍ, funciona aunque apagues el PC:**
- **Flask:** Corre como servicio systemd en la Raspberry (auto-inicia al arrancar)
- **Nginx:** Corre como servicio systemd en la Raspberry (auto-inicia al arrancar)
- **Todo está en la Raspberry:** No depende del PC para funcionar
**El PC solo se usa para:**
- Editar código localmente
- Copiar archivos a la Raspberry (SSH/SCP)
- **NO es necesario que esté encendido para que la página funcione**
**Servicios configurados para auto-iniciar:**
- `gkachele-saas.service``enabled` (inicia automáticamente)
- `nginx.service``enabled` (inicia automáticamente)
**Verificar:**
```bash
# En Raspberry
systemctl is-enabled gkachele-saas # Debe decir "enabled"
systemctl is-enabled nginx # Debe decir "enabled"
```
---
**IMPORTANTE:** Primero copiar WordPress similar, luego iterar. No inventar desde cero.

View File

@@ -0,0 +1,74 @@
# 🎯 Metodología de Trabajo - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## ⚠️ REGLA DE TRABAJO
### Orden de Prioridades:
1. **PRIMERO: Hacer que funcione bien**
- Implementar funcionalidad
- Probar que funciona
- Verificar en producción (Raspberry)
2. **DESPUÉS: Limpieza**
- Optimizar código
- Refactorizar
- Mejorar estructura
- Documentar
### ⚠️ NO hacer limpieza antes de que funcione
**Flujo correcto:**
```
Funcionalidad → Probar → Funciona → Limpieza → Documentar
```
**Flujo incorrecto:**
```
Funcionalidad → Limpieza → Probar → ❌ No funciona
```
---
## 📋 Checklist de Trabajo
### Fase 1: Funcionalidad
- [ ] Implementar funcionalidad básica
- [ ] Probar localmente
- [ ] Desplegar a Raspberry
- [ ] Verificar que funciona en producción
- [ ] Confirmar con usuario
### Fase 2: Limpieza (SOLO después de que funcione)
- [ ] Optimizar código
- [ ] Refactorizar si es necesario
- [ ] Mejorar estructura
- [ ] Documentar cambios
- [ ] Actualizar memoria
---
## 🎯 Principios
1. **Funcionalidad primero, perfección después**
2. **Probar en producción antes de limpiar**
3. **No optimizar prematuramente**
4. **Iterar: Funciona → Mejora → Funciona mejor**
---
## 📝 Notas
- Siempre verificar que funciona antes de hacer limpieza
- La limpieza es importante, pero no es prioridad sobre funcionalidad
- Documentar después de que todo funcione
---
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-metodologia-20250114`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,163 @@
# 🇦🇷 OBJETIVOS PARA ARGENTINA - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🎯 OBJETIVO PRINCIPAL
**Lanzar GKACHELE™ SaaS en Argentina con funcionalidad completa y profesional.**
---
## ✅ CRITERIO DE ÉXITO
**Si funciona 1 rubro bien en Raspberry Pi → PAGAR VPS**
---
## 🚀 OBJETIVOS PRIORITARIOS
### 1. **Funcionalidad Core (PRIMERO)**
- ✅ Registro de clientes
-**Login → Customizer directo (FUNCIONANDO - Hash v3)**
- ✅ Dashboard del cliente (`/dashboard` - ver sus sitios)
- ✅ Customizer funcional (`/customizer/{site_id}`)
- ✅ Panel admin (`/admin` - gestión completa)
- ✅ Flujo completo: Landing → Registro → Login → Customizer → Enviar → Admin → Publicado
### 2. **Gitea - Despliegues y Workflows**
- Integración Gitea para repositorios por cliente
- Workflows automáticos:
- Aceptar peticiones de publicación
- Desplegar sitios automáticamente
- Generar repositorios por cliente
- Versionado automático
- Integración con dashboard admin para gestionar workflows
### 3. **Control de Versiones**
- Git para landing page
- Versionado de templates
- Historial de cambios
- Rollback de versiones
### 4. **Mejoras Landing Page**
- Diseño optimizado para Argentina
- Mejor UX/UI
- Optimización de conversión
- Responsive mejorado
- Performance optimizado
### 5. **Workflows Dashboard Admin**
- Aceptar/rechazar peticiones
- Gestionar usuarios
- Ver estadísticas
- Gestionar despliegues
- Control de versiones
- Integración con Gitea
---
## 🗄️ INFRAESTRUCTURA
### Actual: Raspberry Pi 3
- Desarrollo y pruebas
- Si funciona bien → Migrar a VPS
### Futuro: VPS
- Más recursos
- Mejor rendimiento
- Dominio propio (ya tienes)
- SSL/HTTPS
- Escalabilidad
---
## 📋 CHECKLIST PRE-ARGENTINA
### Funcionalidad Básica:
- [x] Registro funciona correctamente (✅)
- [x] Login redirige a customizer (✅ FUNCIONANDO)
- [x] Dashboard del cliente visible y funcional (✅)
- [x] Customizer básico funcional (✅)
- [x] Panel admin funcional (✅)
- [ ] Al menos 1 rubro funcionando perfecto (EN PROGRESO)
### Gitea y Workflows:
- [ ] Gitea instalado y configurado
- [ ] Repositorios automáticos por cliente
- [ ] Workflows de despliegue
- [ ] Integración con dashboard admin
- [ ] Aceptar peticiones desde workflows
### Control de Versiones:
- [ ] Git configurado
- [ ] Landing en repositorio
- [ ] Versionado de templates
- [ ] Historial de cambios
### Landing Mejorada:
- [ ] Diseño optimizado
- [ ] UX/UI mejorada
- [ ] Performance optimizado
- [ ] Responsive completo
- [ ] Optimización conversión
### Testing:
- [ ] Probar con 1 rubro completo
- [ ] Verificar en Raspberry
- [ ] Si funciona → Preparar VPS
---
## 🎯 PLAN DE ACCIÓN
### Fase 1: Funcionalidad Core (AHORA)
1. Verificar dashboard del cliente
2. Completar customizer
3. Probar con 1 rubro completo
4. Verificar que todo funcione
### Fase 2: Gitea y Workflows
1. Instalar/configurar Gitea
2. Integrar con sistema
3. Crear workflows automáticos
4. Conectar con dashboard admin
### Fase 3: Control de Versiones
1. Configurar Git
2. Versionar landing
3. Versionar templates
4. Sistema de rollback
### Fase 4: Landing Mejorada
1. Rediseñar landing
2. Optimizar para Argentina
3. Mejorar conversión
4. Testing completo
### Fase 5: VPS (Si funciona en Raspberry)
1. Preparar VPS
2. Migrar código
3. Configurar dominio
4. SSL/HTTPS
5. Lanzamiento
---
## 📝 NOTAS IMPORTANTES
- **Prioridad:** Funcionalidad primero, perfección después
- **Testing:** Probar cada funcionalidad antes de avanzar
- **Documentación:** Todo en carpeta `memoria/`
- **Control de Versiones:** Git desde el inicio
- **Argentina:** Optimizar para mercado argentino
---
## 🔄 ACTUALIZACIÓN
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-objetivos-argentina-20250114`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,91 @@
# 🎯 OBJETIVO: CUSTOMIZER ADAPTADO DE WORDPRESS
**© 2025 GKACHELE™. Todos los derechos reservados.**
**Fecha:** 15 Enero 2025
**Hash:** `gkachele-objetivo-customizer-adaptado-20250115-001`
**⚠️ IMPORTANTE:** Este fue el plan desde el principio. Debería estar ya hecho.
---
## ✅ OBJETIVO CLARO (PLAN ORIGINAL)
### **COPIAR Y ADAPTAR WORDPRESS:**
1.**COPIAR WordPress** (funcionalidades completas)
2.**AUTOMATIZAR** (procesos automáticos, no manual)
3.**Cambiar branding a GKACHELE™** (logo, nombres, colores)
4.**ADAPTAR** con lo que ya sabemos
5. ⚠️ **DEBERÍA ESTAR YA HECHO** (pero no está implementado aún)
---
## 🎯 PRINCIPIOS
### 1. **SIMILAR, NO IGUAL**
- ✅ Usar WordPress como **referencia visual y funcional**
- ✅ Adaptar diseño con **branding GKACHELE™**
- ✅ Mantener funcionalidades pero con **nuestro estilo**
- ❌ NO copiar WordPress exactamente
- ❌ NO usar nombres/colores de WordPress
### 2. **AUTOMATIZADO**
- ✅ Procesos automáticos (no manual)
- ✅ Guardado automático de preview
- ✅ Sincronización automática
- ✅ Validación automática
- ✅ Generación automática (mapas, WhatsApp, etc.)
### 3. **ADAPTAR, NO COPIAR**
- ✅ Ver cómo funciona WordPress
- ✅ Entender la lógica
- ✅ Adaptar a nuestras necesidades
- ✅ Mejorar donde sea posible
- ✅ Personalizar con GKACHELE™
---
## 📋 LO QUE TENEMOS
### **Referencia:**
- ✅ Demo completo WordPress: `customizer-wordpress-COMPLETO.html`
- ✅ Documentación: `CUSTOMIZER_WORDPRESS_COMPLETO.md`
- ✅ Código WordPress real en: `wp-content/themes/abiz/core/customizer/`
### **Objetivo:**
- ✅ Customizer GKACHELE™ similar a WordPress
- ✅ Funcionalidades automáticas
- ✅ Diseño adaptado con branding GKACHELE™
---
## 🚀 PROCESO (PLAN ORIGINAL)
1.**Analizar WordPress** (ya hecho - demo completo)
2.**COPIAR WordPress** (demo completo al customizer real)
3.**AUTOMATIZAR** (procesos automáticos)
4.**Cambiar branding** (GKACHELE™ en lugar de WordPress)
5.**ADAPTAR** (con lo que ya sabemos)
6.**Integrar con backend** (Flask/Python)
7.**Testing y pulido**
**Estado:** Pendiente de implementar (debería estar ya hecho)
---
## 📌 NOTAS IMPORTANTES
- **NO mencionar "WordPress"** en el código (ver REGLA_IMPORTANTE.md)
- **Usar "GKACHELE™ Customizer"** o "Sistema GKACHELE™"
- **Adaptar, no copiar**
- **Automatizar todo lo posible**
---
**Última actualización:** 2025-01-15
**Hash:** `gkachele-objetivo-customizer-adaptado-20250115-001`
**Estado:****OBJETIVO CLARO - LISTO PARA IMPLEMENTAR**
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,307 @@
# 📋 Pendientes y Mejoras - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
**Hash:** `gkachele-pendientes-20250115-004`
**Fecha:** 2025-01-15
**⚠️ VER:** `PROBLEMAS_CRITICOS_CUSTOMIZER.md` - **REHACER COMPLETAMENTE EL CUSTOMIZER**
---
## ✅ FUNCIONALIDADES COMPLETADAS
1.**Sistema de bloques añadibles COMPLETO** (video, imagen, texto, redes sociales, mapa)
- ✅ Función `addNewBlock()` implementada
- ✅ Función `removeBlock()` implementada
- ✅ Función `loadBlocksList()` implementada
- ✅ Lista de bloques en sidebar funcional
- ✅ Integración completa con backend
- ✅ Notificaciones de éxito/error
2. ✅ Iconos SVG para redes sociales
3. ✅ Click to edit en preview
4. ✅ Gestión de platos del menú (añadir/eliminar)
5. ✅ Actualización en tiempo real del preview
6. ✅ Drag & drop básico para bloques
---
## 🔧 MEJORAS PENDIENTES
### 1. 🗺️ Mapa Automático desde Dirección
**Estado:** Pendiente
**Requisito:**
- El mapa debe generarse automáticamente usando la dirección del campo "Dirección"
- No debe requerir URL manual
- Usar Google Maps Embed API sin API key (o geocoding simple)
**Implementación:**
```javascript
// Cuando cambie la dirección, generar automáticamente el mapa
function generateMapFromAddress(address) {
// Convertir dirección a URL de Google Maps embed
const encodedAddress = encodeURIComponent(address);
const mapUrl = `https://www.google.com/maps/embed/v1/place?key=AIzaSy...&q=${encodedAddress}`;
// O usar iframe con búsqueda directa
const mapUrl = `https://www.google.com/maps?q=${encodedAddress}&output=embed`;
return mapUrl;
}
```
**Archivos a modificar:**
- `demo/templates/customizer.html` - Auto-generar mapa_url cuando cambie dirección
- `demo/themes/restaurante-moderno/template.html` - Usar dirección si no hay mapa_url
---
### 2. 📁 Upload de Archivos (Drag & Drop)
**Estado:** Pendiente
**Requisito:**
- Arrastrar y soltar archivos en campos de Media
- O abrir navegador de archivos
- No usar URLs manuales
- Subir a servidor y guardar ruta
**Implementación:**
```html
<!-- En customizer.html -->
<div class="media-upload-area" ondrop="handleFileDrop(event)" ondragover="allowDrop(event)">
<input type="file" id="media_upload" style="display: none;" onchange="handleFileSelect(event)">
<button onclick="document.getElementById('media_upload').click()">📁 Seleccionar archivo</button>
<p>O arrastra y suelta aquí</p>
</div>
```
```python
# En app.py
@app.route('/api/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'error': 'No file'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': 'No file selected'}), 400
filename = secure_filename(file.filename)
filepath = os.path.join(UPLOAD_FOLDER, filename)
file.save(filepath)
return jsonify({'url': f'/uploads/{filename}'})
```
**Archivos a modificar:**
- `demo/templates/customizer.html` - Añadir drag & drop a campos Media
- `demo/app.py` - Endpoint de upload
- `demo/static/` - Carpeta para uploads
---
### 3. ✏️ Editar Contenido de Bloques Existentes
**Estado:** Pendiente
**Problema:**
- Los bloques se pueden añadir y eliminar, pero no editar su contenido
- No hay forma de modificar el contenido de un bloque después de crearlo
**Solución:**
```javascript
// En template.html - función debe estar disponible globalmente
function removeBlockFromPreview(blockId) {
if (window.parent !== window) {
window.parent.postMessage({
type: 'remove-block',
block_id: blockId
}, '*');
} else {
// Si no está en iframe, llamar directamente
removeBlock(blockId);
}
}
// En customizer.html - escuchar mensaje
window.addEventListener('message', function(e) {
if (e.data && e.data.type === 'remove-block') {
removeBlock(e.data.block_id);
}
});
```
**Archivos a modificar:**
- `demo/templates/customizer.html` - Añadir función `editBlock(blockId)` que abra modal según tipo
- `demo/templates/customizer.html` - Hacer bloques clickeables en la lista para editar
- `demo/app.py` - Endpoint `/api/customizer/update-block` para actualizar contenido
---
### 4. 🧩 Eliminar Zonas/Secciones (Como WordPress)
**Estado:** Pendiente
**Requisito:**
- Poder eliminar secciones completas (Hero, Menú, Horarios, Contacto, etc.)
- Como WordPress: cada sección puede ocultarse/eliminarse
- Guardar estado en content_json
**Implementación:**
```json
{
"sections": {
"hero": {"visible": true, "enabled": true},
"menu": {"visible": true, "enabled": true},
"horarios": {"visible": false, "enabled": false},
"contacto": {"visible": true, "enabled": true}
}
}
```
```html
<!-- En template.html -->
{% if sections.hero.enabled %}
<section id="hero" class="section hero">
<!-- Contenido -->
<button class="section-delete" onclick="toggleSection('hero')">🗑️ Ocultar sección</button>
</section>
{% endif %}
```
**Archivos a modificar:**
- `demo/templates/customizer.html` - Añadir controles para secciones
- `demo/themes/restaurante-moderno/template.html` - Renderizar condicionalmente
- `demo/app.py` - Endpoint para toggle de secciones
---
### 5. ✏️ Edición de Contenido de Bloques
**Estado:** Pendiente
**Requisito:**
- Cada bloque añadido debe ser editable
- Click en bloque → editar contenido
- Modal o inline editor según tipo
**Implementación:**
```javascript
function editBlock(blockId) {
const block = blocks.find(b => b.id === blockId);
if (!block) return;
// Abrir modal según tipo
if (block.type === 'texto') {
openTextEditor(block);
} else if (block.type === 'video') {
openVideoEditor(block);
} else if (block.type === 'redes_sociales') {
openSocialEditor(block);
}
}
```
**Archivos a modificar:**
- `demo/templates/customizer.html` - Añadir función editBlock
- `demo/themes/restaurante-moderno/template.html` - Hacer bloques clickeables
---
### 6. 🔄 Guardado Automático de Orden (Drag & Drop)
**Estado:** Pendiente
**Requisito:**
- Al arrastrar y soltar bloques, guardar orden automáticamente
- No esperar a añadir/eliminar
**Implementación:**
```javascript
function handleDrop(e) {
e.preventDefault();
// Reordenar bloques
const newOrder = Array.from(document.querySelectorAll('.gk-block'))
.map(block => block.dataset.blockId);
// Guardar orden inmediatamente
fetch('/api/customizer/reorder-blocks', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
site_id: siteId,
block_ids: newOrder
})
});
}
```
**Archivos a modificar:**
- `demo/themes/restaurante-moderno/template.html` - Mejorar drag & drop
- `demo/templates/customizer.html` - Guardar orden automáticamente
---
## 🚨 PROBLEMAS CRÍTICOS (REHACER COMPLETAMENTE)
**Ver documento completo:** `PROBLEMAS_CRITICOS_CUSTOMIZER.md`
### Problemas Identificados:
1.**Diseño horrible** - No se parece a WordPress
2.**Colores horribles** - No usa paleta WordPress
3.**Guardado inconsistente** - Algunas cosas guardan, otras no
4.**No hay botón Cancelar** - Hay que refrescar o salir
5.**Mapa no funciona**
6.**No hay WhatsApp flotante**
7.**No hay scroll suave**
8.**No hay iconos a elegir** (solo emojis)
**Solución:** REHACER COMPLETAMENTE copiando EXACTAMENTE WordPress Customizer
---
## 📝 CHECKLIST DE IMPLEMENTACIÓN
### Prioridad CRÍTICA (REHACER TODO)
- [ ] **Rehacer diseño visual** - Copiar EXACTAMENTE WordPress
- [ ] **Rehacer sistema de guardado** - Botón "Guardar y Publicar" + "Descartar"
- [ ] **Arreglar mapa** - Generar automáticamente desde dirección
- [ ] **Añadir WhatsApp flotante** - Configurable desde sidebar
- [ ] **Añadir selector de iconos** - Dashicons o Font Awesome
- [ ] **Añadir scroll suave** - Mejorar navegación
### Prioridad Alta
- [ ] Editar contenido de bloques existentes
- [ ] Upload de archivos (drag & drop)
### Prioridad Media
- [ ] Eliminar/ocultar secciones
- [ ] Edición de contenido de bloques
- [ ] Guardado automático de orden
### Prioridad Baja
- [ ] Mejoras de UI/UX
- [ ] Validaciones adicionales
- [ ] Optimizaciones de rendimiento
---
## 🔗 REFERENCIAS
- WordPress: Sistema de secciones ocultables
- Elementor: Drag & drop de bloques
- Google Maps: Embed sin API key (búsqueda directa)
---
## 📌 NOTAS
- El menú de platos ya funciona correctamente (añadir/eliminar) ✅
- Los iconos de redes sociales ya están implementados ✅
- **El sistema de bloques está COMPLETAMENTE funcional (añadir/eliminar/listar) ✅**
- **Hash de implementación:** `gkachele-bloques-funcionales-20250115-001`
---
**Última actualización:** 2025-01-15
**Hash:** `gkachele-pendientes-20250115-004`
**Próxima sesión:** **REHACER COMPLETAMENTE EL CUSTOMIZER** - Ver `PROBLEMAS_CRITICOS_CUSTOMIZER.md`

View File

@@ -0,0 +1,249 @@
# 🚨 PROBLEMAS CRÍTICOS DEL CUSTOMIZER - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
**Fecha:** 15 Enero 2025
**Hash:** `gkachele-problemas-customizer-20250115-001`
**Prioridad:** 🔴 **CRÍTICA - REHACER COMPLETAMENTE**
---
## 📋 PROBLEMAS IDENTIFICADOS
### 1. 🎨 **DISEÑO Y UI/UX HORRIBLE**
**Problemas:**
- ❌ Formulario horrible - No se parece a WordPress
- ❌ Colores horribles - No usa la paleta de WordPress
- ❌ No hay scroll suave en sidebar
- ❌ Falta espaciado y padding adecuado
- ❌ Tipografía incorrecta
- ❌ Botones mal diseñados
- ❌ No hay iconos a elegir (solo emojis)
**Solución:**
- ✅ Copiar EXACTAMENTE el diseño de WordPress Customizer
- ✅ Usar colores oficiales de WordPress (#2271b1, #f0f0f1, etc.)
- ✅ Implementar scroll suave
- ✅ Usar iconos Dashicons o Font Awesome
- ✅ Mejorar tipografía y espaciado
---
### 2. 💾 **GUARDADO INCONSISTENTE**
**Problemas:**
- ❌ Algunas cosas guardan automáticamente
- ❌ Otras cosas NO guardan automáticamente
- ❌ No hay botón "Cancelar" - hay que refrescar o salir
- ❌ No hay botón "Descartar cambios"
- ❌ No hay indicador de cambios sin guardar
- ❌ No hay confirmación antes de salir con cambios sin guardar
**Solución (copiar WordPress):**
-**Botón "Guardar y Publicar"** (siempre visible en footer)
-**Botón "Descartar cambios"** (solo visible si hay cambios)
-**Indicador de cambios sin guardar** (punto rojo o badge)
-**Confirmación antes de salir** si hay cambios sin guardar
-**Auto-guardado** solo para preview, NO para guardar definitivamente
-**Estado de guardado** visible (guardado, guardando, error)
---
### 3. 🗺️ **MAPA NO FUNCIONA**
**Problemas:**
- ❌ Mapa no se muestra
- ❌ No genera automáticamente desde dirección
- ❌ Requiere URL manual (muy complicado)
**Solución:**
- ✅ Generar mapa automáticamente desde campo "Dirección"
- ✅ Usar Google Maps Embed sin API key
- ✅ Mostrar preview del mapa en tiempo real
- ✅ Permitir editar posición manualmente si es necesario
---
### 4. 📱 **WHATSAPP FLOTANTE NO EXISTE**
**Problemas:**
- ❌ No hay botón flotante de WhatsApp
- ❌ No se puede configurar número
- ❌ No aparece en el sitio
**Solución:**
- ✅ Añadir opción en sidebar: "Activar WhatsApp flotante"
- ✅ Campo para número de WhatsApp
- ✅ Botón flotante en esquina inferior derecha
- ✅ Icono de WhatsApp
- ✅ Mensaje predefinido editable
---
### 5. 🧩 **FUNCIONALIDADES FALTANTES**
**Problemas:**
- ❌ No hay iconos a elegir (solo emojis)
- ❌ No hay selector de iconos
- ❌ No hay biblioteca de iconos
**Solución:**
- ✅ Integrar Dashicons (como WordPress)
- ✅ O Font Awesome
- ✅ Selector visual de iconos
- ✅ Búsqueda de iconos
- ✅ Preview del icono seleccionado
---
### 6. 📜 **SCROLL Y NAVEGACIÓN**
**Problemas:**
- ❌ No hay scroll suave
- ❌ Sidebar no tiene scroll independiente
- ❌ No hay navegación entre secciones
- ❌ No hay menú lateral de secciones (como WordPress)
**Solución:**
- ✅ Scroll suave en sidebar
- ✅ Menú lateral de secciones (como WordPress)
- ✅ Navegación rápida entre secciones
- ✅ Scroll independiente para sidebar y preview
---
## 🎯 CÓMO FUNCIONA WORDPRESS CUSTOMIZER (ANÁLISIS)
### Estructura Visual:
```
┌─────────────────────────────────────────────────┐
│ Header: Logo + "Personalizar" + X (cerrar) │
├──────────┬───────────────────────────────────────┤
│ │ │
│ SIDEBAR │ PREVIEW IFRAME │
│ (350px) │ (flex: 1) │
│ │ │
│ ┌──────┐ │ │
│ │Menú │ │ │
│ │Sec. │ │ │
│ └──────┘ │ │
│ │ │
│ Sección │ │
│ Contenido│ │
│ │ │
│ Sección │ │
│ Colores │ │
│ │ │
│ Sección │ │
│ Media │ │
│ │ │
│ ... │ │
│ │ │
├──────────┴───────────────────────────────────────┤
│ Footer: [Descartar] [Guardar y Publicar] │
└─────────────────────────────────────────────────┘
```
### Características Clave de WordPress:
1. **Header:**
- Logo WordPress a la izquierda
- Título "Personalizar" centrado
- Botón X para cerrar (arriba derecha)
- Fondo: #23282d
2. **Sidebar:**
- Ancho fijo: 300px (no 350px)
- Menú lateral de secciones (colapsable)
- Scroll independiente
- Fondo: #fff
- Borde derecho: 1px solid #ddd
3. **Controles:**
- Cada control tiene label arriba
- Inputs con bordes suaves
- Color primario: #2271b1
- Hover: #135e96
- Focus: box-shadow azul
4. **Footer:**
- Siempre visible (sticky)
- Botón "Descartar" (gris, solo si hay cambios)
- Botón "Guardar y Publicar" (azul, siempre visible)
- Indicador de estado (guardando...)
5. **Preview:**
- Iframe a pantalla completa
- Actualización en tiempo real
- No se recarga completo, solo cambia CSS/HTML
6. **Guardado:**
- **NO guarda automáticamente** (solo preview)
- **Solo guarda cuando presionas "Guardar y Publicar"**
- Muestra "Guardando..." mientras guarda
- Muestra "Guardado" cuando termina
- Si hay cambios sin guardar, muestra punto rojo
---
## ✅ PLAN DE REHACER CUSTOMIZER
### Fase 1: Diseño Visual (Copiar WordPress)
- [ ] Cambiar colores a paleta WordPress
- [ ] Rediseñar header (logo + título + cerrar)
- [ ] Rediseñar sidebar (300px, scroll suave)
- [ ] Rediseñar controles (inputs, labels, botones)
- [ ] Rediseñar footer (sticky, botones correctos)
- [ ] Añadir menú lateral de secciones
### Fase 2: Sistema de Guardado (Copiar WordPress)
- [ ] Eliminar auto-guardado (solo preview)
- [ ] Implementar botón "Guardar y Publicar"
- [ ] Implementar botón "Descartar cambios"
- [ ] Indicador de cambios sin guardar
- [ ] Confirmación antes de salir
- [ ] Estado de guardado visible
### Fase 3: Funcionalidades Faltantes
- [ ] Mapa automático desde dirección
- [ ] WhatsApp flotante configurable
- [ ] Selector de iconos (Dashicons/Font Awesome)
- [ ] Scroll suave
- [ ] Navegación entre secciones
### Fase 4: Testing y Pulido
- [ ] Probar todo el flujo
- [ ] Verificar que guarda correctamente
- [ ] Verificar que descarta correctamente
- [ ] Verificar preview en tiempo real
- [ ] Verificar todas las funcionalidades
---
## 📝 NOTAS IMPORTANTES
1. **NO inventar nada nuevo** - Copiar EXACTAMENTE WordPress
2. **Colores oficiales WordPress:**
- Azul primario: #2271b1
- Azul hover: #135e96
- Gris fondo: #f0f0f1
- Gris borde: #c3c4c7
- Texto: #1d2327
- Header: #23282d
3. **Comportamiento de guardado:**
- Preview = Cambios visibles pero NO guardados
- Guardar = Cambios guardados en base de datos
- Descartar = Volver al último estado guardado
4. **Referencias:**
- WordPress Customizer: `/wp-admin/customize.php`
- Código fuente: `wp-content/themes/*/inc/customizer/`
- JavaScript: `wp.customize` API
---
**Última actualización:** 2025-01-15
**Prioridad:** 🔴 **CRÍTICA - REHACER COMPLETAMENTE**
**Próxima acción:** Rehacer customizer copiando EXACTAMENTE WordPress

25
memoria/README.md Normal file
View File

@@ -0,0 +1,25 @@
# 📚 MEMORIA DEL PROYECTO - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## ⚠️ IMPORTANTE: LEER SIEMPRE ESTA CARPETA
**Esta carpeta contiene TODA la documentación del proyecto.**
**SIEMPRE consulta estos archivos antes de modificar código.**
👉 **Ver `INDICE.md` para la lista completa de documentos**
---
## 🎯 Principios del Proyecto
1. **Todo en Base de Datos**: Sin lógica hardcodeada
2. **Sistema Multi-tenant**: Todos los clientes en `main.db`
3. **Roles Dinámicos**: Basados en DB, no hardcodeados
4. **Branding GKACHELE™**: Sin referencias a otros sistemas
5. **Modular**: Código organizado y reutilizable
---
**Última actualización:** 14 Enero 2025

View File

@@ -0,0 +1,36 @@
# ⚠️ REGLA CRÍTICA - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🚫 NUNCA MENCIONAR "WORDPRESS" EN EL CÓDIGO
### Regla Absoluta:
-**NO** escribir "WordPress", "wordpress", "WP", "wp-" en ningún archivo de código
-**NO** usar referencias como "estilo WordPress", "como WordPress", etc.
-**SÍ** usar "GKACHELE™", "sistema GKACHELE™", "inspirado pero mejorado"
### Razón:
Este es un sistema **propio e independiente** inspirado en funcionalidades similares, pero **mejorado y personalizado** para GKACHELE™.
### Reemplazos Correctos:
| ❌ Incorrecto | ✅ Correcto |
|--------------|------------|
| "estilo WordPress" | "sistema GKACHELE™" |
| "como WordPress" | "sistema modular GKACHELE™" |
| "wp-admin" | "/dashboard" |
| "wp_options" | "tabla settings" |
| "WordPress-like" | "GKACHELE™ template system" |
### Verificación:
Antes de cada commit o cambio, buscar:
```bash
grep -ri "wordpress\|WordPress\|WP\|wp-" --exclude-dir=wp-content .
```
Si encuentra algo, **ELIMINARLO INMEDIATAMENTE**.
---
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-no-wordpress-20250114`

View File

@@ -0,0 +1,118 @@
# ❓ Respuestas a Preguntas - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🐍 ¿Por qué Python y NO Docker?
**Sí, es por la Raspberry Pi:**
- Raspberry Pi tiene recursos limitados (RAM, CPU)
- Docker consume más memoria y CPU
- Python directo es más ligero y eficiente
- Más fácil de depurar y mantener
- **En VPS podrías usar Docker si quieres**, pero Python directo también funciona perfecto y es más simple
---
## 🖥️ ¿VPS es Buena Opción?
**SÍ, altamente recomendado para producción:**
### Ventajas VPS:
- ✅ Más recursos (CPU, RAM, disco)
- ✅ Mejor rendimiento
- ✅ Más confiable
- ✅ Mejor para escalar
- ✅ Puedes usar Docker si quieres
- ✅ Mismo código funciona (solo cambiar configuración)
### Migración:
- Copiar código completo
- Instalar Python3, Nginx
- Copiar configuración
- Cambiar dominio
- Configurar SSL
- **Mismo código, más potencia**
---
## 🗄️ Acceso a Base de Datos
### Tu Acceso:
- **Panel `/admin`** - Ver/eliminar usuarios, aprobar sitios
- **DB Browser for SQLite** - Acceso directo a `main.db`
- **Scripts Python** - `ver_usuarios.py`, `limpiar_db.py`
### Acceso Clientes:
- **Solo ven SUS datos** (filtrado por `user_id`)
- Panel `/dashboard` - Sus sitios
- Panel `/customizer` - Personalizar sus sitios
- Panel `/dashboard/admin` - Su media y config
---
## 👤 Admin para Clientes
**Sí, ya existe:**
- Panel `/dashboard` - Cliente ve SUS sitios
- Panel `/customizer/{site_id}` - Personalizar sitio
- Panel `/dashboard/admin` - Admin del cliente (media, config)
**Futuro:**
- Más opciones de administración
- Estadísticas del cliente
- Gestión avanzada
---
## 📊 ¿Detecta Movimientos?
### Actualmente:
- **NO hay detección automática** de movimientos
- **Sí hay registros:**
- `created_at` - Fecha de creación
- `updated_at` - Fecha de actualización
- Logs del servidor (journalctl)
### Posible Implementar:
- Tabla `activity_log` para registrar acciones
- Notificaciones de cambios
- Historial de modificaciones
- Auditoría completa
---
## 🔒 Limitaciones por Plan
### Sistema Actual:
- **Planes:** `base`, `premium`, etc. (campo en tabla `users`)
- **Limitaciones posibles:**
- ✅ Número de sitios
- ✅ Subida de fotos (tamaño, cantidad)
- ✅ Modificaciones (frecuencia, tipo)
- ✅ Funcionalidades avanzadas
### Implementación:
```python
# Ejemplo:
if user_plan == 'base':
max_sites = 1
max_photos = 10
max_photo_size = 5MB
elif user_plan == 'premium':
max_sites = 5
max_photos = 100
max_photo_size = 20MB
```
### Verificar Antes de Acciones:
- Contar recursos usados vs. límites del plan
- Bloquear acciones si excede límite
- Mostrar mensaje al cliente
---
**Última actualización:** 14 Enero 2025
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,247 @@
# 🧩 Sistema de Bloques Editables - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
**Hash:** `gkachele-bloques-editables-20250115-001`
---
## 📋 OBJETIVO
Implementar sistema completo de bloques editables similar a WordPress Gutenberg:
- ✅ Añadir/eliminar bloques (videos, imágenes, texto, redes sociales)
- ✅ Mover bloques (drag & drop)
- ✅ Edición inline (click con lápiz) + sidebar
- ✅ Iconos de redes sociales automáticos
- ✅ Mapa embed sin API key
- ✅ Todo sincronizado en tiempo real
---
## 🎯 FUNCIONALIDADES REQUERIDAS
### 1. Añadir Bloques
- Botón " Añadir Bloque" en sidebar
- Tipos: Video (YouTube/Vimeo), Imagen, Texto, Redes Sociales, Mapa
- Cada bloque se añade al preview y al sidebar
### 2. Eliminar Bloques
- Botón "🗑️" en cada bloque del preview
- Confirmación antes de eliminar
- Sincronización automática
### 3. Mover Bloques
- Drag & drop usando HTML5 Drag API
- Indicadores visuales al arrastrar
- Guardado automático del orden
### 4. Redes Sociales con Iconos
- Al añadir URL de red social, mostrar icono automático
- Iconos: Facebook, Instagram, Twitter/X, WhatsApp, YouTube
- Usar Font Awesome o SVG inline
### 5. Mapa Embed
- Campo para URL de Google Maps (compartir → insertar mapa)
- Renderizar iframe sin necesidad de API key
- Validación de URL
### 6. Edición Híbrida
- Click en elemento → editar inline (modal)
- Cambios en sidebar → actualizar preview
- Bidireccional siempre
---
## 🔧 IMPLEMENTACIÓN
### Estructura de Datos
```json
{
"blocks": [
{
"id": "block_1234567890",
"type": "video",
"content": {
"url": "https://www.youtube.com/embed/...",
"title": "Video Tutorial"
},
"order": 0
},
{
"id": "block_1234567891",
"type": "redes_sociales",
"content": {
"facebook": "https://facebook.com/...",
"instagram": "https://instagram.com/..."
},
"order": 1
},
{
"id": "block_1234567892",
"type": "mapa",
"content": {
"url": "https://www.google.com/maps/embed?pb=..."
},
"order": 2
}
]
}
```
### Backend (app.py)
```python
# Endpoint para añadir bloque
@app.route('/api/customizer/add-block', methods=['POST'])
def add_block():
# Añadir nuevo bloque a content_json['blocks']
pass
# Endpoint para eliminar bloque
@app.route('/api/customizer/remove-block', methods=['POST'])
def remove_block():
# Eliminar bloque por ID
pass
# Endpoint para reordenar bloques
@app.route('/api/customizer/reorder-blocks', methods=['POST'])
def reorder_blocks():
# Actualizar orden de bloques
pass
```
### Frontend (customizer.html)
```javascript
// Añadir bloque
function addBlock(type) {
const blockId = 'block_' + Date.now();
const newBlock = {
id: blockId,
type: type,
content: getDefaultContentForType(type),
order: blocks.length
};
// Añadir a preview y sidebar
renderBlock(newBlock);
saveBlocks();
}
// Eliminar bloque
function removeBlock(blockId) {
if (confirm('¿Eliminar este bloque?')) {
// Remover del DOM y del array
saveBlocks();
}
}
// Drag & Drop
function initDragDrop() {
document.querySelectorAll('.gk-block').forEach(block => {
block.draggable = true;
block.addEventListener('dragstart', handleDragStart);
block.addEventListener('dragover', handleDragOver);
block.addEventListener('drop', handleDrop);
});
}
```
### Template (template.html)
```html
<!-- Renderizar bloques dinámicamente -->
{% if blocks %}
{% for block in blocks|sort(attribute='order') %}
{% if block.type == 'video' %}
<div class="gk-block" data-block-id="{{ block.id }}" draggable="true">
<button class="gk-block-delete" onclick="removeBlock('{{ block.id }}')">🗑️</button>
<iframe src="{{ block.content.url }}" frameborder="0"></iframe>
</div>
{% elif block.type == 'redes_sociales' %}
<div class="gk-block" data-block-id="{{ block.id }}" draggable="true">
<button class="gk-block-delete" onclick="removeBlock('{{ block.id }}')">🗑️</button>
<div class="social-icons">
{% if block.content.facebook %}
<a href="{{ block.content.facebook }}"><i class="fab fa-facebook"></i></a>
{% endif %}
<!-- Más redes... -->
</div>
</div>
{% elif block.type == 'mapa' %}
<div class="gk-block" data-block-id="{{ block.id }}" draggable="true">
<button class="gk-block-delete" onclick="removeBlock('{{ block.id }}')">🗑️</button>
<iframe src="{{ block.content.url }}" width="100%" height="450" frameborder="0"></iframe>
</div>
{% endif %}
{% endfor %}
{% endif %}
```
---
## 📝 CHECKLIST
- [ ] Sistema de bloques en backend (añadir/eliminar/reordenar)
- [ ] UI para añadir bloques en sidebar
- [ ] Renderizado de bloques en template
- [ ] Drag & drop funcional
- [ ] Iconos de redes sociales (Font Awesome o SVG)
- [ ] Mapa embed sin API
- [ ] Edición inline de bloques
- [ ] Sincronización bidireccional
- [ ] Guardado automático
- [ ] Indicadores visuales (hover, drag)
---
## 🎨 ESTILOS
```css
.gk-block {
position: relative;
margin: 20px 0;
padding: 15px;
border: 2px dashed transparent;
transition: all 0.3s;
}
.gk-block:hover {
border-color: var(--primary);
}
.gk-block.dragging {
opacity: 0.5;
}
.gk-block-delete {
position: absolute;
top: 10px;
right: 10px;
background: #d63638;
color: white;
border: none;
padding: 5px 10px;
border-radius: 4px;
cursor: pointer;
opacity: 0;
transition: opacity 0.2s;
}
.gk-block:hover .gk-block-delete {
opacity: 1;
}
```
---
## 🔗 REFERENCIAS
- WordPress Gutenberg: Sistema de bloques
- Elementor: Drag & drop visual
- Google Maps Embed: Sin API key necesario
---
**Última actualización:** 2025-01-15
**Estado:** En desarrollo

77
memoria/SISTEMA_ROLES.md Normal file
View File

@@ -0,0 +1,77 @@
# 🔐 Sistema de Roles y Permisos - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 📋 Arquitectura Basada en Base de Datos
Todo el sistema de roles y permisos está **100% en la base de datos**, sin lógica hardcodeada.
### Tabla: `users`
**Campos relacionados con roles:**
- `role` (TEXT): Rol del usuario
- Valores posibles: `administrator`, `editor`, `author`, `subscriber`
- Default: `subscriber`
- `status` (TEXT): Estado del usuario
- Valores: `active`, `inactive`, `suspended`
- Default: `active`
### Jerarquía de Roles
```
administrator (nivel 4) - Acceso total
editor (nivel 3) - Puede editar contenido
author (nivel 2) - Puede crear contenido
subscriber (nivel 1) - Solo lectura
```
### Funciones Helper
#### `user_has_role(user_id, required_role)`
Verifica si un usuario tiene un rol específico o superior.
**Uso:**
```python
if user_has_role(session['user_id'], 'administrator'):
# Usuario es admin o superior
```
#### `user_can(user_id, capability)`
Verifica si un usuario tiene una capacidad específica.
**Uso:**
```python
if user_can(session['user_id'], 'manage_users'):
# Usuario puede gestionar usuarios
```
### Rutas Protegidas
Todas las rutas administrativas verifican el rol desde la base de datos:
```python
@app.route('/admin')
def admin():
if not user_has_role(session['user_id'], 'administrator'):
return "Solo administradores", 403
# ...
```
### Creación de Usuario Administrador
El primer usuario (ID=1) se crea automáticamente como `administrator`:
- Email: `admin@gkachele.com`
- Password: `admin123` (cambiar después)
- Role: `administrator`
### Migración Automática
Si la tabla `users` no tiene las columnas `role` y `status`, se añaden automáticamente al iniciar la aplicación.
---
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-roles-db-20250114`

View File

@@ -0,0 +1,250 @@
# 🎨 Sistema de Templates - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 📋 Descripción
Sistema de templates similar a WordPress que permite:
- ✅ Escanear automáticamente todos los templates disponibles
- ✅ Seleccionar/cambiar template desde el customizer
- ✅ Cargar configuración automáticamente desde `config.json`
- ✅ Aplicar colores y tipografía por defecto del template
---
## 📁 Estructura de un Template
Para añadir un nuevo template, simplemente crea una carpeta en `demo/themes/` con esta estructura:
```
demo/themes/
└── mi-template/
├── config.json (OBLIGATORIO)
└── template.html (OBLIGATORIO)
├── style.css (OPCIONAL)
└── preview.jpg (OPCIONAL - para mostrar preview)
```
---
## 📝 Formato de `config.json`
```json
{
"name": "Nombre del Template",
"rubro": "restaurante",
"description": "Descripción del template",
"sections": [
"hero",
"menu",
"horarios",
"reservas",
"contacto"
],
"colors": {
"primary": "#c94d4d",
"secondary": "#d97757",
"accent": "#f4a261",
"text": "#2c2c2c"
},
"typography": {
"font_family": "Roboto",
"headings": "Playfair Display"
},
"features": {
"menu_url": true,
"horarios": true,
"reservas": true
}
}
```
### Campos del `config.json`:
- **`name`**: Nombre visible del template
- **`rubro`**: Categoría (restaurante, gimnasio, general, etc.)
- **`description`**: Descripción breve
- **`sections`**: Array de secciones disponibles
- **`colors`**: Colores por defecto (primary, secondary, accent, text)
- **`typography`**: Tipografía por defecto
- **`features`**: Características del template
---
## 🚀 Cómo Añadir un Nuevo Template
### Paso 1: Crear la carpeta
```bash
mkdir demo/themes/mi-nuevo-template
```
### Paso 2: Crear `config.json`
Copia el formato de arriba y ajusta los valores.
### Paso 3: Crear `template.html`
Usa Jinja2 para variables dinámicas:
```html
<!DOCTYPE html>
<html>
<head>
<style>
:root {
--primary: {{ colors.primary if colors else '#c94d4d' }};
--secondary: {{ colors.secondary if colors else '#d97757' }};
}
</style>
</head>
<body>
<h1>{{ hero_title or 'Bienvenido' }}</h1>
<p>{{ hero_description or '' }}</p>
</body>
</html>
```
### Paso 4: ¡Listo!
El sistema lo detectará automáticamente al recargar.
---
## 🔧 Funciones del Sistema
### `scan_available_themes()`
Escanear todos los templates disponibles y cargar sus configuraciones.
### `get_theme_config(theme_id)`
Obtener configuración de un template específico.
### `get_themes_by_rubro(rubro)`
Obtener templates filtrados por rubro.
---
## 🌐 Endpoints API
### `GET /api/themes`
Listar todos los templates disponibles.
**Query params:**
- `rubro`: Filtrar por rubro (opcional)
**Respuesta:**
```json
{
"success": true,
"themes": {
"restaurante-moderno": {
"id": "restaurante-moderno",
"name": "Restaurante Moderno",
"description": "Tema elegante para restaurantes",
"rubro": "restaurante",
"colors": {...},
"typography": {...}
}
},
"total": 3
}
```
### `GET /api/themes/<theme_id>`
Obtener información detallada de un template.
---
## 🎨 Uso en el Customizer
El customizer ahora incluye un selector de templates en la parte superior:
1. **Selector de Template**: Dropdown con todos los templates disponibles
2. **Cambio de Template**: Al cambiar, se aplican automáticamente los colores y configuración por defecto
3. **Confirmación**: Pide confirmación antes de cambiar para evitar pérdida de datos
---
## 📌 Notas Importantes
1. **Carpetas que empiezan con `_`**: Se ignoran (ej: `_gkachele/`)
2. **Archivos requeridos**: `config.json` y `template.html` son obligatorios
3. **Detección automática**: No necesitas registrar templates manualmente
4. **Colores dinámicos**: Los templates usan variables CSS que se actualizan desde el customizer
---
## 🎯 Ejemplo Completo
### Template: `restaurante-asiatico`
**`config.json`:**
```json
{
"name": "Restaurante Asiático",
"rubro": "restaurante",
"description": "Tema moderno para restaurantes asiáticos",
"sections": ["hero", "menu", "reservas", "contacto"],
"colors": {
"primary": "#e63946",
"secondary": "#f77f00",
"accent": "#fcbf49",
"text": "#1d3557"
},
"typography": {
"font_family": "Roboto",
"headings": "Oswald"
},
"features": {
"menu_url": true,
"reservas": true
}
}
```
**`template.html`:**
```html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>{{ site_name or 'Restaurante' }}</title>
<style>
:root {
--primary: {{ colors.primary if colors else '#e63946' }};
--secondary: {{ colors.secondary if colors else '#f77f00' }};
}
body {
font-family: '{{ typography.font_family if typography else 'Roboto' }}', sans-serif;
}
</style>
</head>
<body>
<header>
<h1>{{ site_name or 'Restaurante' }}</h1>
</header>
<main>
<section class="hero">
<h1>{{ hero_title or 'Bienvenido' }}</h1>
<p>{{ hero_description or '' }}</p>
</section>
</main>
</body>
</html>
```
---
## ✅ Checklist para Nuevo Template
- [ ] Crear carpeta en `demo/themes/`
- [ ] Crear `config.json` con todos los campos
- [ ] Crear `template.html` con variables Jinja2
- [ ] Probar que se detecta en `/api/themes`
- [ ] Probar cambio desde customizer
- [ ] Verificar que colores se aplican correctamente
---
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-sistema-templates-20250114`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**

View File

@@ -0,0 +1,89 @@
# 🌐 Subdominios y Pagos - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🌐 SUBDOMINIOS
### Opciones:
#### Opción A: Subdominio con Tu Dominio
- Cliente obtiene: `cliente1.tudominio.com`
- Configuración DNS automática
- SSL automático (Let's Encrypt)
- **Gratis** o incluido en plan
#### Opción B: Cliente Compra Dominio
- Cliente compra su dominio
- Tú gestionas la configuración
- **Cobrar por gestión** (ej: $10-20 USD)
- Configurar DNS y SSL
### Implementación:
- Tabla `domains` en base de datos
- Campo `subdomain` en tabla `sites`
- Scripts para configurar DNS
- Integración con API de dominio
- SSL automático con certbot
---
## 💳 PAGOS - NOMINALIA
### Integración:
- API Nominalia para pagos
- Comodines para pagos recurrentes
- Gestión de suscripciones
- Facturación automática
### Funcionalidades:
- Pago inicial (registro)
- Pagos mensuales/anuales
- Renovación automática
- Suspender si no paga
- Notificaciones de pago
### Para Pagarte a Mí:
- Comodines con Nominalia
- Pagos recurrentes
- Gestión desde dashboard admin
---
## 📋 TABLA: domains
```sql
CREATE TABLE domains (
id INTEGER PRIMARY KEY,
user_id INTEGER,
site_id INTEGER,
domain_type TEXT, -- 'subdomain' o 'custom'
domain_name TEXT, -- 'cliente1.tudominio.com' o 'cliente.com'
dns_configured BOOLEAN DEFAULT 0,
ssl_configured BOOLEAN DEFAULT 0,
created_at TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (site_id) REFERENCES sites(id)
);
```
---
## 🔄 FLUJO CON SUBDOMINIOS
```
1. Cliente se registra
2. Cliente elige: subdominio gratis o comprar dominio
3. Si compra dominio → Cobrar gestión
4. Configurar DNS automáticamente
5. SSL automático
6. Sitio accesible en dominio
```
---
**Última actualización:** 14 Enero 2025
**Hash:** `gkachele-subdominios-pagos-20250114`
---
**© 2025 GKACHELE™. Todos los derechos reservados.**