Visión general del sistema

HelpMI es una plataforma web privada que gestiona el servicio de asesoramiento clínico semanal que la asociación MeGeMIT ofrece a los terapeutas especializados en microinmunoterapia de la región DACH. La plataforma cubre el ciclo completo: reserva de cita, recepción y gestión de casos, documentación post-consulta, y reporting estadístico.

Motivo del rediseño

El proveedor actual (Concloo CMS / TW-Datentechnik) cesa la relación. No se dispone de acceso al código fuente. El objetivo es reimplementar la funcionalidad completa desde cero con tecnología propia y mantenible.

MOD-01Agenda y citasVista de administración de todas las consultas, estados, creación manual
MOD-02Portal de reservaInterfaz pública embebida para que el terapeuta elija fecha/asesor y rellene la anamnesis
MOD-03DocumentaciónFormulario post-consulta del asesor: recomendaciones terapéuticas, productos, seguimiento
MOD-04Gestión terapeutasCRUD de terapeutas, seguimiento de membresía, frecuencia de uso
MOD-05Gestión asesoresVacaciones, sustituciones, horarios, envío de agenda
MOD-06Productos / medicamentosCatálogo de preparados de microinmunoterapia recomendables
MOD-07EstadísticasInformes periódicos: citas, productos, patologías, frecuencia de uso
MOD-08ConfiguraciónFestivos, parámetros de envío de agendas, ajustes globales

Contexto y funcionamiento del servicio

MeGeMIT ofrece a sus socios terapeutas un servicio semanal de consulta telefónica (o Zoom/WhatsApp) con médicos especialistas. Los terapeutas presentan casos clínicos de pacientes anonimizados y reciben orientación terapéutica y recomendación de productos de microinmunoterapia.

Dinámica semanal

Asesores activos (referencia)

AsesorHorario semanalDesde
Dr. med. Petra BlumLunes 15–18 h · Martes 9–12 h2000
Gunter Schlegel (médico privado)Miércoles 9–13 h2000
Dr. med. Ursula BubendorferJueves 9–12 h2000

Acceso al servicio — condiciones

Punto de acceso público

La reserva se realiza desde la web de MeGeMIT (megemit.org) en la sección "Para terapeutas → Asesoramiento a terapeutas", donde el portal de reserva está embebido como iframe. El portal de reserva es parte del alcance de este proyecto y se reimplementa junto al panel de administración. megemit.org no se toca — solo se actualizará la URL del iframe para apuntar al nuevo sistema.

Datos clínicos — privacidad

Anonimización obligatoria

El terapeuta debe subir la información del paciente de forma completamente anonimizada. Están prohibidos: nombre, fecha de nacimiento y número de asegurado. Los casos que contengan datos identificativos son eliminados inmediatamente. Este flujo debe reforzarse con avisos claros en la UI del portal de reserva.

Stack de la reimplementación

Stack elegido para el nuevo desarrollo. Prioriza productividad, mantenibilidad a largo plazo y madurez del ecosistema para el perfil de este proyecto (plataforma interna + portal embebible, equipo reducido, dominio CRUD con reglas de negocio específicas).

BackendLaravel 11 (PHP 8.3)
Panel adminFilament 3 — tablas, formularios, permisos y dashboard con código mínimo
Portal públicoLivewire 3 + Alpine.js — portal de reserva embebible como iframe, sin SPA separada
CSSTailwind CSS (incluido con Filament)
Base de datosMySQL 8.0
Cache / ColasRedis — colas de email y jobs asíncronos
AlmacenamientoLaravel Storage → S3 o MinIO (self-hosted) para documentos clínicos
EmailsLaravel Mail + Mailgun o Postmark — plantillas Blade, colas Redis
PermisosSpatie Laravel Permission — roles Admin, Berater, Terapeuta
Ficheros / mediaSpatie Media Library — gestión de documentos clínicos (PDF, JPEG, DOC)
AutenticaciónLaravel Fortify + pragmarx/google2fa para TOTP 2FA
ExportaciónLaravel Excel (Maatwebsite) — informes estadísticos en XLSX/PDF
CRM (ampliación)Laravel Events + Jobs — arquitectura preparada para sincronización con HubSpot (implementación en fase posterior)
Tareas programadasLaravel Scheduler — recordatorios, envío de agendas, limpieza
Multiidioma (UI)Laravel Localization (ficheros lang/) + mcamara/laravel-localization para routing con prefijo de locale
Multiidioma (BD)spatie/laravel-translatable — campos traducibles en modelos Eloquent (categorías, nombres de productos, plantillas de email)
DeployLaravel Forge + VPS (Hetzner / DigitalOcean) · Nginx + PHP-FPM
Por qué Filament 3 es la decisión clave

Sin Filament, el panel de administración (tablas con filtros, formularios, gestión de roles, estadísticas) representa el 50–60% del tiempo de desarrollo. Con Filament ese porcentaje baja al ~20%, ya que genera la UI a partir de la definición de los Resources en PHP. Livewire 3 aplica la misma filosofía al portal público, evitando un frontend JavaScript separado y manteniendo todo en un único repositorio Laravel.

Sistema original (referencia)

El sistema a sustituir se construyó sobre Concloo CMS (TW-Datentechnik) con IBM Lotus Domino/Notes como base de datos. Se documenta aquí solo como referencia para entender comportamientos existentes.

CMS / BackendConcloo CMS © 2009–2026 TW-Datentechnik / Thorsten Wessel
Base de datosIBM Lotus Domino / Notes (.nsf) — endpoint /MGM.nsf/
Frontend adminjQuery 1.9.1 + jQuery UI 1.10.3 + TinyMCE
AutenticaciónAJAX custom con SHA-256 + 2FA TOTP opcional
Dominio adminadmin.mgm.concloo.net
Dominio públicoservice.mgm.concloo.net (iframe en megemit.org)

Arquitectura de URLs del sistema actual

RutaMóduloAcceso
/Login / redirectPúblico
/Admin/DashboardDashboard administraciónAdmin
/Admin/TerminGestión de citasAdmin
/Admin/TherapeutGestión de terapeutasAdmin
/Admin/BeraterGestión de asesoresAdmin
/Admin/MedikamentCatálogo de productosAdmin
/Admin/StatistikEstadísticasAdmin
/Admin/EinstellungenConfiguraciónAdmin
/Berater/Vista del asesor (su agenda)Berater
/Therapeut/{País}/Termin/{UNID}Detalle de cita para el asesorBerater + Admin

Roles de usuario

Rol 1

Administrador

Acceso total a la plataforma. Gestiona toda la operativa.

  • Ver y editar todas las citas
  • Crear citas manualmente (teléfono, derivaciones)
  • Gestionar terapeutas y asesores
  • Configurar festivos, horarios, parámetros
  • Acceder a estadísticas completas
  • Ver comentarios internos
Rol 2

Asesor (Berater)

Médico especialista que atiende las consultas.

  • Ver su propia agenda de citas
  • Acceder al detalle de cada caso (anamnesis, documentos)
  • Registrar recomendaciones terapéuticas y productos
  • Marcar citas como completadas
  • Añadir comentario interno
  • Los sustitutos tienen el mismo acceso durante vacaciones
Rol 3

Terapeuta (externo)

Accede solo a través del portal público. Sin login en el admin.

  • Reservar cita (fecha + asesor)
  • Rellenar anamnesis del caso
  • Subir informes clínicos
  • Modificar o cancelar su cita
  • No puede ver recomendaciones del asesor

Agenda y gestión de citas

Vista principal de administración. Muestra todas las citas del sistema en una tabla paginada y filtrable. Permite al administrador gestionar el estado de las consultas y crear citas de forma manual.

Columnas de la tabla de citas

Campo (DE)Campo (ES)Notas
DatumFecha y horaOrdenable
TherapeutNombre del terapeutaOrdenable; badge visual si no es socio
ThemaTema (categoría + subcategoría)Seleccionado por el terapeuta al reservar
BeraterAsesor asignadoOrdenable
KommentarComentario del terapeutaTexto libre del terapeuta
erledigtCompletada (sí/no)Campo de estado resaltado visualmente
Interner KommentarComentario internoSolo visible para asesor y administrador
einlad.Agenda enviadaSi se ha enviado el email de agenda al asesor
FAX-CodeCódigo de faxCódigo autogenerado para asignar documentos enviados por fax
FallnummerNúmero de casoIdentificador único del caso, útil para seguimientos

Estados de una cita

Activa / Pendiente Completada (erledigt) Cancelada (por terapeuta)

Creación manual de citas

El administrador puede crear citas directamente en la plataforma, por ejemplo cuando la reserva llega por teléfono o vía compañeros. El formulario es el mismo que el público pero accesible desde el panel de administración.

Indicadores visuales

Portal de reserva pública

Segunda aplicación dentro del mismo proyecto Laravel. Equivale al actual service.mgm.concloo.net y forma parte del alcance del rediseño. Se servirá desde su propia URL y megemit.org lo seguirá embebiendo exactamente igual que ahora, cambiando únicamente la URL del iframe. No requiere login separado — el terapeuta se identifica con un token firmado generado a partir de su email.

Flujo de reserva del terapeuta

1
Selección de fecha y asesor El terapeuta elige la fecha deseada en un calendario y el asesor preferido. Los slots son siempre de 30 minutos. Los festivos y vacaciones de asesores están bloqueados automáticamente.
2
Relleno de anamnesis Completa los campos del caso clínico: tema principal, subtema, descripción libre del caso. Acepta la política de protección de datos.
3
Subida de informes (opcional) Puede adjuntar documentos clínicos anonimizados: JPEG, PDF, EPS, Word. El sistema asigna un código de fax al caso para recibir documentos vía fax.
4
Confirmación Recibe email automático de confirmación con el número de caso y el código de fax.
5
Gestión post-reserva Desde la confirmación puede: añadir más documentos, modificar información del caso, cambiar la fecha o cancelar la cita.

Campos del formulario de reserva

Campo (DE)TipoValores / Notas
Termin — Fecha y slotDate + time selectorSlots fijos de 30 min. El tiempo real de llamada puede ser menor pero el slot siempre bloquea 30 min en el calendario.
Berater — AsesorSelectorLista de asesores disponibles para esa fecha
Betreff — Motivo de consultaSelectFallbesprechung · Interpretation Laboruntersuchungen · Sonstiges
Hauptthema — Categoría principalSelectVer taxonomía completa más abajo
Unterkategorie — SubcategoríaSelect dependienteOpciones según Hauptthema seleccionado
Weitere Angaben — Descripción del casoTextarea libreCampo principal de anamnesis. Texto libre extenso del terapeuta sobre el caso.
Geschlecht — Sexo del pacienteSelectweiblich · männlich · (Bitte auswählen)
Alter — Rango de edadSelect6-10 · 11-15 · 16-20 · 21-25 · 26-30 · 31-40 · 41-50 · 51-60 · 61-70 · 71-80
Gewicht — Peso (kg)NúmeroPeso del paciente en kilogramos
Größe — Altura (cm)NúmeroAltura del paciente en centímetros
PLZ — Código postalTextoCódigo postal del terapeuta (para localización geográfica en estadísticas)
Datenschutz — Protección de datosCheckboxObligatorio para continuar
Befunde — Documentos clínicosFile upload múltipleFormatos: JPEG, PDF, EPS, DOC/DOCX. Datos del paciente obligatoriamente anonimizados.

Taxonomía completa de categorías (Hauptthema / Unterkategorie)

Extraída de datos reales de producción (marzo 2026). Configurable por el administrador.

HauptthemaUnterkategorien
AllergieMastzellenaktivierungssyndrom · Pollinose
AutoimmunerkrankungAlopecia Areata · Andere autoimmune Erkrankung · Hashimoto bzw. Autoimmun-Thyreoiditis · Typ-1-Diabetes · rheumatoide Arthritis · nicht definiert
Bewegungsapparat und ZähneArthritis · Rheuma · Zahnprobleme
COVIDLong / Post COVID · Post-Vac Syndrom
DarmerkrankungAndere Darmerkrankung
DermatologieAndere dermatologische Erkrankung · Neurodermitis · Psoriasis
GynäkologieDurch HPV ausgelöste nicht onkologische Erkrankung (z.B. Feigwarzen) · Kinderwunsch
Infektion oder ReaktivierungAndere Erreger · CMV · Chlamydien · EBV · Herpes 1 oder 2 · Rezidivierende Atemwegsinfekte · Zoster · nicht definiert
Innere MedizinPneumologie
NeurologieAndere neurologische Erkrankung · Parkinson
OnkologieLymphom, Myelom oder leukämische Erkrankung · Melanom · nicht definiert
PsycheAnderes psychisches Leiden · Depression
SonstigesSonstiges
nicht definiertnicht definiert

Límites del calendario

Documentación de la consulta (Asesor)

Tras la llamada, el asesor accede al detalle de la cita y registra la documentación clínica. Esta información es solo visible para el asesor y el administrador, no para el terapeuta.

Vista previa de la cita

Un día antes, el asesor recibe por email un enlace con su agenda completa del día y los links a cada caso. Puede revisar la anamnesis y los documentos adjuntos antes de la llamada.

Sección: Productos recomendados (Empfohlene Präparate)

Cuadrícula de checkboxes con todos los preparados del catálogo. El asesor selecciona los que recomienda para ese caso.

Preparados serie 2L

ALERGARTHC1C1-NC2CHLACL1CL2CLMCMVDEPDMLAEAIEBVEIDEID-NHAHCHCXHERPINFLAMKAHLNH1MdAMEM-SENIORMICIMIREGMISENOSTEO-NPAPIPARKPRPSOS1S2SENSEPSLEEPREGTNMTOXOVERUVERU JUNIORXFSZONA

Otros preparados

ADN 8CHARN 8CHBMP-2 5CHBMP-4 5CHIFN-α 4CHIFN-α 27CHIFN-γ 4CHIFN-γ 27CHIL-1 4CHIL-1 27CHIL-2 4CHIL-2 27CHIL-6 4CHIL-6 27CHTNFα 4CHTNFα 27CHRANTES 27CH

Sección: Formación recomendada (Empfohlene Hilfen)

Sección: Comentario interno

Campo de texto libre donde el asesor registra la recomendación terapéutica y los próximos pasos del caso. Nunca visible para el terapeuta.

Cierre del caso

El asesor marca la cita como completada (erledigt). El caso permanece en el sistema (importante para casos complejos con seguimiento). El asesor también puede enviar información adicional (formaciones, etc.) al responsable vía el CRM integrado.

Gestión de terapeutas

CampoTipoDescripción
nombreTextoNombre completo del terapeuta
emailEmailIdentificador único; usado para autenticar en portal público
paísSelectAparece en la URL de sus citas (ej. /Therapeut/Germany/)
es_socioBooleanMembresía MeGeMIT activa. Controlado por el admin
usos_sin_socioContadorNúmero de veces que ha usado el servicio sin ser socio (límite: 2)
hubspot_contact_idID externoID del contacto en HubSpot (se rellena cuando se implemente la sincronización)

Lógica de no-socios

  1. El terapeuta puede reservar sin ser socio hasta 2 veces
  2. Al superar el límite, se le bloquea la reserva y recibe un email automático explicando las ventajas de la membresía y cómo hacerse socio
  3. En la vista admin, los no-socios aparecen visualmente señalados en el listado de citas

Gestión de asesores médicos

CampoTipoDescripción
nombreTextoNombre del asesor
emailEmailPara login y para envío de agendas
horario_semanalSlotsDías y franjas horarias de consulta (define disponibilidad en calendario)
dias_agendaIntegerDías de antelación con que recibe el email de agenda (configurable por asesor)
vacacionesRangos de fechasPeriodos de ausencia — bloquean su disponibilidad en el calendario
sustituto_idFK AsesorAsesor sustituto durante vacaciones; recibe pleno acceso en ese periodo

Email de agenda del asesor

El sistema envía automáticamente al asesor su agenda del día X días antes (configurable individualmente). El email incluye la lista de citas con enlace directo a cada caso para que pueda prepararse con antelación.

Catálogo de productos / medicamentos

El administrador mantiene el listado de preparados disponibles en la plataforma. Este listado se utiliza como fuente para los checkboxes de recomendación que rellena el asesor post-consulta.

CampoTipoDescripción
codigoTextoCódigo del preparado (ej. 2L EBV, RANTES 27CH)
nombre_displayTextoNombre completo para mostrar en formularios
serieEnumClasificación del producto (ej. "Serie 2L", "Otros")
activoBooleanSi aparece en el formulario del asesor
ordenIntegerOrden de visualización en el formulario

Estadísticas e informes

El administrador puede generar informes en distintos periodos de tiempo. Los informes se exportan (formato no especificado; recomendar PDF y Excel).

Periodos disponibles

Mensual Trimestral Semestral Anual

Contenido de los informes

MétricaDescripción
Número de citasTotal de consultas realizadas en el periodo, desglosadas por asesor y país
Productos recomendadosFrecuencia de recomendación de cada preparado; ranking de los más prescritos
Principales patologíasRanking de categorías y subcategorías más frecuentes
Terapeutas y frecuencia de usoListado de terapeutas con número de consultas y tendencia

Exportación mensual (formato CSV / XLSX)

Verena Heufler recibe mensualmente un fichero XLSX con el detalle completo de todas las citas del mes. El sistema debe generar este archivo automáticamente. Las columnas exactas extraídas del CSV de producción son:

#ColumnaDescripción
1TerminFecha, día de semana y franja horaria (ej. "MO 02.03.26 15:00-15:30")
2LandPaís del terapeuta (Germany / Austria / Switzerland)
3PLZCódigo postal del terapeuta
4VornameNombre del terapeuta
5NachnameApellido del terapeuta
6hubspot-IDID del contacto en HubSpot (actualmente Solve360; campo a actualizar)
7MitgliedMembresía MeGeMIT: Ja / Nein
8BetreuerCoordinador interno asignado al terapeuta
9BeraterAsesor médico que atendió la consulta
10BetreffMotivo de la consulta (Fallbesprechung / Interpretation Laboruntersuchungen / Sonstiges)
11HauptthemaCategoría principal de patología
12UnterkategorieSubcategoría de patología
13Weitere AngabenTexto libre de anamnesis del terapeuta
14GeschlechtSexo del paciente
15AlterRango de edad del paciente
16GewichtPeso en kg
17GrößeAltura en cm
18–782L ALERG … RANTES 27CHUna columna por producto (61 total); valor X = recomendado, — = no recomendado

Configuración del sistema

ParámetroTipoDescripción
FestivosListado de fechasFechas bloqueadas automáticamente en el calendario de reservas. Configurable por país/región.
Límite uso no-sociosIntegerNúmero de veces que un no-socio puede usar el servicio antes del bloqueo (actual: 2)
Días antelación agendaInteger por asesorCon cuántos días de antelación recibe cada asesor su email de agenda
Categorías / temasÁrbol jerárquicoHauptkategorie + Unterkategorie seleccionables por el terapeuta al reservar
Textos de emailsPlantillasContenido de los emails automáticos (confirmación, recordatorio, agenda, membresía)

Entidades principales y campos

Termin — Cita / Caso clínico

Entidad central del sistema. Cada cita es a la vez un expediente clínico del caso.

id / UNIDUUID (32 hex)
fecha_horaDateTime
terapeuta_idFK Therapeut
asesor_idFK Berater
paisEnum DE/AT/CH
fallnummerString (autogen)
fax_codeString (autogen)
duracion_slotInteger (fijo: 30)
betreuer_idFK Betreuer
betreffEnum
hauptkategorieFK Kategorie
unterkategorieFK SubKategorie
weitere_angabenText (anamnesis)
plzString
geschlechtEnum
alter_bereichEnum (rangos)
gewicht_kgInteger
groesse_cmInteger
interner_kommentarText (privado)
erledigtBoolean
einladung_gesendetBoolean
produkteArray FK Medikament
hilfenArray Enum
weitere_hilfenText
dokumenteArray FileRef
created_atDateTime
updated_atDateTime

Therapeut — Terapeuta

idUUID
nombreString
emailEmail (único)
paisEnum DE/AT/CH
es_socioBoolean
usos_sin_socioInteger (0–2)
hubspot_contact_idString (nullable)
aceptacion_rgpdDateTime

Berater — Asesor médico

idUUID
nombreString
emailEmail
password_hashSHA-256
totp_secretString (2FA)
horario_slotsJSON
dias_agendaInteger
sustituto_idFK Berater
vacacionesArray DateRange

Medikament — Preparado

idUUID
codigoString
nombre_displayString
serieEnum
ordenInteger
activoBoolean

Kategorie — Tema / Patología

idUUID
nombreString (DE)
parent_idFK self (nullable)
ordenInteger

Betreuer — Coordinador interno

Personal interno de MeGeMIT asignado como referente de cada terapeuta. Aparece en cada cita del informe mensual. Pendiente de confirmar si los Betreuer tienen acceso propio a la plataforma o si es únicamente un campo de asignación gestionado por el administrador.

idUUID
nombreString
cargoString (ej. "Medical Science Liaison")
emailEmail
activoBoolean
Aclarar con el cliente

Los Betreuer identificados en datos reales son: Anita Bauza, Anja Chmurek, Francesca Santonoceto, Heike Seita, Jana Stümke, Katja Hansen, Sevgi Yaman (Medical Science Liaison), Susanne Hägele y Verena Heufler. Confirmar si necesitan login propio en el sistema o si la gestión de asignaciones la hace únicamente el administrador.

Feiertag — Festivo

fechaDate
paisEnum DE/AT/CH/ALL
descripcionString

Flujos de email automático

Reglas de negocio críticas


Multiidioma

El sistema soporta múltiples idiomas desde el inicio. El alemán (de) es el idioma principal y de referencia. Los idiomas adicionales se añaden sin cambios estructurales. Hay dos capas de traducción con soluciones distintas que deben tratarse por separado.

Capa 1 — Cadenas de la interfaz

Todos los textos estáticos de la UI (etiquetas, botones, mensajes de error, emails) se externalizan en ficheros de traducción Laravel (lang/{locale}/). El idioma activo se determina por prefijo de URL.

ElementoMecanismoEjemplo
Textos UI admin y portalFicheros lang/de/, lang/en/…__('appointment.confirm')
Routing con localemcamara/laravel-localization/de/termin, /en/appointment
Panel FilamentFilament soporta locale por usuario (configurable en perfil)Admin en DE, asesor en EN
Emails automáticosPlantillas Blade por locale; se envía en el idioma del destinatarioemails/de/confirmation.blade.php
Datepicker / formatos de fechaCarbon locale + configuración de formato por idiomaDE: dd.mm.yyyy · EN: mm/dd/yyyy

Capa 2 — Contenido traducible en base de datos

Los datos gestionados por el administrador que deben mostrarse en el idioma del usuario se almacenan como campos JSON multiidioma mediante spatie/laravel-translatable. El administrador introduce las traducciones desde el panel de Filament.

ModeloCampos traducibles
Kategorienombre — el terapeuta ve la categoría en su idioma al reservar
Medikamentnombre_display — nombre del preparado en cada idioma
Plantillas de emailasunto, cuerpo — el email se envía en el idioma del terapeuta
ConfiguraciónTextos de avisos y condiciones de uso mostrados al terapeuta

Estructura del campo traducible en BD

// Columna JSON en MySQL — spatie/laravel-translatable
{
  "de": "Autoimmunerkrankung",
  "en": "Autoimmune disease",
  "fr": "Maladie auto-immune"
}

// Acceso en código — devuelve el valor del locale activo automáticamente
$kategorie->nombre          // → "Autoimmune disease" (si locale = en)
$kategorie->getTranslation('nombre', 'de')  // → "Autoimmunerkrankung"

Estrategia de locale por contexto

ContextoCómo se determina el locale
Portal de reserva (terapeuta)Prefijo de URL (/de/, /en/…). megemit.org pasa el locale en la URL del iframe.
Panel admin / asesorPreferencia guardada en el perfil del usuario. Por defecto: alemán.
Emails automáticosLocale del terapeuta destinatario (campo locale en el modelo Therapeut).

Idiomas iniciales y ampliación

Alemán como idioma de referencia

Todos los textos se escriben primero en alemán (de). Los ficheros lang/de/ son la fuente canónica. Añadir un nuevo idioma consiste en crear su carpeta lang/{locale}/, traducir los ficheros de cadenas y añadir las traducciones de BD desde el panel de administración — sin ningún cambio de código.

LocaleEstadoNotas
de — AlemánIdioma principalCompleto desde el inicio. Referencia para todas las traducciones.
Otros idiomasAmpliablesLa arquitectura los soporta desde el día 1. Se añaden traduciendo los ficheros lang/ y el contenido de BD.

Campo locale en el modelo Therapeut

Se añade el campo locale al modelo del terapeuta para que los emails automáticos se envíen siempre en su idioma, independientemente del idioma en que el administrador esté usando el panel.

localeEnum (ej. 'de','en'…)

Integraciones externas

Iframe en megemit.org

megemit.org no forma parte del alcance y no se modifica. El portal de reserva del nuevo sistema se servirá desde su propia URL; el único cambio necesario en megemit.org es actualizar la URL del <iframe> para apuntar al nuevo dominio. El comportamiento del embed es idéntico al actual.

HubSpot CRM — Ampliación futura

La sincronización con HubSpot no forma parte del alcance inicial pero el sistema se construirá con la arquitectura preparada para implementarla en una fase posterior sin cambios estructurales.

Patrón de integración a implementar

El sistema publicará eventos de dominio internos al completar acciones clave. Un adaptador HubSpot (desacoplado) consumirá esos eventos de forma asíncrona via Laravel Jobs. Cuando se decida implementar la sincronización, solo hay que desarrollar el adaptador — el resto del sistema no cambia.

Eventos de dominio preparados para HubSpot

Evento internoDato que enviará a HubSpot
AppointmentCompletedRegistro de consulta en el contacto del terapeuta (fecha, asesor, productos recomendados, categoría)
TherapistCreatedCreación o actualización del contacto en HubSpot
TherapistMembershipChangedActualización del campo de membresía en el contacto
// Estructura del patrón — el adaptador es lo único que se implementa en fase 2
AppointmentCompleted  →  [EventBus]  →  HubSpotSyncJob  →  HubSpot Contacts API
TherapistCreated      →  [EventBus]  →  HubSpotSyncJob  →  HubSpot Contacts API
Pendiente de definir antes de implementar HubSpot

Acordar con el cliente qué propiedades de contacto y actividades de HubSpot reciben cada evento, y si se usará la API privada de HubSpot o un token de aplicación. Esta definición no bloquea el desarrollo inicial.

Resumen de integraciones

SistemaPropósitoAlcance
megemit.org (WordPress)Embebe el portal de reserva vía iframeNo se toca — solo se cambia la URL del iframe
Sistema de emailConfirmaciones, recordatorios, agendas de asesoresIncluido en el alcance inicial
HubSpotSincronización de terapeutas y consultas al CRMArquitectura preparada — implementación en fase posterior

Arquitectura de API interna

El sistema actual usa un único endpoint AJAX (POST /ajax) para todas las interacciones del cliente. La reimplementación debería seguir una arquitectura REST o GraphQL estándar, pero se documenta aquí el patrón actual como referencia.

Patrón de request actual

POST /ajax
Content-Type: application/x-www-form-urlencoded

Request={TipoAccion}&campo1=valor1&campo2=valor2

Patrón de response

{
  "Status":  "OK | Error | TOTP | GPWD",
  "HTML":    "<html a inyectar en el DOM>",
  "Target":  "/redirect/url",
  "Comment": "Mensaje de alerta para el usuario",
  "Content": "<html de modal>",
  "submit":  "nuevo handler JS",
  "focus":   "#selector-elemento",
  "ut":      "user token",
  "uc":      "user CNID",
  "ud":      "debug flag"
}

Tipos de acción conocidos

checkLogin gpwd (reset password) fl (file list) name (file naming) + acciones no documentadas por UI action

Upload de ficheros

POST /cgi-bin/fileupload.cgi
Content-Type: multipart/form-data

# Formatos aceptados: JPEG, PDF, EPS, DOC, DOCX
# Almacenamiento interno (referencia):
# {Codigo}##YY##{Filename}##YY##{MIMEtype}##YY##{Bytes}
# Múltiples ficheros: {file1}##**##{file2}##**##...

Autenticación y seguridad

Sistema actual

  1. El cliente envía email + sha256(urlencode(password)) vía AJAX
  2. El servidor responde con token de sesión o solicita TOTP
  3. El cliente almacena CNCLUC, CNCLUNID, CNCLDEBUG como cookies

Recomendaciones para la reimplementación

A considerar

La reimplementación debe implementar: autenticación JWT o sesiones con CSRF token; 2FA TOTP (ya presente en el sistema actual — los asesores pueden tenerlo activado); HTTPS obligatorio; almacenamiento de passwords con bcrypt/argon2 (no SHA-256 directo); política de expiración de sesión; y logging de accesos.

Identificación del terapeuta en el portal público

El portal público identifica al terapeuta mediante un token SHA-256 generado a partir de su email + timestamp. La URL tiene la forma:

https://service.mgm.concloo.net/{sha256token}&user={email}&ts={timestamp}

La reimplementación debe definir un mecanismo equivalente seguro (magic link, token firmado con expiración, etc.).


Preguntas pendientes — confirmar con Verena Heufler

Estas cuestiones no han podido resolverse con la documentación interna ni con el análisis del CSV. Deben confirmarse con Verena antes de iniciar el desarrollo para evitar suposiciones que luego requieran refactorización.

Roles y accesos

#PreguntaImpacto si no se aclara
1 ¿Los Betreuer (coordinadores internos) tienen acceso propio a la plataforma, o son únicamente un campo de asignación que gestiona el administrador? Determina si hay que crear un cuarto rol con login, o si es solo un catálogo de nombres.
2 ¿Los asesores (Berater) tienen acceso únicamente a sus propias citas, o pueden ver las de otros asesores en algún contexto? Afecta a las reglas de visibilidad en las queries y el panel Filament.
3 ¿Hay más perfiles de administrador con distintos niveles de acceso, o todos los administradores tienen acceso total? Define si hace falta granularidad dentro del rol Admin.

Flujos de email

#PreguntaImpacto si no se aclara
4 ¿Cuál es el contenido exacto de cada email automático? (confirmación de reserva, recordatorio 24h, agenda del asesor, email a no-socios). ¿Hay plantillas actuales que pueda compartir? Sin los textos reales hay que redactarlos desde cero, con riesgo de no replicar el tono y la información esperada.
5 El email de agenda al asesor, ¿incluye el detalle completo de cada caso (anamnesis, documentos adjuntos) o solo el listado de citas con el enlace? Determina el contenido y la complejidad de la plantilla del email de agenda.
6 ¿Se envía algún email al asesor cuando se cancela una cita? ¿Y al administrador? Flujo de cancelación no documentado.

Calendario y reservas

#PreguntaImpacto si no se aclara
7 ¿El límite de 2 citas por terapeuta y día aplica por asesor o en total para todo el día de consulta? Cambia la lógica de validación en el calendario.
8 Cuando un asesor tiene sustituto durante vacaciones, ¿el sustituto ve solo las citas de ese periodo o toda la historia del asesor sustituido? Afecta al scope de la query del rol Berater durante sustituciones.
9 ¿Los festivos se configuran manualmente cada año o hay un conjunto base por país que se aplica automáticamente? Decide si integrar una librería de festivos por país o mantenerlo como CRUD manual.

Datos y exportación

#PreguntaImpacto si no se aclara
10 El informe mensual XLSX, ¿lo genera el sistema automáticamente y lo envía por email, o Verena lo descarga manualmente desde la plataforma? Determina si hay que implementar un job programado de envío o solo una función de exportación bajo demanda.
11 ¿Existe algún otro informe o exportación además del mensual (ej. listado de terapeutas, productos por asesor)? Puede ampliar el alcance del módulo de estadísticas.
12 Los documentos clínicos subidos por los terapeutas, ¿tienen alguna política de retención o eliminación automática después de X tiempo? Afecta a la configuración del almacenamiento y posible RGPD.

Integración con megemit.org

#PreguntaImpacto si no se aclara
13 ¿El portal de reserva muestra los tres asesores siempre, o filtra automáticamente según el país del terapeuta? Determina la lógica de disponibilidad en el calendario público.
14 ¿El terapeuta necesita estar registrado previamente en el sistema para poder reservar, o puede hacerlo cualquiera con email? Define si el portal de reserva requiere verificación de identidad previa.
15 ¿Hay idiomas específicos requeridos en el portal de reserva además del alemán? ¿Se necesita inglés desde el inicio? Prioriza qué traducciones deben estar listas en el lanzamiento.

HubSpot (ampliación futura)

#PreguntaImpacto si no se aclara
16 ¿Qué propiedades de contacto de HubSpot deben actualizarse con cada consulta completada? ¿Se usan propiedades estándar o personalizadas? Necesario para diseñar el payload del adaptador HubSpot cuando se implemente.
17 ¿Se deben registrar las consultas como Activities en HubSpot (notas, llamadas) además de actualizar propiedades del contacto? Cambia significativamente la complejidad de la integración.
Nota para el desarrollador

Este documento recoge la funcionalidad del sistema existente extraída de la plataforma en producción y la documentación interna disponible a julio de 2026. Puede haber funcionalidades menores no documentadas. Las preguntas de la sección anterior deben resolverse con Verena Heufler antes de iniciar el desarrollo. La sincronización con HubSpot queda fuera del alcance inicial; el sistema se entregará con la arquitectura de eventos preparada para implementarla en una fase posterior.