feat: notificaciones por tipo, alerta de pago abonado y Acerca de canónica - #35
Merged
Conversation
added 4 commits
August 6, 2026 23:28
…mportant/none Reemplaza el desplegable de 3 niveles (users.notification_level) por toggles individuales por tipo de alerta en el panel de Mi perfil, visibles solo con el push suscrito (patrón Helios/skill web-push-alerts). Las prefs ya existían en notification_preferences y las respetaba el motor; la UI era el único hueco. - SessionCard: carga GET /api/push/preferences y persiste PUT por tipo (rollback optimista), sin desplegable de nivel. - Se elimina users.notification_level (migración 13 DROP COLUMN) y toda su lógica (auth.js updateNotificationLevel, push.js filtro por severidad, index.js schema profile, lib/auth saveNotificationLevel). - Se borra NotificationsCard.tsx huérfano (lógica integrada en SessionCard). - i18n: quitadas las 5 claves notifLevel*, reutilizadas notifTipo.*/notifTipos. Closes #33
…cir animaciones - Los 7 toggles por tipo usan el componente Switch de shadcn (mismo patrón que limpieza automática/modo demo), no botones role=switch caseros. - Textos canónicos del patrón Helios/skill: 'Activar alertas' / 'Desactivar alertas' / 'Alertas activadas en este dispositivo' y se muestra estado.error cuando el subscribe falla (esperado en headless). - 'Reducir animaciones' ELIMINADO: era código muerto (las animaciones usan useReducedMotion() de framer-motion, preferencia del SO); no controlaba nada. Se quita el toggle, el estado reduceMotion del ThemeProvider, la clave REDUCE_MOTION_KEY, el inline de index.html y las claves i18n. Verificado: check canónico keynest-push.mjs (browser real, sin stubs) pasa en localhost (subscribe con error headless esperado) y en LAN (requiere-https).
…propia Aplica el patrón AboutCard de la skill webapp-shell (decisión 14, Deltos v1.9.2): - Fila 1: logo + nombre + descripción a la izquierda, tiles de enlaces BAJOS a la derecha (Código en GitHub, Cambios, Ko-fi, Privacidad). - Fila 2: versión · licencia · runtime en UNA línea sin recuadros, alineada con la descripción (md:pl-[54px]). - El instalador PWA sale de Acerca de a una InstallCard propia (oculta si el navegador no la soporta). - Bloque Sistema fusionado dentro de Acerca de (patrón EasyZFS): SystemInfoBlock recibe info por prop para no duplicar el fetch de /api/system/info. - Nuevas claves i18n aboutCode/aboutCambios/aboutKofi/aboutPrivacidad/aboutUptime. Verificado con keynest-about-check.mjs (browser real): 6/6 OK.
…quecidas Nueva alerta 'transaccion' (issue #34): - Job diario (09:00) busca reservas cuyo check-in fue AYER con importe registrado (amount > 0, del CSV de Airbnb; el iCal no trae importes). - Avisa importe + inmueble + huésped, url /rentabilidad. Dedupe por kv (un aviso por reserva). Nuevo toggle en Mi perfil + i18n ES/EN. reserva_nueva enriquecida: - Añade tiempo (checkin → checkout), personas y importe cuando existen (cruza por confirmation_code/uid con la BD). Sin importe/personas no inventa campos: el payload queda igual que antes. - Columna 'guests' leída de forma defensiva (PRAGMA cacheado) por si la trae otra sesión; funciona igual sin ella. Closes #34
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Trabajo acumulado de notificaciones de Keynest (verificado y desplegado en producción y demo online).
Per-type notification preferences (#33) — closes #33:
ALTER TABLE users DROP COLUMN notification_level— las prefs por tipo (notification_preferences) son la única fuente de verdad; el motor ya las respetaba.useReducedMotion()del SO).Pago abonado 24h post check-in + reservas nuevas enriquecidas (#34) — closes #34:
transaccion: job diario (09:00) avisa reservas cuyo check-in fue ayer con importe registrado (CSV Airbnb) → importe + inmueble + huésped. Dedupe por kv (un aviso por reserva).reserva_nuevaincluye tiempo (check-in → check-out), personas e importe cuando existen (del CSV; el iCal no los trae). Sin ellos el mensaje queda igual.Verificado: tests server 40/40, build + lint OK, Playwright 10/10 (8 toggles, persistencia, ocultos sin suscribir), check canónico push OK, payloads reales comprobados, md5 prod==local, demo online OK.