Agregado
- Tracking de efectividad de formularios: Métricas automáticas de rendimiento para cada formulario
- Sistema de suscripciones refactorizado: Arquitectura simplificada con un solo plan activo por cuenta
- Pricing diferenciado para planes manuales: Recargo configurable para cuentas con gestión manual
- Plan Trial Gratuito: 50 contactos, 200 envíos/mes, 7 días de duración
- Arquitectura de payment gateways: Sistema flexible para múltiples pasarelas de pago
- Sistema de transferencias bancarias: Workflow completo con verificación por admin
- Cache de límites en account: Campos `max_contacts_cached`, `max_sends_cached`, `max_forms_cached`
- Contadores de uso: `contacts_used`, `forms_used` para optimizar queries
- Bajas programadas de cuentas: Los superadmins pueden programar la fecha de baja de una cuenta
Mejorado
- Página de Listas modernizada: Nuevo diseño coherente con sistema de componentes modernos
- Optimización de dashboards: Reducción drástica de queries y mejora de tiempos de carga
Cambiado
- Estandarización de timestamps: Convención `_on` para eventos pasados aplicada a tabla `account`
Eliminado
- Código legacy de FormData: Modelo, controlador y vistas eliminados (tabla `form_data` no existe desde hace tiempo)
- Migración de datos: 22 cuentas migradas exitosamente de `account_plan` a `account_subscription`
- Tabla account_plan renombrada: `account_plan` → `account_plan_legacy` (respaldada)
- Actualización de queries y relaciones: Todas las referencias a `account_plan` actualizadas para usar `account_subscription`
Removido
- Columnas obsoletas de `account`: `trial_started_at`, `trial_expires_at`, `status`, `external_id`, `auto` (movidos a subscription)
- Columna `max_users_crm` de `plan` (módulo CRM eliminado previamente)
- Referencias a tickets/CRM en código activo: Limpieza completa de código residual del módulo CRM/Tickets eliminado
- Módulo OneDrive/SkyDrive completo: Sistema de almacenamiento en OneDrive eliminado por no usarse
- Componentes y modelos CRM adicionales: Funcionalidades implementadas exclusivamente para CRM/Tickets eliminadas
Corregido
- Undefined array key 'callback' en API de formularios con código vacío
- Generación de short_name para campos de formulario (solo nuevos registros)
- Nombres de columnas en ejemplos de API
- Uso de `created_at` → `created_on` en comando MigratePlans
- Path incorrecto en `Account::createDatabase()` impedía ejecutar migraciones al crear cuentas desde admin
- Pérdida de selección de plan en formulario de cuenta al haber errores de validación
Agregado
- Sistema de galería de templates: Templates profesionales pre-diseñados disponibles al crear campañas
- API pública de formularios con encriptación Fernet para integraciones externas
- Gestión completa de API keys desde panel de administración
- Generación automática de ejemplos de API con campos dinámicos
- Botón de "Integración API" en vista de formularios
Cambiado
- Migración completa del sistema de campos de contacto a JSON
- Optimización de validación DNS (solo en registros nuevos o con email modificado)
Corregido
- Propagación de datos de Blacklist a Contact en webhooks
- Validación de formularios con short_name vacíos o 'other'
Agregado
- Editor Templatical (v0.8.1): Editor visual moderno basado en MJML con compilación en frontend
- Custom blocks avanzados: Botón personalizable y Redes Sociales (16 plataformas, 3 estilos)
- Sistema de concurrencia para edición de templates (evita conflictos entre usuarios)
- Upload de imágenes con optimización automática en Templatical
- Wake-up detection para renovar locks después de suspensión del PC
- Conversión automática de merge tags `{{}}` ↔ `[]` para compatibilidad
Cambiado
- Fuentes email-safe completas (10 fuentes con fallbacks optimizados)
- Ocultar branding "Powered by Templatical"
Corregido
- Fondo negro en canvas del editor Templatical
- Referencias circulares y HTML mal formado en compilación MJML
- Múltiples problemas de estilo en preview del editor
- Bloqueo de sesión cuando otro usuario toma control
- Eliminación accidental del footer de desuscripción
Seguridad
- Autenticación obligatoria con hash encriptado para acceder al editor Templatical
Agregado
- Detección de bots en aperturas y clicks: Diferencia entre aperturas reales y automáticas (Apple Mail Privacy, Gmail)
- Métricas separadas de actividad bot vs humana en reportes de campañas
- Columna `is_bot` en campaign_subscriber con contadores `bot_opens` y `bot_clicks`
- Diseño avanzado de formularios: Fuentes Google Fonts, colores personalizados, estilos de botón
- Vista previa dual de formularios (embed iframe + página completa)
- Mensaje personalizable para validación de campo único
- Emoji picker en editor Mosaico con soporte mejorado para Gmail
- Logging de warnings de compatibilidad de templates Mosaico
- Nueva página de gestión de listas con layout de 2 columnas
- Botones de compartir link y envío de prueba en vista previa (step 4)
Cambiado
- Estandarización de timestamps: `created_on`, `updated_on` (pasados), `scheduled_at` (futuros)
- Aplicación de `color_bg` solo al header en formularios tipo view
- Forzar HTTPS en links de emails y tracking de Mailgun
- Traducción de headers de exportación a español
Corregido
- Detección incorrecta de bots en webhooks de Mailgun (campo `client-info.bot`)
- Fix de emojis en Gmail (charset y encoding)
- Corrección de path de caché en replaceSrc de imágenes
- Filtrado de campañas en FixMosaicoImagesCommand (solo no enviadas)
- Ampliación de `listing_names` de VARCHAR(1024) a TEXT
Agregado
- Gestión centralizada de dominios de envío: UI de administración para dominios Mailgun
- Módulo `/admin/` completo con acceso restringido a superadmins
- Comando `domainsync` para sincronización automática con Mailgun API
- MailgunDomainService con reintentos automáticos para errores 5xx
- Validación de dominios asignados por cuenta
- Soporte para dominios públicos compartidos
- Verificación de webhooks configurados en Mailgun
Removido
- Módulo CRM/Tickets completo (no se usaba, bloqueaba migración PHP 8)
- EExcelView/PHPExcel (190 archivos)
- Comando SendCommand (envío masivo ahora en Python)
- Endpoint `/campaign/configuration` obsoleto
- ~570 líneas de código muerto en Campaign.php
Cambiado
- Migración de exports de campañas a XLSXWriter
- Navbar de administración con links horizontales
Agregado
- Soporte completo para PHP 8.1
- Campos de sistema en ContactField (`is_system`, `column_name`)
- Campos con selección múltiple (`multiple=1`)
- Opción "Permitir otros valores" en campos de selección (`allow_other=1`)
- Relación `contact_field_id` en FormField (reemplaza `short_name`)
- Métodos mágicos en Contact para acceso unificado a campos
Cambiado
- Actualización de dependencias para PHP 8:
- Formato de `fields` en Contact ahora usa placeholders en vez de IDs
Removido
- dotzero/yii-sentry (incompatible con PHP 8)
- tebazil/db-seeder (dependía de faker abandonado)
Removido
- Columna redundante `account_id` de todas las tablas tenant
- 14 modelos actualizados (Contact, Campaign, Listing, Template, etc.)
- 10 controladores actualizados
- Código comentado y vistas `_view.php` no utilizadas
Cambiado
- Uso de `Yii::app()->utility->accountId` en lugar de `$model->account_id`
- Actualización de URLs públicas para mantener parámetro `?a=` (routing)
Corregido
- Flujo de formularios embebidos con `setAccountId()` correcto
- Envío de emails de notificación con validación de cuenta
Agregado
- Sanitización automática de `unsubscribed_on` con valores '0000-00-00 00:00:00'
- Scope `active()` para contactos activos (`is_blacklisted=0`)
- Propagación de datos en webhooks sin saves redundantes
- Transacciones en `Blacklist::afterSave()`
Corregido
- Errores MySQL con modo `NO_ZERO_DATE` activo
- Optimización de consultas a Blacklist (solo cuando email cambia)
Agregado
- Editor HTML externo (tipo 4) para templates de Stripo
- Preservación completa de `<head>`, `<style>` y `@media queries`
- Validación obligatoria de link de desuscripción
- Editor Mosaico con templates base en archivos (standard.html, wide.html)
Cambiado
- Columna `base_template` reemplaza `is_base` en Template
- Método `getBaseTemplateHtml()` para acceso unificado
Seguridad
- Headers de seguridad HTTP completos en .htaccess
- X-Frame-Options con excepción para formularios embebidos
- Fail2ban configurado con 5 jails activos
- Filtro apache-wp-scan para detectar scanners
- `Agregado` - Nuevas funcionalidades
- `Cambiado` - Cambios en funcionalidades existentes
- `Deprecado` - Funcionalidades que serán removidas próximamente
- `Removido` - Funcionalidades eliminadas
- `Corregido` - Correcciones de bugs
- `Seguridad` - Mejoras de seguridad