bloque 2: cuenta del cliente (modulo skeen_portal_cliente: acceso con codigo por WhatsApp o enlace por correo, sesion propia separada del personal, mis citas con cancelar y reagendar, pagos, monedero, paquetes, membresias con pago del periodo, formularios, documentos y perfil; invitacion y control de sesiones desde el expediente); apagado por defecto

This commit is contained in:
2026-10-12 00:33:32 +00:00
parent 6a6c2a928b
commit 1bd4cad6a0
26 changed files with 3981 additions and 5 deletions

View File

@@ -144,6 +144,58 @@ Dentro del mismo bloque, la llave `reservas_online.anticipo`. Con `activo = true
pagado, el pago se marca como reembolsado y la cita como "Anticipo
reembolsado". Con `false`, el anticipo se retiene.
## 7 bis. Cuenta del cliente (portal de autoservicio)
**Configuración → Portal del cliente** (apagado por defecto)
Hoy el cliente final solo llega por enlaces con token (reserva, pago,
formulario). Con este bloque se enciende una **cuenta propia** en `/mi-cuenta`
donde entra con su teléfono o correo, **sin contraseña**, y ve su información.
Apagado, nada cambia: el portal responde como deshabilitado y no aparece ninguna
ruta ni enlace nuevo (ni para el cliente ni para el personal).
- **Acceso sin contraseña**: el cliente escribe su teléfono (o correo) y recibe
por el motor de notificaciones un **código de 6 dígitos** por WhatsApp o un
**enlace de acceso** por correo, según `metodo` (`otp_whatsapp` | `enlace_correo`
| `ambos`). El código se guarda **con hash**, caduca en 10 minutos, admite como
máximo 5 intentos y tiene límite de peticiones por IP y por teléfono/correo
(nadie puede probar códigos ni molestar a un cliente). El enlace de correo es
de un solo uso y caduca en 30 minutos.
- **Sesión propia del cliente**, separada de la del personal: token firmado con
alcance limitado al paciente identificado y revocable (cerrar sesión lo
invalida de inmediato; el personal puede cerrar las sesiones de un paciente).
Un token de cliente **no** funciona en los endpoints del personal, y uno del
personal **no** funciona en el portal. El portal nunca confía en un
identificador enviado por el navegador: el paciente siempre sale de la sesión.
- **Opciones** (defaults entre paréntesis): `activo` (no), `metodo`
(`otp_whatsapp`), `requerir_correo_verificado` (no), `permitir_contrasena` (no;
permite fijar contraseña tras entrar), `sesion_horas` (24), `permitir_reagendar`
(sí), `horas_minimas_cancelar` (24), `mostrar_precios` (sí), `mostrar_recetas`
(sí), `permitir_descargar_estado_cuenta` (sí) y `permitir_actualizar_datos` (sí).
- **Qué ve el cliente**: Mis citas (próximas/pasadas; cancelar respetando
`horas_minimas_cancelar` y reagendar reutilizando la disponibilidad real),
Mis pagos (historial, saldo pendiente y estado de cuenta imprimible), Mi
monedero (puntos y su equivalente en pesos y dólares), Mis paquetes (sesiones
incluidas/usadas/restantes y vigencia), Mis membresías (plan, vigencia, próximo
cobro, sesiones y adeudo, con botón para pagar el periodo pendiente por el
enlace de cobro existente), Mis formularios (pendientes y respondidos con su
firma), Mis documentos (recetas y estado de cuenta) y Mi perfil (datos de
contacto y fotografías; edición solo si `permitir_actualizar_datos`, y nunca
datos clínicos).
- **Para el personal**: en la ficha del paciente (expediente) hay un bloque para
**invitar al portal**, ver **si ya entró** (última entrada y sesiones abiertas)
y **cerrar sus sesiones**; en la pestaña de configuración hay un listado de
quién tiene acceso activo. Requiere los permisos nuevos `portal.invitar` y
`portal.sesiones` (por defecto: administración, gerencia y recepción).
- **Notificaciones**: usa dos plantillas nuevas del bloque de notificaciones,
`plantilla_codigo_acceso` y `plantilla_enlace_acceso` (con advertencia de no
compartir el código/enlace). En modo prueba del motor, la pantalla de acceso
muestra el código o el enlace en pantalla para poder probar sin enviar nada
real; con el modo prueba apagado nunca se expone.
- **Enlaces cruzados**: el portal de reservas (`/reservar`) enlaza a la cuenta y
la pantalla de acceso del personal muestra un aviso para clientes que llegan
ahí por error.
## 8. Recursos (cabinas, salas y equipos)
**Configuración → Recursos** (apagado por defecto)
@@ -465,6 +517,7 @@ El panel es una **aplicación web instalable** (PWA), sin tienda de aplicaciones
- [ ] Comisiones (reglas, metas y liquidaciones).
- [ ] Formularios y consentimientos.
- [ ] Reservas en línea (activar y difundir el enlace).
- [ ] Portal del cliente (si se ofrece cuenta): activar y difundir `/mi-cuenta`.
- [ ] Notificaciones en modo prueba → revisar textos → encender.
- [ ] Tickets: formato y secciones.
- [ ] Licencia: aplicar la clave del plan contratado.
@@ -490,6 +543,7 @@ Todas las fases están **entregadas**.
| 3.4 | PWA instalable y branding por instancia | Entregado |
| 3.5 | Licenciamiento por plan, API keys gestionables y webhooks | Entregado |
| 3.6 | i18n español/inglés | Entregado |
| 3.7 | Cuenta del cliente (portal de autoservicio) | Entregado |
| Operación | Backups automáticos verificados y panel/CLI multi-instancia | Entregado |
Los pendientes y limitaciones conocidos (los que aún no están cerrados) viven en