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:
@@ -1,5 +1,5 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { odooApi, type ClinicSettings, CLINIC_SETTINGS_DEFAULT, IMPUESTOS_DEFAULT, NOTIFICACIONES_DEFAULT, MEMBRESIAS_DEFAULT, COBRO_AUTOMATICO_DEFAULT, RESERVAS_ONLINE_DEFAULT, ANTICIPO_DEFAULT, RECURSOS_DEFAULT, COMPRAS_DEFAULT, COMISIONES_DEFAULT, LICENCIA_DEFAULT, LICENCIA_LIMITES_DEFAULT } from '../services/odoo';
|
||||
import { odooApi, type ClinicSettings, CLINIC_SETTINGS_DEFAULT, IMPUESTOS_DEFAULT, NOTIFICACIONES_DEFAULT, MEMBRESIAS_DEFAULT, COBRO_AUTOMATICO_DEFAULT, RESERVAS_ONLINE_DEFAULT, ANTICIPO_DEFAULT, RECURSOS_DEFAULT, COMPRAS_DEFAULT, COMISIONES_DEFAULT, LICENCIA_DEFAULT, LICENCIA_LIMITES_DEFAULT, PORTAL_CLIENTE_DEFAULT } from '../services/odoo';
|
||||
|
||||
// Ajustes de la clínica compartidos por la sesión (nombre, moneda e impuestos).
|
||||
// Se leen una sola vez del servidor y se avisa a quien los use cuando cambian.
|
||||
@@ -28,6 +28,7 @@ const normalizar = (settings?: Partial<ClinicSettings> | null): ClinicSettings =
|
||||
...(settings?.licencia || {}),
|
||||
limites: { ...LICENCIA_LIMITES_DEFAULT, ...((settings?.licencia || {}).limites || {}) },
|
||||
},
|
||||
portal_cliente: { ...PORTAL_CLIENTE_DEFAULT, ...(settings?.portal_cliente || {}) },
|
||||
});
|
||||
|
||||
let actual: ClinicSettings = normalizar(null);
|
||||
|
||||
@@ -670,6 +670,173 @@ export const es: Dict = {
|
||||
'config.cobroAuto.cancelHelp': 'Al agotar los reintentos, marca la membresía vencida. Apagado, sigue activa hasta el proceso normal de vencimiento.',
|
||||
'config.cobroAuto.simulated': 'Permitir pago simulado',
|
||||
'config.cobroAuto.simulatedHelp': 'Permite probar el flujo sin pasarela ni dinero real. Déjalo apagado en producción.',
|
||||
// --- Portal del cliente (cuenta de autoservicio) ---
|
||||
'config.tabs.portal': 'Portal del cliente',
|
||||
'config.portal.title': 'Portal del cliente',
|
||||
'config.portal.help': 'Cuenta de autoservicio donde el cliente entra con su teléfono o correo, sin contraseña, y ve sus citas, pagos, monedero, paquetes, membresías, formularios y documentos. Apagado, nada cambia en el sistema.',
|
||||
'config.portal.enable': 'Activar el portal del cliente',
|
||||
'config.portal.enableHelp': 'Mientras esté apagado, el portal responde deshabilitado y no aparece ninguna ruta ni enlace nuevo.',
|
||||
'config.portal.method': 'Método de acceso',
|
||||
'config.portal.methodWhatsapp': 'Código por WhatsApp',
|
||||
'config.portal.methodEmail': 'Enlace por correo',
|
||||
'config.portal.methodBoth': 'Código o enlace (según el dato)',
|
||||
'config.portal.requireEmail': 'Exigir correo registrado',
|
||||
'config.portal.requireEmailHelp': 'Si el acceso es por WhatsApp, requiere que el paciente tenga correo.',
|
||||
'config.portal.password': 'Permitir contraseña',
|
||||
'config.portal.passwordHelp': 'El cliente puede fijar una contraseña después de entrar la primera vez.',
|
||||
'config.portal.sessionHours': 'Duración de la sesión (horas)',
|
||||
'config.portal.allowReschedule': 'Permitir reagendar citas',
|
||||
'config.portal.cancelHours': 'Horas mínimas para cancelar',
|
||||
'config.portal.showPrices': 'Mostrar importes',
|
||||
'config.portal.showRecipes': 'Mostrar recetas',
|
||||
'config.portal.allowStatement': 'Permitir descargar estado de cuenta',
|
||||
'config.portal.allowUpdate': 'Permitir actualizar sus datos',
|
||||
'config.portal.save': 'Guardar portal del cliente',
|
||||
'config.portal.on': 'Activo',
|
||||
'config.portal.off': 'Inactivo',
|
||||
'config.portal.saved': 'Portal del cliente guardado',
|
||||
'config.portal.saveError': 'No se pudo guardar el portal del cliente',
|
||||
'config.portal.linkTitle': 'Enlace del portal',
|
||||
'config.portal.copy': 'Copiar',
|
||||
'config.portal.copied': 'Copiado',
|
||||
'config.portal.open': 'Abrir',
|
||||
'config.portal.linkHelp': 'El enlace usa la URL pública configurada en «Clínica»; si está vacía, la dirección actual.',
|
||||
'config.portal.accessTitle': 'Accesos al portal',
|
||||
'config.portal.accessHelp': 'Pacientes con acceso, última entrada y sesiones abiertas.',
|
||||
'config.portal.accessNone': 'Aún no hay accesos al portal.',
|
||||
'config.portal.colPatient': 'Paciente',
|
||||
'config.portal.colLast': 'Última entrada',
|
||||
'config.portal.colSessions': 'Sesiones abiertas',
|
||||
'config.portal.closeSessions': 'Cerrar sesiones',
|
||||
'config.portal.sessionsClosed': 'Sesiones cerradas',
|
||||
'portal.patient.title': 'Portal del cliente',
|
||||
'portal.patient.invite': 'Invitar al portal',
|
||||
'portal.patient.invited': 'Invitación enviada',
|
||||
'portal.patient.noAccess': 'Sin acceso al portal',
|
||||
'portal.patient.lastAccess': 'Última entrada',
|
||||
'portal.patient.sessions': 'Sesiones abiertas',
|
||||
'portal.patient.activate': 'Reactivar acceso',
|
||||
'portal.patient.deactivate': 'Desactivar acceso',
|
||||
'portal.patient.updated': 'Acceso actualizado',
|
||||
'portal.patient.noPermission': 'No tienes permiso para gestionar el portal.',
|
||||
'portal.patient.testCode': 'Código de prueba: {code}',
|
||||
'portal.patient.testLink': 'Enlace de prueba: {url}',
|
||||
'portal.loading': 'Cargando…',
|
||||
'login.isClient': '¿Eres cliente? Entra a tu cuenta',
|
||||
'portal.unavailableTitle': 'Cuenta no disponible',
|
||||
'portal.unavailableBody': 'El portal de clientes no está activo. Si necesitas algo, comunícate con la clínica.',
|
||||
'portal.title': 'Mi cuenta',
|
||||
'portal.logout': 'Cerrar sesión',
|
||||
'portal.login.intro': 'Entra con tu teléfono o correo. Te enviamos un acceso, sin contraseña.',
|
||||
'portal.login.identifier': 'Teléfono o correo',
|
||||
'portal.login.identifierPh': 'Ej. 664 123 4567 o tu correo',
|
||||
'portal.login.send': 'Enviar acceso',
|
||||
'portal.login.sent': 'Si los datos están registrados, te enviamos tu acceso.',
|
||||
'portal.login.code': 'Código de 6 dígitos',
|
||||
'portal.login.codePh': '000000',
|
||||
'portal.login.enter': 'Entrar',
|
||||
'portal.login.usePassword': 'Entrar con contraseña',
|
||||
'portal.login.useCode': 'Prefiero recibir un código',
|
||||
'portal.login.password': 'Contraseña',
|
||||
'portal.login.enterPw': 'Entrar',
|
||||
'portal.login.wrongCode': 'El código no es válido o ya expiró.',
|
||||
'portal.login.genericError': 'No se pudo completar. Intenta de nuevo.',
|
||||
'portal.login.testHint': 'Modo de prueba: tu código es {code}',
|
||||
'portal.login.testLink': 'Modo de prueba: abre este enlace para entrar: {url}',
|
||||
'portal.tabs.resumen': 'Resumen',
|
||||
'portal.tabs.citas': 'Mis citas',
|
||||
'portal.tabs.pagos': 'Mis pagos',
|
||||
'portal.tabs.monedero': 'Mi monedero',
|
||||
'portal.tabs.paquetes': 'Mis paquetes',
|
||||
'portal.tabs.membresias': 'Mis membresías',
|
||||
'portal.tabs.formularios': 'Mis formularios',
|
||||
'portal.tabs.documentos': 'Mis documentos',
|
||||
'portal.tabs.perfil': 'Mi perfil',
|
||||
'portal.resumen.hello': 'Hola, {name}',
|
||||
'portal.resumen.upcoming': 'Próximas citas',
|
||||
'portal.resumen.balance': 'Saldo pendiente',
|
||||
'portal.resumen.points': 'Puntos',
|
||||
'portal.resumen.forms': 'Formularios pendientes',
|
||||
'portal.citas.upcoming': 'Próximas',
|
||||
'portal.citas.past': 'Pasadas',
|
||||
'portal.citas.none': 'No tienes citas.',
|
||||
'portal.citas.cancel': 'Cancelar',
|
||||
'portal.citas.reschedule': 'Reagendar',
|
||||
'portal.citas.confirmCancel': '¿Cancelar esta cita?',
|
||||
'portal.citas.cancelled': 'Cita cancelada.',
|
||||
'portal.citas.cancelError': 'No se pudo cancelar la cita.',
|
||||
'portal.citas.rescheduled': 'Cita reagendada.',
|
||||
'portal.citas.rescheduleError': 'No se pudo reagendar la cita.',
|
||||
'portal.citas.date': 'Elige la nueva fecha',
|
||||
'portal.citas.slot': 'Elige un horario disponible',
|
||||
'portal.citas.noSlots': 'No hay horarios disponibles ese día.',
|
||||
'portal.citas.service': 'Servicio',
|
||||
'portal.citas.doctor': 'Especialista',
|
||||
'portal.citas.branch': 'Sucursal',
|
||||
'portal.citas.duration': 'Duración',
|
||||
'portal.citas.amount': 'Importe',
|
||||
'portal.citas.minutes': 'min',
|
||||
'portal.citas.anticipo': 'Anticipo pendiente',
|
||||
'portal.pagos.payments': 'Pagos',
|
||||
'portal.pagos.sales': 'Compras (notas)',
|
||||
'portal.pagos.balance': 'Saldo pendiente',
|
||||
'portal.pagos.download': 'Descargar estado de cuenta',
|
||||
'portal.pagos.none': 'No hay movimientos.',
|
||||
'portal.monedero.points': 'Puntos disponibles',
|
||||
'portal.monedero.mxn': 'Equivalente en pesos',
|
||||
'portal.monedero.usd': 'Equivalente en dólares',
|
||||
'portal.monedero.none': 'Aún no tienes movimientos en tu monedero.',
|
||||
'portal.paquetes.total': 'Incluidas',
|
||||
'portal.paquetes.used': 'Usadas',
|
||||
'portal.paquetes.left': 'Restantes',
|
||||
'portal.paquetes.valid': 'Vigencia',
|
||||
'portal.paquetes.none': 'No tienes paquetes.',
|
||||
'portal.membresias.plan': 'Plan',
|
||||
'portal.membresias.valid': 'Vigencia',
|
||||
'portal.membresias.next': 'Próximo cobro',
|
||||
'portal.membresias.sessions': 'Sesiones restantes',
|
||||
'portal.membresias.unlimited': 'Ilimitadas',
|
||||
'portal.membresias.due': 'Periodo pendiente',
|
||||
'portal.membresias.pay': 'Pagar periodo',
|
||||
'portal.membresias.none': 'No tienes membresías.',
|
||||
'portal.membresias.payError': 'No se pudo generar el pago.',
|
||||
'portal.formularios.pending': 'Pendientes',
|
||||
'portal.formularios.done': 'Respondidos',
|
||||
'portal.formularios.open': 'Llenar',
|
||||
'portal.formularios.none': 'No tienes formularios.',
|
||||
'portal.formularios.signed': 'Con firma',
|
||||
'portal.documentos.recetas': 'Recetas',
|
||||
'portal.documentos.estado': 'Estado de cuenta',
|
||||
'portal.documentos.none': 'No hay documentos.',
|
||||
'portal.documentos.noAccess': 'La descarga del estado de cuenta no está disponible.',
|
||||
'portal.documentos.download': 'Descargar',
|
||||
'portal.perfil.name': 'Nombre',
|
||||
'portal.perfil.phone': 'Teléfono',
|
||||
'portal.perfil.email': 'Correo',
|
||||
'portal.perfil.birth': 'Fecha de nacimiento',
|
||||
'portal.perfil.occupation': 'Ocupación',
|
||||
'portal.perfil.address': 'Dirección',
|
||||
'portal.perfil.emergency': 'Contacto de emergencia',
|
||||
'portal.perfil.emergencyPhone': 'Teléfono de emergencia',
|
||||
'portal.perfil.save': 'Guardar cambios',
|
||||
'portal.perfil.saved': 'Datos actualizados.',
|
||||
'portal.perfil.error': 'No se pudieron guardar los datos.',
|
||||
'portal.perfil.photos': 'Mis fotografías',
|
||||
'portal.perfil.noPhotos': 'Sin fotografías.',
|
||||
'portal.perfil.readonly': 'La actualización de datos está desactivada. Pide cambios a la clínica.',
|
||||
'portal.perfil.passwordTitle': 'Contraseña',
|
||||
'portal.perfil.setPassword': 'Establecer contraseña',
|
||||
'portal.perfil.passwordSaved': 'Contraseña guardada.',
|
||||
'portal.estado.title': 'Estado de cuenta de {name}',
|
||||
'portal.estado.generated': 'Generado el {date}',
|
||||
'portal.estado.points': 'Puntos monedero',
|
||||
'portal.estado.spent': 'Total gastado',
|
||||
'portal.estado.due': 'Adeudo',
|
||||
'portal.estado.visits': 'Visitas',
|
||||
'portal.estado.print': 'Imprimir',
|
||||
'portal.common.currency': 'Moneda',
|
||||
'portal.common.status': 'Estado',
|
||||
'portal.common.date': 'Fecha',
|
||||
};
|
||||
|
||||
// ------------------------------------------------------------
|
||||
@@ -1295,6 +1462,173 @@ export const en: Dict = {
|
||||
'config.cobroAuto.cancelHelp': 'When retries are exhausted, marks the membership as expired. Off, it stays active until the normal expiration process.',
|
||||
'config.cobroAuto.simulated': 'Allow simulated payment',
|
||||
'config.cobroAuto.simulatedHelp': 'Lets you test the flow with no gateway and no real money. Keep it off in production.',
|
||||
// --- Customer portal (self-service account) ---
|
||||
'config.tabs.portal': 'Customer portal',
|
||||
'config.portal.title': 'Customer portal',
|
||||
'config.portal.help': 'Self-service account where the customer signs in with their phone or email, no password, and sees their appointments, payments, wallet, packages, memberships, forms and documents. When off, nothing changes in the system.',
|
||||
'config.portal.enable': 'Enable the customer portal',
|
||||
'config.portal.enableHelp': 'While off, the portal responds as disabled and no new route or link appears.',
|
||||
'config.portal.method': 'Access method',
|
||||
'config.portal.methodWhatsapp': 'Code via WhatsApp',
|
||||
'config.portal.methodEmail': 'Link via email',
|
||||
'config.portal.methodBoth': 'Code or link (based on the detail)',
|
||||
'config.portal.requireEmail': 'Require a registered email',
|
||||
'config.portal.requireEmailHelp': 'For WhatsApp access, requires the patient to have an email.',
|
||||
'config.portal.password': 'Allow password',
|
||||
'config.portal.passwordHelp': 'The customer may set a password after their first sign-in.',
|
||||
'config.portal.sessionHours': 'Session length (hours)',
|
||||
'config.portal.allowReschedule': 'Allow rescheduling',
|
||||
'config.portal.cancelHours': 'Minimum hours to cancel',
|
||||
'config.portal.showPrices': 'Show amounts',
|
||||
'config.portal.showRecipes': 'Show prescriptions',
|
||||
'config.portal.allowStatement': 'Allow statement download',
|
||||
'config.portal.allowUpdate': 'Allow editing their details',
|
||||
'config.portal.save': 'Save customer portal',
|
||||
'config.portal.on': 'Active',
|
||||
'config.portal.off': 'Inactive',
|
||||
'config.portal.saved': 'Customer portal saved',
|
||||
'config.portal.saveError': 'The customer portal could not be saved',
|
||||
'config.portal.linkTitle': 'Portal link',
|
||||
'config.portal.copy': 'Copy',
|
||||
'config.portal.copied': 'Copied',
|
||||
'config.portal.open': 'Open',
|
||||
'config.portal.linkHelp': 'The link uses the public URL set in “Clinic”; if empty, the current address.',
|
||||
'config.portal.accessTitle': 'Portal access',
|
||||
'config.portal.accessHelp': 'Patients with access, last sign-in and open sessions.',
|
||||
'config.portal.accessNone': 'No portal access yet.',
|
||||
'config.portal.colPatient': 'Patient',
|
||||
'config.portal.colLast': 'Last sign-in',
|
||||
'config.portal.colSessions': 'Open sessions',
|
||||
'config.portal.closeSessions': 'Close sessions',
|
||||
'config.portal.sessionsClosed': 'Sessions closed',
|
||||
'portal.patient.title': 'Customer portal',
|
||||
'portal.patient.invite': 'Invite to portal',
|
||||
'portal.patient.invited': 'Invitation sent',
|
||||
'portal.patient.noAccess': 'No portal access',
|
||||
'portal.patient.lastAccess': 'Last sign-in',
|
||||
'portal.patient.sessions': 'Open sessions',
|
||||
'portal.patient.activate': 'Reactivate access',
|
||||
'portal.patient.deactivate': 'Disable access',
|
||||
'portal.patient.updated': 'Access updated',
|
||||
'portal.patient.noPermission': 'You do not have permission to manage the portal.',
|
||||
'portal.patient.testCode': 'Test code: {code}',
|
||||
'portal.patient.testLink': 'Test link: {url}',
|
||||
'portal.loading': 'Loading…',
|
||||
'login.isClient': 'Are you a customer? Go to your account',
|
||||
'portal.unavailableTitle': 'Account unavailable',
|
||||
'portal.unavailableBody': 'The customer portal is not active. If you need anything, please contact the clinic.',
|
||||
'portal.title': 'My account',
|
||||
'portal.logout': 'Sign out',
|
||||
'portal.login.intro': 'Sign in with your phone or email. We will send you an access link or code — no password needed.',
|
||||
'portal.login.identifier': 'Phone or email',
|
||||
'portal.login.identifierPh': 'e.g. 664 123 4567 or your email',
|
||||
'portal.login.send': 'Send access',
|
||||
'portal.login.sent': 'If your details are registered, we sent you access.',
|
||||
'portal.login.code': '6-digit code',
|
||||
'portal.login.codePh': '000000',
|
||||
'portal.login.enter': 'Sign in',
|
||||
'portal.login.usePassword': 'Sign in with password',
|
||||
'portal.login.useCode': 'I prefer a code',
|
||||
'portal.login.password': 'Password',
|
||||
'portal.login.enterPw': 'Sign in',
|
||||
'portal.login.wrongCode': 'The code is invalid or has expired.',
|
||||
'portal.login.genericError': 'Could not complete. Please try again.',
|
||||
'portal.login.testHint': 'Test mode: your code is {code}',
|
||||
'portal.login.testLink': 'Test mode: open this link to sign in: {url}',
|
||||
'portal.tabs.resumen': 'Overview',
|
||||
'portal.tabs.citas': 'My appointments',
|
||||
'portal.tabs.pagos': 'My payments',
|
||||
'portal.tabs.monedero': 'My wallet',
|
||||
'portal.tabs.paquetes': 'My packages',
|
||||
'portal.tabs.membresias': 'My memberships',
|
||||
'portal.tabs.formularios': 'My forms',
|
||||
'portal.tabs.documentos': 'My documents',
|
||||
'portal.tabs.perfil': 'My profile',
|
||||
'portal.resumen.hello': 'Hi, {name}',
|
||||
'portal.resumen.upcoming': 'Upcoming appointments',
|
||||
'portal.resumen.balance': 'Outstanding balance',
|
||||
'portal.resumen.points': 'Points',
|
||||
'portal.resumen.forms': 'Pending forms',
|
||||
'portal.citas.upcoming': 'Upcoming',
|
||||
'portal.citas.past': 'Past',
|
||||
'portal.citas.none': 'You have no appointments.',
|
||||
'portal.citas.cancel': 'Cancel',
|
||||
'portal.citas.reschedule': 'Reschedule',
|
||||
'portal.citas.confirmCancel': 'Cancel this appointment?',
|
||||
'portal.citas.cancelled': 'Appointment cancelled.',
|
||||
'portal.citas.cancelError': 'The appointment could not be cancelled.',
|
||||
'portal.citas.rescheduled': 'Appointment rescheduled.',
|
||||
'portal.citas.rescheduleError': 'The appointment could not be rescheduled.',
|
||||
'portal.citas.date': 'Choose the new date',
|
||||
'portal.citas.slot': 'Choose an available time',
|
||||
'portal.citas.noSlots': 'No times available that day.',
|
||||
'portal.citas.service': 'Service',
|
||||
'portal.citas.doctor': 'Specialist',
|
||||
'portal.citas.branch': 'Branch',
|
||||
'portal.citas.duration': 'Duration',
|
||||
'portal.citas.amount': 'Amount',
|
||||
'portal.citas.minutes': 'min',
|
||||
'portal.citas.anticipo': 'Deposit pending',
|
||||
'portal.pagos.payments': 'Payments',
|
||||
'portal.pagos.sales': 'Sales (notes)',
|
||||
'portal.pagos.balance': 'Outstanding balance',
|
||||
'portal.pagos.download': 'Download statement',
|
||||
'portal.pagos.none': 'No transactions.',
|
||||
'portal.monedero.points': 'Available points',
|
||||
'portal.monedero.mxn': 'Equivalent in pesos',
|
||||
'portal.monedero.usd': 'Equivalent in dollars',
|
||||
'portal.monedero.none': 'You have no wallet activity yet.',
|
||||
'portal.paquetes.total': 'Included',
|
||||
'portal.paquetes.used': 'Used',
|
||||
'portal.paquetes.left': 'Remaining',
|
||||
'portal.paquetes.valid': 'Valid until',
|
||||
'portal.paquetes.none': 'You have no packages.',
|
||||
'portal.membresias.plan': 'Plan',
|
||||
'portal.membresias.valid': 'Term',
|
||||
'portal.membresias.next': 'Next charge',
|
||||
'portal.membresias.sessions': 'Remaining sessions',
|
||||
'portal.membresias.unlimited': 'Unlimited',
|
||||
'portal.membresias.due': 'Pending period',
|
||||
'portal.membresias.pay': 'Pay period',
|
||||
'portal.membresias.none': 'You have no memberships.',
|
||||
'portal.membresias.payError': 'The payment could not be generated.',
|
||||
'portal.formularios.pending': 'Pending',
|
||||
'portal.formularios.done': 'Answered',
|
||||
'portal.formularios.open': 'Fill out',
|
||||
'portal.formularios.none': 'You have no forms.',
|
||||
'portal.formularios.signed': 'Signed',
|
||||
'portal.documentos.recetas': 'Prescriptions',
|
||||
'portal.documentos.estado': 'Account statement',
|
||||
'portal.documentos.none': 'No documents.',
|
||||
'portal.documentos.noAccess': 'Statement download is not available.',
|
||||
'portal.documentos.download': 'Download',
|
||||
'portal.perfil.name': 'Name',
|
||||
'portal.perfil.phone': 'Phone',
|
||||
'portal.perfil.email': 'Email',
|
||||
'portal.perfil.birth': 'Date of birth',
|
||||
'portal.perfil.occupation': 'Occupation',
|
||||
'portal.perfil.address': 'Address',
|
||||
'portal.perfil.emergency': 'Emergency contact',
|
||||
'portal.perfil.emergencyPhone': 'Emergency phone',
|
||||
'portal.perfil.save': 'Save changes',
|
||||
'portal.perfil.saved': 'Details updated.',
|
||||
'portal.perfil.error': 'The details could not be saved.',
|
||||
'portal.perfil.photos': 'My photos',
|
||||
'portal.perfil.noPhotos': 'No photos.',
|
||||
'portal.perfil.readonly': 'Editing is disabled. Ask the clinic for changes.',
|
||||
'portal.perfil.passwordTitle': 'Password',
|
||||
'portal.perfil.setPassword': 'Set password',
|
||||
'portal.perfil.passwordSaved': 'Password saved.',
|
||||
'portal.estado.title': 'Account statement for {name}',
|
||||
'portal.estado.generated': 'Generated on {date}',
|
||||
'portal.estado.points': 'Wallet points',
|
||||
'portal.estado.spent': 'Total spent',
|
||||
'portal.estado.due': 'Amount due',
|
||||
'portal.estado.visits': 'Visits',
|
||||
'portal.estado.print': 'Print',
|
||||
'portal.common.currency': 'Currency',
|
||||
'portal.common.status': 'Status',
|
||||
'portal.common.date': 'Date',
|
||||
};
|
||||
|
||||
export const DICT: Record<Locale, Dict> = { es, en };
|
||||
|
||||
@@ -9,6 +9,7 @@ export const PERM_KEYS: string[] = [
|
||||
'recursos.ver', 'recursos.editar',
|
||||
'pacientes.ver', 'pacientes.expediente', 'pacientes.crear', 'pacientes.editar',
|
||||
'pacientes.eliminar', 'pacientes.exportar', 'pacientes.saldos',
|
||||
'portal.invitar', 'portal.sesiones',
|
||||
'visitas.ver', 'visitas.crear', 'visitas.editar', 'visitas.eliminar', 'visitas.archivos',
|
||||
'ventas.vender', 'ventas.cobrar', 'ventas.descuentos', 'ventas.impuestos', 'ventas.cancelar',
|
||||
'ventas.devolver', 'ventas.reimprimir',
|
||||
@@ -64,6 +65,8 @@ const DEFAULT_PERM_ROLES: Record<string, string[]> = {
|
||||
'pacientes.ver': ALL, 'pacientes.expediente': ALL, 'pacientes.crear': W,
|
||||
'pacientes.editar': W, 'pacientes.eliminar': W, 'pacientes.exportar': ALL,
|
||||
'pacientes.saldos': ALL,
|
||||
'portal.invitar': ['admin', 'recepcion', 'gerencia'],
|
||||
'portal.sesiones': ['admin', 'recepcion', 'gerencia'],
|
||||
'visitas.ver': ALL, 'visitas.crear': W, 'visitas.editar': W,
|
||||
'visitas.eliminar': W, 'visitas.archivos': W,
|
||||
'ventas.vender': MONEY, 'ventas.cobrar': WN, 'ventas.descuentos': MONEY,
|
||||
|
||||
Reference in New Issue
Block a user