一键导入
workers
Explica cómo funcionan los workers y la cola de trabajos en FacturaScripts para ejecutar procesos en segundo plano mediante eventos.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Explica cómo funcionan los workers y la cola de trabajos en FacturaScripts para ejecutar procesos en segundo plano mediante eventos.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Crea un modelo de FacturaScripts con su clase PHP y archivo XML de tabla.
Configura la ruta de módulos MCP locales privados en ~/.fs-claude.json
Redacta en pantalla (sin crear ningún archivo) un texto en formato markdown, listo para copiar y pegar, que explica las novedades, mejoras y correcciones de un plugin o proyecto de FacturaScripts a partir de un rango de commits o de versiones. Activa esta skill siempre que el usuario pida "redacta las novedades", "escribe la noticia de los cambios", "genera el changelog", "qué ha cambiado desde la versión X", "resume los cambios entre la versión X y la Y", "prepara el anuncio de la nueva versión", o cualquier variación en la que se pida comunicar qué se ha hecho en un rango de commits o entre dos versiones.
Guía para añadir una nueva conexión de FacturaScripts al archivo de configuración
Sincroniza modelos del MCP fs-mcp con sus fuentes (FacturaScripts core o plugins privados). Detecta columnas nuevas/modificadas/eliminadas, mantiene las descripciones unificadas en los archivos de overrides, regenera la metadata y compila si hace falta. Soporta uno o varios modelos, ruta local o URL de GitHub, y un modo "refresh masivo" para auditar todos los modelos del catálogo y actualizar la versión registrada de FacturaScripts.
Responde preguntas sobre cómo usar FacturaScripts consultando la documentación oficial de usuarios a través del agente especializado `docs-expert`. ACTIVAR SIEMPRE que el usuario pregunte cómo hacer una operación, dónde encontrar una función, cómo fluye un proceso (presupuesto→factura), cómo gestionar clientes, inventario, compras, contabilidad, o cualquier aspecto práctico de uso del ERP. También activar cuando Claude necesite explorar la documentación de usuario antes de responder sobre procedimientos — no esperar a que el usuario pregunte explícitamente. No esperes a que mencione "documentación" — si la pregunta o tarea involucra procedimientos operativos en FacturaScripts, activa esta skill.
| name | workers |
| description | Explica cómo funcionan los workers y la cola de trabajos en FacturaScripts para ejecutar procesos en segundo plano mediante eventos. |
Los workers permiten ejecutar procesos en segundo plano al final de cada ejecución de página. Se usan para tareas no críticas que no necesitan ejecutarse en el momento exacto de la acción (por ejemplo, actualizar contadores, enviar notificaciones, sincronizar datos).
La cola de trabajos se compone de eventos y workers:
Para generar automáticamente la clase Worker y registrarla en Init.php:
fsmaker worker
Todos los modelos lanzan automáticamente eventos al operar sobre ellos:
| Acción | Eventos lanzados |
|---|---|
| Insertar | Model.NombreModelo.Insert, Model.NombreModelo.Save |
| Modificar | Model.NombreModelo.Update, Model.NombreModelo.Save |
| Eliminar | Model.NombreModelo.Delete |
Ejemplos:
Model.Producto.Insert — al insertar un productoModel.Cliente.Update — al modificar un clienteModel.FacturaCliente.Delete — al eliminar una facturause FacturaScripts\Core\Model\WorkEvent;
use FacturaScripts\Core\WorkQueue;
// lanzar un evento inmediatamente
WorkQueue::send('mi-evento', 'valor-identificador');
// lanzar un evento con parámetros adicionales
WorkQueue::send('mi-evento', $modelo->id(), $modelo->toArray());
// lanzar un evento para ejecutarse en el futuro (en segundos)
WorkQueue::sendFuture(300, 'mi-evento', 'valor'); // en 5 minutos
Los workers se crean en la carpeta Worker/ del plugin:
<?php
namespace FacturaScripts\Plugins\MiPlugin\Worker;
use FacturaScripts\Core\Model\WorkEvent;
use FacturaScripts\Core\Template\WorkerClass;
class MiWorker extends WorkerClass
{
public function run(WorkEvent $event): bool
{
// tu código aquí
return $this->done();
}
}
Para que un worker escuche un evento, hay que registrarlo en la función init() del archivo Init.php:
<?php
namespace FacturaScripts\Plugins\MiPlugin;
use FacturaScripts\Core\Template\InitClass;
use FacturaScripts\Core\WorkQueue;
class Init extends InitClass
{
public function init(): void
{
// escucha solo cuando se modifica un producto
WorkQueue::addWorker('MiWorker', 'Model.Producto.Update');
// escucha inserción y eliminación
WorkQueue::addWorker('MiWorker', 'Model.Producto.Insert');
WorkQueue::addWorker('MiWorker', 'Model.Producto.Delete');
// escucha todos los eventos de Producto (usando comodín)
WorkQueue::addWorker('MiWorker', 'Model.Producto.*');
// escucha todos los eventos del sistema
WorkQueue::addWorker('MiWorker', '*');
}
}
Importante: Si lanzas eventos en
Init::update(), debes registrar los workers necesarios también enupdate(), ya queupdate()se ejecuta antes queinit().
El worker recibe un objeto WorkEvent con información del evento:
public function run(WorkEvent $event): bool
{
// ID del registro (clave primaria del modelo)
$id = $event->value;
// todos los parámetros del evento
$datos = $event->params();
// un parámetro concreto con valor por defecto
$referencia = $event->param('referencia', '');
$precio = $event->param('precio', 0.0);
return $this->done();
}
Cuando se produce un evento automático de modelo:
$event->value → ID del registro ($model->id())$event->params() → array con todos los campos del modelo ($model->toArray())Excepción: Con
$model->update(array $values)(actualización directa), el eventoUpdatesolo enviará los campos que se están actualizando, no todos los campos del modelo.
Con WorkQueue::send(), tú decides qué enviar:
// enviar el ID y todos los datos de una factura
WorkQueue::send(
'Model.FacturaCliente.Paid',
$factura->idfactura,
$factura->toArray()
);
// enviar solo los datos que necesites
WorkQueue::send(
'proceso-especial',
'identificador',
['dato1' => 'valor1', 'dato2' => 'valor2']
);
Si el worker modifica el mismo modelo que lanzó el evento, puede crearse un bucle infinito. Para evitarlo, usa preventNewEvents():
public function run(WorkEvent $event): bool
{
// evitar que se creen nuevos eventos de tipo Model.Producto.Save
$this->preventNewEvents(['Model.Producto.Save']);
// tu código aquí (puede modificar el producto sin crear bucle)
return $this->done();
}
La lista de eventos pendientes de procesar se puede consultar desde: Menú Administrador → Logs → pestaña "Eventos de trabajos"
Para consultar la documentación oficial completa sobre workers y cola de trabajos, invoca el agente docs-expert que te proporcionará detalles completos directamente desde la documentación oficial del framework.