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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user