Skip to main content

Descripción

El módulo Inicio (Dashboard) es la pantalla principal y punto de entrada de Nubidoc tras iniciar sesión. Proporciona una vista resumida y centralizada de la actividad diaria del profesional, mostrando sus citas y eventos del día, notas importantes, cumpleaños de pacientes, y opcionalmente estadísticas del centro médico. El dashboard está diseñado para ofrecer una visión rápida de “qué tengo que hacer hoy” y “qué está pasando en mi centro”, permitiendo al usuario orientarse rápidamente y acceder a las funciones que necesita con un solo clic. Es un panel de control personalizado según el rol y permisos del usuario.

Usuarios Objetivo

  • Profesionales médicos: Ven sus citas del día, eventos agendados, y notas clínicas importantes
  • Recepcionistas: Ven citas de todos los profesionales, cumpleaños de pacientes, recordatorios
  • Administradores: Además de lo anterior, ven estadísticas del centro (usuarios, pacientes, espacio, SMS)
  • Todos los usuarios: Acceso centralizado a notas importantes y calendario del mes

1. Consultar Citas del Día al Llegar

  • Actor: Profesional médico
  • Objetivo: Ver qué pacientes tiene programados hoy
  • Precondiciones: Tener citas agendadas
  • Pasos:
    1. Iniciar sesión en Nubidoc
    2. Sistema muestra dashboard automáticamente
    3. Visualizar sección “citas” con listado del día actual
    4. Ver hora, paciente, estado de cada cita
  • Resultado: Conocimiento rápido de la agenda del día

2. Revisar Notas Importantes Pendientes

  • Actor: Cualquier usuario
  • Objetivo: Leer notas destacadas que requieren atención
  • Precondiciones: Existen wall notes con “Alertar al lector”
  • Pasos:
    1. Abrir dashboard
    2. Sistema muestra diálogo automático con notas de alerta
    3. Leer contenido de la nota
    4. Opcionalmente: marcar como leída
  • Resultado: Notificaciones importantes no se pierden

3. Verificar Cumpleaños de Pacientes

  • Actor: Recepcionista o profesional
  • Objetivo: Saber qué pacientes cumplen años hoy para felicitarlos
  • Precondiciones: Configuración showBirthdaySectionOnMainPage() activa
  • Pasos:
    1. Abrir dashboard
    2. Revisar panel “Hoy cumple años” (columna derecha)
    3. Ver fotos y nombres de pacientes
    4. Opcionalmente: clic en paciente para abrir su ficha
    5. Llamar o enviar mensaje de felicitación
  • Resultado: Atención personalizada que fideliza pacientes

4. Consultar Estadísticas del Centro (Admin)

  • Actor: Administrador
  • Objetivo: Monitorizar uso de recursos y límites del plan
  • Precondiciones: Ser administrador, configuración showStadisticsOnInitPage() activa
  • Pasos:
    1. Abrir dashboard
    2. Visualizar 4 círculos de estadísticas:
      • Nº usuarios vs límite
      • Nº pacientes vs límite
      • Espacio disco vs límite
      • SMS enviados vs límite
    3. Revisar gráficos de actividad:
      • Citas últimos 30 días
      • Citas últimos 12 meses
  • Resultado: Visión general del estado del centro

5. Navegar a Día Específico del Mes

  • Actor: Cualquier usuario
  • Objetivo: Ver citas/eventos de otro día del mes actual
  • Precondiciones: Ninguna
  • Pasos:
    1. En dashboard, localizar calendario mensual (columna izquierda)
    2. Hacer clic en día deseado del calendario
    3. Sistema recarga sección “citas” y “eventos” con datos de ese día
    4. Revisar citas/eventos
  • Resultado: Planificación de días futuros o revisión de pasados

6. Acceder Rápidamente a una Cita

  • Actor: Profesional o recepcionista
  • Objetivo: Abrir detalles de una cita del día para atenderla
  • Precondiciones: Cita programada para hoy
  • Pasos:
    1. En dashboard, localizar cita en listado
    2. Hacer clic en el link de la cita
    3. Sistema abre diálogo “Acciones de Cita”
    4. Realizar acciones: cambiar estado, añadir notas, crear factura, etc.
  • Resultado: Flujo rápido sin navegar por menús

Opción del Menú

El Dashboard se accede de dos formas:

Opción 1: Al Iniciar Sesión

  • Automático: Se carga automáticamente tras autenticación exitosa
  • No requiere clic en menú

Opción 2: Botón “Inicio” en Menú

  • Función JavaScript: openMainPage()
  • Icono: fa fa-home (Casa)
  • Descripción: Vuelve al dashboard desde cualquier otra pantalla
  • Privilegios: Ninguno específico
  • Comportamiento:
    • Recarga dashboard con datos actuales
    • Resetea fecha seleccionada a hoy
    • Refresca todos los widgets

Pantalla 1: Dashboard Principal

Función de acceso: openMainPage() o inicio automático

Descripción

Pantalla dividida en columnas con widgets de información. Layout responsivo que se adapta a diferentes tamaños de pantalla.

Distribución de Pantalla

┌─────────────────────────────────────────────────────────────┐
│  Nubidoc - Usuario: [Nombre]                    [Notif] [X] │
├───────────┬─────────────────────────────┬───────────────────┤
│           │                             │                   │
│ Calendario│   Resumen del Día          │   Notas           │
│  Mensual  │                             │   Importantes     │
│           │   - Citas del día           │                   │
│  [< Mes >]│   - Eventos del día         │   [Lista notas]   │
│           │                             │                   │
│  [1][2][3]│   [Listado citas]          │   ─────────────   │
│  [4][5][6]│                             │                   │
│    ...    │   [Listado eventos]         │   Cumpleaños      │
│           │                             │   (opcional)      │
│           │                             │                   │
│           │                             │   [Fotos pacien]  │
├───────────┴─────────────────────────────┴───────────────────┤
│  Estadísticas (solo admin, opcional)                        │
│  ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐                   │
│  │Usuar │  │Pacien│  │ Disco│  │ SMS  │                   │
│  │ vs   │  │  vs  │  │  vs  │  │  vs  │                   │
│  │Límite│  │Límite│  │Límite│  │Límite│                   │
│  └──────┘  └──────┘  └──────┘  └──────┘                   │
├─────────────────────────────────────────────────────────────┤
│  Gráficos de Actividad (opcional)                           │
│  ┌─────────────────────┐  ┌─────────────────────┐         │
│  │ Citas últimos 30 d  │  │ Citas últimos 12 m  │         │
│  │                     │  │                     │         │
│  │   [Área chart]      │  │   [Área chart]      │         │
│  │                     │  │                     │         │
│  └─────────────────────┘  └─────────────────────┘         │
├─────────────────────────────────────────────────────────────┤
│  Videos Tutoriales (opcional)                               │
│  [Video 1]   [Video 2]   [Video 3]                         │
└─────────────────────────────────────────────────────────────┘

Secciones de la Pantalla

1. Columna Izquierda: Calendario Mensual
  • Tamaño: col-md-4 (33% ancho)
  • Componente: Calendar widget (CLNDR plugin)
  • Funcionalidad:
    • Muestra mes actual por defecto
    • Navegación: flechas < > para cambiar mes
    • También: teclas ← → del teclado
    • Click en día: recarga citas/eventos de ese día
    • Día seleccionado queda destacado
  • Variable JS: mainpageDateSelected (guarda fecha seleccionada)
2. Columna Central: Resumen del Día
  • Tamaño: col-md-4 (33% ancho)
  • ID Contenedor: userdaysummary
  • Subsecciones: 2a. Citas del Día
    • Título: “citas”
    • Muestra: Hora | Paciente | Estado
    • Coloración por estado de cita
    • Timer en vivo para citas “En sala” (muestra tiempo transcurrido)
    • Click en cita: abre openAppoActionsDialog(appoId)
    • Si no hay citas: mensaje info “No hay citas en la fecha seleccionada”
    2b. Eventos del Día
    • Título: “eventos”
    • Muestra: Nombre evento @ Hora
    • Click en evento: abre openEventDetailsDialog(eventId)
    • Si no hay eventos: mensaje info “No hay eventos en la fecha seleccionada”
3. Columna Derecha: Paneles Informativos
  • Tamaño: col-md-4 (33% ancho)
  • Compuesta por hasta 3 paneles: 3a. Comunicaciones (Desactivado por defecto)
    • Contenido: Interacciones asignadas al usuario
    • Título: “Comunicaciones”
    • Botón refresh: Recarga con reloadUserInteract(userId)
    • Nota: Actualmente con if (false) → no visible
    3b. Notas (Siempre visible)
    • Título: “Notas”
    • Contenido: Wall notes del usuario
    • Botón refresh: reloadWallNote(null, userId)
    • Botón “ver notas leídas”: Muestra historial
    • Funcionalidad especial:
      • Notas con alertreader = 1: se muestran en popup automático al cargar
      • Si usuario es médico y hay patient: botón ”+ añadir nota”
    • Si no hay notas: “No hay notas que mostrar”
    3c. Hoy cumple años (Condicional)
    • Título: “Hoy cumple años”
    • Contenido:
      • Foto miniatura del paciente
      • Nombre del paciente
      • Edad (calculada desde fecha nacimiento)
      • Opcionalmente fecha nacimiento
    • Botón refresh: reloadMainPageBirthdays()
    • Click en paciente: Abre openRecord(patientId)
    • Filtro opcional: Si patientBirthdayOnlyIfAppointment(): solo pacientes con citas previas
    • Si no hay: “Ningún [paciente] cumple años en esta fecha”
4. Fila de Estadísticas (Solo Administradores)
  • Condición:
    • customer->showStadisticsOnInitPage() == true
  • Tamaño: 4 columnas de col-md-3 (25% cada una) 4a. Círculo: Nº de usuarios
    • Muestra: Usuarios actuales vs límite del plan
    • Fuente datos:
      • module_maxusers del módulo base
      • Suma módulos adicionales de usuarios
      • customer->getNumValidUsers() para usuarios actuales
    • Visualización: Gráfico circular (epie-chart)
    • Porcentaje: (usuarios actuales / límite) * 100
    • Ejemplo: “5 usuarios | Límite 10”
    4b. Círculo: Nº de pacientes
    • Muestra: Pacientes creados vs límite del plan
    • Fuente datos:
      • module_maxpatients del módulo base
      • Suma módulos adicionales de pacientes
      • COUNT de hpc_patient donde deleted=0
    • Visualización: Gráfico circular
    • Porcentaje: (pacientes / límite) * 100
    • Nota: Término “pacientes” puede cambiar según configuración (ej. “clientes”)
    4c. Círculo: Espacio en disco
    • Muestra: Espacio usado vs límite de almacenamiento
    • Fuente datos:
      • module_maxstorage en MB, convertido a bytes (* 1024^2)
      • Suma módulos adicionales de disco (type=3, status activo): se lee unitsleft de cada hpc_customer_module (en MB)
    • Visualización: Gráfico circular
    • Porcentaje: (usado / límite) * 100
    • Formato: MB/GB (convertido automáticamente)
    • Nota: Si el centro tiene módulos adicionales de almacenamiento contratados, el límite refleja la suma del almacenamiento base del plan más los módulos adicionales
    • Alertas:
      • Si > 90%: Warning en log
      • Si > 100%: Error en log (comentado)
    4d. Círculo: Mensajes SMS
    • Muestra: SMS enviados vs SMS contratados
    • Fuente datos:
      • customer->getCustomerModuleSmsActives() - módulos SMS activos
      • Para cada: units (total) - unitsleft (restantes) = enviados
      • Suma total de enviados y total contratado
    • Visualización: Gráfico circular
    • Porcentaje: (enviados / total) * 100
    • Ejemplo: “250 sms | Límite 500”
5. Fila de Gráficos de Actividad (Condicional)
  • Condición: customer->showStadisticsOnInitPage() == true
  • Tamaño: 2 columnas de col-md-6 (50% cada una)
  • Librería: Morris.js (área charts) 5a. Gráfico: Citas de los últimos 30 días
    • Tipo: Gráfico de área (Area chart)
    • Fuente datos: User::getMyLastFigures(30, 'day')
    • Series:
      • “Mis citas” (rojo #E67A77): citas del usuario actual
      • “Total citas” (turquesa #79D1CF): todas las citas (solo si admin)
    • Eje X: Periodo (días)
    • Eje Y: Número de citas
    • Interactividad: Hover muestra valor exacto
    • Botón: Chevron down para colapsar panel
    5b. Gráfico: Citas de los últimos 12 meses
    • Tipo: Gráfico de área (Area chart)
    • Fuente datos: User::getMyLastFigures(12, 'month')
    • Series:
      • “Mis citas”: citas del usuario actual por mes
      • “Total citas”: todas las citas (solo si admin)
    • Eje X: Periodo (meses)
    • Eje Y: Número de citas
    • Mismo formato visual que gráfico anterior
6. Sección Videos Tutoriales (Condicional)
  • Layout: Grid responsive, col-md-4 por video (3 por fila)
  • Fuente datos: Tabla hpc_video
  • Tipos de video:
    • Videos locales: <video> HTML5 desde app.nubidoc.com/videos/[filename]
    • Videos YouTube: <iframe> embedded de YouTube con ID
  • Funcionalidad:
    • Play en video local: registra visualización en hpc_video_user
    • Evento JS: handleVideoClick(videoId)
    • Permite controles nativos de video
  • Si no hay videos: No se muestra sección

Workflow 1: Inicio de Sesión y Carga del Dashboard

1. Usuario introduce credenciales en login

2. Sistema valida usuario y contraseña
   - Crea sesión, establece Zend_Auth identity

3. Sistema determina tipo de usuario
   - isUserMedicalCenter() → profesional/médico
   - isUserPermission() → administrativo/recepcionista


5. Sistema obtiene datos del usuario actual
   - $userId = user->getValue('hpc_user_id')

6. Sistema renderiza componentes condicionalmente:

   6a. Calendario mensual (siempre)
       - Inicializa plugin CLNDR
       - Mes actual, día de hoy destacado

   6b. Resumen del día (siempre)
       - Obtiene fecha = hoy
       - Llama getApposBetweenDates(hoy, mañana, userId)
       - Llama getEventsBetweenDates(hoy, mañana, userId)
       - Renderiza listas de citas y eventos

   6c. Panel Notas (siempre)
       - Obtiene user->getWallnotes()
       - Renderiza cada wallnote
       - Si wallnote->alertreader == 1:
         → Añade a array alertNotes

   6d. Panel Cumpleaños (si configurado)
       - Si showBirthdaySectionOnMainPage():
         → Busca pacientes con datebirthday = dd/mm de hoy
         → Si patientBirthdayOnlyIfAppointment():
           → Filtra solo con citas previas
         → Muestra fotos y nombres

   6e. Estadísticas (si admin y configurado)
       - Si isAdmin() && showStadisticsOnInitPage():
         → Calcula 4 círculos de estadísticas
         → Genera datos para 2 gráficos Morris

   6f. Videos (si configurado)
       - Si showNubidocVideosOnMainPage():
         → SELECT * FROM hpc_video
         → Renderiza videos/iframes

7. Sistema ejecuta JavaScript inicialización
   - Inicializa calendario CLNDR con eventos click
   - Si hay Morris charts: renderiza gráficos con datos
   - Si hay alertNotes: muestra popups automáticos

8. Sistema verifica control horario (si habilitado)
   - Si allowUserTimeCheck() && user->timecheck == 1:
     → Busca registro entrada hoy sin salida
     → Si no existe: popup "¿Desea registrar hora entrada?"
     → Si acepta: llama registerUserTime(userId, 0)

9. Dashboard completamente cargado y operativo
Tiempo de carga típico: 1-3 segundos (depende de cantidad de datos) Errores posibles:
  • Si customerModuleBase not found: Error crítico, configuración incorrecta
  • Si no hay datos: Se muestran mensajes informativos, no errores

Workflow 2: Cambiar Día del Calendario

1. Usuario hace clic en un día del calendario

2. Evento click capturado por CLNDR plugin
   - Función: click: function(target)

3. JavaScript obtiene fecha del día clickeado
   - var d = new Date(target.date)
   - mainpageDateSelected = getDateFormat(d)
   - Formato: yyyy-MM-dd HH:mm:ss

4. Sistema llama reloadUserSummaryAppoToday()
   - Parámetros: fecha seleccionada, userId

   - Via AJAX: loadPartial()
   - Parámetros: date, userId

6. Servidor busca datos de la nueva fecha
   - begindate = fecha seleccionada 00:00:00
   - enddate = fecha seleccionada + 1 día 00:00:00
   - getApposBetweenDates(begindate, enddate, userId)
   - getEventsBetweenDates(begindate, enddate, userId)

7. Sistema renderiza nuevo HTML
   - Lista actualizada de citas del día
   - Lista actualizada de eventos
   - Día de la semana (ej. "Lunes 15/12/2025")

8. JavaScript reemplaza contenido de #userdaysummary
   - innerHTML actualizado con nuevos datos
   - Timers iniciados si hay citas "En sala"

9. Usuario ve citas/eventos del día seleccionado
Variantes:
  • Si selecciona día sin citas: “No hay citas en la fecha seleccionada”
  • Si selecciona día sin eventos: “No hay eventos en la fecha seleccionada”
  • Flechas teclado (← →): cambian mes sin recargar día

Workflow 3: Ver Detalles de Cita desde Dashboard

1. Usuario localiza cita en listado "citas"
   - Lista muestra: Hora - Nombre paciente
   - Estado coloreado visible

2. Usuario hace clic en link de la cita
   - <a onclick="openAppoActionsDialog('appoId')">

3. Sistema ejecuta función JavaScript
   - openAppoActionsDialog(appoId)

4. Sistema abre diálogo modal "Acciones de Cita"
   - Modal con opciones de acciones sobre la cita
   - Contenido: partials agenda/appodialogactions

5. Usuario ve opciones disponibles:
   - Ver/Editar cita
   - Cambiar estado
   - Añadir notas clínicas
   - Crear factura
   - Enviar recordatorio
   - Marcar como no asistió
   - Etc. (según permisos)

6. Usuario selecciona acción
   - Clic en botón de acción deseada

7. Sistema ejecuta acción correspondiente
   - Cada botón tiene su función específica
   - Puede abrir nuevo formulario o ejecutar directamente

8. Sistema actualiza estado/datos
   - Si cambió estado: UPDATE appointment
   - Si añadió nota: INSERT clinicalnote
   - Etc.

9. Sistema cierra diálogo o muestra confirmación

10. Dashboard se actualiza (opcional)
    - Si cambió estado visible: se refleja en listado
    - Color del estado se actualiza
Nota: Este flujo integra dashboard con módulo Agenda sin necesidad de navegar

Workflow 4: Gestión de Nota con Alerta

1. Otro usuario crea wall note para usuario actual
   - Desde ficha de paciente o panel de notas
   - Campo "Alertar al lector" = checked (valor 1)
   - Guarda nota

2. Usuario actual inicia sesión
   - O recarga dashboard haciendo clic en "Inicio"

3. Sistema carga dashboard
   - Renderiza panel "Notas"
   - Lee user->getWallnotes()

4. Sistema detecta wallnote con alertreader = 1
   - Añade a array $alertNotes
   - Renderiza en listado normal también

5. JavaScript ejecuta código en ready()
   - Itera array de alertNotes
   - Para cada nota con alerta:
     → Llama alertWallnote(wallnoteId)

6. Sistema abre popup modal automático
   - Función: openMainDialog()
   - Partial: mainpage/partials/wallnoteshow
   - Título: "Nota"
   - Tamaño: medium

7. Popup muestra contenido de la nota
   - Creador de la nota
   - Fecha creación
   - Contenido completo
   - Prioridad (si tiene)

8. Usuario lee la nota
   - Visualiza información importante

9. Usuario cierra popup
   - Clic en X o fuera del modal

10. Nota queda marcada como leída (implícito)
    - Ya no se mostrará en alertas futuras
    - Pero sigue visible en panel de notas
Casos especiales:
  • Si hay múltiples notas con alerta: se muestran popups consecutivos
  • Usuario puede marcar como leída explícitamente desde panel de notas
  • Notas leídas se pueden consultar con botón “ver notas leídas”

Workflow 5: Verificar Cumpleaños y Contactar Paciente

1. Usuario abre dashboard (día actual)

2. Sistema renderiza panel "Hoy cumple años"
   - Si showBirthdaySectionOnMainPage() == true

3. Sistema busca pacientes con cumpleaños hoy
   - Query: WHERE datebirthday LIKE 'dd/mm%'
   - dd/mm = día y mes actual (ej. 16/12)

4. Sistema aplica filtro opcional
   - Si patientBirthdayOnlyIfAppointment():
     → Para cada paciente:
       → Verifica patient->hasAnyAppointmentWith(userId)
       → Si NO tiene citas con este usuario: skip

5. Sistema renderiza tarjetas de pacientes
   - Foto miniatura (o avatar por defecto)
   - Nombre completo
   - Edad calculada (ej. "45 años")
   - Opcionalmente fecha nacimiento completa
   - Layout: 3 por fila (col-lg-3)

6. Usuario ve lista de cumpleañeros
   - Identifica visualmente con fotos

7. Usuario decide contactar a un paciente
   - Clic en foto o nombre del paciente

8. Sistema abre ficha del paciente
   - Ejecuta: openRecord(patientId)
   - Carga: partials patient/patient
   - Modal o tab con datos completos

9. Usuario ve datos de contacto
   - Teléfono, email, dirección

10. Usuario realiza acción de contacto:

    Opción A: Llamada telefónica
    - Marca número mostrado
    - Felicita verbalmente
    - Opcionalmente: registra interact "Llamada"

    Opción B: Envío de mensaje/email
    - Desde ficha: botón "Enviar mensaje"
    - Redacta felicitación
    - Sistema envía vía SMS o email

    Opción C: Crear nota para recordatorio
    - Crea wall note en ficha paciente
    - "Llamar para felicitar cumpleaños"
Resultado:
  • Paciente recibe atención personalizada
  • Se fortalece relación paciente-centro
  • Potencial fidelización y marketing positivo

Regla 1: Dashboard como Pantalla por Defecto

  • Descripción: El dashboard siempre se muestra automáticamente tras login exitoso
  • Cuándo aplica: Al iniciar sesión en el sistema
  • Efecto:
    • No requiere navegación manual
    • Usuario ve inmediatamente su actividad del día
    • Punto de partida para cualquier operación
  • Código: IndexController tras autenticación exitosa

Regla 2: Personalización según Tipo de Usuario

  • Descripción: El contenido del dashboard varía según el rol del usuario
  • Efecto:
    • Profesionales médicos: Ven sus propias citas y eventos
    • Recepcionistas: Pueden ver citas de varios profesionales (según permisos)
    • Administradores: Ven estadísticas adicionales del centro
    • Todos: Ven notas y cumpleaños (si configurado)
  • Código: Condiciones isUserMedicalCenter(), isAdmin() en vista

Regla 3: Día Actual como Fecha por Defecto

  • Descripción: Al cargar dashboard, siempre muestra datos del día actual
  • Cuándo aplica: Al abrir dashboard o hacer clic en “Inicio”
  • Efecto:
    • Variable mainpageDateSelected = null inicialmente
    • Si null: usa new DateTime() → hoy
    • Calendario destaca día actual
    • Resumen muestra citas/eventos de hoy

Regla 4: Alertas Automáticas de Wall Notes

  • Descripción: Notas con flag “Alertar al lector” se muestran en popup automático
  • Cuándo aplica: Al cargar dashboard, si existen wall notes con alertreader = 1
  • Efecto:
    • Sistema itera wallnotes renderizadas
    • Para cada con alertreader = 1: añade a array
    • En document.ready(): ejecuta alertWallnote() para cada una
    • Popups se muestran secuencialmente
  • Propósito: Garantizar que información crítica no se pierda

Regla 5: Visibilidad Condicional de Componentes

  • Descripción: Ciertos componentes solo se muestran si están configurados para el centro
  • Cuándo aplica: Al renderizar dashboard
  • Efecto: Cada componente verifica su condición:
    • Cumpleaños: if (showBirthdaySectionOnMainPage())
    • Estadísticas: if (isAdmin() && showStadisticsOnInitPage())
    • Videos: if (showNubidocVideosOnMainPage())
    • Comunicaciones: if (allowCRM()) ← actualmente siempre false
    • Control horario: if (allowUserTimeCheck() && user->timecheck)
  • Razón: Personalización por centro, evita sobrecarga visual

Regla 6: Actualización de Fecha no Recarga Página

  • Descripción: Cambiar día en calendario solo recarga sección de citas/eventos, no toda la página
  • Cuándo aplica: Al hacer clic en día del calendario
  • Efecto:
    • Solo se actualiza contenido de div #userdaysummary
    • Resto de dashboard permanece igual (notas, cumpleaños, stats)
    • Performance mejorada, no se pierden estados de otros widgets
  • Tecnología: AJAX con loadPartial()

Regla 7: Cálculo de Estadísticas Solo para Administradores

  • Descripción: Los círculos de estadísticas y gráficos consumen recursos, solo se calculan si se van a mostrar
  • Cuándo aplica: Al renderizar dashboard
  • Efecto:
    • Verificación: if (isAdmin() && showStadisticsOnInitPage())
    • Si false: no se ejecutan queries de conteo, no se generan datos de gráficos
    • Ahorro de tiempo de procesamiento para usuarios no admin
    • Consultas complejas (ej. getMyLastFigures(30)) pueden tardar segundos

Regla 8: Filtrado de Cumpleaños por Relación con Usuario

  • Descripción: Opcionalmente, solo se muestran cumpleaños de pacientes con citas previas con el usuario
  • Cuándo aplica: Si patientBirthdayOnlyIfAppointment() == true
  • Efecto:
    • Para cada paciente con cumpleaños hoy: → Verifica: patient->hasAnyAppointmentWith(userId) → Si no tiene citas con este usuario: no se muestra
    • Evita mostrar cumpleaños de pacientes que no conoce el profesional
    • Especialmente útil en centros multiprofesionales

Regla 9: Límites de Recursos con Alertas

  • Descripción: Sistema monitoriza uso vs límites del plan y genera alertas
  • Cuándo aplica: Al calcular estadísticas de espacio en disco
  • Efecto:
    • Si espacio usado > 90% del límite: → new Hpc_Exception_Generic(“Customer has reached 90% storage”) → Registra en log
    • Si espacio usado > 100%: → new Hpc_Exception_Generic (línea comentada) → Potencialmente bloquea ciertas operaciones
  • Propósito: Prevenir problemas de espacio antes que ocurran

Regla 10: Sincronización de Timers en Citas

  • Descripción: Citas en estado “En sala” muestran timer en vivo con tiempo transcurrido
  • Cuándo aplica: Si cita tiene estado = “started” (En sala de espera)
  • Efecto:
    • Se calcula timerDate = momento en que entró en sala
    • JavaScript inicia contador en vivo: startTime(divId, timerDate)
    • Contador se actualiza cada segundo
    • Muestra formato: HH:mm:ss o “hace X minutos”
  • Propósito: Control visual del tiempo de espera del paciente

Mensajes Informativos

  • “No hay citas en la fecha seleccionada”
    • Cuándo: Al seleccionar día sin citas programadas
    • Dónde: Panel central, sección “citas”
    • Estilo: Info azul
  • “No hay eventos en la fecha seleccionada”
    • Cuándo: Al seleccionar día sin eventos agendados
    • Dónde: Panel central, sección “eventos”
    • Estilo: Info azul
  • “No hay notas que mostrar”
    • Cuándo: Usuario no tiene wall notes pendientes
    • Dónde: Panel derecho, sección “Notas”
    • Estilo: Info azul
  • “Ningún [paciente] cumple años en esta fecha”
    • Cuándo: No hay pacientes con cumpleaños hoy, o ninguno cumple condiciones de filtro
    • Dónde: Panel derecho, sección “Hoy cumple años”
    • Estilo: Info azul

Mensajes de Alerta

  • “No ha registrado hora de entrada hoy. ¿Desea registrarla ahora?”
    • Cuándo: Control horario activado, usuario no fichó entrada hoy
    • Condiciones:
      • allowUserTimeCheck() == true
      • user->timecheck == 1
      • No existe registro en hpc_timeregistry para hoy sin datetimeout
    • Dónde: Popup modal automático al cargar dashboard
    • Título popup: “Registrar hora entrada”
    • Botones: “Aceptar” / “Cancelar”
    • Si acepta: ejecuta registerUserTime(userId, 0) → crea registro entrada
  • Popup automático de Wall Note con alerta
    • Cuándo: Existe wall note con alertreader = 1 no leída
    • Contenido: Texto completo de la nota
    • Título: “Nota”
    • Estilo: Modal medium
    • Cierre: Usuario debe cerrar manualmente

Mensajes de Error (Logs)

  • “customerModuleBase not found”
    • Cuándo: No se encuentra módulo base del centro
    • Gravedad: CRÍTICO - impide cargar dashboard
    • Causa: Configuración corrupta en base de datos
    • Solución: Revisar tabla hpc_customermodule, contactar soporte
  • “User ID not found on daysummaryuser”
    • Cuándo: No se puede determinar userId en resumen del día
    • Gravedad: ERROR - impide mostrar citas/eventos
    • Causa: Sesión corrupta o parámetros incorrectos
    • Solución: Cerrar sesión y volver a iniciar
  • “patient and user are null on wallnotesshow”
    • Cuándo: Panel de notas llamado sin patient ni user
    • Gravedad: ERROR - impide mostrar notas
    • Causa: Error en invocación del partial
    • Solución: Reportar bug a desarrolladores

Advertencias en Log

  • “Customer has reached 90% storage: [X]%”
    • Cuándo: Espacio en disco supera 90% del límite
    • Dónde: Log del servidor
    • Acción: Advertencia a administrador, considerar ampliar plan o limpiar archivos
  • “Customer! has reached 100% storage: [X]%” (Comentado)
    • Cuándo: Espacio en disco supera 100% del límite
    • Dónde: Log del servidor (actualmente comentado)
    • Acción potencial: Bloquear subida de archivos

Preguntas Frecuentes

Q: ¿Por qué al iniciar sesión siempre veo el dashboard primero? A: El dashboard está diseñado para ser la pantalla de inicio por defecto. Proporciona una visión general rápida de tu actividad del día (citas, eventos, notas) sin necesidad de navegar. Si prefieres ir directamente a otra sección, puedes hacerlo desde el menú inmediatamente después de cargar. Q: ¿Cómo cambio la fecha para ver citas de otro día? A: En la columna izquierda del dashboard hay un calendario mensual. Simplemente haz clic en el día que desees consultar y el panel central se actualizará mostrando las citas y eventos de ese día. También puedes usar las flechas ← → del teclado para cambiar de mes. Q: ¿Por qué no veo las estadísticas de usuarios, pacientes y espacio en disco? A: Las estadísticas solo son visibles para usuarios administradores y si el centro tiene configurada la opción showStadisticsOnInitPage(). Si eres administrador y no las ves, contacta con soporte técnico para activar esta funcionalidad. Q: ¿Qué significa el timer que aparece en algunas citas? A: El timer aparece en citas que están en estado “En sala de espera”. Muestra el tiempo transcurrido desde que el paciente entró en sala, ayudándote a controlar visualmente cuánto lleva esperando. Se actualiza en tiempo real cada segundo. Q: ¿Cómo funcionan las notas con alerta? A: Cuando alguien crea una nota (wall note) y marca la opción “Alertar al lector”, esa nota se mostrará automáticamente en un popup cuando inicies sesión o recargues el dashboard. Esto garantiza que no se te escape información importante. Una vez cerrado el popup, la nota sigue visible en el panel de notas pero no volverá a alertar automáticamente. Q: ¿Por qué solo veo algunos pacientes en “Hoy cumple años”? A: Depende de la configuración de tu centro. Si patientBirthdayOnlyIfAppointment() está activo, solo se mostrarán pacientes que han tenido al menos una cita contigo previamente. Esto evita mostrar cumpleaños de pacientes que atienden otros profesionales y que tú no conoces. Q: ¿Puedo ocultar algún componente del dashboard que no uso? A: Los componentes del dashboard son configurables a nivel de centro, no a nivel individual de usuario. Si hay algo que no necesitas (ej. videos tutoriales, estadísticas), debe ser configurado por el administrador del centro. Contacta con tu administrador para solicitar cambios. Q: ¿Qué son los gráficos de “Citas de los últimos 30 días” y “12 meses”? A: Son gráficos de área que muestran la evolución de tu actividad de citas en el tiempo. El primero muestra día a día los últimos 30 días, útil para ver tendencias recientes. El segundo muestra mes a mes el último año, útil para análisis de largo plazo. Si eres administrador, verás dos líneas: tus citas y el total del centro. Q: ¿Qué pasa si mi red o mi navegador bloquean la carga de gráficos externos? A: El dashboard y la pantalla de inicio deben seguir cargando igualmente. Puede que algún gráfico puntual no llegue a mostrarse, pero el acceso, las citas y el resto de la pantalla seguirán funcionando con normalidad. Q: ¿Cómo añado una nota en el dashboard? A: Las notas (wall notes) del dashboard están asociadas a usuarios o pacientes. Si eres profesional médico y estás viendo el dashboard desde la ficha de un paciente, verás un botón ”+ añadir nota” en el panel de notas. Si quieres añadir una nota general para ti, hazlo desde el módulo de Pacientes o desde tu perfil de usuario. Q: ¿Puedo cambiar el orden de los componentes del dashboard? A: No, el layout del dashboard está predefinido y no es personalizable por el usuario. El orden está optimizado según la importancia de la información: calendario y citas (lo más importante) a la izquierda y centro, información complementaria (notas, cumpleaños) a la derecha. Q: ¿Qué significan los colores en el listado de citas? A: Los colores representan el estado de cada cita:
  • Azul: Programada
  • Verde: Confirmada
  • Amarillo/Naranja: En sala de espera
  • Gris: Atendida/Finalizada
  • Rojo: No asistió
  • Blanco: Cancelada El mismo código de colores se usa en toda la aplicación (agenda, búsquedas, etc.).
Q: ¿Por qué al hacer clic en un día del calendario no se refresca toda la página? A: Es una optimización de rendimiento. Al cambiar de día, solo se actualiza la sección central (citas y eventos) mediante AJAX, sin recargar todo el dashboard. Esto es más rápido y no pierdes el estado de otros componentes (notas que estabas leyendo, posición de scroll, etc.). Q: ¿Qué pasa si supero el límite de pacientes o espacio en disco mostrado en estadísticas? A: Los límites están definidos por tu plan contratado. Si te acercas al 90% del límite de espacio, el sistema genera advertencias en el log. Es recomendable contactar con tu proveedor para ampliar el plan antes de alcanzar el 100%. Para pacientes, normalmente el sistema te permitirá crear algunos más, pero eventualmente bloqueará nuevas altas. Q: ¿Los videos tutoriales consumen datos si no los reproduzco? A: No. Los videos (sean locales o de YouTube) solo cargan cuando haces clic en play. Al cargar el dashboard solo se muestran las miniaturas y controles, pero el contenido de video no se descarga hasta que lo reproduces. Q: ¿Cuántos calendarios/agendas puede tener el centro? A: No hay límite de calendarios/agendas en Nubidoc, pero hay que tener en cuenta que las agendas van ligadas a usuarios. Para tener una nueva agenda necesitas crear un nuevo usuario en el sistema. Cada usuario profesional tiene su propia agenda personal. Q: ¿Se pueden crear usuarios genéricos por departamento en lugar de usuarios personales? A: Técnicamente sí es posible, por ejemplo crear un usuario “cirugia@example.com” compartido por varias personas del departamento. Sin embargo, esto tiene problemas importantes:
  • No se pueden calcular comisiones por profesional
  • No se puede saber quién escribió en la parte clínica
  • No se puede registrar la hora de entrada/salida de cada persona
  • Pérdida de trazabilidad de acciones individuales Por estas razones, se recomienda encarecidamente que cada persona tenga su propio usuario personal, aunque trabaje en el mismo departamento.
Q: ¿Los calendarios/agendas son por profesional o por médico? A: Sí, exactamente. La manera de funcionar genérica del sistema es que cada profesional (médico, enfermero, terapeuta, etc.) tenga su propio usuario y por tanto su propia agenda personal. Esto permite control individualizado, cálculo de comisiones, y trazabilidad de actividades. Q: ¿Los calendarios/agendas son comunes a todas las empresas del grupo? A: Nubidoc es muy versátil en este aspecto. Se pueden definir privilegios granulares para controlar qué usuarios ven qué centros:
  • Un usuario puede tener acceso solo a su agenda y su centro
  • Un usuario puede ver todos los centros del grupo
  • Un usuario puede ver solo ciertos centros específicos (por ejemplo, centros “A” y “B” pero no “C”) Los profesionales están asociados a un centro principal, pero también pueden tener asignados otros centros adicionales. Por ejemplo, el Dr. Juan puede pasar consulta en el centro “A” y “B”, y su agenda permitirá ver la disponibilidad y citar en ambos centros.
Q: ¿Al entrar al programa, entramos con una empresa concreta o con un usuario que puede trabajar para varias empresas? A: Inicias sesión con tu usuario personal, no con una empresa específica. Una vez autenticado, el sistema determina a qué centros/empresas tienes acceso basándose en tu configuración:
  • Tienes un centro principal asignado
  • Opcionalmente, puedes tener centros adicionales asignados
  • Tus citas y facturas se pueden crear para cualquiera de los centros a los que tienes acceso Por ejemplo, un profesional puede trabajar para el centro A los lunes/miércoles y para el centro B los martes/jueves, todo con el mismo usuario.

Layout y Estructura

Sistema de Grid:
  • Bootstrap 3 responsive grid
  • Breakpoints: xs (móvil), sm (tablet), md (escritorio), lg (pantallas grandes)
  • Dashboard optimizado para md (≥992px)
Distribución de Columnas:
  • Columna izquierda: col-md-4 (calendar)
  • Columna central: col-md-4 (day summary)
  • Columna derecha: col-md-4 (notes, birthdays)
  • Filas completas: col-md-12 (statistics row, graphs row, videos row)

Componentes Visuales

Calendario (CLNDR Plugin):
  • Estilo: Grid 7x6 (lunes a domingo)
  • Día actual: Resaltado en color primario
  • Día seleccionado: Borde destacado
  • Navegación: Flechas < > en header
  • Mes/Año: Centrado en header
  • Días adyacentes: Opcionalmente visibles en gris claro
Listado de Citas:
  • Formato: Lista <ul class="event-list">
  • Item: <li> con link clickeable
  • Contenido: “HH:mm - Nombre Paciente”
  • Badge estado: <div class="label pull-right"> con color
  • Timer: <div> inline si estado=En sala
  • Hover: Subrayado del link
Listado de Eventos:
  • Formato: Igual que citas
  • Contenido: “Nombre evento @ HH:mm”
  • Sin badge: No tienen estado visual
  • Click: Abre detalles de evento
Panel de Notas:
  • Contenedor: <section class="panel">
  • Header: Título “Notas” + iconos refresh y chevron
  • Body: Lista de wallnotes renderizadas
  • Cada nota:
    • Creador y fecha
    • Contenido (texto/HTML)
    • Botón acción (si editable)
  • Footer: Botones “añadir nota” y “ver leídas”
Tarjetas de Cumpleaños:
  • Layout: Grid col-lg-3 (4 por fila)
  • Elementos:
    • Foto circular (miniprofile-pic)
    • Nombre paciente debajo
    • Edad en años
    • Opcionalmente fecha nacimiento
  • Click: Área completa clickeable
  • Hover: Efecto visual (generalmente ligero zoom o sombra)
Círculos de Estadísticas (epie-chart):
  • Librería: Easy Pie Chart
  • Visualización: Círculo progress con porcentaje
  • Colores: Degradado según porcentaje
    • Verde: 0-70%
    • Amarillo: 70-90%
    • Rojo: 90-100%
  • Estructura:
    • Título arriba
    • Lado izquierdo: Valor actual + unidad
    • Centro: Círculo animado
    • Lado derecho: “Límite” + valor máximo
Gráficos Morris:
  • Tipo: Area chart (gráfico de área)
  • Ejes:
    • X: Periodos (días o meses)
    • Y: Número de citas
  • Colores:
    • Rojo (#E67A77): “Mis citas”
    • Turquesa (#79D1CF): “Total citas” (solo admin)
  • Interactividad:
    • Hover sobre punto: muestra tooltip con valor exacto
    • hideHover: ‘auto’ (tooltip desaparece al quitar mouse)
  • Opciones:
    • behaveLikeLine: true (área se comporta como línea)
    • gridEnabled: false (sin grid de fondo)
    • fillOpacity: 0.7 (transparencia del área)
    • pointSize: 0 (sin puntos visibles)
    • lineWidth: 0 (sin línea visible, solo área)
Videos:
  • Videos locales:
    • Tag: <video controls>
    • Ancho: 100% (responsivo)
    • Controles nativos HTML5
  • Videos YouTube:
    • Tag: <iframe>
    • Dimensiones: width=100%, height=315px
    • allowfullscreen habilitado
  • Layout: Grid col-md-4 (3 por fila)

Iconos Principales

  • fa fa-home - Inicio (icono del módulo)
  • fa fa-chevron-down - Colapsar panel
  • fa fa-chevron-left / fa fa-chevron-right - Navegación calendario
  • fa fa-refresh - Recargar componente
  • fa fa-plus - Añadir nota
  • fa fa-external-link - Ver más (notas leídas, etc.)
  • fa fa-check - Marcar como completado (en timers o acciones)

Estados Visuales de Citas

EstadoValorColor FondoColor TextoClase Adicional
Programada1Azul (#5bc0de)Blanco-
Confirmada2Verde (#5cb85c)Blanco-
En sala3Amarillo/Naranja (#f0ad4e)Negrohpc-patientlabel-alert (parpadeo)
Atendida4Gris (#999)Blanco-
No asistió5Rojo (#d9534f)Blanco-
Cancelada6Blanco (#fff)Gris-
Clase especial hpc-patientlabel-alert:
  • Aplicada a citas en estado “En sala”
  • CSS con animación de parpadeo o pulsación
  • Llama atención visual sobre pacientes esperando

Niveles de Acceso

UsuarioDashboard BásicoEstadísticasGráficosControl HorarioNotas Paciente
Profesional✓ Sus citas/eventosOpcional (individual)✓ Lectura/Escritura
Recepcionista✓ Citas según permisosOpcional (individual)✗ o Solo lectura
Administrador✓ Todas las citas✓ Si configurado✓ Si configuradoOpcional (individual)✓ Todas
MasterAdmin✓ Completo✓ Siempre✓ SiempreGestión de todos✓ Todas

Restricciones

Visibilidad de Citas:
// Profesional ve:
WHERE appointment_user_id = [current_user_id]

// Recepcionista con permisos ver otras agendas:
WHERE (appointment_user_id = [current_user_id]
   OR appointment_user_id IN [usuarios_con_acceso])

// Admin ve todas del centro:
WHERE appointment_customer_id = [customer_id]
Visibilidad de Eventos:
  • Similar a citas
  • Filtrado por event_user_id
  • Eventos públicos (isprivate = 0) visibles para todos
Visibilidad de Wall Notes:
// Notas del usuario:
WHERE wallnote_user_id = [current_user_id] AND deleted = 0

// Notas de paciente (si aplica):
WHERE wallnote_patient_id = [patient_id] AND deleted = 0
Creación de Wall Notes:
  • Profesionales médicos: Pueden crear notas en fichas de pacientes
  • Recepcionistas: Según privilegio CREATE_WALLNOTES (si existe)
  • Administradores: Siempre pueden crear
Estadísticas:
  • Si no admin: secciones de estadísticas ni siquiera se renderizan (no solo ocultas)
  • Previene intentos de acceso vía inspección HTML
Configuración de Centro:
  • Solo MasterAdmin o usuarios con privilegeADM_CustomerModify pueden cambiar configuraciones
  • Afecta visibilidad de componentes para todos los usuarios del centro
Control Horario:
  • Configuración a dos niveles:
    1. Centro: allowUserTimeCheck() debe ser true
    2. Usuario individual: user->timecheck debe ser 1
  • Solo si ambos activos se muestra popup de registro

Reportes y Exportaciones

El módulo de Inicio (Dashboard) no incluye funcionalidades directas de exportación o impresión de reportes. Su propósito es visualización en pantalla de información del día. Datos visualizados:
  • Citas y eventos (pueden exportarse desde módulo Agenda)
  • Notas (pueden gestionarse desde módulo Pacientes)
  • Cumpleaños (datos de pacientes, exportables desde módulo Pacientes)
  • Estadísticas (visualización solo, sin exportación directa)
  • Gráficos (visualización solo, sin exportación directa)
Para reportes relacionados ver:
  • Módulo Listados: Reportes de citas, facturación, actividad
  • Módulo Agenda: Exportación de citas a Excel
  • Módulo Pacientes: Listados y exportación de pacientes
Gráficos:
  • Los gráficos Morris no tienen botón de exportación
  • Pueden capturarse con screenshot si es necesario
  • Datos subyacentes están en base de datos (tablas appointment)

️ Configuraciones Especiales

showBirthdaySectionOnMainPage()
  • Tipo: Boolean
  • Por defecto: Varía según centro
  • Efecto: Muestra/oculta panel “Hoy cumple años”
  • Configuración: Tabla hpc_customer, campo específico o método personalizado
  • Cuándo activar: Centros que quieren atención personalizada a pacientes
showStadisticsOnInitPage()
  • Tipo: Boolean
  • Por defecto: false (para evitar sobrecarga)
  • Efecto: Muestra/oculta círculos estadísticas y gráficos Morris
  • Requisito adicional: Usuario debe ser administrador
  • Cuándo activar: Centros con administradores que monitorean uso de recursos
  • Performance: Genera múltiples queries, puede ralentizar carga de dashboard
showNubidocVideosOnMainPage()
  • Tipo: Boolean
  • Por defecto: true (en instalaciones Nubidoc)
  • Efecto: Muestra/oculta sección de videos tutoriales
  • Configuración: Generalmente ligado a branding (Nubidoc sí, instalaciones privadas no)
  • Cuándo desactivar: Centros que no quieren contenido de formación en dashboard
allowCRM()
  • Tipo: Boolean
  • Por defecto: false (actualmente)
  • Efecto: Mostraría panel de “Comunicaciones” con interacciones
  • Estado actual: Desactivado con if (false) adicional
  • Cuándo activar: Funcionalidad CRM completa en futuro
patientBirthdayOnlyIfAppointment()
  • Tipo: Boolean
  • Por defecto: Varía según centro
  • Efecto: Filtra cumpleaños para mostrar solo pacientes con citas previas con el usuario
  • Cuándo activar: Centros multiprofesionales donde cada profesional tiene sus propios pacientes
  • Cuándo desactivar: Centros pequeños donde todos conocen a todos
allowUserTimeCheck()
  • Tipo: Boolean
  • Por defecto: false
  • Efecto: Habilita sistema de control horario (fichaje entrada/salida)
  • Requisito adicional: Usuario individual debe tener user->timecheck = 1
  • Cuándo activar: Centros que necesitan registro de jornada laboral
  • Funcionalidad:
    • Popup al iniciar sesión si no fichó entrada
    • Registro en tabla hpc_timeregistry
    • Reportes de jornada laboral

Configuraciones de Usuario Individual

user->timecheck
  • Tipo: TINYINT (0 o 1)
  • Efecto: Activa control horario para este usuario específico
  • Requiere: allowUserTimeCheck() activo a nivel centro
  • Gestión: Administración → Usuarios → Editar usuario
user->canchangeversion
  • Tipo: TINYINT (0 o 1)
  • Efecto: Muestra botón para cambiar versión de interfaz (legacy, actualmente desactivado)

Configuraciones de Videos

Tabla hpc_video:
Campos:
- video_id: INT (PK)
- video_filename: VARCHAR - Nombre del archivo (si es local)
- video_youtubeurl: VARCHAR - ID de YouTube (si es externo)
- video_title: VARCHAR - Título del video
- video_description: TEXT - Descripción
- deleted: TINYINT

Gestión:
- Administración → Videos (si existe módulo)
- O directamente en base de datos
Registro de visualizaciones:
  • Tabla: hpc_video_user
  • Al hacer play en video local: INSERT con video_id y user_id
  • Permite estadísticas de qué videos ve cada usuario

Plugins y Librerías JavaScript

CLNDR (Calendario):
  • Versión: Compatible con jQuery
  • Configuración actual:
    • weekOffset: 0 (semana empieza lunes)
    • showAdjacentMonths: true (muestra días del mes anterior/siguiente)
    • adjacentDaysChangeMonth: false (clic en día adyacente no cambia mes)
Morris.js (Gráficos):
  • Versión: Compatible incluida en Nubidoc
  • Tipos usados: Morris.Area (gráfico de área)
  • Configuración:
    • behaveLikeLine: true
    • gridEnabled: false
    • fillOpacity: 0.7
    • pointSize: 0 (sin puntos)
    • lineWidth: 0 (solo área, sin línea)
    • hideHover: ‘auto’
  • Colores personalizables: Modificar lineColors en código
Easy Pie Chart (Círculos estadísticas):
  • Clase CSS: .epie-chart
  • Data attribute: data-percent="XX" (0-100)
  • Inicialización: Automática por plugin
  • Colores: Definidos por CSS, gradiente según porcentaje

Tutorial 1: Revisar mi Agenda del Día

Objetivo: Consultar rápidamente qué citas y eventos tengo hoy Tiempo estimado: 30 segundos Pasos:
  1. Iniciar sesión en Nubidoc
    • Introduce usuario y contraseña
    • Haz clic en “Entrar”
  2. Dashboard se carga automáticamente
    • No es necesario hacer nada más
    • Pantalla muestra información del día actual por defecto
  3. Localizar sección “citas” (columna central)
    • Título: “citas”
    • Debajo del calendario
  4. Revisar listado de citas
    • Cada línea muestra: Hora - Nombre paciente
    • Color del badge indica estado:
      • Azul: Programada
      • Verde: Confirmada
      • Amarillo: En sala de espera (con timer)
      • Gris: Ya atendida
  5. Revisar sección “eventos” (debajo de citas)
    • Eventos personales o recordatorios del día
    • Formato: Nombre evento @ Hora
  6. Resultado
    • Visión completa de tu agenda del día en segundos
    • Sin necesidad de navegar a otros módulos

Tutorial 2: Consultar Citas de Otro Día del Mes

Objetivo: Ver qué citas tengo un día específico del mes actual Tiempo estimado: 15 segundos Pasos:
  1. Localizar calendario mensual (columna izquierda)
    • Muestra mes actual con todos los días
    • Día de hoy destacado visualmente
  2. Identificar día que deseas consultar
    • Puede ser día futuro o pasado del mes
  3. Hacer clic en el día
    • Un solo clic sobre el número del día
  4. Sistema recarga información central
    • Sección “citas” se actualiza con citas de ese día
    • Sección “eventos” se actualiza con eventos de ese día
    • Encabezado muestra: “[Día de semana] [Fecha]”
    • Ejemplo: “Martes 19/12/2025”
  5. Navegar a otro mes (si necesario)
    • Clic en flecha < (mes anterior)
    • Clic en flecha > (mes siguiente)
    • O usar teclas ← → del teclado
  6. Volver a hoy
    • Clic en día de hoy en calendario
    • O simplemente clic en “Inicio” del menú (recarga todo)

Tutorial 3: Atender Cita desde Dashboard

Objetivo: Acceder rápidamente a una cita del día para gestionarla Tiempo estimado: 1 minuto Pasos:
  1. Identificar cita a atender en listado
    • Columna central, sección “citas”
    • Buscar por hora o nombre de paciente
  2. Hacer clic en el link de la cita
    • Línea completa es clickeable
    • Ejemplo: clic en “10:00 - García Pérez, Juan”
  3. Se abre diálogo “Acciones de Cita”
    • Modal con opciones disponibles
  4. Seleccionar acción deseada: Opción A: Cambiar estado a “En sala”
    • Clic en botón “Marcar en sala”
    • Paciente pasa a sala de espera
    • Timer se inicia automáticamente
    Opción B: Ver/Editar detalles
    • Clic en “Ver detalles” o “Editar”
    • Se abre formulario completo de cita
    • Modificar notas, duración, etc.
    Opción C: Añadir nota clínica
    • Clic en “Añadir nota”
    • Escribir observaciones de la consulta
    • Guardar
    Opción D: Crear factura
    • Clic en “Crear factura”
    • Sistema pre-rellena con datos de la cita
    • Añadir servicios prestados
    • Guardar factura
  5. Completar acción seleccionada
    • Según opción elegida
  6. Cerrar diálogo
    • Clic en X o botón “Cerrar”
    • O automáticamente tras guardar
  7. Dashboard se actualiza
    • Estado de la cita refleja el cambio
    • Color del badge actualizado
    • Si cambió a “Atendida”: puede desaparecer del listado (según filtros)

Tutorial 4: Gestionar Notas Importantes

Objetivo: Leer y gestionar notas que requieren mi atención Tiempo estimado: 2 minutos Pasos:
  1. Al cargar dashboard, si hay notas con alerta:
    • Popup automático aparece con contenido de la nota
    • Título: “Nota”
    • Contenido completo visible
  2. Leer contenido del popup
    • Información importante que no puedes perderte
    • Puede ser recordatorio, aviso clínico, tarea urgente, etc.
  3. Cerrar popup
    • Clic en X o fuera del modal
    • Si hay varias notas con alerta: siguiente popup aparece automáticamente
  4. Revisar panel de notas (columna derecha)
    • Título: “Notas”
    • Lista de todas las notas pendientes (incluyendo las que alertaron)
  5. Leer cada nota en el panel:
    • Cabecera: Quién la creó y cuándo
    • Contenido: Texto de la nota
    • Acciones: Botones si es editable
  6. Marcar nota como leída (opcional):
    • Algunas notas tienen botón “Marcar leída”
    • Clic en el botón
    • Nota pasa a historial de leídas
  7. Añadir nueva nota (si eres profesional médico):
    • Botón verde ”+ añadir nota” al pie del panel
    • Solo visible si estás en contexto de paciente
    • Clic en botón
    • Se abre formulario de nueva nota
    • Escribir contenido
    • Opcionalmente: marcar “Alertar al lector”
    • Guardar
  8. Ver notas leídas (historial):
    • Clic en botón “ver notas leídas”
    • Se abre listado con notas antiguas ya leídas
    • Útil para consultar información pasada
  9. Refrescar panel de notas:
    • Clic en icono refresh (🔄) en header del panel
    • Recarga lista de notas por si hay nuevas

Tutorial 5: Monitorizar Recursos del Centro (Solo Admin)

Objetivo: Revisar uso de usuarios, pacientes, espacio y SMS Tiempo estimado: 2 minutos Requisitos previos:
  • Ser administrador del centro
  • Configuración showStadisticsOnInitPage() activa
Pasos:
  1. Abrir dashboard
    • Como admin, verás secciones adicionales
  2. Localizar fila de estadísticas
    • Debajo del resumen del día
    • 4 círculos con gráficos
  3. Revisar círculo “Nº de usuarios”:
    • Lado izquierdo: Usuarios actuales (ej. “5 usuarios”)
    • Centro: Gráfico circular con porcentaje lleno
    • Lado derecho: Límite del plan (ej. “Límite 10”)
    • Interpretación:
      • Verde (0-70%): Uso normal
      • Amarillo (70-90%): Cerca del límite
      • Rojo (90-100%): Límite casi alcanzado, considerar ampliar plan
  4. Revisar círculo “Nº de pacientes”:
    • Misma estructura
    • Pacientes creados vs límite del plan
    • Si estás cerca del límite: contactar con proveedor para ampliar
  5. Revisar círculo “Espacio en disco”:
    • Lado izquierdo: Espacio usado (ej. “2.3 GB”)
    • Lado derecho: Límite (ej. “Límite 5 GB”)
    • Interpretación:
      • Si >90%: Advertencia en log del servidor
      • Acción: Limpiar archivos innecesarios o ampliar plan
      • Archivos ocupan: PDFs de facturas, fotos de pacientes, documentos adjuntos
  6. Revisar círculo “Mensajes SMS”:
    • Lado izquierdo: SMS enviados (ej. “250 sms”)
    • Lado derecho: Total contratado (ej. “Límite 500”)
    • Interpretación:
      • Monitorizar para no quedarse sin SMS
      • Los SMS se usan para: recordatorios de citas, confirmaciones, avisos
      • Si se agota: contratar pack adicional
  7. Revisar gráfico “Citas de los últimos 30 días”:
    • Columna izquierda debajo de estadísticas
    • Línea roja: Tus citas día a día
    • Línea turquesa: Total de citas del centro
    • Hover sobre gráfico: Ver número exacto de un día
    • Utilidad: Identificar tendencias, días con más/menos actividad
  8. Revisar gráfico “Citas de los últimos 12 meses”:
    • Columna derecha
    • Mismas líneas pero por mes
    • Utilidad: Análisis de largo plazo, estacionalidad, crecimiento
  9. Tomar decisiones basadas en datos:
    • Si usuarios cerca del límite: planificar ampliación o gestionar inactivos
    • Si pacientes cerca del límite: actualizar plan antes de bloquearse
    • Si espacio >80%: iniciar limpieza de archivos antiguos
    • Si SMS se agotan: contratar más antes de quedarse sin
    • Si gráficos muestran caída: analizar causas, mejorar marketing
  10. Refrescar datos (si necesario):
    • Clic en “Inicio” del menú para recargar todo
    • Estadísticas se recalculan en tiempo real