CHANGELOG
v2.3.1 — 2026-05-23
Añadido
- API logs de WordPress: Nuevo endpoint
GET /api/v1/chart/logs que devuelve los últimos N usuarios del plugin carta-natal-maia.
- Plugin WP — Últimos usuarios: Sección en configuración del plugin con tabla de los 10 últimos usuarios.
Corregido
- Versiones de plugins WP: Corregidos los headers de
carta-natal-maia.php (v1.4.0) y maia-connector.php (v1.0.1) para reflejar sus versiones reales, no la de la app.
- Changelog en updates:
check.php ahora lee la versión y changelog del componente correcto (app, carta-natal-maia o maia-connector) usando componentVersion(). Añadida a Functions.php.
- Updater WP:
download_url() reemplazado por wp_remote_get() + file_put_contents() en ambos plugins.
- download.php: Soporta
maia-connector como alias del directorio maia.
v2.3.0 — 2026-05-23
Añadido
- Sidebar lateral colapsable en vista de carta: Las pestañas horizontales de
charts/view.php se reemplazan por un panel lateral izquierdo con toggle ☰. Colapsado: solo iconos (52px). Expandido: icono + texto (220px). Estado persistente en localStorage. En móvil (<768px) vuelve a tabs horizontales.
- Motor de Cálculo de Tránsitos Adaptativo: Nuevo script
scripts/calculadora_transitos.py (~350 líneas) que sustituye las consultas SQL a ephemerides_planetas (~630M filas, ~8 GB) por cálculo dinámico con Swiss Ephemeris + interpolación cúbica (scipy.CubicSpline).
- Grupo rápido (Sol, Luna, Mercurio, Venus, Marte):
swe.calc_ut() diario (0.5d para Luna).
- Grupo lento (Júpiter, Saturno, Urano, Neptuno, Plutón, Quirón, Nodos): muestreo cada 15d +
CubicSpline con
numpy.unwrap para cruce del punto Aries.
- Detección con orbes reales desde
ANGULOS_Y_ORBES_ASPECTOS (antes ignorados, solo matching exacto).
- Partil (hora exacta): extrapolación lineal zero-cost desde la derivada del spline.
- Deduplicación: solo el punto de máximo acercamiento por paso consecutivo.
- Rendimiento: 12 meses = 0.037s / 130 llamadas SWE; 3 años = 0.1s / 370 llamadas SWE.
- Migración
017_drop_ephemerides_planetas.sql: Elimina v_ephemerides_legible y ephemerides_planetas.
- Soporte
True_South_Node: Derivado automáticamente del Nodo Norte (+180°).
Cambiado
TransitosCalculator.php: Refactorizado calcularTransitosCompletos() para usar el motor Python vía proc_open() con JSON stdin/stdout. Añadidos ejecutarCalculoTransitos(), adaptarResultadoPython(), lonToRaw() y formatearGradosMinutos(). obtenerRangosTransitos() ahora lee del resultado Python en memoria.
ajax/transitos.php: get_date_limits() usa rangos configurables vía .env (TRANSITOS_ANIO_MIN/MAX) en vez de SQL.
routes.php: Limpieza de ruta innecesaria.
- Dependencia Python: Añadido
scipy>=1.17 al Python del sistema ServBay 3.11.
Corregido
- Rangos de tránsitos: Los min/max de cada planeta ahora se calculan desde las posiciones reales de inicio/fin del período, no desde los puntos de aspecto detectados. Corrige falsos rangos de vuelta completa en Saturno y disparidad entre Nodo Norte/Sur.
- Arcos de tránsito en la rueda (WheelRenderer): El sweep ahora se fuerza a ≤180° (arco corto) con
sweepFlipped para invertir el sweep-flag SVG cuando corresponde. Corrige arcos de ~320° (89% del zodíaco) en planetas retrógrados y la posición del label (tSN, tNN).
- Sidebar lateral:
switchTab() renombrado a switchChartTab() para evitar colisión con la función global de script.js que se carga después vía footer.php.
Obsoleto
calcularPuntosDeAspectos() y procesarTransitos(): Marcados como @deprecated. Se eliminarán en v2.4.0.
v2.2.5 — 2026-05-22
Corregido
- Actualización de Plugins WP: Refactorizado
run_update() en ambos plugins. Ahora descarga el zip por separado con SSL relajado y download_url(), usa Automatic_Upgrader_Skin + archivo local en vez de WP_Ajax_Upgrader_Skin + URL remota, fuerza FS_METHOD=direct, verifica tanto $result como $skin->result, y comprueba el retorno de activate_plugin(). Esto resuelve el falso "actualizado correctamente" cuando el upgrader fallaba silenciosamente.
v2.2.4 — 2026-05-22
Mejorado
- Rueda a Pantalla Completa (Desktop): La rueda SVG de la carta natal en el plugin WP ahora ocupa la altura máxima disponible de la ventana en pantallas ≥1024px, permitiendo verla completa sin scroll vertical.
v2.2.3 — 2026-05-22
Corregido
- Transient Stale en Updater WP: Los plugins
carta-natal-maia y maia ahora invalidan el transient de actualización si la versión cacheada ya no es superior a la versión local. Esto evitaba que apareciese una falsa notificación de "actualización disponible" cuando servidor y plugin tenían la misma versión.
v2.2.2 — 2026-05-22
Corregido
- Fiabilidad de Actualización: Añadida limpieza de caché de plugins de WordPress tras la actualización para asegurar la detección inmediata de la nueva versión.
- Interfaz de Ajustes: Corregido error de diseño (layout) en WordPress que causaba desplazamientos visuales en el panel.
- Descarga Pública: Corregido error "Invalid component" en el enlace de descarga de la pantalla de login.
v2.2.1 — 2026-05-22
Añadido
- Branding Universal: Enlace a la web personal del autor en todos los pies de página (App y Plugins).
- Acceso Público a Versión: La página de registro de cambios ahora es accesible sin necesidad de autenticación.
- Promoción de Plugins: Nueva caja de descarga y contacto en la pantalla de login para usuarios de WordPress.
v2.2.0 — 2026-05-22
Añadido
- Sistema de Logs para Integraciones:
- Nueva tabla
wordpress_chart_logs para registrar cada cálculo realizado desde WordPress.
- Registro de datos: Nombre, fecha/hora de nacimiento, lugar, IP, Sistema Operativo y Navegador.
-
Seguimiento de Características: El log ahora registra qué secciones se activaron (Planetas, Aspectos, Balance, Luna, Quirón).
- Nueva vista de "Logs" en el panel de administración de integraciones para visualizar estadísticas detalladas.
- Mejoras en el Plugin WP v2.2.0:
- Actualizada la lógica de envío para incluir las preferencias de visualización en el log del servidor.
- Corregidos errores de permisos en el proceso de auto-actualización.
v2.1.2 — 2026-05-21
Mejorado
- Sincronización de Versiones: Actualización global de versiones en todos los componentes del sistema (App y Plugins) para asegurar la coherencia del ecosistema Maia.
v2.1.1 — 2026-05-21
Añadido
- URL de Copyright Premium: Opción para definir una URL personalizada en el copyright de las integraciones premium. Soporte para ocultar el enlace si se deja vacío.
v2.1.0 — 2026-05-21
Añadido
- Sistema de Licencias Premium:
- Nuevo endpoint
api/v1/license/validate para verificar validez de API Key y estado Premium.
- Columna
is_premium en tabla
wordpress_sites (Migración
014_add_is_premium_to_wp_sites.sql).
- Capacidad de personalización (White-label) para sitios Premium: Título y Copyright personalizados.
- Plugin WP Carta Natal Maia v1.3.0:
-
Validación de Licencia: Comprobación forzada en ajustes y automática cada 24 horas en el sitio.
-
Personalización Premium: Campos para Título y Copyright personalizados en el panel de administración.
-
Atributos de Shortcode: Parámetros
custom_title y
custom_copyright soportados (solo para sitios Premium).
-
Fase Lunar y Quirón: Nuevas tarjetas informativas con diseño detallado replicando el informe de Maia.
-
Configuración Dinámica: Opciones para activar/desactivar secciones (Planetas, Aspectos, Balance, Luna, Quirón) desde ajustes o vía shortcode.
-
Versión 1.3.0: Actualización de versión en cabeceras y encolado de scripts/estilos.
Mejorado
- Motor de Tránsitos (Propuesta Técnica): Diseño de nueva arquitectura para cálculo dinámico "on-the-fly" usando Swiss Ephemeris (Root-Finding) eliminando la dependencia de base de datos precalculada.
- Robustez de Fase Lunar: Corregidos "gaps" matemáticos en el cálculo de fases de la luna en
InfoAstrologica.php.
- Seguridad en Frontend: Comprobaciones de existencia de nodos DOM en el plugin de WordPress para evitar errores con cachés de servidor.
v1.1.6 — 2026-05-12
Corregido
- CSRF en
admin/users.php: los 5 formularios (change_group, block, unblock, delete, impersonate) no incluían el campo csrf_token desde que se añadió la validación CSRF en v1.0.5. El intento de impersonar, bloquear, desbloquear, eliminar o cambiar grupo devolvía «Token de seguridad inválido». Añadido <input type="hidden" name="csrf_token"> a todos.
- Migración 013: columnas
default_group_id y force_group_sync faltantes en wordpress_sites. El INSERT de WordPressSiteRepository::create() fallaba con SQLSTATE[42S22]: Column not found: 1054 Unknown column 'default_group_id' al crear integraciones WordPress en producción.
v1.1.5 — 2026-05-12
Mejorado
- Plugin WP Carta Natal Maia v1.1.1:
-
Fuente Nunito: reemplaza la pila de fuentes del sistema por Nunito (Google Fonts, pesos 400/500/600/700) cargada vía
@import en el CSS.
-
Tamaño mínimo 16px: todo el texto del plugin tiene mínimo 16px. Labels pequeñas (footer, orbes, retro) a 14px.
-
Tamaños proporcionales: headings escalados (brand 26px, títulos 24px, secciones 18px).
-
Símbolos astrológicos a 30px:
.astronomicon,
.planeta-header,
.simbolo-aspecto,
.cnm-summary-glyph,
.cnm-pt-symbol escalados al mínimo de 30px establecido por convención.
-
Responsive: tamaños del breakpoint 480px actualizados proporcionalmente (inputs/botones/tabs a 16px, step-title a 22px).
v1.1.4 — 2026-05-12
Añadido
- Generador de imagen PNG (
ChartImageRenderer): nueva clase GD+TTF que dibuja la carta natal completa como imagen PNG (1200×1200). Incluye rueda con signos, casas, planetas con grados/signo/minutos, líneas de aspecto con símbolos, cabecera con datos personales y tabla de posiciones planetarias. Usa fuente Astronomicon (TTF) directamente — no depende de renderizado SVG del servidor.
- API v1
chart_image field: POST /api/v1/chart/calculate ahora devuelve data.chart_image con la imagen PNG en formato data URI base64 (además del SVG y HTML de aspectos).
- Recálculo automático de cartas antiguas: si
charts/view.php detecta datos incompletos (planets o casas vacíos), fuerza recálculo vía calcularCartaNatal() y persiste los datos en BD con el nuevo método CartaNatalRepository::guardarDatosCalculados().
- Método
guardarDatosCalculados(int $cartaId, array $datos) en CartaNatalRepository: actualiza solo la columna datos_calculados de una carta existente.
Corregido
- API v1
renderAspectosList() no mostraba aspectos: la función usaba claves en español con acentos ('conjunción', 'oposición'…) pero AspectosCalculator devuelve las claves en inglés de ANGULOS_Y_ORBES_ASPECTOS ('conjunction', 'opposition'…). Ahora renderAspectosList() recibe directamente el resultado de AspectosCalculator::getAspectosUnicos() y mapea correctamente las claves.
- Plugin WP v1.1.0: IDs HTML duplicados (
#cnm-wheel-container, #cnm-aspects-container) por tabulación sobrante en shortcode.php. Eliminados los divs cnm-tab-* no utilizados. Estructura HTML corregida. Layout de resultados reorganizado: imagen PNG principal + sección de aspectos.
Modificado
api/v1/chart/calculate.php: usa AspectosCalculator para generar el listado de aspectos y el contador de stats; genera imagen PNG vía ChartImageRenderer.
integrations/wp-plugins/carta-natal-maia/: JS usa data.chart_image (PNG) como vista principal. CSS con clase .cnm-chart-png responsive.
charts/view.php: detección de datos incompletos + recálculo + guardado en BD.
v1.1.3 — 2026-05-11
Mejorado
- Plugin WP Carta Natal Maia v1.0.6:
-
Sin filtros ni interactividad: el SVG de la rueda se renderiza sin controles, zoom, ni fullscreen.
-
Listado de aspectos en HTML: sustituye el SVG grid por un listado agrupado por tipo de aspecto con nombres de planetas en texto (no requiere fuente Astronomicon).
-
Estilos robustos: prefijo
#carta-natal-maia-app en todos los selectores +
!important en botones para vencer temas WP.
- REST API v1:
POST /api/v1/chart/calculate ahora acepta API keys de ambos tipos (maia y carta-natal-maia).
- Router: soporte para preflight CORS (
OPTIONS) automático en cualquier ruta registrada.
v1.1.2 — 2026-05-11
Añadido
- GeoNames local — búsqueda de lugares de nacimiento desde base de datos propia, sin depender de la API externa:
- Migración
008_create_geonames_places.sql: tabla
geonames_places con FULLTEXT en
name + asciiname + alternatenames.
- Script
scripts/import_geonames.php: importa
allCountries.txt (solo clase P, ciudades/pueblos) en lotes de 1000. Uso:
php scripts/import_geonames.php --file=/ruta/allCountries.txt.
- Directorio
data/geonames/ para colocar el archivo
allCountries.txt.
- Endpoint
GET /api/v1/geo/search ahora consulta la BD local (con fallback a API GeoNames si la tabla no existe).
- Migración
009_geonames_indexes.sql: índices B-tree en
name,
asciiname y
population para acelerar búsquedas LIKE + ORDER BY.
Mejorado
- Output buffering global:
ob_start() en index.php para que los endpoints API puedan emitir headers CORS limpios sin interferencia del debug output de init.php.
- Robustez API geo/search: doble fallback (
file_get_contents → curl) para llamadas a GeoNames como último recurso.
- Respuesta geo/search unificada: ahora devuelve campos compatibles con formato Nominatim (
display_name, lon, address.city/state/country) y formato GeoNames (name, lng, countryCode).
- Búsqueda en formulario de creación Maia:
js/script.js usa /api/v1/geo/search (BD local) en vez de Nominatim. Búsqueda automática al escribir 3+ caracteres (con 400ms debounce). Enter para búsqueda manual de 1-2 caracteres.
- Nombres de región legibles: migración
010_create_admin1_codes.sql + script import_admin1.php traducen códigos FIPS/ISO a nombres (ej: "56" → "Catalonia"). geo/search hace LEFT JOIN automático.
- Plugin WP Carta Natal Maia v1.0.4: búsqueda automática a 3+ caracteres (antes 2+).
v1.1.1 — 2026-05-11
Mejorado
- Plugin WP Carta Natal Maia v1.0.2:
- Menú propio «MaiaCN» en sidebar de WordPress (icono ⭐, posición 30), en lugar de bajo Ajustes.
- Cabecera «Carta Natal by Maia» sobre el formulario.
- Footer «© 2026 Maia by David Herrero» con enlace a la URL de Maia configurada (abre en nueva ventana).
-
Formulario unificado: todos los campos visibles a la vez (nombre, fecha, hora, lugar) con labels. El botón de calcular se habilita automáticamente al rellenar nombre, fecha y seleccionar ciudad.
- Estilos CSS para cabecera y footer.
Corregido
- Panel integraciones: fallback
?? 'maia' para plugin_type en sitios existentes sin la migración aplicada.
v1.1.0 — 2026-05-11
Añadido
- Plugin WordPress «Carta Natal Maia» (
/integrations/wp-plugins/carta-natal-maia/):
- Shortcode
[carta_natal_maia] que muestra un formulario paso a paso (nombre → fecha → hora → lugar) y calcula la carta natal de forma anónima.
- Configuración desde Ajustes → Carta Natal Maia (URL de Maia + API Key).
- Búsqueda de ciudad vía GeoNames con autocompletado.
- Resultados: SVG de la rueda zodiacal + SVG de la tabla de aspectos, con tabs para alternar.
- Plug & play: solo requiere API Key generada desde el panel de integraciones de Maia.
- REST API v1 (
POST /api/v1/chart/calculate):
- Autenticación vía header
X-API-Key (clave secreta del sitio).
- Rate limiting: 60 peticiones/minuto por API key.
- Validación de fechas (1800–2400) y coordenadas.
- Sin guardar en BD: cálculo puramente anónimo.
- Devuelve JSON con SVG de la rueda zodiacal + SVG de la tabla de aspectos.
- Contador de cartas calculadas por sitio (
chart_count en
wordpress_sites).
- Panel de integraciones mejorado (
admin/integrations.php):
- Selector de tipo de plugin al crear sitio: «Maia (acceso total · SSO)» o «Carta Natal Maia (solo cálculo anónimo)».
- Badges visuales en listado para distinguir tipo de integración.
- Contador de cartas calculadas visible para sitios de tipo «Carta Natal Maia».
- Validación CSRF en todos los formularios (crear, editar, toggle, eliminar).
- Migración
007_add_plugin_type.sql: columna plugin_type y chart_count en tabla wordpress_sites.
- WordPressSiteRepository: nuevos métodos
validateApiKey(), incrementChartCount(), getByType().
Cambiado
- Renombrado:
/integrations/wordpress/ → /integrations/wp-plugins/maia/.
v1.0.5 — 2026-05-11
Seguridad — corregido
- IDOR en AJAX:
obtenerPorId() ahora requiere userId en transitos, direcciones, lunaciones y progressions. Las cartas ajenas ya no son accesibles mediante enumeración de IDs.
- CSRF en POST: añadida validación de token CSRF en
/charts/save, /charts/delete, /admin/users. Formularios de creación/edición incluyen campo oculto csrf_token. El JS de eliminación envía el token desde el <meta>.
.env inaccesible vía web: añadido <FilesMatch "\.env$"> Require all denied </FilesMatch> en .htaccess.
- Logs protegidos en Apache 2.4+:
logs/.htaccess actualizado a sintaxis Require all denied (la sintaxis Apache 2.2 anterior era ignorada en servidores modernos).
- Tokens de recuperación hasheados:
reset_token ahora se almacena como hash('sha256', $token) en BD, no en texto plano. findByResetToken() compara hashes.
- Token sin exponer en retorno:
requestPasswordReset() ya no incluye el token en el array de retorno.
- Sin paths ni trazas en errores AJAX:
DebugManager::returnAjaxError() ya no incluye file, line ni trace en respuestas JSON (solo success + error).
- API con autenticación:
/api/ ahora requiere partes/RequireLogin.php.
- XSS almacenado mitigado: los campos
nombre, lugar, relacion, notas de carta se escapan con htmlspecialchars() antes de codificarse a JSON para showCartaInfo() en el dashboard.
- Fuga de emails en compartir:
obtenerUsuariosCompartidos() y obtenerUsuariosDisponibles() ya no devuelven email. share-manager.js actualizado para no mostrar emails.
- TOCTOU en cuota de cartas:
verificarLimiteCartas() usa SELECT ... FOR UPDATE para evitar race condition en creación concurrente de cartas.
- Cookie de sesión condicional:
SameSite y Secure ahora dependen de si la conexión es HTTPS. En HTTP local usa Lax + Secure=0, evitando que falle la autenticación en desarrollo.
Corregido
- Bug regresión en IDOR fix: las funciones
calculateDirecciones(), calculateLunaciones() y calculateProgressions() usaban $user['id'] fuera de scope (la variable no es accesible desde funciones standalone). Ahora reciben int $userId como parámetro explícito desde el switch del scope global.
v1.0.4 — 2026-05-11
Mejorado
- Formulario paso a paso (wizard) en creación de carta natal (
js/script.js + charts/create.php + css/styles.css):
- Al iniciar solo se ve "Nombre completo"
- Al rellenar el nombre, aparece "Fecha y Hora de Nacimiento" con transición suave
- Al rellenar fecha (1800–2400) y hora, aparece "Lugar de Nacimiento" con el buscador activo
- Transiciones CSS con
.form-step /
.form-step-hidden /
.form-step-visible
- Modo edición: todas las secciones visibles desde el inicio
- Info de ciudad seleccionada ahora aparece dentro del mismo contenedor de resultados, con botón "Cambiar ciudad"
- Auto-selección: si la búsqueda devuelve un solo resultado, se selecciona automáticamente
- Ajuste de zona horaria (
#timeAdjustment) movido a la sección de lugar, bajo los resultados
Corregido
- Validación de fecha sin rango:
validarFecha() en CartaNatalRepository.php ahora exige 1800–2400
- Resultados duplicados en búsqueda de ciudad: deduplicación por nombre + región + país (
js/script.js)
- Input date con
min="1800-01-01" y max="2400-12-31" en charts/create.php
v1.0.3 — 2026-05-10
Corregido
- Registro de usuario roto (
includes/AuthManager.php:376): phone_country y form_load_time se pasaban a UserRepository::create() y se intentaban insertar en usuarios (columna inexistente → SQLSTATE[42S22]). Añadidos al unset().
- Links hardcodeados en forgot-password (
auth/forgot-password.php:118-120): /UserLogin.php → route('/login'), /UserRegister.php → route('/register').
- Terminología: "carta astral" / "cartas astrales" → "carta natal" / "cartas natales" en todo el código (PHP, CSS, traducciones .po/.mo). Término astrológico correcto.
- Versión hardcodeada en
admin/version.php: ahora se lee dinámicamente del CHANGELOG.md
Añadido
- Footer general con copyright + versión en 8 páginas (login, register, forgot-password, dashboard, groups, group_edit, version, view)
- CSS (
css/login.css): clase .app-footer + regla .user-login-container > .app-footer para grid de login
- Función
appVersion() en includes/Functions.php: lee la versión del CHANGELOG.md (cache estática)
- Función
copyrightFooter() en includes/Functions.php: combina APP_COPYRIGHT de .env con appVersion() + versión enlaza a /admin/version
- Variable
APP_COPYRIGHT en .env y .env.example para editar el copyright centralizadamente
v1.0.2 — 2026-05-09
Corregido
- Eliminados todos los estilos inline (
style="") de dashboard.php — extraídos a css/dashboard.css
- Movido el
<style> inline de admin/version.php a css/version.css
- Estilos de botones de destacado movidos de
css/direcciones.css a css/dashboard.css
- Asegurado
font-size mínimo de 16px en todas las nuevas clases CSS
- Tamaño mínimo de símbolos astrológicos 30px en progresiones y direcciones
Mejoras
AGENTS.md documentado con reglas de estilo: sin inline CSS/JS, min 16px texto, min 30px símbolos
- Botones de acción en cards ahora uniformes (36x36px, solo icono)
- Orden de botones: Ver → Destacar → Info → Editar → Compartir → Eliminar
- Nombre de la carta clickable (misma acción que botón Ver)
Archivos creados
css/dashboard.css — estilos del dashboard
css/version.css — estilos de la página de versión
---
v1.0.1 — 2026-05-09
Corregido
Call to undefined method Database::prepare() en dashboard.php y ajax/feature_chart.php
— sustituido por
$db->query() y
$db->fetchOne() (métodos del singleton Database)
SyntaxError: redeclaration of let Modal por carga duplicada de Modal.js
— eliminada la carga redundante en
dashboard.php (
footer.php ya incluye
modal.js)
filtro-carta-natal.js mostraba error en páginas sin botón "Aplicar Filtros"
— cambiado
Utils.error →
Utils.log para que solo sea informativo
- Tabla
chart_featured no existente al primer uso
— añadido
CREATE TABLE IF NOT EXISTS automático en
dashboard.php y
ajax/feature_chart.php
- Estrella de destacado sin feedback visual al hacer clic
— añadido
alert() en caso de error + deshabilitado temporal del botón durante la petición
- Posición de la estrella de destacado movida junto a la etiqueta "Propia"/"Compartida"
---
v1.0.0 — 2026-05-09
Añadido
- Módulo de Direcciones de Arco Solar: nueva pestaña "Direccions" en la vista de carta
- Calculadora de direcciones de arco solar (1 año de vida = 1 día de tránsito)
- Tabla de resultados con columnas: Pd, Casa, Asp, Pn, Data, Pos(Pd)
- Soporte para aspectes a planetas natales, nodos, Quirón
- Ingressos de casa (conjunción) → "Casa [nº]"
- Ingressos de signo (conjunción) → símbolo del signo
- Indicador de "funció inferior" cuando el planeta supera los 29° de un signo
- Filtros: fecha inicial, duración en años, orbe, planetas dirigidos, planetas natales, aspectos, casas, signos
- Aspectos por defecto: conjunción y oposición
- Permiso
access_direcciones ("Ver Direcciones") añadido al sistema de permisos
- Cartas destacadas: los usuarios pueden marcar/desmarcar cartas como favoritas
- Icono de estrella (★) junto al nombre de cada carta en el dashboard
- Estrella amarilla rellena cuando está destacada, transparente cuando no
- Las cartas destacadas se ordenan primero alfabéticamente
- El estado de destacado es por usuario (independiente del propietario)
- Página de Versión y Log en el panel de administración (
/admin/version)
- Muestra la versión actual y el changelog completo
Archivos creados
includes/DireccionesCalculator.php — clase calculadora de direcciones de arco solar
partes/direcciones.php — template de la página de direcciones
ajax/direcciones.php — endpoint AJAX para cálculo de direcciones
js/direcciones-js.php — JavaScript del módulo de direcciones
css/direcciones.css — estilos del módulo de direcciones
ajax/feature_chart.php — endpoint AJAX para toggle de destacado
migrations/add_direcciones_permission.sql — migración del permiso de direcciones
migrations/add_chart_featured.sql — migración de la tabla de destacados
admin/version.php — página de versión y changelog
CHANGELOG.md — este archivo
Modificaciones
charts/view.php — añadida pestaña "Direccions" con verificación de permiso
partes/header.php — añadido <link> para direcciones.css
partes/footer.php — añadido <script> para direcciones-js.php
dashboard.php — añadido icono de estrella para destacar cartas, ordenación por destacadas primero
admin/index.php — añadida tarjeta "Versión y Log" en el panel de administración
routes.php — añadida ruta /admin/version