Saltar a contenido

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_DELEGATION con 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