PMCORE-552
This commit is contained in:
committed by
Julio Cesar Laura Avendaño
parent
a1f447d8af
commit
ebfc73ca11
@@ -17,6 +17,7 @@ use Applications;
|
||||
use AppNotes;
|
||||
use AppNotesPeer;
|
||||
use AppSolr;
|
||||
use AppTimeoutActionExecuted;
|
||||
use BasePeer;
|
||||
use Bootstrap;
|
||||
use BpmnEngineServicesSearchIndex;
|
||||
@@ -25,6 +26,7 @@ use CasesPeer;
|
||||
use Configurations;
|
||||
use CreoleTypes;
|
||||
use Criteria;
|
||||
use DateTime;
|
||||
use DBAdapter;
|
||||
use EntitySolrRequestData;
|
||||
use Exception;
|
||||
@@ -44,8 +46,11 @@ use ProcessMaker\Exception\UploadException;
|
||||
use ProcessMaker\Exception\CaseNoteUploadFile;
|
||||
use ProcessMaker\Model\Application as ModelApplication;
|
||||
use ProcessMaker\Model\AppNotes as Notes;
|
||||
use ProcessMaker\Model\AppTimeoutAction;
|
||||
use ProcessMaker\Model\Delegation;
|
||||
use ProcessMaker\Model\Documents;
|
||||
use ProcessMaker\Model\ListUnassigned;
|
||||
use ProcessMaker\Model\Triggers;
|
||||
use ProcessMaker\Plugins\PluginRegistry;
|
||||
use ProcessMaker\Services\OAuth2\Server;
|
||||
use ProcessMaker\Util\DateTime as UtilDateTime;
|
||||
@@ -4107,4 +4112,127 @@ class Cases
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the cases related to the self services timeout that needs to execute the trigger related
|
||||
*
|
||||
* @return array
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function executeSelfServiceTimeout()
|
||||
{
|
||||
try {
|
||||
$casesSelfService = ListUnassigned::selfServiceTimeout();
|
||||
$casesExecuted = [];
|
||||
foreach ($casesSelfService as $row) {
|
||||
$appUid = $row["APP_UID"];
|
||||
$appNumber = $row["APP_NUMBER"];
|
||||
$delIndex = $row["DEL_INDEX"];
|
||||
$delegateDate = $row["DEL_DELEGATE_DATE"];
|
||||
$proUid = $row["PRO_UID"];
|
||||
$taskUid = $row["TAS_UID"];
|
||||
$taskSelfServiceTime = intval($row["TAS_SELFSERVICE_TIME"]);
|
||||
$taskSelfServiceTimeUnit = $row["TAS_SELFSERVICE_TIME_UNIT"];
|
||||
$triggerUid = $row["TAS_SELFSERVICE_TRIGGER_UID"];
|
||||
|
||||
/*----------------------------------********---------------------------------*/
|
||||
$typeOfExecution = $row["TAS_SELFSERVICE_EXECUTION"];
|
||||
$flagExecuteOnce = true;
|
||||
// This option will be executed just once, can check if was executed before
|
||||
if ($typeOfExecution == 'ONCE') {
|
||||
$appTimeout = new AppTimeoutAction();
|
||||
$appTimeout->setCaseUid($appUid);
|
||||
$appTimeout->setIndex($delIndex);
|
||||
$caseExecuted = $appTimeout->cases();
|
||||
$flagExecuteOnce = !empty($caseExecuted) ? false : true;
|
||||
}
|
||||
/*----------------------------------********---------------------------------*/
|
||||
|
||||
// Add the time in the corresponding unit to the delegation date
|
||||
$delegateDate = calculateDate($delegateDate, $taskSelfServiceTimeUnit, $taskSelfServiceTime);
|
||||
|
||||
// Define the current time
|
||||
$datetime = new DateTime('now');
|
||||
$currentDate = $datetime->format('Y-m-d H:i:s');
|
||||
|
||||
// Check if the triggers to be executed
|
||||
if ($currentDate >= $delegateDate && $flagExecuteOnce) {
|
||||
// Review if the session process is defined
|
||||
$sessProcess = null;
|
||||
$sessProcessSw = false;
|
||||
if (isset($_SESSION["PROCESS"])) {
|
||||
$sessProcess = $_SESSION["PROCESS"];
|
||||
$sessProcessSw = true;
|
||||
}
|
||||
// Load case data
|
||||
$case = new ClassesCases();
|
||||
$appFields = $case->loadCase($appUid);
|
||||
$appFields["APP_DATA"]["APPLICATION"] = $appUid;
|
||||
// Set the process defined in the case related
|
||||
$_SESSION["PROCESS"] = $appFields["PRO_UID"];
|
||||
|
||||
// Get the trigger related and execute
|
||||
$triggersList = [];
|
||||
if (!empty($triggerUid)) {
|
||||
$trigger = new Triggers();
|
||||
$trigger->setTrigger($triggerUid);
|
||||
$triggersList = $trigger->triggers();
|
||||
}
|
||||
|
||||
// If the trigger exist, let's to execute
|
||||
if (!empty($triggersList)) {
|
||||
// Execute the trigger defined in the self service timeout
|
||||
$fieldsCase['APP_DATA'] = $case->executeTriggerFromList(
|
||||
$triggersList,
|
||||
$appFields['APP_DATA'],
|
||||
'SELF_SERVICE_TIMEOUT',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
false
|
||||
);
|
||||
|
||||
// Update the case
|
||||
$case->updateCase($appUid, $fieldsCase);
|
||||
|
||||
/*----------------------------------********---------------------------------*/
|
||||
if ($typeOfExecution == 'ONCE') {
|
||||
// Saving the case`s data if the 'Execution' is set in ONCE.
|
||||
$appTimeoutActionExecuted = new AppTimeoutActionExecuted();
|
||||
$dataSelf = [];
|
||||
$dataSelf["APP_UID"] = $appUid;
|
||||
$dataSelf["DEL_INDEX"] = $delIndex;
|
||||
$dataSelf["EXECUTION_DATE"] = time();
|
||||
$appTimeoutActionExecuted->create($dataSelf);
|
||||
}
|
||||
/*----------------------------------********---------------------------------*/
|
||||
|
||||
array_push($casesExecuted, $appNumber); // Register the cases executed
|
||||
|
||||
// Logging this action
|
||||
$context = [
|
||||
'appUid' => $appUid,
|
||||
'appNumber' => $appNumber,
|
||||
'triUid' => $triggerUid,
|
||||
'proUid' => $proUid,
|
||||
'tasUid' => $taskUid,
|
||||
'selfServiceTime' => $taskSelfServiceTime,
|
||||
'selfServiceTimeUnit' => $taskSelfServiceTimeUnit,
|
||||
];
|
||||
Log::channel(':TriggerExecution')->info('Timeout trigger execution', Bootstrap::context($context));
|
||||
}
|
||||
|
||||
unset($_SESSION["PROCESS"]);
|
||||
|
||||
if ($sessProcessSw) {
|
||||
$_SESSION["PROCESS"] = $sessProcess;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $casesExecuted;
|
||||
} catch (Exception $e) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace ProcessMaker\AuditLog;
|
||||
namespace ProcessMaker\Log;
|
||||
|
||||
use Bootstrap;
|
||||
use Configurations;
|
||||
103
workflow/engine/src/ProcessMaker/Model/AppTimeoutAction.php
Normal file
103
workflow/engine/src/ProcessMaker/Model/AppTimeoutAction.php
Normal file
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
namespace ProcessMaker\Model;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class AppTimeoutAction extends Model
|
||||
{
|
||||
protected $table = 'APP_TIMEOUT_ACTION_EXECUTED';
|
||||
// We do not have create/update timestamps for this table
|
||||
public $timestamps = false;
|
||||
// Filter by a specific case using case number
|
||||
private $caseUid = '';
|
||||
// Filter by a specific index
|
||||
private $index = 0;
|
||||
|
||||
/**
|
||||
* Set Case Uid
|
||||
*
|
||||
* @param string $caseUid
|
||||
*/
|
||||
public function setCaseUid($caseUid)
|
||||
{
|
||||
$this->caseUid = $caseUid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Case Uid
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCaseUid()
|
||||
{
|
||||
return $this->caseUid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set index
|
||||
*
|
||||
* @param int $index
|
||||
*/
|
||||
public function setIndex($index)
|
||||
{
|
||||
$this->index = $index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get index
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getIndex()
|
||||
{
|
||||
return $this->index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope a query to get specific case uid
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param string $appUid
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public function scopeCase($query, $appUid)
|
||||
{
|
||||
return $query->where('APP_UID', $appUid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope a query to get index
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param int $index
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public function scopeIndex($query, $index)
|
||||
{
|
||||
return $query->where('DEL_INDEX', $index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the records related to the case and index if it was defined
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function cases()
|
||||
{
|
||||
$query = AppTimeoutAction::query()->select();
|
||||
// Specific case uid
|
||||
if (!empty($this->getCaseUid())) {
|
||||
$query->case($this->getCaseUid());
|
||||
}
|
||||
// Specific index
|
||||
if (!empty($this->getIndex())) {
|
||||
$query->index($this->getIndex());
|
||||
}
|
||||
$results = $query->get()->toArray();
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
@@ -46,8 +46,9 @@ class ListUnassigned extends Model
|
||||
/**
|
||||
* Scope a query to only include specific tasks
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param array $tasks
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param array $tasks
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public function scopeTasksIn($query, array $tasks)
|
||||
@@ -58,8 +59,8 @@ class ListUnassigned extends Model
|
||||
/**
|
||||
* Scope a query to only include a specific case
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param integer $appNumber
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param integer $appNumber
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
@@ -71,8 +72,8 @@ class ListUnassigned extends Model
|
||||
/**
|
||||
* Scope a query to only include a specific index
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param integer $index
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param integer $index
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
@@ -84,8 +85,8 @@ class ListUnassigned extends Model
|
||||
/**
|
||||
* Scope a query to only include a specific task
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param integer $task
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param integer $task
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
@@ -100,7 +101,7 @@ class ListUnassigned extends Model
|
||||
* @param string $userUid
|
||||
* @param array $filters
|
||||
*
|
||||
* @return array
|
||||
* @return int
|
||||
*/
|
||||
public static function doCount($userUid, $filters = [])
|
||||
{
|
||||
@@ -125,4 +126,21 @@ class ListUnassigned extends Model
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the unassigned cases related to the self service timeout
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function selfServiceTimeout()
|
||||
{
|
||||
$query = ListUnassigned::query()->select();
|
||||
$query->join('TASK', function ($join) {
|
||||
$join->on('LIST_UNASSIGNED.TAS_ID', '=', 'TASK.TAS_ID')
|
||||
->where('TASK.TAS_SELFSERVICE_TIMEOUT', '=', 1);
|
||||
});
|
||||
$results = $query->get()->toArray();
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,11 +10,34 @@ class Triggers extends Model
|
||||
protected $table = 'TRIGGERS';
|
||||
// No timestamps
|
||||
public $timestamps = false;
|
||||
//primary key
|
||||
// Primary key
|
||||
protected $primaryKey = 'TRI_UID';
|
||||
//No incrementing
|
||||
// No incrementing
|
||||
public $incrementing = false;
|
||||
|
||||
// Filter by a specific uid
|
||||
private $triUid = '';
|
||||
|
||||
/**
|
||||
* Set trigger uid
|
||||
*
|
||||
* @param string $triUid
|
||||
*/
|
||||
public function setTrigger($triUid)
|
||||
{
|
||||
$this->triUid = $triUid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get trigger uid
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getTrigger()
|
||||
{
|
||||
return $this->triUid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope a query to filter an specific process
|
||||
*
|
||||
@@ -22,8 +45,37 @@ class Triggers extends Model
|
||||
* @param string $columns
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public function scopeProcess($query, string $proUID)
|
||||
public function scopeProcess($query, string $proUid)
|
||||
{
|
||||
return $query->where('PRO_UID', $proUID);
|
||||
return $query->where('PRO_UID', $proUid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope a query to filter an specific trigger
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param string $triUid
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public function scopeTrigger($query, string $triUid)
|
||||
{
|
||||
return $query->where('TRI_UID', $triUid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the records
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function triggers()
|
||||
{
|
||||
$query = Triggers::query()->select();
|
||||
// Specific trigger
|
||||
if (!empty($this->getTrigger())) {
|
||||
$query->trigger($this->getTrigger());
|
||||
}
|
||||
$results = $query->get()->toArray();
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
@@ -640,3 +640,33 @@ function saveAppDocument($file, $appUid, $appDocUid, $version = 1, $upload = tru
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a specific date minutes, hours or days
|
||||
*
|
||||
* @param string $iniDate
|
||||
* @param string $timeUnit
|
||||
* @param int $time
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @link https://www.php.net/manual/en/datetime.modify.php
|
||||
*/
|
||||
function calculateDate($iniDate, $timeUnit, $time)
|
||||
{
|
||||
|
||||
$datetime = new DateTime($iniDate);
|
||||
switch ($timeUnit) {
|
||||
case 'DAYS':
|
||||
$datetime->modify('+' . $time . ' day');
|
||||
break;
|
||||
case 'HOURS':
|
||||
$datetime->modify('+' . $time . ' hour');
|
||||
break;
|
||||
case 'MINUTES':
|
||||
$datetime->modify('+' . $time . ' minutes');
|
||||
break;
|
||||
}
|
||||
|
||||
return $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user