PMCORE-1402 Use Jobs in the email execution related to the 'Action by email'

This commit is contained in:
Roly Rudy Gutierrez Pinto
2020-05-25 15:15:31 -04:00
parent 292b5cf1f9
commit 97e9831e0d
16 changed files with 385 additions and 185 deletions

View File

@@ -1,5 +1,6 @@
<?php
use App\Jobs\EmailEvent;
use Illuminate\Support\Facades\Crypt;
use ProcessMaker\BusinessModel\EmailServer;
/*----------------------------------********---------------------------------*/
@@ -1029,7 +1030,7 @@ class WsBase
switch ($appMsgType) {
case WsBase::MESSAGE_TYPE_EMAIL_EVENT:
case WsBase::MESSAGE_TYPE_PM_FUNCTION:
JobsManager::getSingleton()->dispatch('EmailEvent', $closure);
JobsManager::getSingleton()->dispatch(EmailEvent::class, $closure);
break;
default :
$spool = $closure();

View File

@@ -1,5 +1,6 @@
<?php
use App\Jobs\RouteCase;
use ProcessMaker\Core\JobsManager;
/**
@@ -105,8 +106,8 @@ try {
$cases = new Cases();
$cases->routeCase($processUid, $application, $postForm, $sStatus, $flagGmail, $tasUid, $index, $userLogged);
};
JobsManager::getSingleton()->dispatch("CasesDispatch", $closure);
JobsManager::getSingleton()->dispatch(RouteCase::class, $closure);
//We close the related threads.
$cases = new Cases();
$cases->CloseCurrentDelegation($application, $index);

View File

@@ -4,14 +4,14 @@
* @see workflow/engine/methods/services/ActionsByEmailDataForm.php
* @link https://wiki.processmaker.com/3.3/Actions_by_Email#Link_to_Fill_a_Form
*/
use ProcessMaker\BusinessModel\Cases\InputDocument;
use ProcessMaker\ChangeLog\ChangeLog;
use App\Jobs\ActionByEmail;
use ProcessMaker\Core\JobsManager;
use ProcessMaker\Validation\ValidationUploadedFiles;
if (PMLicensedFeatures::getSingleton()
->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=')) {
$featureEnable = PMLicensedFeatures::getSingleton()
->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=');
if ($featureEnable) {
/**
* To do: The following evaluation must be moved after saving the data (so as not to lose the data entered in the form).
* It only remains because it is an old behavior, which must be defined by "Product Owner".
@@ -22,7 +22,7 @@ if (PMLicensedFeatures::getSingleton()
G::SendMessageText($validator->getMessage(), "ERROR");
$url = explode("sys" . config("system.workspace"), $_SERVER['HTTP_REFERER']);
G::header("location: " . "/sys" . config("system.workspace") . $url[1]);
die();
return;
}
$G_PUBLISH = new Publisher();
@@ -53,111 +53,23 @@ if (PMLicensedFeatures::getSingleton()
$aber = G::decrypt($_REQUEST['ABER'], URL_KEY);
$dynUid = G::decrypt($_REQUEST['DYN_UID'], URL_KEY);
$forms = isset($_REQUEST['form']) ? $_REQUEST['form'] : [];
$remoteAddr = $_SERVER['REMOTE_ADDR'];
$files = $_FILES;
//Load data related to the case
$case = new Cases();
$casesFields = $case->loadCase($appUid, $delIndex);
// Check if the current thread is not finished
if (!is_null($casesFields['DEL_FINISH_DATE'])) {
throw new Exception(G::loadTranslation('ID_ABE_FORM_ALREADY_FILLED'));
}
// Merge the data
$casesFields['APP_DATA'] = array_merge($casesFields['APP_DATA'], $forms);
//Get current user info
$delegation = new AppDelegation();
$currentUsrUid = $delegation->getUserAssignedInThread($appUid, $delIndex);
if (!is_null($currentUsrUid)) {
$users = new Users();
$userInfo = $users->loadDetails($currentUsrUid);
$casesFields["APP_DATA"]["USER_LOGGED"] = $currentUsrUid;
$casesFields["APP_DATA"]["USR_USERNAME"] = $userInfo['USR_USERNAME'];
}
foreach ($casesFields["APP_DATA"] as $index => $value) {
$_SESSION[$index] = $value;
}
$casesFields['CURRENT_DYNAFORM'] = $dynUid;
$casesFields['USER_UID'] = $casesFields['CURRENT_USER_UID'];
ChangeLog::getChangeLog()
->getUsrIdByUsrUid($casesFields['USER_UID'], true)
->setSourceId(ChangeLog::FromABE);
//Update case info
$case->updateCase($appUid, $casesFields);
if (isset($_FILES ['form'])) {
if (isset($_FILES["form"]["name"]) && count($_FILES["form"]["name"]) > 0) {
$oInputDocument = new InputDocument();
$oInputDocument->uploadFileCase($_FILES, $case, $casesFields, $currentUsrUid, $appUid, $delIndex);
}
}
$wsBaseInstance = new WsBase();
$result = $wsBaseInstance->derivateCase(
$casesFields['CURRENT_USER_UID'], $appUid, $delIndex, true
);
$code = (is_array($result) ? $result['status_code'] : $result->status_code);
$dataResponses = array();
$dataResponses['ABE_REQ_UID'] = $aber;
$dataResponses['ABE_RES_CLIENT_IP'] = $_SERVER['REMOTE_ADDR'];
$dataResponses['ABE_RES_DATA'] = serialize($forms);
$dataResponses['ABE_RES_STATUS'] = 'PENDING';
$dataResponses['ABE_RES_MESSAGE'] = '';
try {
require_once 'classes/model/AbeResponses.php';
$abeAbeResponsesInstance = new AbeResponses();
$dataResponses['ABE_RES_UID'] = $abeAbeResponsesInstance->createOrUpdate($dataResponses);
} catch (Exception $error) {
throw $error;
}
if ($code == 0) {
//Save Cases Notes
$dataAbeRequests = loadAbeRequest($aber);
$dataAbeConfiguration = loadAbeConfiguration($dataAbeRequests['ABE_UID']);
if ($dataAbeConfiguration['ABE_CASE_NOTE_IN_RESPONSE'] == 1) {
$response = new stdclass();
$response->usrUid = $casesFields['APP_DATA']['USER_LOGGED'];
$response->appUid = $appUid;
$response->delIndex = $delIndex;
$response->noteText = "Check the information that was sent for the receiver: " . $dataAbeRequests['ABE_REQ_SENT_TO'];
postNote($response);
}
$dataAbeRequests['ABE_REQ_ANSWERED'] = 1;
$code == 0 ? uploadAbeRequest($dataAbeRequests) : '';
$assign = $result['message'];
$aMessage['MESSAGE'] = '<strong>' . G::loadTranslation('ID_ABE_INFORMATION_SUBMITTED') . '</strong>';
} else {
throw new Exception('An error occurred while the application was being processed.<br /><br />
Error code: ' . $result->status_code . '<br />
Error message: ' . $result->message . '<br /><br />');
}
// Update
$dataResponses['ABE_RES_STATUS'] = ($code == 0 ? 'SENT' : 'ERROR');
$dataResponses['ABE_RES_MESSAGE'] = ($code == 0 ? '-' : $result->message);
try {
$abeAbeResponsesInstance = new AbeResponses();
$abeAbeResponsesInstance->createOrUpdate($dataResponses);
} catch (Exception $error) {
throw $error;
}
//Now we dispatch the derivation of the case through Jobs Laravel.
$closure = function() use ($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files) {
$cases = new Cases();
$cases->routeCaseActionByEmail($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files);
};
JobsManager::getSingleton()->dispatch(ActionByEmail::class, $closure);
$message = [];
$message['MESSAGE'] = '<strong>' . G::loadTranslation('ID_ABE_INFORMATION_SUBMITTED') . '</strong>';
$_SESSION = unserialize($backupSession);
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showInfo', '', $aMessage);
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showInfo', '', $message);
} catch (Exception $error) {
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showMessage', '', array('MESSAGE' => $error->getMessage() . ' Please contact to your system administrator.'));
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showMessage', '', ['MESSAGE' => $error->getMessage() . ' Please contact to your system administrator.']);
}
$_SESSION = unserialize($backupSession);
G::RenderPage('publish', 'blank');
}
}

View File

@@ -1,43 +0,0 @@
<?php
namespace ProcessMaker\BusinessModel\Factories;
use Closure;
use Exception;
class Jobs
{
const CLASS_NAMESPACE = "App\\Jobs\\";
/**
* Gets the full name of the class, if the class does not exist, an exception is thrown.
* @param string $name
* @return string
* @throws Exception
*/
public static function getClassName($name)
{
$className = self::CLASS_NAMESPACE . $name;
if (!class_exists($className)) {
throw new Exception("{$className} not exists.");
}
return $className;
}
/**
* This gets an instance of some Job defined in App\Jobs and dispatch this job.
* @param string $name
* @param Closure $closure
* @return object
*/
public static function create($name, Closure $closure)
{
$jobName = self::getClassName($name);
$instance = $jobName::dispatch($closure);
return $instance;
}
}

View File

@@ -2,6 +2,7 @@
namespace ProcessMaker\Cases;
use AbeResponses;
use AppDelegation;
use AppDelegationPeer;
use AppDocumentDrive;
@@ -9,17 +10,22 @@ use BasePeer;
use Cases;
use Derivation;
use Event;
use Exception;
use G;
use Illuminate\Support\Facades\Log;
use PMLicensedFeatures;
use ProcessMaker\BusinessModel\Cases\InputDocument;
use ProcessMaker\BusinessModel\Pmgmail;
use ProcessMaker\ChangeLog\ChangeLog;
use stdClass;
use Users;
use WebDriver\Exception;
use WsBase;
trait CasesTrait
{
/**
* This initiates the routing of the case given the application and the form
* This initiates the routing of the case given the application and the form
* data in the web application interface.
* @param string $processUid
* @param string $application
@@ -29,8 +35,9 @@ trait CasesTrait
* @param string $tasUid
* @param integer $index
* @param string $userLogged
* @return stdClass
*/
public function routeCase($processUid, $application, $postForm, $status, $flagGmail, $tasUid, $index, $userLogged)
public function routeCase($processUid, $application, $postForm, $status, $flagGmail, $tasUid, $index, $userLogged): stdClass
{
//warning: we are not using the result value of function thisIsTheCurrentUser, so I'm commenting to optimize speed.
$appFields = $this->loadCase($application);
@@ -195,11 +202,131 @@ trait CasesTrait
}
// Set users drive - End
/*----------------------------------********---------------------------------*/
$result = [
'appFields' => $appFields,
'triggerDebug' => $triggerDebug
];
return (object) $result;
}
/**
* This initiates the routing of the case given the application and the form
* data in the email application interface.
* @param string $appUid
* @param int $delIndex
* @param string $aber
* @param string $dynUid
* @param array $forms
* @param string $remoteAddr
* @param array $files
* @return array
* @throws Exception
*/
public function routeCaseActionByEmail($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files): array
{
//Load data related to the case
$case = new Cases();
$fields = $case->loadCase($appUid, $delIndex);
// Check if the current thread is not finished
if (!is_null($fields['DEL_FINISH_DATE'])) {
$message = G::loadTranslation('ID_ABE_FORM_ALREADY_FILLED');
Log::error($message);
throw new Exception($message);
}
// Merge the data
$fields['APP_DATA'] = array_merge($fields['APP_DATA'], $forms);
//Get current user info
$delegation = new AppDelegation();
$currentUsrUid = $delegation->getUserAssignedInThread($appUid, $delIndex);
if (!is_null($currentUsrUid)) {
$users = new Users();
$userInfo = $users->loadDetails($currentUsrUid);
$fields["APP_DATA"]["USER_LOGGED"] = $currentUsrUid;
$fields["APP_DATA"]["USR_USERNAME"] = $userInfo['USR_USERNAME'];
}
foreach ($fields["APP_DATA"] as $index => $value) {
$_SESSION[$index] = $value;
}
$fields['CURRENT_DYNAFORM'] = $dynUid;
$fields['USER_UID'] = $fields['CURRENT_USER_UID'];
ChangeLog::getChangeLog()
->getUsrIdByUsrUid($fields['USER_UID'], true)
->setSourceId(ChangeLog::FromABE);
//Update case info
$case->updateCase($appUid, $fields);
if (isset($files['form'])) {
if (isset($files["form"]["name"]) && count($files["form"]["name"]) > 0) {
$oInputDocument = new InputDocument();
$oInputDocument->uploadFileCase($files, $case, $fields, $currentUsrUid, $appUid, $delIndex);
}
}
$wsBase = new WsBase();
$result = $wsBase->derivateCase($fields['CURRENT_USER_UID'], $appUid, $delIndex, true);
$code = is_array($result) ? $result['status_code'] : $result->status_code;
$dataResponses = [];
$dataResponses['ABE_REQ_UID'] = $aber;
$dataResponses['ABE_RES_CLIENT_IP'] = $remoteAddr;
$dataResponses['ABE_RES_DATA'] = serialize($forms);
$dataResponses['ABE_RES_STATUS'] = 'PENDING';
$dataResponses['ABE_RES_MESSAGE'] = '';
try {
require_once 'classes/model/AbeResponses.php';
$abeResponses = new AbeResponses();
$dataResponses['ABE_RES_UID'] = $abeResponses->createOrUpdate($dataResponses);
} catch (Exception $error) {
$message = $error->getMessage();
Log::error($message);
throw $error;
}
if ($code == 0) {
//Save Cases Notes
$abeRequest = loadAbeRequest($aber);
$abeConfiguration = loadAbeConfiguration($abeRequest['ABE_UID']);
if ($abeConfiguration['ABE_CASE_NOTE_IN_RESPONSE'] == 1) {
$response = new stdclass();
$response->usrUid = $fields['APP_DATA']['USER_LOGGED'];
$response->appUid = $appUid;
$response->delIndex = $delIndex;
$response->noteText = "Check the information that was sent for the receiver: " . $abeRequest['ABE_REQ_SENT_TO'];
postNote($response);
}
$abeRequest['ABE_REQ_ANSWERED'] = 1;
$code == 0 ? uploadAbeRequest($abeRequest) : '';
} else {
$resStatusCode = is_array($result) ? $result['status_code'] : $result->status_code;
$resMessage = is_array($result) ? $result['message'] : $result->message;
$message = 'An error occurred while the application was being processed.<br /><br />
Error code: ' . $resStatusCode . '<br />
Error message: ' . $resMessage . '<br /><br />';
Log::error($message);
throw new Exception($message);
}
// Update
$resMessage = is_array($result) ? $result['message'] : $result->message;
$dataResponses['ABE_RES_STATUS'] = ($code == 0 ? 'SENT' : 'ERROR');
$dataResponses['ABE_RES_MESSAGE'] = ($code == 0 ? '-' : $resMessage);
try {
$abeResponses = new AbeResponses();
$abeResponses->createOrUpdate($dataResponses);
} catch (Exception $error) {
$message = $error->getMessage();
Log::error($message);
throw $error;
}
return $dataResponses;
}
}

View File

@@ -5,7 +5,6 @@ namespace ProcessMaker\Core;
use Bootstrap;
use Exception;
use Illuminate\Support\Facades\Log;
use ProcessMaker\BusinessModel\Factories\Jobs;
use ProcessMaker\Core\System;
use Propel;
@@ -187,7 +186,7 @@ class JobsManager
{
$environment = $this->getDataSnapshot();
$instance = Jobs::create($name, function() use ($callback, $environment) {
$instance = $name::dispatch(function() use ($callback, $environment) {
try {
$this->recoverDataSnapshot($environment);
$callback($environment);