Skip to content

feat: notificaciones por tipo, alerta de pago abonado y Acerca de canónica - #35

Merged
gnacho merged 4 commits into
mainfrom
feat/keynest-notif-transaccion
Aug 7, 2026
Merged

feat: notificaciones por tipo, alerta de pago abonado y Acerca de canónica#35
gnacho merged 4 commits into
mainfrom
feat/keynest-notif-transaccion

Conversation

@gnacho

@gnacho gnacho commented Aug 7, 2026

Copy link
Copy Markdown
Owner

Trabajo acumulado de notificaciones de Keynest (verificado y desplegado en producción y demo online).

Per-type notification preferences (#33)closes #33:

  • Mi perfil: 7 toggles por tipo de alerta (componente Switch canónico de shadcn), sustituyen al desplegable all/important/none.
  • Migración 13: ALTER TABLE users DROP COLUMN notification_level — las prefs por tipo (notification_preferences) son la única fuente de verdad; el motor ya las respetaba.
  • Textos canónicos ("Activar alertas" / "Alertas activadas en este dispositivo") + error de subscribe visible.
  • 'Reducir animaciones' eliminado (código muerto: las animaciones usan useReducedMotion() del SO).
  • Acerca de canónica webapp-shell (tiles Código/Cambios/Ko-fi/Privacidad + versión·licencia·runtime en línea) e instalador PWA en tarjeta propia.

Pago abonado 24h post check-in + reservas nuevas enriquecidas (#34)closes #34:

  • Nueva alerta 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_nueva incluye 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.

gnacho 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
@gnacho
gnacho merged commit 13d9101 into main Aug 7, 2026
2 checks passed
@gnacho
gnacho deleted the feat/keynest-notif-transaccion branch August 7, 2026 05:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant