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.