protected function MaestroEngine::doProductionAssignmentNotifications in Maestro 3.x
Same name and namespace in other branches
- 8.2 src/Engine/MaestroEngine.php \Drupal\maestro\Engine\MaestroEngine::doProductionAssignmentNotifications()
Internal method to do production assignment notifications.
2 calls to MaestroEngine::doProductionAssignmentNotifications()
- MaestroEngine::cleanQueue in src/
Engine/ MaestroEngine.php - CleanQueue method This is the core method used by the orchestrator to move the process forward and to determine assignments and next steps.
- MaestroEngine::createProductionTask in src/
Engine/ MaestroEngine.php - Creates a task in the Maestro Queue table.
File
- src/
Engine/ MaestroEngine.php, line 1835
Class
- MaestroEngine
- Class MaestroEngine.
Namespace
Drupal\maestro\EngineCode
protected function doProductionAssignmentNotifications($templateMachineName, $taskMachineName, $queueID, $notificationType = 'assignment') {
$config = \Drupal::config('maestro.settings');
$templateTask = $this
->getTemplateTaskByID($templateMachineName, $taskMachineName);
$notificationList = [];
if (array_key_exists('notifications', $templateTask) && array_key_exists('notification_assignments', $templateTask['notifications'])) {
$notifications = explode(',', $templateTask['notifications']['notification_assignments']);
foreach ($notifications as $notification) {
// We will assume that WE are the ones doing the notification. Otherwise we're offloading to a different module to do so.
$doNotification = TRUE;
// [0] is to what type of entity, [1] is fixed or variable, [2] is entity or variable, [3] is type
$thisNotification = explode(':', $notification);
// Works for any assignment type passed in.
if ($thisNotification[3] == $notificationType) {
$entity = '';
if ($thisNotification[1] == 'fixed') {
$entity = $thisNotification[2];
}
elseif ($thisNotification[1] == 'variable') {
// Variable is in [2]. Need to get its value.
$processID = MaestroEngine::getProcessIdFromQueueId($queueID);
$variableValue = MaestroEngine::getProcessVariable($thisNotification[2], $processID);
// Assumption here is that these values are actual names of users or roles or whatever other entity.
$entity = $variableValue;
}
else {
$doNotification = FALSE;
}
if ($thisNotification[0] == 'user' && $doNotification) {
// Load the user(s) by name and get their email addr.
$users = explode(',', $entity);
foreach ($users as $accountName) {
if ($accountName != '') {
$account = user_load_by_name($accountName);
if ($account) {
$notificationList[$account
->get('mail')
->getString()] = $account
->get('mail')
->getString();
}
else {
throw new MaestroGeneralException('Unknown account name identified when attempting a notification.');
}
}
}
}
elseif ($thisNotification[0] == 'role' && $doNotification) {
// Have to parse out WHO is in the role and then get their email addr.
$roles = explode(',', $entity);
foreach ($roles as $roleName) {
if ($roleName != '') {
$ids = \Drupal::entityQuery('user')
->accessCheck(FALSE)
->condition('status', 1)
->condition('roles', $roleName)
->execute();
$users = User::loadMultiple($ids);
foreach ($users as $account) {
$notificationList[$account
->get('mail')
->getString()] = $account
->get('mail')
->getString();
}
}
}
}
else {
// TODO: does this need to be declared differently? You can get the template and template task from the queueID.
\Drupal::moduleHandler()
->invokeAll('maestro_production_' . $notificationType . '_notification', [
$queueID,
$thisNotification,
&$notificationList,
]);
}
}
}
//end foreach over each assignment
// ok, now we can check to see if we have any assignments.
if (count($notificationList) > 0) {
$notificationMessage = '';
if (array_key_exists('notification_' . $notificationType, $templateTask['notifications']) && $templateTask['notifications']['notification_' . $notificationType] != '') {
$notificationMessage = $templateTask['notifications']['notification_' . $notificationType];
// Now do a token replacement
// TODO: token replacement Use hook token? https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Utility!token.api.php/function/hook_tokens/8.2.x
$tokenService = \Drupal::token();
$notificationMessage = $tokenService
->replace($notificationMessage, [
'maestro' => [
'task' => $templateTask,
'queueID' => $queueID,
],
]);
if ($notificationType == 'assignment') {
$subject = array_key_exists('notification_assignment_subject', $templateTask['notifications']) ? $tokenService
->replace($templateTask['notifications']['notification_assignment_subject'], [
'maestro' => [
'task' => $templateTask,
'queueID' => $queueID,
],
]) : 'You have a new task assignment';
}
elseif ($notificationType == 'reminder') {
$subject = array_key_exists('notification_reminder_subject', $templateTask['notifications']) ? $tokenService
->replace($templateTask['notifications']['notification_reminder_subject'], [
'maestro' => [
'task' => $templateTask,
'queueID' => $queueID,
],
]) : 'You have a new task assignment';
}
elseif ($notificationType == 'escalation') {
$subject = array_key_exists('notification_escalation_subject', $templateTask['notifications']) ? $tokenService
->replace($templateTask['notifications']['notification_escalation_subject'], [
'maestro' => [
'task' => $templateTask,
'queueID' => $queueID,
],
]) : 'You have a new task assignment';
}
}
else {
// TODO: create a sitewide default email in the Maestro config.
// Strip off a trailing slash as we're going to add it ourselves.
$redirectionLocation = rtrim($config
->get('maestro_task_console_location'), '/');
if ($redirectionLocation == '') {
$redirectionLocation = '/taskconsole';
}
$queueRecord = MaestroEngine::getQueueEntryById($queueID);
if ($notificationType == 'assignment') {
$notificationMessage = t('A new task titled:') . ' ' . $queueRecord->task_label
->getString() . ' ' . t('has been assigned to you.');
$notificationMessage .= t('Click here to go to see your tasks:') . ' ' . '<a href="' . Url::fromUserInput($redirectionLocation . '/' . $queueID, [
'absolute' => TRUE,
])
->toString() . '">Task Console</a>';
}
elseif ($notificationType == 'reminder') {
$notificationMessage = t('A reminder you have open tasks. Please review the task:') . ' ' . $queueRecord->task_label
->getString();
$notificationMessage .= t('Click here to go to your tasks:') . ' <a href="' . Url::fromUserInput($redirectionLocation . '/' . $queueID, [
'absolute' => TRUE,
])
->toString() . '">Task Console</a>';
}
elseif ($notificationType == 'escalation') {
$notificationMessage = t('An escalation for an overdue task has been generated for the task:') . ' ' . $queueRecord->task_label
->getString();
// The escalation will have to have more information associated with it.. who is assigned, when it was assigned etc etc.
// TODO: need the list of assigned users/roles/whatever.
$notificationMessage .= t('Assigned To:') . ' ';
$notificationMessage .= t('Queue ID:') . ' ' . $queueID;
$notificationMessage .= t('Process IDr:') . ' ' . $queueRecord->process_id
->getString();
}
}
$mailManager = \Drupal::service('plugin.manager.mail');
$langcode = \Drupal::languageManager()
->getCurrentLanguage()
->getId();
$params = [];
$params['queueID'] = $queueID;
$tokenService = \Drupal::token();
$params['subject'] = isset($subject) ? $subject : t('You have a new task assignment');
$params['message'] = $notificationMessage;
foreach ($notificationList as $email) {
$result = $mailManager
->mail('maestro', $notificationType . '_notification', $email, $langcode, $params, NULL, TRUE);
}
}
// End of actual mail sending routine.
}
}