Recetario de desencadenadores¶
Seis recetas que usan solo llamadas soportadas. Cada una indica cuándo debe ejecutarse el desencadenador y por qué funciona, para que la adaptes en lugar de copiarla a ciegas.
Ninguna consulta las tablas internas. Las recetas que lo hacían se descartaron: acoplan el proceso al esquema y se vuelven lentas con carga.
Enviar una grilla por correo¶
Cuándo: después de la tarea que llena la grilla.
PMFSendMessage(
$_SESSION["APPLICATION"],
"no-reply@example.com",
@@NotifyTo,
"",
"",
"Resumen del caso " . @@CaseTitle,
"grid-summary.html",
["Rows" => @@Rows]
);
Por qué funciona: el octavo argumento es el conjunto de variables que recibe la plantilla, y la plantilla puede repetir un bloque sobre una grilla:
<table>
<tr><td>Item</td><td>Amount</td></tr>
@>Rows
<tr><td>@#Item</td><td>@#Amount</td></tr>
@<Rows
</table>
Pasa la grilla con el mismo nombre que usa la plantilla. Si el bloque no se cierra, el resto del mensaje queda absorbido por la repetición.
Crear un caso con estado¶
Cuándo: cualquier desencadenador que deba iniciar un caso en otro proceso.
$caseId = PMFNewCase(@@TargetProcessUid, $_SESSION["USER_LOGGED"], @@TargetTaskUid, [], "TO_DO");
Por qué funciona: un caso creado sin estado es un borrador: existe, pero no está en
la bandeja de nadie. El quinto argumento lo define: DRAFT o TO_DO. La función devuelve
el id del caso nuevo, o 0 si falla, así que conviene verificar antes de usarlo.
Crear un caso sobre una tarea de autoservicio¶
Cuándo: la tarea destino la toma quien la reclama, no la asigna el proceso.
$caseId = PMFNewCase(@@TargetProcessUid, $usrUid, @@TargetTaskUid, [], "TO_DO");
if ($caseId) {
PMFDerivateCase($caseId, 1, false, $usrUid);
}
Por qué funciona: una tarea de autoservicio está disponible cuando el caso llega a ella,
y un caso nuevo se queda en su primera delegación. Derivar con delIndex = 1 lo mueve una
vez, que es lo que lo hace aparecer en el grupo. Pasar el usuario evita depender de la
sesión cuando el desencadenador corre desde una entrada web.
Asignar por valor¶
Cuándo: la tarea usa asignación por valor, así que el asignado sale de una variable.
@@NextUser = $managerUid;
PMFDerivateCase($_SESSION["APPLICATION"], $_SESSION["INDEX"]);
Por qué funciona: la regla de asignación lee la variable cuando el caso llega, así que la variable debe estar definida antes de derivar, no después. Si la variable guarda un usuario que no puede tomar la tarea, el caso se detiene; las reglas de asignación de la tarea son el lugar donde ver qué usuarios son elegibles.
Pausar un caso por un período¶
Cuándo: antes o después de una tarea, cuando la espera la deciden los datos y no un evento de temporizador.
$until = date("Y-m-d H:i:s", strtotime("+" . @%WaitDays . " days"));
PMFPauseCase($_SESSION["APPLICATION"], $_SESSION["INDEX"], $_SESSION["USER_LOGGED"], $until);
Por qué funciona: un evento de temporizador intermedio espera un tiempo fijo, decidido
en el diagrama. PMFPauseCase recibe la fecha en ejecución, así que la espera puede depender
de una variable. Una fecha vacía pausa el caso indefinidamente.
Avisar al asignado cuando se reanuda un caso¶
Cuándo: en un proceso aparte que observa la reanudación, no en el caso pausado.
$users = PMFGetNextAssignedUser($_SESSION["APPLICATION"], @@TasUid);
foreach ($users as $user) {
if (!empty($user["USR_EMAIL"])) {
PMFSendMessage(
$_SESSION["APPLICATION"],
"no-reply@example.com",
$user["USR_EMAIL"],
"", "",
"Caso reanudado: " . @@CaseTitle,
"case-resumed.html"
);
}
}
Por qué funciona: un caso pausado no ejecuta desencadenadores hasta que se reanuda, así que el correo no puede salir desde dentro. La reanudación dispara el proceso que observa, que lee los asignados y envía el mensaje.
Qué no está aquí¶
- Contadores y “variables globales” — dependían de las tablas PM, que el producto ya no ofrece.
- Saltar la tarea siguiente, reabrir un caso, derivar todas las tareas paralelas —
consultaban
APP_DELEGATIONcon SQL. Funcionan hasta que cambia el esquema, y son lentas. - Repetir una tarea N veces — eso es diseño de proceso (un bucle con compuerta o una tarea multi-instancia), no código de desencadenador.
Relacionado¶
- Escribir el código — qué recibe un desencadenador y cómo falla.
- Funciones de Lurana — todas las funciones, con sus argumentos.
- Plantillas de correo — el cuerpo, sus marcadores y bloques de grilla.
- Notificaciones — el correo integrado, sin desencadenador.
- Documentos de salida — generar un archivo en lugar de enviarlo.