EIPSI Forms
Wordpress
by Mathias N. Rojas de la Fuente · github.com/minorett/eipsi-forms-plugin · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/minorett/eipsi-forms-plugin/archive/refs/heads/main.zipEIPSI Forms - Professional Form Builder for Clinical Research
Plugin multipágina diseñado para psicólogxs y psiquiatras hispanohablantes.
«Por fin alguien entendió cómo trabajo de verdad con mis pacientes»
📋 Versión Actual: 2.5.3
Compatibilidad: WordPress 5.8+ | PHP 7.4+ | Tested up to WP 6.7
Instalación: Download ZIP → Upload to /wp-content/plugins/ → Activate
🚀 Quick Start
Instalación Rápida
# Clonar o descargar el plugin
cd /wp-content/plugins/
git clone https://github.com/eipsi/eipsi-forms.git
cd eipsi-forms
# Instalar dependencias y compilar
npm install
npm run build
Crear tu primer formulario
- Ir a WordPress Admin → Posts/Pages → Add New
- Agregar bloque "EIPSI Form Container" desde el editor Gutenberg
- Dentro del container, agregar bloques de campos:
Campo Texto,Campo Textarea,Campo Radio,Campo SelectCampo Likert,VAS Slider(escalas visuales analógicas)Consent Block(consentimiento informado)
- Publicar y el formulario está listo para recibir respuestas
Ver resultados
- Admin → EIPSI Forms → Cross-sectional Study → Submissions
- Exportar a Excel (.xlsx) o CSV con un click
✨ Features Principales
📊 Longitudinal Studies (Estudios Longitudinales)
Sistema completo para estudios con múltiples tomas (T1, T2, T3...) con seguimiento de participantes.
Características:
- Multiple Waves: Configura hasta N tomas con intervalos personalizables
- Magic Links: Links seguros con TTL 30 min, one-time use, auto-login
- Participant Management: CRUD completo, importación CSV, estados activo/inactivo
- Email Automation: Bienvenida, recordatorios por wave, confirmaciones, recuperación de dropouts
- Session Management: Sesiones de 7 días, cookies seguras (HttpOnly, Secure, SameSite)
- Wave Completion Tracking: Seguimiento de progreso por participante y wave
- Setup Wizard: Crea estudios en 3 pasos con templates pre-configurados
Shortcodes:
[eipsi_survey_login] // Portal de login para participantes
[eipsi_participant_dashboard] // Dashboard personal del participante
[eipsi_longitudinal_study id="123"] // Formulario de estudio específico
🎲 Randomized Controlled Trials (RCT)
Sistema de aleatorización completo para ensayos clínicos controlados.
Características:
- Configuración de brazos: Múltiples brazos con probabilidades custom
- Fingerprinting robusto: Canvas, WebGL, Screen, Timezone, Language, Hardware (CPU, RAM) ⚠️ Audio/Fonts: No implementado
- Métodos de aleatorización:
seeded- Reproducible para auditoríapure-random- Aleatoriedad criptográfica
- Dashboard en tiempo real: Estadísticas de asignación por brazo
- Manual overrides: Asignación manual para casos especiales
Shortcodes:
[eipsi_randomized_form configuration_id="456"]
[eipsi_randomized_form_page configuration_id="456"]
🏥 Pool Hub v2.5.3 (Longitudinal Pools)
Sistema avanzado de asignación aleatoria de participantes a estudios longitudinales con tracking completo y analytics.
Características:
- Pools de estudios: Agrupa múltiples estudios longitudinales con configuración JSON estructurada
- Weighted Random Assignment: Dos métodos de aleatorización:
seeded- Asignación determinística reproducible (mismo participante = mismo estudio)pure-random- Aleatoriedad criptográfica para máxima imparcialidad
- Persistencia de asignaciones: Tabla
eipsi_pool_assignmentspara tracking completo - Analytics diarios: Tabla
eipsi_pool_analyticscon métricas de asignaciones y completitud - Dashboard v3: Visualización de estadísticas, completitud, y estado de pools
- Re-asignación configurable: Permitir o bloquear re-asignación después de completar
- Migración automática: Función
eipsi_migrate_pools_to_v2()para migrar formatos viejos
Tablas de base de datos:
wp_eipsi_longitudinal_pools- Configuración de poolswp_eipsi_pool_assignments- Asignaciones de participanteswp_eipsi_pool_analytics- Analytics diarios por pool/estudio
Shortcodes (backward compatible):
[eipsi_pool pool_id="789"] // Shortcode nuevo (v2.5.3)
[eipsi_pool pool_id="789" method="seeded"] // Especificar método
[eipsi_pool_join pool_id="789"] // Legacy alias (v2.1.0+)
Testing E2E:
// tests/test-pool-hub-e2e.php
require_once __DIR__ . '/tests/test-pool-hub-e2e.php';
eipsi_e2e_run_all_tests();
Estado: ✅ v2.5.3 - Sistema completo con migración, analytics, y testing E2E.
📧 Email Service
Sistema de emails transaccionales con templates HTML y logging completo.
Templates disponibles:
welcome.php- Bienvenida con Magic Link inicialwave-reminder.php- Recordatorio de toma pendientewave-confirmation.php- Confirmación de recepcióndropout-recovery.php- Mensaje "Te extrañamos"magic-link.php- Links seguros de accesogentle-reminder.php- Recordatorios empáticos
Características técnicas:
- Logging en
wp_survey_email_log - Retry mechanism para envíos fallidos
- SMTP integration configurable
- Placeholders dinámicos:
{name},{study_name},{wave_date},{magic_link}
📈 Monitoring Dashboard
Panel de monitoreo integral para administradores.
Métricas disponibles:
- Email Stats: Enviados, fallidos, bounce rate
- Cron Jobs: Estado, última ejecución, health indicator
- Sessions: Activas, expiradas, unused
- Database Health: Integridad de tablas
- Audit Log: Historial de acciones administrativas
🔐 Security & Privacy
Diseñado para cumplir con estándares de investigación clínica.
Seguridad:
- Rate limiting: 5 intentos de login / 15 minutos
- Session TTL: 7 días
- Magic link TTL: 30 minutos
- Cookie flags: HttpOnly, Secure, SameSite=Lax
- Nonce verification en todos los AJAX handlers
- Prepared statements en todas las queries SQL
Privacidad (GDPR compliant):
- IP configurable (OFF por defecto)
- Browser/OS/Screen OFF por defecto
- Data Request Portal para participantes
- Admin-initiated anonymization
- Audit logging completo
- Retention policy enforcement
💾 Export System
Exportación de datos en múltiples formatos.
Formatos:
- Excel (.xlsx) con estilos
- CSV (UTF-8 compatible)
Filtros disponibles:
- Por estudio/survey
- Por wave
- Por rango de fechas
- Por estado (pending/submitted)
Stats incluidos:
- Tasa de finalización
- Tiempos de respuesta
- Distribución de respuestas
🧱 12 Gutenberg Blocks
Bloques diseñados específicamente para investigación clínica.
| Bloque | Descripción |
|---|---|
Form Container |
Contenedor principal del formulario |
Form Page |
Página/sección dentro del formulario |
Campo Texto |
Input de texto simple |
Campo Textarea |
Área de texto largo |
Campo Radio |
Opción única (radio buttons) |
Campo Multiple |
Opción múltiple (checkboxes) |
Campo Select |
Dropdown/selector |
Campo Descripción |
Texto informativo (markdown) |
Campo Likert |
Escala Likert configurable |
VAS Slider |
Escala visual analógica 1-100 |
Consent Block |
Consentimiento informado |
Randomization Block |
Configuración de aleatorización |
🔀 Conditional Logic
Lógica condicional potente para formularios dinámicos.
Operadores: AND / OR Acciones:
jump_to_page- Saltar a página específica ✅show/hide- Mostrar/ocultar campos ⚠️ Parcial: funciona entre páginas, no dentro de la misma páginaconditional required- Campos obligatorios condicionales ✅
Compatibilidad: Funciona con todos los tipos de campo
💾 Save & Continue Later
Sistema de guardado automático para formularios largos.
Características:
- IndexedDB para drafts persistentes
- Autosave cada 30 segundos
- beforeunload warning (previene pérdida accidental)
- Modal de recuperación de sesión
- Cross-session persistence
📋 Changelog Reciente
v2.1.3 (2025-04-09) - Privacy & Metadata Fixes + Pool Deletion
Fixes recientes:
- ✅ Extended Metadata Export: Ahora funciona correctamente el guardado de configuración
- ✅ Privacy & Metadata UI: Nueva sección "Exportación Extendida" con checkboxes funcionales
- ✅ Pool Deletion: Arreglado error de permisos y foreign keys al eliminar pools
- ✅ Randomization Excel Export: Ahora incluye submission ID, duration, completed at, form responses
- ✅ Wizard UI: Eliminados campos innecesarios (Duración estimada) y arreglado botón Monitoreo Semanal
- ✅ Wide Export: Removida columna fingerprint_id (el investigador debe construirlo si lo necesita)
v2.1.0 (2025-02-24) - Phase 3: Researcher Data Confidence
Epic: Researcher Data Confidence
3A - Export Hardening
- ✅ Participant Access Log Export (IRB compliance)
- ✅ Completion Rate Verification
- ✅ Wave-Level Timestamps (
wave_started_at,wave_completed_at,time_to_complete) - ✅ v2.1.3: Extended Metadata Export (Canvas, WebGL, Hardware) - Configurable vía Privacy & Metadata
- ✅ v2.1.3: Randomization Excel Export con submission data, duration, form responses
3B - Monitoring Upgrades
- ✅ Per-Participant Progress View (Timeline)
- ✅ Failed Email Alerts Dashboard
- ✅ Cron Health Indicator
v2.0.0 (2025-02-XX)
- 🎉 Longitudinal Pools Parts 1-4 completadas
- ✅ Pool Assignment Service con weighted random
- ✅ Pool Dashboard con monitoreo de asignaciones
- ✅ Pool Join Shortcode
- ✅ Múltiples fixes de UI/UX
- ✅ v2.1.3: Fix de permisos para eliminar pools con foreign keys
v1.4.2 (2025-02-06) - Security Hardening
- 🔒 12 vulnerabilidades corregidas
- ✅ SQL Injection fixes (prepared statements)
- ✅ Input validation con whitelists
- ✅ Race condition fix (atomic delete)
- ✅ Database indices optimizados
v1.4.1 (2025-02-05) - Email Service
- 📧 4 templates HTML creados
- ✅ Email logging en base de datos
- ✅ SMTP integration
v1.4.0 (2025-02-04) - Longitudinal Studies
- 📊 Sistema longitudinal completo
- ✅ Waves, Magic Links, Participants
- ✅ Email automation
- ✅ Session management
🗄️ Database Schema
El plugin crea las siguientes tablas en la base de datos:
Tablas principales
| Tabla | Descripción |
|---|---|
wp_vas_form_results |
Respuestas de formularios |
wp_vas_form_events |
Eventos de sesión (page views, etc.) |
wp_vas_randomizations |
Configuraciones RCT |
wp_vas_rct_assignments |
Asignaciones de brazos RCT |
Tablas longitudinales
| Tabla | Descripción |
|---|---|
wp_survey_studies |
Definición de estudios longitudinales |
wp_survey_waves |
Waves/tomas de cada estudio |
wp_survey_participants |
Participantes registrados |
wp_survey_sessions |
Sesiones activas |
wp_survey_email_log |
Log de emails enviados |
wp_survey_audit_log |
Auditoría de acciones |
wp_survey_cron_log |
Historial de cron jobs |
wp_survey_data_requests |
Solicitudes GDPR |
Tablas de pools
| Tabla | Descripción |
|---|---|
wp_eipsi_longitudinal_pools |
Definición de pools |
wp_eipsi_pool_assignments |
Asignaciones a pools |
🏗️ Architecture
El plugin sigue una arquitectura orientada a servicios (Service Layer Pattern).
Services (20 clases)
// Servicios principales
EIPSI_Email_Service // Envío de emails
EIPSI_Participant_Service // Gestión de participantes
EIPSI_Wave_Service // Gestión de waves
EIPSI_MagicLinksService // Generación de magic links
EIPSI_Auth_Service // Autenticación
EIPSI_Anonymize_Service // Anonimización GDPR
EIPSI_Export_Service // Exportación de datos
EIPSI_SMTP_Service // Configuración SMTP
EIPSI_Assignment_Service // Asignación de participantes
// Phase 3 - Researcher Data Confidence
EIPSI_Access_Log_Export_Service // Export de logs de acceso
EIPSI_Completion_Verification_Service // Verificación de completitud
EIPSI_Participant_Timeline_Service // Timeline por participante
EIPSI_Failed_Email_Alerts_Service // Alertas de emails fallidos
EIPSI_Cron_Health_Service // Monitoreo de cron
EIPSI_Participant_Data_Request_Service // Portal GDPR
EIPSI_Participant_Access_Log_Service // Logs de acceso
EIPSI_Participant_Auth_Handler // Handler de auth
EIPSI_Device_Data_Service // Datos de dispositivo
// Pools
EIPSI_Pool_Assignment_Service // Lógica de asignación
EIPSI_Pool_Dashboard_Service // Dashboard de monitoreo
📁 Directory Structure
eipsi-forms/
├── admin/ # Panel de administración
│ ├── services/ # Clases de servicio (20 archivos)
│ ├── tabs/ # Tabs del panel admin
│ ├── ajax-*.php # Handlers AJAX
│ ├── cron-*.php # Handlers de cron
│ ├── database-schema-manager.php # Gestión de schema
│ ├── export.php # Sistema de export
│ ├── monitoring.php # Dashboard de monitoreo
│ └── ...
├── assets/ # Assets estáticos
│ ├── css/ # Estilos (15+ archivos)
│ ├── js/ # JavaScript (15+ archivos)
│ └── images/ # Iconos e imágenes
├── build/ # Build output (generado)
├── includes/ # Includes principales
│ ├── emails/ # Templates de email (9 archivos)
│ ├── shortcodes/ # Clases de shortcodes
│ └── class-*.php # Clases helper
├── src/ # Código fuente Gutenberg
│ ├── blocks/ # 13 bloques Gutenberg
│ └── utils/ # Utilidades JS
├── languages/ # Traducciones (.pot, .po, .mo)
├── eipsi-forms.php # Archivo principal del plugin
├── package.json # Dependencias npm
├── webpack.config.js # Configuración de build
└── README.md # Este archivo
🔧 Development
Requisitos
- Node.js 16+
- npm 8+
- PHP 7.4+
- WordPress 5.8+
Comandos de desarrollo
# Instalar dependencias
npm install
# Build de producción
npm run build
# Build de desarrollo (watch)
npm run start
# Linting JavaScript
npm run lint:js
# Linting con auto-fix
npm run lint:js -- --fix
# Linting CSS
npm run lint:css
Build Output
- Bundle size: < 250 KB (gzipped)
- Build time: < 5 segundos
- Lint: 0 errors / 0 warnings
🛣️ Roadmap
✅ Completado (v1.0 - v2.1)
- [x] 12 Gutenberg Blocks clínicos
- [x] Sistema longitudinal completo
- [x] Randomized Controlled Trials (RCT)
- [x] Email Service con templates
- [x] Monitoring Dashboard
- [x] Export System (Excel/CSV)
- [x] Conditional Logic (AND/OR, jump_to_page)
- [x] Save & Continue Later
- [x] GDPR Compliance Portal
- [x] Security Hardening (12 vulnerabilidades)
- [x] Longitudinal Pools (Parts 1-4)
🚧 En Progreso / Próximos
- [ ] Integrated completion page (misma URL forever, sin redirects externos)
- [ ] Conditional field visibility (dentro de la misma página - actualmente solo funciona entre páginas)
- [ ] Clinical templates (PHQ-9, GAD-7, PCL-5, AUDIT, DASS-21) con scoring automático
- [x] Fingerprint ID → Datos RAW ✅ Implementado en v2.1.3: Sección "Exportación Extendida" en Privacy & Metadata
📅 Futuro (Nice-to-have)
- [ ] Visual progress bar
- [ ] Matrix questions (grid)
- [ ] Analytics UI avanzada
- [ ] Multilingual (i18n completo)
- [ ] REST API pública
- [ ] Field encryption
🤝 Contributing
Las contribuciones son bienvenidas. Por favor:
- Fork el repositorio
- Crear branch feature (
git checkout -b feature/nueva-funcionalidad) - Commit cambios (
git commit -m 'feat: descripción del cambio') - Push al branch (
git push origin feature/nueva-funcionalidad) - Abrir Pull Request
Código de Conducta
Este proyecto sigue el principio de Zero fear + Zero friction + Zero excuses. Todo comentario, issue o PR debe ser respetuoso y constructivo.
📜 License
GPL v2 or later. Ver LICENSE.
👤 Author
Mathias N. Rojas de la Fuente
- Instagram: @enmediodel.contexto
- Web: enmediodelcontexto.com.ar
🙏 Acknowledgments
EIPSI Forms existe porque ningún plugin de forms entendió cómo trabajan realmente lxs psicólogxs y psiquiatras con sus pacientes. Este plugin es la respuesta a esa frustración compartida por miles de clínicos en el mundo hispanohablante.
"Por fin alguien entendió cómo trabajo de verdad con mis pacientes"
EIPSI Forms - El form builder que habla tu idioma clínico