Portal de pacientes
Alcance
Sección titulada «Alcance»El portal de pacientes permite que una persona compre guias digitales desde el catalogo publico de un profesional y luego ingrese a BeanCRM para ver su historial de compras aprobadas y volver a descargar sus guias.
La cuenta de paciente es independiente de User, Role y los permisos internos del panel profesional. El mismo email puede existir como cuentas distintas en profesionales o tenants diferentes.
Identidad paciente
Sección titulada «Identidad paciente»La entidad PatientAccount guarda la identidad del paciente para un tenant:
TenantId.- Email normalizado.
- Nombre.
- Estado de la cuenta.
- Ultimo acceso.
- Hash y expiracion del codigo de login.
- Refresh token hasheado.
La unicidad del email es por { TenantId, Email }, no global. Esto permite que [email protected] exista en dos profesionales distintos sin compartir sesion, historial ni permisos.
Compra publica
Sección titulada «Compra publica»El catalogo publico vive en /catalog/[subdomain] como fallback y en /catalog cuando se entra desde https://{subdomain}.beancrm.app. No requiere login. Al iniciar una compra:
- El comprador ingresa nombre y email.
- El backend busca o crea
PatientAccountpor tenant y email. - La nueva
DigitalGuidePurchasequeda vinculada conPatientAccountId. - Mercado Pago procesa el checkout.
- Cuando el pago se aprueba, se mantiene el email de descarga directa y se agrega un CTA al portal del paciente.
Las compras antiguas sin PatientAccountId no se muestran en el portal. No hay fallback por email.
Login passwordless
Sección titulada «Login passwordless»El paciente inicia sesion siempre con codigo por email:
POST /api/v1/patient-auth/request-codeconsubdomainyemail.POST /api/v1/patient-auth/verify-codeconsubdomain,emailycode.POST /api/v1/patient-auth/refresh.
El JWT de paciente es separado del JWT del staff y contiene:
account_type=patient.patient_id.tenant_id.
No contiene permisos administrativos ni clinicos.
Rutas del panel:
/patient/login./patient/verify./patient/dashboard./patient/purchases.https://{subdomain}.beancrm.app/redirige a login o dashboard paciente segun sesion.
Endpoints:
GET /api/v1/patient/me.GET /api/v1/patient/purchases.POST /api/v1/patient/purchases/{purchaseId}/download.
La descarga desde el portal solo se permite cuando la compra esta aprobada, pertenece al mismo tenant, tiene PatientAccountId y ese PatientAccountId coincide con el paciente autenticado. Cada redescarga genera una URL presignada nueva.
Rutas renombradas
Sección titulada «Rutas renombradas»Las rutas publicas y de panel usan nombres en ingles:
/catalog/[subdomain]./catalogen hosts{subdomain}.beancrm.app./download/[token]./download/error./appointments./patients./guides./guides/new./guides/[id]/edit./settings./settings/mp-callback./team./invitation.
Existen redirects temporales desde las rutas anteriores en espanol para preservar links existentes de emails, Mercado Pago o marcadores.
Los profesionales pueden editar su subdominio desde Settings. El panel interno del staff se mantiene en panel.beancrm.app; los subdominios de profesionales quedan reservados para el portal paciente.
Seguridad y privacidad
Sección titulada «Seguridad y privacidad»- Paciente no usa
User, roles ni permisos internos. - Staff no obtiene acceso clinico nuevo por este cambio.
- Paciente solo ve compras vinculadas a su
PatientAccountIddentro del tenant autenticado. - Las compras pendientes, rechazadas o sin
PatientAccountIdno permiten descarga por portal. - El portal actualmente expone compras administrativas de guias; no expone datos clinicos.