Portafolio
Proyecto propio (plugin FacturaScripts) · 2023–2024

MoodleManagement: facturación que matricula sola

Plugin FacturaScripts ↔ Moodle

Plugin para FacturaScripts que convierte una factura pagada en una matrícula automática en Moodle vía API REST, con certificados PDF y workers asíncronos.

Mi rol Diseño e implementación completa

  • PHP 8
  • FacturaScripts
  • Moodle Web Services (REST)
  • MySQL / MariaDB / PostgreSQL
  • Twig
  • Bootstrap 5
  • Chart.js 4
  • PHPUnit / PHPStan
MoodleManagement: facturación que matricula sola
~22.200
Líneas de código (app)
193
Commits
7
Clientes API Moodle
6
Workers asíncronos

Capturas

Problema

Un negocio de formación que factura cursos en FacturaScripts y los imparte en Moodle vive con dos sistemas desconectados. Cada venta obliga a dar de alta al alumno a mano en el LMS, matricularlo en el curso correcto, vigilar que pague antes de darle acceso y, al terminar, emitir y enviar el certificado. Es trabajo manual, repetitivo y propenso a errores: alumnos matriculados sin haber pagado, duplicados, o accesos que nadie revoca cuando se anula la factura.

Solución

Diseñé e implementé MoodleManagement, un plugin de FacturaScripts que vincula la facturación con la matrícula en Moodle a través de su API REST de web services (wstoken, moodlewsrestformat). El núcleo es un cliente HTTP propio sobre webservice/rest/server.php repartido en 7 clases de API (usuarios, cursos, matrículas, insignias, finalización, ficheros). El flujo se dispara solo: al marcar una FacturaCliente como pagada, un EnrolmentWorker asíncrono recorre las líneas mapeadas a cursos y matricula en Moodle; si la factura no está pagada, revierte. Mapeo producto→curso y contacto→usuario, generación de certificados PDF, sincronización de progreso por cron, y un panel con gráficas. Lo blindé con guardas de idempotencia, circuit breaker, reintentos con backoff, cifrado de tokens, URLs firmadas y validación anti-SSRF.

Resultado

El plugin reúne 27 controladores, 11 modelos, 6 workers asíncronos y una suite de pruebas (unitarias e integración) sobre PHPUnit, PHPStan y PHPCS. Cubre el ciclo completo "factura pagada → matrícula → certificado por email" sin intervención manual, soporta múltiples instancias Moodle y está traducido a 24 locales. La capa de seguridad y resiliencia (HMAC en webhooks, idempotencia, circuit breaker) lo prepara para operar de forma desatendida frente a una API externa que puede fallar.