PMCORE-1402 Use Jobs in the email execution related to the 'Action by email'
This commit is contained in:
14
app/Jobs/ActionByEmail.php
Normal file
14
app/Jobs/ActionByEmail.php
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Jobs;
|
||||||
|
|
||||||
|
class ActionByEmail extends QueuedClosure
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The number of times the job may be attempted.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
public $tries = 1;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Jobs;
|
|
||||||
|
|
||||||
class CasesDispatch extends QueuedClosure
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -18,4 +18,14 @@ abstract class QueuedClosure extends CallQueuedClosure
|
|||||||
{
|
{
|
||||||
parent::__construct(new SerializableClosure($closure));
|
parent::__construct(new SerializableClosure($closure));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the display name for the queued job.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function displayName(): string
|
||||||
|
{
|
||||||
|
return get_class($this) . ' ' . parent::displayName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
14
app/Jobs/RouteCase.php
Normal file
14
app/Jobs/RouteCase.php
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Jobs;
|
||||||
|
|
||||||
|
class RouteCase extends QueuedClosure
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The number of times the job may be attempted.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
public $tries = 1;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,10 +3,14 @@
|
|||||||
use Faker\Generator as Faker;
|
use Faker\Generator as Faker;
|
||||||
|
|
||||||
$factory->define(\ProcessMaker\Model\AbeConfiguration::class, function (Faker $faker) {
|
$factory->define(\ProcessMaker\Model\AbeConfiguration::class, function (Faker $faker) {
|
||||||
$process = \ProcessMaker\Model\Process::all()->random();
|
$process = factory(\ProcessMaker\Model\Process::class)->create();
|
||||||
$task = \ProcessMaker\Model\Task::all()->random();
|
$dynaform = factory(\ProcessMaker\Model\Dynaform::class)->create([
|
||||||
$dynaForm = \ProcessMaker\Model\Dynaform::all()->random();
|
'PRO_UID' => $process->PRO_UID
|
||||||
$emailServer = \ProcessMaker\Model\EmailServerModel::all()->random();
|
]);
|
||||||
|
$task = factory(\ProcessMaker\Model\Task::class)->create([
|
||||||
|
'PRO_UID' => $process->PRO_UID
|
||||||
|
]);
|
||||||
|
$emailServer = factory(\ProcessMaker\Model\EmailServerModel::class)->create();
|
||||||
return [
|
return [
|
||||||
'ABE_UID' => G::generateUniqueID(),
|
'ABE_UID' => G::generateUniqueID(),
|
||||||
'PRO_UID' => $process->PRO_UID,
|
'PRO_UID' => $process->PRO_UID,
|
||||||
@@ -14,7 +18,7 @@ $factory->define(\ProcessMaker\Model\AbeConfiguration::class, function (Faker $f
|
|||||||
'ABE_TYPE' => $faker->randomElement(['', 'LINK']),
|
'ABE_TYPE' => $faker->randomElement(['', 'LINK']),
|
||||||
'ABE_TEMPLATE' => 'actionByEmail.html',
|
'ABE_TEMPLATE' => 'actionByEmail.html',
|
||||||
'ABE_DYN_TYPE' => 'NORMAL',
|
'ABE_DYN_TYPE' => 'NORMAL',
|
||||||
'DYN_UID' => $dynaForm->DYN_UID,
|
'DYN_UID' => $dynaform->DYN_UID,
|
||||||
'ABE_EMAIL_FIELD' => 'admin@processmaker.com',
|
'ABE_EMAIL_FIELD' => 'admin@processmaker.com',
|
||||||
'ABE_ACTION_FIELD' => '',
|
'ABE_ACTION_FIELD' => '',
|
||||||
'ABE_CASE_NOTE_IN_RESPONSE' => $faker->randomElement(['0', '1']),
|
'ABE_CASE_NOTE_IN_RESPONSE' => $faker->randomElement(['0', '1']),
|
||||||
|
|||||||
@@ -3,12 +3,17 @@
|
|||||||
use Faker\Generator as Faker;
|
use Faker\Generator as Faker;
|
||||||
|
|
||||||
$factory->define(\ProcessMaker\Model\AbeRequest::class, function (Faker $faker) {
|
$factory->define(\ProcessMaker\Model\AbeRequest::class, function (Faker $faker) {
|
||||||
$process = \ProcessMaker\Model\Application::all()->random();
|
$process = factory(\ProcessMaker\Model\Process::class)->create();
|
||||||
$abeConfiguration = \ProcessMaker\Model\AbeConfiguration::all()->random();
|
$abeConfiguration = factory(\ProcessMaker\Model\AbeConfiguration::class)->create([
|
||||||
|
'PRO_UID' => $process->PRO_UID
|
||||||
|
]);
|
||||||
|
$application = factory(\ProcessMaker\Model\Application::class)->create([
|
||||||
|
'PRO_UID' => $process->PRO_UID
|
||||||
|
]);
|
||||||
return [
|
return [
|
||||||
'ABE_REQ_UID' => G::generateUniqueID(),
|
'ABE_REQ_UID' => G::generateUniqueID(),
|
||||||
'ABE_UID' => $abeConfiguration->ABE_UID,
|
'ABE_UID' => $abeConfiguration->ABE_UID,
|
||||||
'APP_UID' => $process->APP_UID,
|
'APP_UID' => $application->APP_UID,
|
||||||
'DEL_INDEX' => 0,
|
'DEL_INDEX' => 0,
|
||||||
'ABE_REQ_SENT_TO' => $faker->email,
|
'ABE_REQ_SENT_TO' => $faker->email,
|
||||||
'ABE_REQ_SUBJECT' => '',
|
'ABE_REQ_SUBJECT' => '',
|
||||||
|
|||||||
@@ -10,10 +10,12 @@ $factory->define(\ProcessMaker\Model\Dynaform::class, function(Faker $faker) {
|
|||||||
$date = $faker->dateTime();
|
$date = $faker->dateTime();
|
||||||
return [
|
return [
|
||||||
'DYN_UID' => G::generateUniqueID(),
|
'DYN_UID' => G::generateUniqueID(),
|
||||||
'DYN_ID' => $faker->unique()->numberBetween(1, 10000),
|
|
||||||
'DYN_TITLE' => $faker->sentence(2),
|
'DYN_TITLE' => $faker->sentence(2),
|
||||||
'DYN_DESCRIPTION' => $faker->sentence(5),
|
'DYN_DESCRIPTION' => $faker->sentence(5),
|
||||||
'PRO_UID' => G::generateUniqueID(),
|
'PRO_UID' => function() {
|
||||||
|
$process = factory(Process::class)->create();
|
||||||
|
return $process->PRO_UID;
|
||||||
|
},
|
||||||
'DYN_TYPE' => 'xmlform',
|
'DYN_TYPE' => 'xmlform',
|
||||||
'DYN_FILENAME' => '',
|
'DYN_FILENAME' => '',
|
||||||
'DYN_CONTENT' => '',
|
'DYN_CONTENT' => '',
|
||||||
@@ -27,7 +29,6 @@ $factory->state(\ProcessMaker\Model\Dynaform::class, 'foreign_keys', function (F
|
|||||||
$date = $faker->dateTime();
|
$date = $faker->dateTime();
|
||||||
return [
|
return [
|
||||||
'DYN_UID' => G::generateUniqueID(),
|
'DYN_UID' => G::generateUniqueID(),
|
||||||
'DYN_ID' => $faker->unique()->numberBetween(1, 10000),
|
|
||||||
'DYN_TITLE' => $faker->sentence(2),
|
'DYN_TITLE' => $faker->sentence(2),
|
||||||
'DYN_DESCRIPTION' => $faker->sentence(5),
|
'DYN_DESCRIPTION' => $faker->sentence(5),
|
||||||
'PRO_UID' => function() {
|
'PRO_UID' => function() {
|
||||||
@@ -49,10 +50,12 @@ $factory->state(\ProcessMaker\Model\Dynaform::class, 'translations', function (F
|
|||||||
$date = $faker->dateTime();
|
$date = $faker->dateTime();
|
||||||
return [
|
return [
|
||||||
'DYN_UID' => G::generateUniqueID(),
|
'DYN_UID' => G::generateUniqueID(),
|
||||||
'DYN_ID' => $faker->unique()->numberBetween(1, 10000),
|
|
||||||
'DYN_TITLE' => $faker->sentence(2),
|
'DYN_TITLE' => $faker->sentence(2),
|
||||||
'DYN_DESCRIPTION' => $faker->sentence(5),
|
'DYN_DESCRIPTION' => $faker->sentence(5),
|
||||||
'PRO_UID' => G::generateUniqueID(),
|
'PRO_UID' => function() {
|
||||||
|
$process = factory(Process::class)->create();
|
||||||
|
return $process->PRO_UID;
|
||||||
|
},
|
||||||
'DYN_TYPE' => 'xmlform',
|
'DYN_TYPE' => 'xmlform',
|
||||||
'DYN_FILENAME' => '',
|
'DYN_FILENAME' => '',
|
||||||
'DYN_CONTENT' => '',
|
'DYN_CONTENT' => '',
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ use ProcessMaker\Model\Process;
|
|||||||
$factory->define(InputDocument::class, function(Faker $faker) {
|
$factory->define(InputDocument::class, function(Faker $faker) {
|
||||||
return [
|
return [
|
||||||
'INP_DOC_UID' => G::generateUniqueID(),
|
'INP_DOC_UID' => G::generateUniqueID(),
|
||||||
'INP_DOC_ID' => $faker->unique()->numberBetween(1, 10000),
|
|
||||||
'PRO_UID' => function() {
|
'PRO_UID' => function() {
|
||||||
$process = factory(Process::class)->create();
|
$process = factory(Process::class)->create();
|
||||||
return $process->PRO_UID;
|
return $process->PRO_UID;
|
||||||
|
|||||||
@@ -2,11 +2,17 @@
|
|||||||
|
|
||||||
namespace Tests\unit\workflow\engine\src\ProcessMaker\Cases;
|
namespace Tests\unit\workflow\engine\src\ProcessMaker\Cases;
|
||||||
|
|
||||||
use App\Jobs\CasesDispatch;
|
use App\Jobs\RouteCase;
|
||||||
use Cases;
|
use Cases;
|
||||||
|
use G;
|
||||||
use Illuminate\Support\Facades\Queue;
|
use Illuminate\Support\Facades\Queue;
|
||||||
|
use ProcessMaker\Model\AbeConfiguration;
|
||||||
|
use ProcessMaker\Model\AbeRequest;
|
||||||
use ProcessMaker\Model\Application;
|
use ProcessMaker\Model\Application;
|
||||||
use ProcessMaker\Model\Delegation;
|
use ProcessMaker\Model\Delegation;
|
||||||
|
use ProcessMaker\Model\Dynaform;
|
||||||
|
use ProcessMaker\Model\EmailServerModel;
|
||||||
|
use ProcessMaker\Model\InputDocument;
|
||||||
use ProcessMaker\Model\Process;
|
use ProcessMaker\Model\Process;
|
||||||
use ProcessMaker\Model\Route;
|
use ProcessMaker\Model\Route;
|
||||||
use ProcessMaker\Model\Step;
|
use ProcessMaker\Model\Step;
|
||||||
@@ -286,6 +292,162 @@ class CasesTraitTest extends TestCase
|
|||||||
|
|
||||||
require_once PATH_METHODS . 'cases/cases_Derivate.php';
|
require_once PATH_METHODS . 'cases/cases_Derivate.php';
|
||||||
|
|
||||||
Queue::assertPushed(CasesDispatch::class);
|
Queue::assertPushed(RouteCase::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test verifies if ABE is completed.
|
||||||
|
* @test
|
||||||
|
* @covers Cases::routeCaseActionByEmail
|
||||||
|
*/
|
||||||
|
public function it_should_verify_if_abe_is_completed()
|
||||||
|
{
|
||||||
|
$user = User::where('USR_ID', '=', 1)->get()->first();
|
||||||
|
|
||||||
|
$process = factory(Process::class)->create([
|
||||||
|
'PRO_CREATE_USER' => $user->USR_UID
|
||||||
|
]);
|
||||||
|
$dynaform = factory(Dynaform::class)->create([
|
||||||
|
'PRO_UID' => $process->PRO_UID
|
||||||
|
]);
|
||||||
|
$inpuDocument = factory(InputDocument::class)->create([
|
||||||
|
'PRO_UID' => $process->PRO_UID
|
||||||
|
]);
|
||||||
|
$task = factory(Task::class)->create([
|
||||||
|
'TAS_ASSIGN_TYPE' => 'BALANCED',
|
||||||
|
'TAS_GROUP_VARIABLE' => '',
|
||||||
|
'PRO_UID' => $process->PRO_UID
|
||||||
|
]);
|
||||||
|
factory(TaskUser::class)->create([
|
||||||
|
'TAS_UID' => $task->TAS_UID,
|
||||||
|
'USR_UID' => $user->USR_UID,
|
||||||
|
'TU_RELATION' => 1,
|
||||||
|
'TU_TYPE' => 1
|
||||||
|
]);
|
||||||
|
$task2 = factory(Task::class)->create([
|
||||||
|
'TAS_ASSIGN_TYPE' => 'BALANCED',
|
||||||
|
'TAS_GROUP_VARIABLE' => '',
|
||||||
|
'PRO_UID' => $process->PRO_UID
|
||||||
|
]);
|
||||||
|
factory(TaskUser::class)->create([
|
||||||
|
'TAS_UID' => $task2->TAS_UID,
|
||||||
|
'USR_UID' => $user->USR_UID,
|
||||||
|
'TU_RELATION' => 1,
|
||||||
|
'TU_TYPE' => 1
|
||||||
|
]);
|
||||||
|
|
||||||
|
$application = factory(Application::class)->create([
|
||||||
|
'PRO_UID' => $process->PRO_UID
|
||||||
|
]);
|
||||||
|
$delegation1 = factory(Delegation::class)->create([
|
||||||
|
'USR_UID' => $user->USR_UID,
|
||||||
|
'PRO_UID' => $process->PRO_UID,
|
||||||
|
'APP_UID' => $application->APP_UID,
|
||||||
|
'TAS_UID' => $task->TAS_UID,
|
||||||
|
'DEL_INDEX' => 1,
|
||||||
|
]);
|
||||||
|
factory(Delegation::class)->create([
|
||||||
|
'USR_UID' => $user->USR_UID,
|
||||||
|
'PRO_UID' => $process->PRO_UID,
|
||||||
|
'APP_UID' => $application->APP_UID,
|
||||||
|
'TAS_UID' => $task2->TAS_UID,
|
||||||
|
'DEL_INDEX' => 2,
|
||||||
|
'DEL_PREVIOUS' => $delegation1->DEL_INDEX
|
||||||
|
]);
|
||||||
|
factory(Route::class)->create([
|
||||||
|
'TAS_UID' => $task->TAS_UID,
|
||||||
|
'ROU_NEXT_TASK' => $task2->TAS_UID,
|
||||||
|
'PRO_UID' => $process->PRO_UID
|
||||||
|
]);
|
||||||
|
|
||||||
|
$emailServer = factory(EmailServerModel::class)->create();
|
||||||
|
$abeConfiguration = factory(AbeConfiguration::class)->create([
|
||||||
|
'PRO_UID' => $process->PRO_UID,
|
||||||
|
'DYN_UID' => $dynaform->DYN_UID,
|
||||||
|
'TAS_UID' => $task2->TAS_UID,
|
||||||
|
'ABE_EMAIL_SERVER_UID' => $emailServer->MESS_UID,
|
||||||
|
'ABE_TYPE' => 'LINK',
|
||||||
|
'ABE_CASE_NOTE_IN_RESPONSE' => 1,
|
||||||
|
]);
|
||||||
|
$abeRequest = factory(AbeRequest::class)->create([
|
||||||
|
'ABE_UID' => $abeConfiguration->ABE_UID,
|
||||||
|
'APP_UID' => $application->APP_UID,
|
||||||
|
'DEL_INDEX' => $delegation1->DEL_INDEX,
|
||||||
|
]);
|
||||||
|
if (!defined('PATH_DOCUMENT')) {
|
||||||
|
define('PATH_DOCUMENT', PATH_DB . config('system.workspace') . PATH_SEP . 'files' . PATH_SEP);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$appUid = $delegation1->APP_UID;
|
||||||
|
$delIndex = $delegation1->DEL_INDEX;
|
||||||
|
$aber = $abeRequest->ABE_REQ_UID;
|
||||||
|
$dynUid = $dynaform->DYN_UID;
|
||||||
|
$forms = [];
|
||||||
|
$remoteAddr = '127.0.0.1';
|
||||||
|
$files = [
|
||||||
|
'form' => [
|
||||||
|
'name' => ['test'],
|
||||||
|
'type' => ['test'],
|
||||||
|
'size' => ['1000'],
|
||||||
|
'tmp_name' => [tempnam(sys_get_temp_dir(), 'test')],
|
||||||
|
'error' => [''],
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$cases = new Cases();
|
||||||
|
$cases->routeCaseActionByEmail($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test verifies if the ABE form has been completed.
|
||||||
|
* @test
|
||||||
|
* @covers Cases::routeCaseActionByEmail
|
||||||
|
*/
|
||||||
|
public function it_should_verify_if_abe_has_completed()
|
||||||
|
{
|
||||||
|
$delegation1 = factory(Delegation::class)->state('closed')->create();
|
||||||
|
$abeRequest = factory(AbeRequest::class)->create();
|
||||||
|
$dynaform = factory(Dynaform::class)->create([
|
||||||
|
'PRO_UID' => $delegation1->PRO_UID
|
||||||
|
]);
|
||||||
|
|
||||||
|
$appUid = $delegation1->APP_UID;
|
||||||
|
$delIndex = $delegation1->DEL_INDEX;
|
||||||
|
$aber = $abeRequest->ABE_REQ_UID;
|
||||||
|
$dynUid = $dynaform->DYN_UID;
|
||||||
|
$forms = [];
|
||||||
|
$remoteAddr = '127.0.0.1';
|
||||||
|
$files = [];
|
||||||
|
|
||||||
|
$this->expectException(\Exception::class);
|
||||||
|
$cases = new Cases();
|
||||||
|
$cases->routeCaseActionByEmail($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test verifies if the case has failed due to any circumstance.
|
||||||
|
* @test
|
||||||
|
* @covers Cases::routeCaseActionByEmail
|
||||||
|
*/
|
||||||
|
public function it_should_test_an_exception_if_the_case_throws_an_incorrect_state()
|
||||||
|
{
|
||||||
|
$delegation1 = factory(Delegation::class)->create();
|
||||||
|
$abeRequest = factory(AbeRequest::class)->create();
|
||||||
|
$dynaform = factory(Dynaform::class)->create([
|
||||||
|
'PRO_UID' => $delegation1->PRO_UID
|
||||||
|
]);
|
||||||
|
|
||||||
|
$appUid = $delegation1->APP_UID;
|
||||||
|
$delIndex = $delegation1->DEL_INDEX;
|
||||||
|
$aber = $abeRequest->ABE_REQ_UID;
|
||||||
|
$dynUid = $dynaform->DYN_UID;
|
||||||
|
$forms = [];
|
||||||
|
$remoteAddr = '127.0.0.1';
|
||||||
|
$files = [];
|
||||||
|
|
||||||
|
$this->expectException(\Exception::class);
|
||||||
|
$cases = new Cases();
|
||||||
|
$cases->routeCaseActionByEmail($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ class JobsManagerTest extends TestCase
|
|||||||
$callback = function() {
|
$callback = function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
$actual = $this->object->dispatch('Email', $callback);
|
$actual = $this->object->dispatch(\App\Jobs\Email::class, $callback);
|
||||||
|
|
||||||
$this->assertInstanceOf(\Illuminate\Foundation\Bus\PendingDispatch::class, $actual);
|
$this->assertInstanceOf(\Illuminate\Foundation\Bus\PendingDispatch::class, $actual);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use App\Jobs\EmailEvent;
|
||||||
use Illuminate\Support\Facades\Crypt;
|
use Illuminate\Support\Facades\Crypt;
|
||||||
use ProcessMaker\BusinessModel\EmailServer;
|
use ProcessMaker\BusinessModel\EmailServer;
|
||||||
/*----------------------------------********---------------------------------*/
|
/*----------------------------------********---------------------------------*/
|
||||||
@@ -1029,7 +1030,7 @@ class WsBase
|
|||||||
switch ($appMsgType) {
|
switch ($appMsgType) {
|
||||||
case WsBase::MESSAGE_TYPE_EMAIL_EVENT:
|
case WsBase::MESSAGE_TYPE_EMAIL_EVENT:
|
||||||
case WsBase::MESSAGE_TYPE_PM_FUNCTION:
|
case WsBase::MESSAGE_TYPE_PM_FUNCTION:
|
||||||
JobsManager::getSingleton()->dispatch('EmailEvent', $closure);
|
JobsManager::getSingleton()->dispatch(EmailEvent::class, $closure);
|
||||||
break;
|
break;
|
||||||
default :
|
default :
|
||||||
$spool = $closure();
|
$spool = $closure();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use App\Jobs\RouteCase;
|
||||||
use ProcessMaker\Core\JobsManager;
|
use ProcessMaker\Core\JobsManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -105,7 +106,7 @@ try {
|
|||||||
$cases = new Cases();
|
$cases = new Cases();
|
||||||
$cases->routeCase($processUid, $application, $postForm, $sStatus, $flagGmail, $tasUid, $index, $userLogged);
|
$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.
|
//We close the related threads.
|
||||||
$cases = new Cases();
|
$cases = new Cases();
|
||||||
|
|||||||
@@ -4,13 +4,13 @@
|
|||||||
* @see workflow/engine/methods/services/ActionsByEmailDataForm.php
|
* @see workflow/engine/methods/services/ActionsByEmailDataForm.php
|
||||||
* @link https://wiki.processmaker.com/3.3/Actions_by_Email#Link_to_Fill_a_Form
|
* @link https://wiki.processmaker.com/3.3/Actions_by_Email#Link_to_Fill_a_Form
|
||||||
*/
|
*/
|
||||||
|
use App\Jobs\ActionByEmail;
|
||||||
use ProcessMaker\BusinessModel\Cases\InputDocument;
|
use ProcessMaker\Core\JobsManager;
|
||||||
use ProcessMaker\ChangeLog\ChangeLog;
|
|
||||||
use ProcessMaker\Validation\ValidationUploadedFiles;
|
use ProcessMaker\Validation\ValidationUploadedFiles;
|
||||||
|
|
||||||
if (PMLicensedFeatures::getSingleton()
|
$featureEnable = PMLicensedFeatures::getSingleton()
|
||||||
->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=')) {
|
->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).
|
* To do: The following evaluation must be moved after saving the data (so as not to lose the data entered in the form).
|
||||||
@@ -22,7 +22,7 @@ if (PMLicensedFeatures::getSingleton()
|
|||||||
G::SendMessageText($validator->getMessage(), "ERROR");
|
G::SendMessageText($validator->getMessage(), "ERROR");
|
||||||
$url = explode("sys" . config("system.workspace"), $_SERVER['HTTP_REFERER']);
|
$url = explode("sys" . config("system.workspace"), $_SERVER['HTTP_REFERER']);
|
||||||
G::header("location: " . "/sys" . config("system.workspace") . $url[1]);
|
G::header("location: " . "/sys" . config("system.workspace") . $url[1]);
|
||||||
die();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$G_PUBLISH = new Publisher();
|
$G_PUBLISH = new Publisher();
|
||||||
@@ -53,111 +53,23 @@ if (PMLicensedFeatures::getSingleton()
|
|||||||
$aber = G::decrypt($_REQUEST['ABER'], URL_KEY);
|
$aber = G::decrypt($_REQUEST['ABER'], URL_KEY);
|
||||||
$dynUid = G::decrypt($_REQUEST['DYN_UID'], URL_KEY);
|
$dynUid = G::decrypt($_REQUEST['DYN_UID'], URL_KEY);
|
||||||
$forms = isset($_REQUEST['form']) ? $_REQUEST['form'] : [];
|
$forms = isset($_REQUEST['form']) ? $_REQUEST['form'] : [];
|
||||||
|
$remoteAddr = $_SERVER['REMOTE_ADDR'];
|
||||||
|
$files = $_FILES;
|
||||||
|
|
||||||
//Load data related to the case
|
//Now we dispatch the derivation of the case through Jobs Laravel.
|
||||||
$case = new Cases();
|
$closure = function() use ($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files) {
|
||||||
$casesFields = $case->loadCase($appUid, $delIndex);
|
$cases = new Cases();
|
||||||
|
$cases->routeCaseActionByEmail($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files);
|
||||||
// Check if the current thread is not finished
|
};
|
||||||
if (!is_null($casesFields['DEL_FINISH_DATE'])) {
|
JobsManager::getSingleton()->dispatch(ActionByEmail::class, $closure);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
$message = [];
|
||||||
|
$message['MESSAGE'] = '<strong>' . G::loadTranslation('ID_ABE_INFORMATION_SUBMITTED') . '</strong>';
|
||||||
$_SESSION = unserialize($backupSession);
|
$_SESSION = unserialize($backupSession);
|
||||||
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showInfo', '', $aMessage);
|
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showInfo', '', $message);
|
||||||
} catch (Exception $error) {
|
} 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);
|
$_SESSION = unserialize($backupSession);
|
||||||
G::RenderPage('publish', 'blank');
|
G::RenderPage('publish', 'blank');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace ProcessMaker\Cases;
|
namespace ProcessMaker\Cases;
|
||||||
|
|
||||||
|
use AbeResponses;
|
||||||
use AppDelegation;
|
use AppDelegation;
|
||||||
use AppDelegationPeer;
|
use AppDelegationPeer;
|
||||||
use AppDocumentDrive;
|
use AppDocumentDrive;
|
||||||
@@ -9,11 +10,16 @@ use BasePeer;
|
|||||||
use Cases;
|
use Cases;
|
||||||
use Derivation;
|
use Derivation;
|
||||||
use Event;
|
use Event;
|
||||||
|
use Exception;
|
||||||
use G;
|
use G;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use PMLicensedFeatures;
|
use PMLicensedFeatures;
|
||||||
|
use ProcessMaker\BusinessModel\Cases\InputDocument;
|
||||||
use ProcessMaker\BusinessModel\Pmgmail;
|
use ProcessMaker\BusinessModel\Pmgmail;
|
||||||
|
use ProcessMaker\ChangeLog\ChangeLog;
|
||||||
|
use stdClass;
|
||||||
use Users;
|
use Users;
|
||||||
use WebDriver\Exception;
|
use WsBase;
|
||||||
|
|
||||||
trait CasesTrait
|
trait CasesTrait
|
||||||
{
|
{
|
||||||
@@ -29,8 +35,9 @@ trait CasesTrait
|
|||||||
* @param string $tasUid
|
* @param string $tasUid
|
||||||
* @param integer $index
|
* @param integer $index
|
||||||
* @param string $userLogged
|
* @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.
|
//warning: we are not using the result value of function thisIsTheCurrentUser, so I'm commenting to optimize speed.
|
||||||
$appFields = $this->loadCase($application);
|
$appFields = $this->loadCase($application);
|
||||||
@@ -202,4 +209,124 @@ trait CasesTrait
|
|||||||
];
|
];
|
||||||
return (object) $result;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ namespace ProcessMaker\Core;
|
|||||||
use Bootstrap;
|
use Bootstrap;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use ProcessMaker\BusinessModel\Factories\Jobs;
|
|
||||||
use ProcessMaker\Core\System;
|
use ProcessMaker\Core\System;
|
||||||
use Propel;
|
use Propel;
|
||||||
|
|
||||||
@@ -187,7 +186,7 @@ class JobsManager
|
|||||||
{
|
{
|
||||||
$environment = $this->getDataSnapshot();
|
$environment = $this->getDataSnapshot();
|
||||||
|
|
||||||
$instance = Jobs::create($name, function() use ($callback, $environment) {
|
$instance = $name::dispatch(function() use ($callback, $environment) {
|
||||||
try {
|
try {
|
||||||
$this->recoverDataSnapshot($environment);
|
$this->recoverDataSnapshot($environment);
|
||||||
$callback($environment);
|
$callback($environment);
|
||||||
|
|||||||
Reference in New Issue
Block a user