Files
luos/workflow/engine/src/ProcessMaker/BusinessModel/MessageApplication.php
Paula V. Quispe 6c70456f0b HOR-2022
2016-10-10 11:31:07 -04:00

670 lines
28 KiB
PHP

<?php
namespace ProcessMaker\BusinessModel;
class MessageApplication
{
private $arrayFieldNameForException = array(
"start" => "START",
"limit" => "LIMIT"
);
private $frontEnd = false;
/**
* Verify if exists the Message-Application
*
* @param string $messageApplicationUid Unique id of Message-Application
*
* return bool Return true if exists the Message-Application, false otherwise
*/
public function exists($messageApplicationUid)
{
try {
$obj = \MessageApplicationPeer::retrieveByPK($messageApplicationUid);
return (!is_null($obj))? true : false;
} catch (\Exception $e) {
throw $e;
}
}
/**
* Create Message-Application for the Case
*
* @param string $applicationUid Unique id of Case
* @param string $projectUid Unique id of Project
* @param string $eventUidThrow Unique id of Event (throw)
* @param array $arrayApplicationData Case data
*
* return bool Return true if been created, false otherwise
*/
public function create($applicationUid, $projectUid, $eventUidThrow, array $arrayApplicationData)
{
try {
$flagCreate = true;
//Set data
//Message-Event-Relation - Get unique id of Event (catch)
$messageEventRelation = new \ProcessMaker\BusinessModel\MessageEventRelation();
$arrayMessageEventRelationData = $messageEventRelation->getMessageEventRelationWhere(
array(
\MessageEventRelationPeer::PRJ_UID => $projectUid,
\MessageEventRelationPeer::EVN_UID_THROW => $eventUidThrow
),
true
);
if (!is_null($arrayMessageEventRelationData)) {
$eventUidCatch = $arrayMessageEventRelationData["EVN_UID_CATCH"];
} else {
$flagCreate = false;
}
//Message-Application - Get data ($eventUidThrow)
$messageEventDefinition = new \ProcessMaker\BusinessModel\MessageEventDefinition();
if ($messageEventDefinition->existsEvent($projectUid, $eventUidThrow)) {
$arrayMessageEventDefinitionData = $messageEventDefinition->getMessageEventDefinitionByEvent($projectUid, $eventUidThrow, true);
$arrayMessageApplicationVariables = $arrayMessageEventDefinitionData["MSGED_VARIABLES"];
$messageApplicationCorrelation = \G::replaceDataField($arrayMessageEventDefinitionData["MSGED_CORRELATION"], $arrayApplicationData["APP_DATA"]);
foreach ($arrayMessageApplicationVariables as $key => $value) {
$arrayMessageApplicationVariables[$key] = \G::replaceDataField($value, $arrayApplicationData["APP_DATA"]);
}
} else {
$flagCreate = false;
}
if (!$flagCreate) {
//Return
return false;
}
//Create
$cnn = \Propel::getConnection("workflow");
try {
$messageApplication = new \MessageApplication();
$messageApplicationUid = \ProcessMaker\Util\Common::generateUID();
$messageApplication->setMsgappUid($messageApplicationUid);
$messageApplication->setAppUid($applicationUid);
$messageApplication->setPrjUid($projectUid);
$messageApplication->setEvnUidThrow($eventUidThrow);
$messageApplication->setEvnUidCatch($eventUidCatch);
$messageApplication->setMsgappVariables(serialize($arrayMessageApplicationVariables));
$messageApplication->setMsgappCorrelation($messageApplicationCorrelation);
$messageApplication->setMsgappThrowDate("now");
if ($messageApplication->validate()) {
$cnn->begin();
$result = $messageApplication->save();
$cnn->commit();
//Return
return true;
} else {
$msg = "";
foreach ($messageApplication->getValidationFailures() as $validationFailure) {
$msg = $msg . (($msg != "")? "\n" : "") . $validationFailure->getMessage();
}
throw new \Exception(\G::LoadTranslation("ID_RECORD_CANNOT_BE_CREATED") . (($msg != "")? "\n" . $msg : ""));
}
} catch (\Exception $e) {
$cnn->rollback();
throw $e;
}
} catch (\Exception $e) {
throw $e;
}
}
/**
* Update Message-Application
*
* @param string $messageApplicationUid Unique id of Message-Application
* @param array $arrayData Data
*
* return bool Return true if been updated, false otherwise
*/
public function update($messageApplicationUid, array $arrayData)
{
try {
//Verify data
if (!$this->exists($messageApplicationUid)) {
//Return
return false;
}
//Update
$cnn = \Propel::getConnection("workflow");
try {
$messageApplication = \MessageApplicationPeer::retrieveByPK($messageApplicationUid);
$messageApplication->fromArray($arrayData, \BasePeer::TYPE_FIELDNAME);
$messageApplication->setMsgappCatchDate("now");
if ($messageApplication->validate()) {
$cnn->begin();
$result = $messageApplication->save();
$cnn->commit();
//Return
return true;
} else {
$msg = "";
foreach ($messageApplication->getValidationFailures() as $validationFailure) {
$msg = $msg . (($msg != "")? "\n" : "") . $validationFailure->getMessage();
}
throw new \Exception(\G::LoadTranslation("ID_REGISTRY_CANNOT_BE_UPDATED") . (($msg != "")? "\n" . $msg : ""));
}
} catch (\Exception $e) {
$cnn->rollback();
throw $e;
}
} catch (\Exception $e) {
throw $e;
}
}
/**
* Get criteria for Message-Application
*
* return object
*/
public function getMessageApplicationCriteria()
{
try {
$criteria = new \Criteria("workflow");
$criteria->addSelectColumn(\MessageApplicationPeer::MSGAPP_UID);
$criteria->addSelectColumn(\MessageApplicationPeer::APP_UID);
$criteria->addSelectColumn(\MessageApplicationPeer::PRJ_UID);
$criteria->addSelectColumn(\MessageApplicationPeer::EVN_UID_THROW);
$criteria->addSelectColumn(\MessageApplicationPeer::EVN_UID_CATCH);
$criteria->addSelectColumn(\MessageApplicationPeer::MSGAPP_VARIABLES);
$criteria->addSelectColumn(\MessageApplicationPeer::MSGAPP_CORRELATION);
$criteria->addSelectColumn(\MessageApplicationPeer::MSGAPP_THROW_DATE);
$criteria->addSelectColumn(\MessageApplicationPeer::MSGAPP_CATCH_DATE);
$criteria->addSelectColumn(\MessageApplicationPeer::MSGAPP_STATUS);
return $criteria;
} catch (\Exception $e) {
throw $e;
}
}
/**
* Merge and get variables
*
* @param array $arrayVariableName Variables
* @param array $arrayVariableValue Values
*
* return array Return an array
*/
public function mergeVariables(array $arrayVariableName, array $arrayVariableValue)
{
try {
$arrayVariable = array();
foreach ($arrayVariableName as $key => $value) {
if (preg_match("/^@[@%#\?\x24\=]([A-Za-z_]\w*)$/", $value, $arrayMatch) && isset($arrayVariableValue[$key])) {
$arrayVariable[$arrayMatch[1]] = $arrayVariableValue[$key];
}
}
//Return
return $arrayVariable;
} catch (\Exception $e) {
throw $e;
}
}
/**
* Get all Message-Applications
*
* @param array $arrayFilterData Data of the filters
* @param string $sortField Field name to sort
* @param string $sortDir Direction of sorting (ASC, DESC)
* @param int $start Start
* @param int $limit Limit
*
* return array Return an array with all Message-Applications
*/
public function getMessageApplications($arrayFilterData = null, $sortField = null, $sortDir = null, $start = null, $limit = null)
{
try {
$arrayMessageApplication = array();
//Verify data
$process = new \ProcessMaker\BusinessModel\Process();
$process->throwExceptionIfDataNotMetPagerVarDefinition(array("start" => $start, "limit" => $limit), $this->arrayFieldNameForException);
//Get data
if (!is_null($limit) && $limit . "" == "0") {
return $arrayMessageApplication;
}
//SQL
$criteria = $this->getMessageApplicationCriteria();
$criteria->addSelectColumn(\BpmnEventPeer::EVN_UID);
$criteria->addSelectColumn(\BpmnEventPeer::EVN_TYPE);
$criteria->addSelectColumn(\BpmnEventPeer::EVN_MARKER);
$criteria->addSelectColumn(\MessageEventDefinitionPeer::MSGED_USR_UID);
$criteria->addSelectColumn(\MessageEventDefinitionPeer::MSGED_VARIABLES);
$criteria->addSelectColumn(\MessageEventDefinitionPeer::MSGED_CORRELATION);
$criteria->addSelectColumn(\ElementTaskRelationPeer::TAS_UID);
$arrayEventType = array("START", "INTERMEDIATE");
$arrayEventMarker = array("MESSAGECATCH");
$criteria->addJoin(\MessageApplicationPeer::EVN_UID_CATCH, \BpmnEventPeer::EVN_UID, \Criteria::INNER_JOIN);
$criteria->add(\BpmnEventPeer::EVN_TYPE, $arrayEventType, \Criteria::IN);
$criteria->add(\BpmnEventPeer::EVN_MARKER, $arrayEventMarker, \Criteria::IN);
$criteria->addJoin(\MessageApplicationPeer::EVN_UID_CATCH, \MessageEventDefinitionPeer::EVN_UID, \Criteria::INNER_JOIN);
$criteria->addJoin(\MessageApplicationPeer::EVN_UID_CATCH, \ElementTaskRelationPeer::ELEMENT_UID, \Criteria::INNER_JOIN);
$criteria->add(\ElementTaskRelationPeer::ELEMENT_TYPE, "bpmnEvent", \Criteria::EQUAL);
if (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["messageApplicationStatus"]) && trim($arrayFilterData["messageApplicationStatus"]) != "") {
$criteria->add(\MessageApplicationPeer::MSGAPP_STATUS, $arrayFilterData["messageApplicationStatus"], \Criteria::EQUAL);
}
//Number records total
$criteriaCount = clone $criteria;
$criteriaCount->clearSelectColumns();
$criteriaCount->addSelectColumn("COUNT(" . \MessageApplicationPeer::MSGAPP_UID . ") AS NUM_REC");
$rsCriteriaCount = \MessageApplicationPeer::doSelectRS($criteriaCount);
$rsCriteriaCount->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
$rsCriteriaCount->next();
$row = $rsCriteriaCount->getRow();
$numRecTotal = $row["NUM_REC"];
//SQL
if (!is_null($sortField) && trim($sortField) != "") {
$sortField = strtoupper($sortField);
if (in_array($sortField, array("MSGAPP_THROW_DATE", "MSGAPP_CATCH_DATE", "MSGAPP_STATUS"))) {
$sortField = \MessageApplicationPeer::TABLE_NAME . "." . $sortField;
} else {
$sortField = \MessageApplicationPeer::MSGAPP_THROW_DATE;
}
} else {
$sortField = \MessageApplicationPeer::MSGAPP_THROW_DATE;
}
if (!is_null($sortDir) && trim($sortDir) != "" && strtoupper($sortDir) == "DESC") {
$criteria->addDescendingOrderByColumn($sortField);
} else {
$criteria->addAscendingOrderByColumn($sortField);
}
if (!is_null($start)) {
$criteria->setOffset((int)($start));
}
if (!is_null($limit)) {
$criteria->setLimit((int)($limit));
}
$rsCriteria = \MessageApplicationPeer::doSelectRS($criteria);
$rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
while ($rsCriteria->next()) {
$row = $rsCriteria->getRow();
$row["MSGAPP_VARIABLES"] = unserialize($row["MSGAPP_VARIABLES"]);
$row["MSGED_VARIABLES"] = unserialize($row["MSGED_VARIABLES"]);
$arrayMessageApplication[] = $row;
}
//Return
return array(
"total" => $numRecTotal,
"start" => (int)((!is_null($start))? $start : 0),
"limit" => (int)((!is_null($limit))? $limit : 0),
"filter" => (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["messageApplicationStatus"]))? $arrayFilterData["messageApplicationStatus"] : "",
"data" => $arrayMessageApplication
);
} catch (\Exception $e) {
throw $e;
}
}
/**
* Catch Message-Events for the Cases
*
* @param bool $frontEnd Flag to represent progress bar
*
* @return void
*/
public function catchMessageEvent($frontEnd = false)
{
try {
\G::LoadClass("wsBase");
//Set variables
$ws = new \wsBase();
$case = new \Cases();
$common = new \ProcessMaker\Util\Common();
$common->setFrontEnd($frontEnd);
//Get data
$totalMessageEvent = 0;
$counterStartMessageEvent = 0;
$counterIntermediateCatchMessageEvent = 0;
$counter = 0;
$flagFirstTime = false;
$common->frontEndShow("START");
do {
$flagNextRecords = false;
$arrayMessageApplicationUnread = $this->getMessageApplications(array("messageApplicationStatus" => "UNREAD"), null, null, 0, 1000);
if (!$flagFirstTime) {
$totalMessageEvent = $arrayMessageApplicationUnread["total"];
$flagFirstTime = true;
}
foreach ($arrayMessageApplicationUnread["data"] as $value) {
if ($counter + 1 > $totalMessageEvent) {
$flagNextRecords = false;
break;
}
$arrayMessageApplicationData = $value;
$processUid = $arrayMessageApplicationData["PRJ_UID"];
$taskUid = $arrayMessageApplicationData["TAS_UID"];
$messageApplicationUid = $arrayMessageApplicationData["MSGAPP_UID"];
$messageApplicationCorrelation = $arrayMessageApplicationData["MSGAPP_CORRELATION"];
$messageEventDefinitionUserUid = $arrayMessageApplicationData["MSGED_USR_UID"];
$messageEventDefinitionCorrelation = $arrayMessageApplicationData["MSGED_CORRELATION"];
$arrayVariable = $this->mergeVariables($arrayMessageApplicationData["MSGED_VARIABLES"], $arrayMessageApplicationData["MSGAPP_VARIABLES"]);
$flagCatched = false;
switch ($arrayMessageApplicationData["EVN_TYPE"]) {
case "START":
if ($messageEventDefinitionCorrelation == $messageApplicationCorrelation && $messageEventDefinitionUserUid != "") {
//Start and derivate new Case
$result = $ws->newCase($processUid, $messageEventDefinitionUserUid, $taskUid, $arrayVariable);
$arrayResult = \G::json_decode(\G::json_encode($result), true);
if ($arrayResult["status_code"] == 0) {
$applicationUid = $arrayResult["caseId"];
$appUid = $arrayResult["caseId"];
$appNumber = $arrayResult["caseNumber"];
$this->syslog(
200
,"Case #$appNumber created"
,'CREATED-NEW-CASE'
,''//timeZone
,$messageEventDefinitionUserUid
,$processUid
,$taskUid
,$appUid
,$appNumber
);
$result = $ws->derivateCase($messageEventDefinitionUserUid, $applicationUid, 1);
$arrayResult = \G::json_decode(\G::json_encode($result), true);
if ($arrayResult["status_code"] == 0) {
$this->syslog(
200
,"Case #$appNumber routed"
,'ROUTED-NEW-CASE'
,''//timeZone
,$messageEventDefinitionUserUid
,$processUid
,$taskUid
,$appUid
,$appNumber
,'1'//Del Index
);
} else {
$this->syslog(
500
,"Failed case #$appNumber. " . $arrayResult["message"]
,'ROUTED-NEW-CASE'
,''//timeZone
,$messageEventDefinitionUserUid
,$processUid
,$taskUid
,$appUid
,$appNumber
);
}
$flagCatched = true;
//Counter
$counterStartMessageEvent++;
} else {
$this->syslog(
500
,"Failed case #$appNumber. " . $arrayResult["message"]
,'CREATED-NEW-CASE'
,''//timeZone
,$messageEventDefinitionUserUid
,$processUid
,$taskUid
);
}
}
break;
case "INTERMEDIATE":
$criteria = new \Criteria("workflow");
$criteria->addSelectColumn(\AppDelegationPeer::APP_UID);
$criteria->addSelectColumn(\AppDelegationPeer::DEL_INDEX);
$criteria->addSelectColumn(\AppDelegationPeer::USR_UID);
$criteria->add(\AppDelegationPeer::PRO_UID, $processUid, \Criteria::EQUAL);
$criteria->add(\AppDelegationPeer::TAS_UID, $taskUid, \Criteria::EQUAL);
$criteria->add(\AppDelegationPeer::DEL_THREAD_STATUS, "OPEN", \Criteria::EQUAL);
$criteria->add(\AppDelegationPeer::DEL_FINISH_DATE, null, \Criteria::ISNULL);
$rsCriteria = \AppDelegationPeer::doSelectRS($criteria);
$rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
while ($rsCriteria->next()) {
$row = $rsCriteria->getRow();
$applicationUid = $row["APP_UID"];
$delIndex = $row["DEL_INDEX"];
$userUid = $row["USR_UID"];
$arrayApplicationData = $case->loadCase($applicationUid);
if (\G::replaceDataField($messageEventDefinitionCorrelation, $arrayApplicationData["APP_DATA"]) == $messageApplicationCorrelation) {
//"Unpause" and derivate Case
$arrayApplicationData["APP_DATA"] = array_merge($arrayApplicationData["APP_DATA"], $arrayVariable);
$arrayResult = $case->updateCase($applicationUid, $arrayApplicationData);
$appNumber = isset($arrayApplicationData["APP_DATA"]["APP_NUMBER"]) ? $arrayApplicationData["APP_DATA"]["APP_NUMBER"] : '';
$result = $ws->derivateCase($userUid, $applicationUid, $delIndex);
$arrayResult = \G::json_decode(\G::json_encode($result), true);
if ($arrayResult["status_code"] == 0) {
$this->syslog(
200
,"Case #$appNumber routed "
,'ROUTED-NEW-CASE'
,''//timeZone
,$userUid
,$processUid
,$taskUid
,$applicationUid
,$appNumber
,$delIndex
);
} else {
$this->syslog(
500
,"Failed case #$appNumber. " . $arrayResult["message"]
,'ROUTED-NEW-CASE'
,''//timeZone
,$userUid
,$processUid
,$taskUid
,$applicationUid
,$appNumber
,$delIndex
);
}
$flagCatched = true;
}
}
//Counter
if ($flagCatched) {
$counterIntermediateCatchMessageEvent++;
}
break;
}
//Message-Application catch
if ($flagCatched) {
$result = $this->update($messageApplicationUid, array("MSGAPP_STATUS" => "READ"));
}
$counter++;
//Progress bar
$common->frontEndShow("BAR", "Message-Events (unread): " . $counter . "/" . $totalMessageEvent . " " . $common->progressBar($totalMessageEvent, $counter));
$flagNextRecords = true;
}
} while ($flagNextRecords);
$common->frontEndShow("TEXT", "Total Message-Events unread: " . $totalMessageEvent);
$common->frontEndShow("TEXT", "Total cases started: " . $counterStartMessageEvent);
$common->frontEndShow("TEXT", "Total cases continued: " . $counterIntermediateCatchMessageEvent);
$common->frontEndShow("TEXT", "Total Message-Events pending: " . ($totalMessageEvent - ($counterStartMessageEvent + $counterIntermediateCatchMessageEvent)));
$this->syslog(
200
,'Total Message-Events unread '. $totalMessageEvent
,'RESUME'//Action
);
$this->syslog(
200
,'Total cases started '. $counterStartMessageEvent
,'RESUME'//Action
);
$this->syslog(
200
,'Total cases continued '. $counterIntermediateCatchMessageEvent
,'RESUME'//Action
);
$this->syslog(
200
,'Total Message-Events pending '. ($totalMessageEvent - ($counterStartMessageEvent + $counterIntermediateCatchMessageEvent))
,'RESUME'//Action
);
$common->frontEndShow("END");
} catch (\Exception $e) {
throw $e;
}
}
/**
* The Syslog register the information in Monolog Class
*
* @param int $level DEBUG=100 INFO=200 NOTICE=250 WARNING=300 ERROR=400 CRITICAL=500
* @param string $message
* @param string $ipClient for Context information
* @param string $action for Context information
* @param string $timeZone for Context information
* @param string $workspace for Context information
* @param string $usrUid for Context information
* @param string $proUid for Context information
* @param string $tasUid for Context information
* @param string $appUid for Context information
* @param string $delIndex for Context information
* @param string $stepUid for Context information
* @param string $triUid for Context information
* @param string $outDocUid for Context information
* @param string $inpDocUid for Context information
* @param string $url for Context information
*
* return void
*/
private function syslog(
$level,
$message,
$action='',
$timeZone='',
$usrUid='',
$proUid='',
$tasUid='',
$appUid='',
$appNumber='',
$delIndex='',
$stepUid='',
$triUid='',
$outDocUid='',
$inpDocUid='',
$url=''
)
{
try {
$aContext = array(
'ip' => \G::getIpAddress()
,'action' => $action
,'TimeZone' => $timeZone
,'workspace'=> (defined("SYS_SYS"))? SYS_SYS : "Wokspace Undefined"
,'usrUid' => $usrUid
,'proUid' => $proUid
,'tasUid' => $tasUid
,'appUid' => $appUid
,'appNumber'=> $appNumber
,'delIndex' => $delIndex
,'stepUid' => $stepUid
,'triUid' => $triUid
,'outDocUid'=> $outDocUid
,'inpDocUid'=> $inpDocUid
,'url' => $url
);
\Bootstrap::registerMonolog('MessageEventCron', $level, $message, $aContext, SYS_SYS, 'processmaker.log');
} catch (\Exception $e) {
throw $e;
}
}
}