Files
luos/workflow/engine/classes/Derivation.php

2240 lines
105 KiB
PHP
Raw Normal View History

2010-12-02 23:34:41 +00:00
<?php
2012-10-09 12:40:24 -04:00
2017-08-11 12:08:19 -04:00
class Derivation
2010-12-02 23:34:41 +00:00
{
2012-10-09 12:40:24 -04:00
var $case;
2016-04-14 15:51:36 -04:00
protected $flagControl;
2016-04-15 16:46:47 -04:00
protected $flagControlMulInstance;
2016-11-21 18:02:50 -05:00
protected $sys;
protected $context;
protected $regexpTaskTypeToInclude;
2016-08-12 07:41:52 -04:00
public $node;
public $userLogged = null;
2017-07-06 16:36:53 -04:00
protected $flagUpdateList;
protected $removeList;
protected $aSP;
protected $iNewDelIndex;
protected $arraySiblings;
public function __construct()
{
$this->userLogged = new Users();
$this->setRegexpTaskTypeToInclude("GATEWAYTOGATEWAY|END-MESSAGE-EVENT|END-EMAIL-EVENT");
}
/**
* @return mixed
*/
public function getRegexpTaskTypeToInclude()
{
return $this->regexpTaskTypeToInclude;
}
/**
* @param mixed $regexpTaskTypeToInclude
*/
public function setRegexpTaskTypeToInclude($regexpTaskTypeToInclude)
{
$this->regexpTaskTypeToInclude = $regexpTaskTypeToInclude;
}
2012-10-09 12:40:24 -04:00
/**
* prepareInformationTask
*
* @param array $arrayTaskData Task data (derivation)
*
* @return array Return array
2017-08-07 10:58:08 -04:00
* @throws Exception
*/
protected function prepareInformationTask(array $arrayTaskData)
{
try {
$task = new Task();
$arrayTaskData = G::array_merges($arrayTaskData, $task->load($arrayTaskData["TAS_UID"]));
//2. If next case is an special case
if ((int)($arrayTaskData["ROU_NEXT_TASK"]) < 0) {
$arrayTaskData["NEXT_TASK"]["TAS_UID"] = (int)($arrayTaskData["ROU_NEXT_TASK"]);
$arrayTaskData["NEXT_TASK"]["TAS_ASSIGN_TYPE"] = "nobody";
$arrayTaskData["NEXT_TASK"]["TAS_PRIORITY_VARIABLE"] = "";
$arrayTaskData["NEXT_TASK"]["TAS_DEF_PROC_CODE"] = "";
$arrayTaskData["NEXT_TASK"]["TAS_PARENT"] = "";
$arrayTaskData["NEXT_TASK"]["TAS_TRANSFER_FLY"] = "";
switch ($arrayTaskData["ROU_NEXT_TASK"]) {
case -1:
$arrayTaskData["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation("ID_END_OF_PROCESS");
break;
case -2:
$arrayTaskData["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation("ID_TAREA_COLGANTE");
break;
}
$arrayTaskData["NEXT_TASK"]["USR_UID"] = "";
$arrayTaskData["NEXT_TASK"]["USER_ASSIGNED"] = array("USR_UID" => "", "USR_USERNAME" => "");
} else {
//3. Load the task information of normal NEXT_TASK
$arrayTaskData["NEXT_TASK"] = $task->load($arrayTaskData["ROU_NEXT_TASK"]); //print $arrayTaskData["ROU_NEXT_TASK"]." **** ".$arrayTaskData["NEXT_TASK"]["TAS_TYPE"]."<hr>";
if ($arrayTaskData["NEXT_TASK"]["TAS_TYPE"] == "SUBPROCESS") {
$taskParent = $arrayTaskData["NEXT_TASK"]["TAS_UID"];
$criteria = new Criteria("workflow");
$criteria->add(SubProcessPeer::PRO_PARENT, $arrayTaskData["PRO_UID"]);
$criteria->add(SubProcessPeer::TAS_PARENT, $arrayTaskData["NEXT_TASK"]["TAS_UID"]);
$rsCriteria = SubProcessPeer::doSelectRS($criteria);
$rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC);
$rsCriteria->next();
$row = $rsCriteria->getRow();
$arrayTaskData["ROU_NEXT_TASK"] = $row["TAS_UID"]; //print "<hr>Life is just a lonely highway";
$arrayTaskData["NEXT_TASK"] = $task->load($arrayTaskData["ROU_NEXT_TASK"]); //print "<hr>Life is just a lonely highway";print"<hr>";
$process = new Process();
$row = $process->load($row["PRO_UID"]);
$arrayTaskData["NEXT_TASK"]["TAS_TITLE"] .= " (" . $row["PRO_TITLE"] . ")";
$arrayTaskData["NEXT_TASK"]["TAS_PARENT"] = $taskParent;
//unset($task, $process, $row, $taskParent);
} else {
$arrayTaskData["NEXT_TASK"]["TAS_PARENT"] = "";
}
2016-11-25 13:06:25 -05:00
$regexpTaskTypeToExclude = "GATEWAYTOGATEWAY|END-MESSAGE-EVENT|SCRIPT-TASK|SERVICE-TASK|INTERMEDIATE-CATCH-TIMER-EVENT|INTERMEDIATE-THROW-MESSAGE-EVENT|END-EMAIL-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT|INTERMEDIATE-CATCH-MESSAGE-EVENT";
$arrayTaskData["NEXT_TASK"]["USER_ASSIGNED"] = (!preg_match("/^(?:" . $regexpTaskTypeToExclude . ")$/", $arrayTaskData["NEXT_TASK"]["TAS_TYPE"]))? $this->getNextAssignedUser($arrayTaskData) : array("USR_UID" => "", "USR_FULLNAME" => "");
}
//Return
return $arrayTaskData;
} catch (Exception $e) {
throw $e;
}
}
2017-03-23 09:28:09 -04:00
/**
2012-10-09 12:40:24 -04:00
* prepareInformation
*
* @param array $arrayData Data
* @param string $taskUid Unique id of Task
*
2017-08-07 10:58:08 -04:00
* @return array
* @throws Exception
2012-10-09 12:40:24 -04:00
*/
public function prepareInformation(array $arrayData, $taskUid = "")
2012-10-09 12:40:24 -04:00
{
try {
$this->case = new Cases();
$task = new Task();
$arrayApplicationData = $this->case->loadCase($arrayData["APP_UID"]);
$arrayNextTask = array();
$arrayNextTaskDefault = array();
2015-02-19 09:39:15 -04:00
$i = 0;
$criteria = new Criteria("workflow");
2012-10-09 12:40:24 -04:00
$criteria->addSelectColumn(RoutePeer::TAS_UID);
$criteria->addSelectColumn(RoutePeer::ROU_NEXT_TASK);
$criteria->addSelectColumn(RoutePeer::ROU_TYPE);
$criteria->addSelectColumn(RoutePeer::ROU_DEFAULT);
$criteria->addSelectColumn(RoutePeer::ROU_CONDITION);
if ($taskUid != "") {
$criteria->add(RoutePeer::TAS_UID, $taskUid, Criteria::EQUAL);
$criteria->addAscendingOrderByColumn(RoutePeer::ROU_CASE);
$rsCriteria = RoutePeer::doSelectRS($criteria);
} else {
$criteria->addJoin(AppDelegationPeer::TAS_UID, TaskPeer::TAS_UID, Criteria::LEFT_JOIN);
$criteria->addJoin(AppDelegationPeer::TAS_UID, RoutePeer::TAS_UID, Criteria::LEFT_JOIN);
$criteria->add(AppDelegationPeer::APP_UID, $arrayData["APP_UID"], Criteria::EQUAL);
$criteria->add(AppDelegationPeer::DEL_INDEX, $arrayData["DEL_INDEX"], Criteria::EQUAL);
$criteria->addAscendingOrderByColumn(RoutePeer::ROU_CASE);
$rsCriteria = AppDelegationPeer::doSelectRS($criteria);
2012-10-09 12:40:24 -04:00
}
2010-12-02 23:34:41 +00:00
$rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC);
2015-02-23 11:09:57 -04:00
$flagDefault = false;
2015-11-13 15:05:26 -04:00
$aSecJoin = array();
$count = 0;
while ($rsCriteria->next()) {
$arrayRouteData = G::array_merges($rsCriteria->getRow(), $arrayData);
if ((int)($arrayRouteData["ROU_DEFAULT"]) == 1) {
$arrayNextTaskDefault = $arrayRouteData;
2015-02-23 11:09:57 -04:00
$flagDefault = true;
continue;
2012-10-09 12:40:24 -04:00
}
2010-12-02 23:34:41 +00:00
$flagAddDelegation = true;
//Evaluate the condition if there are conditions defined
if (trim($arrayRouteData["ROU_CONDITION"]) != "" && $arrayRouteData["ROU_TYPE"] != "SELECT") {
$pmScript = new PMScript();
$pmScript->setFields($arrayApplicationData["APP_DATA"]);
$pmScript->setScript($arrayRouteData["ROU_CONDITION"]);
$flagAddDelegation = $pmScript->evaluate();
}
HOR-1319 "Registros corruptos: Crea 2 registros de un Elemento..." SOLVED Issue: Registros corruptos: Crea 2 registros de un Elemento con 2 Tareas, se debe borrar los q no se usan Cause: - El problema se presenta cuando se tiene la combinacion gateway-to-gateway y al hacer (por ejemplo) un movimiento de algun elemento del proceso y posteriormente guardarlo. Esto ocasiona que se creen registros corruptos en las tablas TASK, ROUTE y ELEMENT_TASK_RELATION - Este problema fue ocasionado por: > Commit: 137a4ea2237573a54964414f477e13a4f5c76a5d, Card: PMLOCAL-3840 El commit 137a4ea2237573a54964414f477e13a4f5c76a5d tambien origino los siguientes issues: > Commit: 6bb8ad6cc05a3d8e671baa5d358b409c1f2710f6, Card: HOR-421 > Commit: 9e8030904a4c0f4f670fc159c9220fead10a5859, Card: PMLOCAL-4270 > Commit: d3296132bf13f81aee12c0f7696d5952d79ee323, Card: HOR-1383 > Commit: b58dc888c1f54d981fc329c3a35cb4294785e0f7, Card: HOR-1358 Solution: Se revirtieron los cambios de los commits involucrados, con el siguiente detalle: - Commit 137a4ea2237573a54964414f477e13a4f5c76a5d: Se revirtio el cambio; se soluciono el problema problema planteado en el card - Commit 6bb8ad6cc05a3d8e671baa5d358b409c1f2710f6: Se revirtio el cambio; se soluciono el problema problema planteado en el card - Commit 9e8030904a4c0f4f670fc159c9220fead10a5859: Se revirtio el cambio - Commit d3296132bf13f81aee12c0f7696d5952d79ee323: Se revirtio el cambio - Commit b58dc888c1f54d981fc329c3a35cb4294785e0f7: Se revirtio el cambio; se soluciono el problema planteado segun el analisis del commit
2016-07-26 15:34:52 -04:00
if (trim($arrayRouteData['ROU_CONDITION']) == '' && $arrayRouteData['ROU_NEXT_TASK'] != '-1') {
$arrayTaskData = $task->load($arrayRouteData['ROU_NEXT_TASK']);
2016-06-30 10:15:46 -04:00
HOR-1319 "Registros corruptos: Crea 2 registros de un Elemento..." SOLVED Issue: Registros corruptos: Crea 2 registros de un Elemento con 2 Tareas, se debe borrar los q no se usan Cause: - El problema se presenta cuando se tiene la combinacion gateway-to-gateway y al hacer (por ejemplo) un movimiento de algun elemento del proceso y posteriormente guardarlo. Esto ocasiona que se creen registros corruptos en las tablas TASK, ROUTE y ELEMENT_TASK_RELATION - Este problema fue ocasionado por: > Commit: 137a4ea2237573a54964414f477e13a4f5c76a5d, Card: PMLOCAL-3840 El commit 137a4ea2237573a54964414f477e13a4f5c76a5d tambien origino los siguientes issues: > Commit: 6bb8ad6cc05a3d8e671baa5d358b409c1f2710f6, Card: HOR-421 > Commit: 9e8030904a4c0f4f670fc159c9220fead10a5859, Card: PMLOCAL-4270 > Commit: d3296132bf13f81aee12c0f7696d5952d79ee323, Card: HOR-1383 > Commit: b58dc888c1f54d981fc329c3a35cb4294785e0f7, Card: HOR-1358 Solution: Se revirtieron los cambios de los commits involucrados, con el siguiente detalle: - Commit 137a4ea2237573a54964414f477e13a4f5c76a5d: Se revirtio el cambio; se soluciono el problema problema planteado en el card - Commit 6bb8ad6cc05a3d8e671baa5d358b409c1f2710f6: Se revirtio el cambio; se soluciono el problema problema planteado en el card - Commit 9e8030904a4c0f4f670fc159c9220fead10a5859: Se revirtio el cambio - Commit d3296132bf13f81aee12c0f7696d5952d79ee323: Se revirtio el cambio - Commit b58dc888c1f54d981fc329c3a35cb4294785e0f7: Se revirtio el cambio; se soluciono el problema planteado segun el analisis del commit
2016-07-26 15:34:52 -04:00
if ($arrayRouteData['ROU_TYPE'] != 'SEC-JOIN' && $arrayTaskData['TAS_TYPE'] == 'GATEWAYTOGATEWAY') {
2015-11-13 15:05:26 -04:00
$flagAddDelegation = true;
}
HOR-1319 "Registros corruptos: Crea 2 registros de un Elemento..." SOLVED Issue: Registros corruptos: Crea 2 registros de un Elemento con 2 Tareas, se debe borrar los q no se usan Cause: - El problema se presenta cuando se tiene la combinacion gateway-to-gateway y al hacer (por ejemplo) un movimiento de algun elemento del proceso y posteriormente guardarlo. Esto ocasiona que se creen registros corruptos en las tablas TASK, ROUTE y ELEMENT_TASK_RELATION - Este problema fue ocasionado por: > Commit: 137a4ea2237573a54964414f477e13a4f5c76a5d, Card: PMLOCAL-3840 El commit 137a4ea2237573a54964414f477e13a4f5c76a5d tambien origino los siguientes issues: > Commit: 6bb8ad6cc05a3d8e671baa5d358b409c1f2710f6, Card: HOR-421 > Commit: 9e8030904a4c0f4f670fc159c9220fead10a5859, Card: PMLOCAL-4270 > Commit: d3296132bf13f81aee12c0f7696d5952d79ee323, Card: HOR-1383 > Commit: b58dc888c1f54d981fc329c3a35cb4294785e0f7, Card: HOR-1358 Solution: Se revirtieron los cambios de los commits involucrados, con el siguiente detalle: - Commit 137a4ea2237573a54964414f477e13a4f5c76a5d: Se revirtio el cambio; se soluciono el problema problema planteado en el card - Commit 6bb8ad6cc05a3d8e671baa5d358b409c1f2710f6: Se revirtio el cambio; se soluciono el problema problema planteado en el card - Commit 9e8030904a4c0f4f670fc159c9220fead10a5859: Se revirtio el cambio - Commit d3296132bf13f81aee12c0f7696d5952d79ee323: Se revirtio el cambio - Commit b58dc888c1f54d981fc329c3a35cb4294785e0f7: Se revirtio el cambio; se soluciono el problema planteado segun el analisis del commit
2016-07-26 15:34:52 -04:00
if($arrayRouteData['ROU_TYPE'] == 'SEC-JOIN'){
$aSecJoin[$count]['ROU_PREVIOUS_TASK'] = $arrayRouteData['ROU_NEXT_TASK'];
$aSecJoin[$count]['ROU_PREVIOUS_TYPE'] = 'SEC-JOIN';
$count++;
}
2016-06-30 10:15:46 -04:00
}
2015-11-13 15:05:26 -04:00
HOR-1319 "Registros corruptos: Crea 2 registros de un Elemento..." SOLVED Issue: Registros corruptos: Crea 2 registros de un Elemento con 2 Tareas, se debe borrar los q no se usan Cause: - El problema se presenta cuando se tiene la combinacion gateway-to-gateway y al hacer (por ejemplo) un movimiento de algun elemento del proceso y posteriormente guardarlo. Esto ocasiona que se creen registros corruptos en las tablas TASK, ROUTE y ELEMENT_TASK_RELATION - Este problema fue ocasionado por: > Commit: 137a4ea2237573a54964414f477e13a4f5c76a5d, Card: PMLOCAL-3840 El commit 137a4ea2237573a54964414f477e13a4f5c76a5d tambien origino los siguientes issues: > Commit: 6bb8ad6cc05a3d8e671baa5d358b409c1f2710f6, Card: HOR-421 > Commit: 9e8030904a4c0f4f670fc159c9220fead10a5859, Card: PMLOCAL-4270 > Commit: d3296132bf13f81aee12c0f7696d5952d79ee323, Card: HOR-1383 > Commit: b58dc888c1f54d981fc329c3a35cb4294785e0f7, Card: HOR-1358 Solution: Se revirtieron los cambios de los commits involucrados, con el siguiente detalle: - Commit 137a4ea2237573a54964414f477e13a4f5c76a5d: Se revirtio el cambio; se soluciono el problema problema planteado en el card - Commit 6bb8ad6cc05a3d8e671baa5d358b409c1f2710f6: Se revirtio el cambio; se soluciono el problema problema planteado en el card - Commit 9e8030904a4c0f4f670fc159c9220fead10a5859: Se revirtio el cambio - Commit d3296132bf13f81aee12c0f7696d5952d79ee323: Se revirtio el cambio - Commit b58dc888c1f54d981fc329c3a35cb4294785e0f7: Se revirtio el cambio; se soluciono el problema planteado segun el analisis del commit
2016-07-26 15:34:52 -04:00
if ($arrayRouteData['ROU_TYPE'] == 'EVALUATE' && !empty($arrayNextTask)) {
$flagAddDelegation = false;
}
if ($flagAddDelegation &&
preg_match("/^(?:EVALUATE|PARALLEL-BY-EVALUATION)$/", $arrayRouteData["ROU_TYPE"]) &&
trim($arrayRouteData["ROU_CONDITION"]) == ""
) {
$flagAddDelegation = false;
}
if ($flagAddDelegation) {
2015-02-19 09:39:15 -04:00
$arrayNextTask[++$i] = $this->prepareInformationTask($arrayRouteData);
}
2012-10-09 12:40:24 -04:00
}
if (count($arrayNextTask) == 0 && count($arrayNextTaskDefault) > 0) {
2015-02-19 09:39:15 -04:00
$arrayNextTask[++$i] = $this->prepareInformationTask($arrayNextTaskDefault);
}
//Check Task GATEWAYTOGATEWAY, END-MESSAGE-EVENT, END-EMAIL-EVENT
2016-08-11 12:06:34 -04:00
$arrayNextTaskBackup = $arrayNextTask;
2016-08-12 12:05:55 -04:00
$arrayNextTask = array();
2015-02-19 09:39:15 -04:00
$i = 0;
foreach ($arrayNextTaskBackup as $value) {
$arrayNextTaskData = $value;
2016-08-12 07:41:52 -04:00
$this->node[$value['TAS_UID']]['out'][$value['ROU_NEXT_TASK']] = $value['ROU_TYPE'];
if ($arrayNextTaskData["NEXT_TASK"]["TAS_UID"] != "-1" &&
2017-03-14 18:19:37 -04:00
preg_match("/^(?:" . $this->regexpTaskTypeToInclude . ")$/", $arrayNextTaskData["NEXT_TASK"]["TAS_TYPE"])
) {
$arrayAux = $this->prepareInformation($arrayData, $arrayNextTaskData["NEXT_TASK"]["TAS_UID"]);
2016-08-12 07:41:52 -04:00
$this->node[$value['ROU_NEXT_TASK']]['in'][$value['TAS_UID']] = $value['ROU_TYPE'];
foreach ($arrayAux as $value2) {
$key = ++$i;
$arrayNextTask[$key] = $value2;
2016-08-22 17:24:25 -04:00
$prefix = substr($value['ROU_NEXT_TASK'], 0, 4);
if($prefix!=='gtg-'){
$arrayNextTask[$key]['SOURCE_UID'] = $value['ROU_NEXT_TASK'];
}
2015-11-13 15:05:26 -04:00
foreach($aSecJoin as $rsj){
$arrayNextTask[$i]["NEXT_TASK"]["ROU_PREVIOUS_TASK"] = $rsj["ROU_PREVIOUS_TASK"];
$arrayNextTask[$i]["NEXT_TASK"]["ROU_PREVIOUS_TYPE"] = "SEC-JOIN";
}
}
} else {
$regexpTaskTypeToInclude = "END-MESSAGE-EVENT|END-EMAIL-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT";
if ($arrayNextTaskData["NEXT_TASK"]["TAS_UID"] == "-1" &&
preg_match("/^(?:" . $regexpTaskTypeToInclude . ")$/", $arrayNextTaskData["TAS_TYPE"])
) {
$arrayNextTaskData["NEXT_TASK"]["TAS_UID"] = $arrayNextTaskData["TAS_UID"] . "/" . $arrayNextTaskData["NEXT_TASK"]["TAS_UID"];
}
2016-08-22 17:24:25 -04:00
$prefix = substr($value['ROU_NEXT_TASK'], 0, 4);
if($prefix!=='gtg-'){
$arrayNextTaskData['SOURCE_UID'] = $value['ROU_NEXT_TASK'];
}
2015-02-19 09:39:15 -04:00
$arrayNextTask[++$i] = $arrayNextTaskData;
2015-11-13 15:05:26 -04:00
foreach($aSecJoin as $rsj){
$arrayNextTask[$i]["NEXT_TASK"]["ROU_PREVIOUS_TASK"] = $rsj["ROU_PREVIOUS_TASK"];
$arrayNextTask[$i]["NEXT_TASK"]["ROU_PREVIOUS_TYPE"] = "SEC-JOIN";
}
2015-11-17 11:46:07 -04:00
//Start-Timer with Script-task
$criteriaE = new Criteria("workflow");
$criteriaE->addSelectColumn(ElementTaskRelationPeer::ELEMENT_UID);
$criteriaE->addJoin(BpmnEventPeer::EVN_UID, ElementTaskRelationPeer::ELEMENT_UID, Criteria::LEFT_JOIN);
$criteriaE->add(ElementTaskRelationPeer::TAS_UID, $arrayNextTaskData["TAS_UID"], Criteria::EQUAL);
$criteriaE->add(BpmnEventPeer::EVN_TYPE, 'START', Criteria::EQUAL);
$criteriaE->add(BpmnEventPeer::EVN_MARKER, 'TIMER', Criteria::EQUAL);
$rsCriteriaE = AppDelegationPeer::doSelectRS($criteriaE);
$rsCriteriaE->setFetchmode(ResultSet::FETCHMODE_ASSOC);
while ($rsCriteriaE->next()) {
if($arrayNextTaskData["NEXT_TASK"]["TAS_TYPE"] == "SCRIPT-TASK"){
if(isset($arrayNextTaskData["NEXT_TASK"]["USER_ASSIGNED"]["USR_UID"]) && $arrayNextTaskData["NEXT_TASK"]["USER_ASSIGNED"]["USR_UID"] == ""){
$useruid = "00000000000000000000000000000001";
$userFields = $this->getUsersFullNameFromArray( $useruid );
$arrayNextTask[$i]["NEXT_TASK"]["USER_ASSIGNED"] = $userFields;
}
}
}
}
}
//1. There is no rule
if (empty($arrayNextTask)) {
$bpmn = new \ProcessMaker\Project\Bpmn();
throw new Exception(G::LoadTranslation(
'ID_NO_DERIVATION_' . (($bpmn->exists($arrayApplicationData['PRO_UID']))? 'BPMN_RULE' : 'RULE')
));
}
//Return
return $arrayNextTask;
} catch (Exception $e) {
throw $e;
}
2010-12-02 23:34:41 +00:00
}
2012-10-09 12:40:24 -04:00
/**
* getRouteCondition
*
* @param array $aData
* @return $routeCondition
*/
function getRouteCondition ($aData)
{
$c = new Criteria( 'workflow' );
$c->clearSelectColumns();
$c->addSelectColumn( AppDelegationPeer::TAS_UID );
$c->addSelectColumn( RoutePeer::ROU_CONDITION );
$c->addSelectColumn( RoutePeer::ROU_NEXT_TASK );
$c->addSelectColumn( RoutePeer::ROU_TYPE );
$c->addSelectColumn( RoutePeer::ROU_OPTIONAL );
$c->addJoin( AppDelegationPeer::TAS_UID, TaskPeer::TAS_UID, Criteria::LEFT_JOIN );
$c->addJoin( AppDelegationPeer::TAS_UID, RoutePeer::TAS_UID, Criteria::LEFT_JOIN );
$c->add( AppDelegationPeer::APP_UID, $aData['APP_UID'] );
$c->add( AppDelegationPeer::DEL_INDEX, $aData['DEL_INDEX'] );
$c->addAscendingOrderByColumn( RoutePeer::ROU_CASE );
$rs = AppDelegationPeer::doSelectRs( $c );
$rs->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$rs->next();
$aDerivation = $rs->getRow();
while (is_array( $aDerivation )) {
return $aDerivation;
}
2010-12-02 23:34:41 +00:00
}
2012-10-09 12:40:24 -04:00
function GetAppParentIndex ($aData)
{
//('SELECT * FROM APP_THREAD WHERE APP_UID='".$aData['APP_UID']."' AND DEL_INDEX = '".$aData['DEL_INDEX']."'");
try {
$aThreads = array ();
$c = new Criteria();
$c->addSelectColumn( AppThreadPeer::APP_THREAD_PARENT );
$c->add( AppThreadPeer::APP_UID, $aData['APP_UID'] );
$c->add( AppThreadPeer::DEL_INDEX, $aData['DEL_INDEX'] );
$rs = AppThreadPeer::doSelectRs( $c );
$rs->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$rs->next();
$row = $rs->getRow();
while (is_array( $row )) {
$aThreads = $row;
$rs->next();
$row = $rs->getRow();
}
return $aThreads;
} catch (exception $e) {
throw ($e);
}
}
2010-12-02 23:34:41 +00:00
2012-10-09 12:40:24 -04:00
/* get all users, from any task, if the task have Groups, the function expand the group
*
* @param string $sTasUid the task uidUser
* @param bool $flagIncludeAdHocUsers
* @return Array $users an array with userID order by USR_UID
*/
function getAllUsersFromAnyTask($sTasUid, $flagIncludeAdHocUsers = false)
2012-10-09 12:40:24 -04:00
{
$users = array ();
$c = new Criteria( 'workflow' );
$c->clearSelectColumns();
$c->addSelectColumn( TaskUserPeer::USR_UID );
$c->addSelectColumn( TaskUserPeer::TU_RELATION );
$c->add( TaskUserPeer::TAS_UID, $sTasUid );
if ($flagIncludeAdHocUsers) {
$c->add(
$c->getNewCriterion(TaskUserPeer::TU_TYPE, 1, Criteria::EQUAL)->addOr(
$c->getNewCriterion(TaskUserPeer::TU_TYPE, 2, Criteria::EQUAL))
);
} else {
$c->add(TaskUserPeer::TU_TYPE, 1);
}
2012-10-09 12:40:24 -04:00
$rs = TaskUserPeer::DoSelectRs( $c );
$rs->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$rs->next();
$row = $rs->getRow();
while (is_array( $row )) {
if ($row['TU_RELATION'] == '2') {
$cGrp = new Criteria( 'workflow' );
$cGrp->add( GroupwfPeer::GRP_STATUS, 'ACTIVE' );
$cGrp->add( GroupUserPeer::GRP_UID, $row['USR_UID'] );
$cGrp->addJoin( GroupUserPeer::GRP_UID, GroupwfPeer::GRP_UID, Criteria::LEFT_JOIN );
$cGrp->addJoin( GroupUserPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN );
$cGrp->add( UsersPeer::USR_STATUS, 'INACTIVE', Criteria::NOT_EQUAL );
2012-10-09 12:40:24 -04:00
$rsGrp = GroupUserPeer::DoSelectRs( $cGrp );
$rsGrp->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$rsGrp->next();
$rowGrp = $rsGrp->getRow();
while (is_array( $rowGrp )) {
$users[$rowGrp['USR_UID']] = $rowGrp['USR_UID'];
$rsGrp->next();
$rowGrp = $rsGrp->getRow();
}
} else {
//filter to users that is in vacation or has an inactive estatus, and others
$oUser = UsersPeer::retrieveByPK( $row['USR_UID'] );
if ($oUser->getUsrStatus() == 'ACTIVE') {
$users[$row['USR_UID']] = $row['USR_UID'];
} else {
$userUID = $this->checkReplacedByUser( $oUser );
if ($userUID != '') {
$users[$userUID] = $userUID;
}
}
}
$rs->next();
$row = $rs->getRow();
2010-12-02 23:34:41 +00:00
}
2012-10-09 12:40:24 -04:00
//to do: different types of sort
sort( $users );
2010-12-02 23:34:41 +00:00
2012-10-09 12:40:24 -04:00
return $users;
}
2010-12-02 23:34:41 +00:00
2012-10-09 12:40:24 -04:00
/* get an array of users, and returns the same arrays with User's fullname and other fields
*
* @param Array $aUsers the task uidUser
* @return Array $aUsersData an array with with User's fullname
*/
2012-10-09 12:40:24 -04:00
function getUsersFullNameFromArray ($aUsers)
{
$oUser = new Users();
$aUsersData = array ();
if (is_array( $aUsers )) {
foreach ($aUsers as $key => $val) {
// $userFields = $oUser->load( $val );
$userFields = $oUser->userVacation( $val );
2012-10-09 12:40:24 -04:00
$auxFields['USR_UID'] = $userFields['USR_UID'];
$auxFields['USR_USERNAME'] = $userFields['USR_USERNAME'];
$auxFields['USR_FIRSTNAME'] = $userFields['USR_FIRSTNAME'];
$auxFields['USR_LASTNAME'] = $userFields['USR_LASTNAME'];
$auxFields['USR_FULLNAME'] = $userFields['USR_LASTNAME'] . ($userFields['USR_LASTNAME'] != '' ? ', ' : '') . $userFields['USR_FIRSTNAME'];
$auxFields['USR_EMAIL'] = $userFields['USR_EMAIL'];
$auxFields['USR_STATUS'] = $userFields['USR_STATUS'];
$auxFields['USR_COUNTRY'] = $userFields['USR_COUNTRY'];
$auxFields['USR_CITY'] = $userFields['USR_CITY'];
$auxFields['USR_LOCATION'] = $userFields['USR_LOCATION'];
$auxFields['DEP_UID'] = $userFields['DEP_UID'];
$auxFields['USR_HIDDEN_FIELD'] = '';
$aUsersData[] = $auxFields;
}
} else {
$oCriteria = new Criteria();
$oCriteria->add( UsersPeer::USR_UID, $aUsers );
if (UsersPeer::doCount( $oCriteria ) < 1) {
return null;
}
$userFields = $oUser->load( $aUsers );
$auxFields['USR_UID'] = $userFields['USR_UID'];
$auxFields['USR_USERNAME'] = $userFields['USR_USERNAME'];
$auxFields['USR_FIRSTNAME'] = $userFields['USR_FIRSTNAME'];
$auxFields['USR_LASTNAME'] = $userFields['USR_LASTNAME'];
$auxFields['USR_FULLNAME'] = $userFields['USR_LASTNAME'] . ($userFields['USR_LASTNAME'] != '' ? ', ' : '') . $userFields['USR_FIRSTNAME'];
$auxFields['USR_EMAIL'] = $userFields['USR_EMAIL'];
$auxFields['USR_STATUS'] = $userFields['USR_STATUS'];
$auxFields['USR_COUNTRY'] = $userFields['USR_COUNTRY'];
$auxFields['USR_CITY'] = $userFields['USR_CITY'];
$auxFields['USR_LOCATION'] = $userFields['USR_LOCATION'];
$auxFields['DEP_UID'] = $userFields['DEP_UID'];
$aUsersData = $auxFields;
}
return $aUsersData;
2010-12-02 23:34:41 +00:00
}
2012-10-09 12:40:24 -04:00
/* get next assigned user
*
* @param Array $tasInfo
* @return Array $userFields
*/
2012-10-09 12:40:24 -04:00
function getNextAssignedUser ($tasInfo)
2010-12-02 23:34:41 +00:00
{
2012-10-09 12:40:24 -04:00
$nextAssignedTask = $tasInfo['NEXT_TASK'];
$lastAssigned = $tasInfo['NEXT_TASK']['TAS_LAST_ASSIGNED'];
$sTasUid = $tasInfo['NEXT_TASK']['TAS_UID'];
$taskNext = TaskPeer::retrieveByPK($nextAssignedTask["TAS_UID"]);
$bpmnActivityNext = BpmnActivityPeer::retrieveByPK($nextAssignedTask["TAS_UID"]);
$flagTaskNextIsMultipleInstance = false;
$flagTaskNextAssignTypeIsMultipleInstance = false;
if (!is_null($taskNext) && !is_null($bpmnActivityNext)) {
2015-12-21 16:34:38 -04:00
$flagTaskNextIsMultipleInstance = $bpmnActivityNext->getActType() == "TASK" && preg_match("/^(?:EMPTY|SENDTASK|RECEIVETASK|USERTASK|SERVICETASK|MANUALTASK|BUSINESSRULE)$/", $bpmnActivityNext->getActTaskType()) && $bpmnActivityNext->getActLoopType() == "PARALLEL";
$flagTaskNextAssignTypeIsMultipleInstance = preg_match("/^(?:MULTIPLE_INSTANCE|MULTIPLE_INSTANCE_VALUE_BASED)$/", $taskNext->getTasAssignType());
}
$taskNextAssignType = $taskNext->getTasAssignType();
$taskNextAssignType = ($flagTaskNextIsMultipleInstance && !$flagTaskNextAssignTypeIsMultipleInstance)? "" : $taskNextAssignType;
$taskNextAssignType = (!$flagTaskNextIsMultipleInstance && $flagTaskNextAssignTypeIsMultipleInstance)? "" : $taskNextAssignType;
switch ($taskNextAssignType) {
2012-10-09 12:40:24 -04:00
case 'BALANCED':
$users = $this->getAllUsersFromAnyTask( $sTasUid );
$uidUser = "";
2012-10-09 12:40:24 -04:00
if (is_array( $users ) && count( $users ) > 0) {
//to do apply any filter like LOCATION assignment
$uidUser = $users[0];
$i = count( $users ) - 1;
while ($i > 0) {
if ($lastAssigned < $users[$i]) {
2012-10-09 12:40:24 -04:00
$uidUser = $users[$i];
}
2012-10-09 12:40:24 -04:00
$i --;
}
} else {
throw (new Exception( G::LoadTranslation( 'ID_NO_USERS' ) ));
}
$userFields = $this->getUsersFullNameFromArray( $uidUser );
break;
case 'STATIC_MI':
case 'CANCEL_MI':
case 'MANUAL':
$users = $this->getAllUsersFromAnyTask( $sTasUid );
$userFields = $this->getUsersFullNameFromArray( $users );
break;
case 'EVALUATE':
$AppFields = $this->case->loadCase( $tasInfo['APP_UID'] );
$variable = str_replace( '@@', '', $nextAssignedTask['TAS_ASSIGN_VARIABLE'] );
if (isset( $AppFields['APP_DATA'][$variable] )) {
if ($AppFields['APP_DATA'][$variable] != '') {
$value = $this->checkReplacedByUser( $AppFields['APP_DATA'][$variable] );
$userFields = $this->getUsersFullNameFromArray( $value );
if (is_null( $userFields )) {
throw (new Exception( "Task doesn't have a valid user in variable $variable." ));
}
} else {
throw (new Exception( "Task doesn't have a valid user in variable $variable." ));
}
} else {
2012-10-09 12:40:24 -04:00
throw (new Exception( "Task doesn't have a valid user in variable $variable or this variable doesn't exist." ));
}
2012-10-09 12:40:24 -04:00
break;
case 'REPORT_TO':
//default error user when the reportsTo is not assigned to that user
//look for USR_REPORTS_TO to this user
$userFields['USR_UID'] = '';
$userFields['USR_FULLNAME'] = 'Current user does not have a valid Reports To user';
$userFields['USR_USERNAME'] = 'Current user does not have a valid Reports To user';
$userFields['USR_FIRSTNAME'] = '';
$userFields['USR_LASTNAME'] = '';
$userFields['USR_EMAIL'] = '';
//get the report_to user & its full info
2016-07-07 17:34:20 -04:00
$lastManager = $userTasInfo = $tasInfo["USER_UID"];
do {
$userTasInfo = $this->getDenpendentUser($userTasInfo);
$useruid = $this->checkReplacedByUser($userTasInfo);
//When the lastManager is INACTIVE/VACATION and does not have a Replace by, the REPORT_TO is himself
if($lastManager === $userTasInfo){
$useruid = $tasInfo["USER_UID"];
} else {
$lastManager = $userTasInfo;
}
} while ($useruid === '');
2012-10-09 12:40:24 -04:00
if (isset( $useruid ) && $useruid != '') {
$userFields = $this->getUsersFullNameFromArray( $useruid );
}
// if there is no report_to user info, throw an exception indicating this
if (! isset( $userFields ) || $userFields['USR_UID'] == '') {
throw (new Exception( G::LoadTranslation( 'ID_MSJ_REPORSTO' ) )); // "The current user does not have a valid Reports To user. Please contact administrator.") ) ;
}
break;
case 'SELF_SERVICE':
2017-06-01 17:09:43 -04:00
//Check if is Self Service Value Based Assignment
if (!empty($nextAssignedTask['TAS_GROUP_VARIABLE'])) {
$appFields = $this->case->loadCase($tasInfo['APP_UID']);
$variable = str_replace('@@', '', $nextAssignedTask['TAS_GROUP_VARIABLE']);
//If the variable exists will be validate the UID's
if (isset($appFields['APP_DATA'][$variable])) {
$arrVar = $appFields['APP_DATA'][$variable];
if (is_array($arrVar)) {
$statusToCheck = $arrVar;
} else {
$statusToCheck = array($arrVar);
}
$toValidate = array('ACTIVE', 'VACATION');
$gpr = new GroupUser();
if (!$gpr->groupsUsersAvailable($statusToCheck, $toValidate)) {
if (!($gpr->groupsUsersAvailable($statusToCheck, $toValidate, "groups"))) {
throw (new Exception("Task doesn't have a valid user in variable $variable or this variable doesn't exist."));
}
2017-06-01 12:10:02 -04:00
}
2017-06-01 17:09:43 -04:00
} else {
throw (new Exception("Task doesn't have a valid user in variable $variable or this variable doesn't exist."));
2017-06-01 12:10:02 -04:00
}
}
2017-06-01 17:09:43 -04:00
2012-10-09 12:40:24 -04:00
//look for USR_REPORTS_TO to this user
$userFields['USR_UID'] = '';
2017-06-01 12:10:02 -04:00
$userFields['USR_FULLNAME'] = '<b>' . G::LoadTranslation('ID_UNASSIGNED') . '</b>';
$userFields['USR_USERNAME'] = '<b>' . G::LoadTranslation('ID_UNASSIGNED') . '</b>';
2012-10-09 12:40:24 -04:00
$userFields['USR_FIRSTNAME'] = '';
$userFields['USR_LASTNAME'] = '';
$userFields['USR_EMAIL'] = '';
break;
case "MULTIPLE_INSTANCE":
$userFields = $this->getUsersFullNameFromArray($this->getAllUsersFromAnyTask($nextAssignedTask["TAS_UID"]));
2015-11-23 10:52:42 -04:00
if(empty($userFields)){
throw (new Exception( G::LoadTranslation( 'ID_NO_USERS' ) ));
}
break;
case "MULTIPLE_INSTANCE_VALUE_BASED":
$arrayApplicationData = $this->case->loadCase($tasInfo["APP_UID"]);
$nextTaskAssignVariable = trim($nextAssignedTask["TAS_ASSIGN_VARIABLE"], " @#");
if ($nextTaskAssignVariable != "" &&
isset($arrayApplicationData["APP_DATA"][$nextTaskAssignVariable]) && !empty($arrayApplicationData["APP_DATA"][$nextTaskAssignVariable]) && is_array($arrayApplicationData["APP_DATA"][$nextTaskAssignVariable])
) {
$userFields = $this->getUsersFullNameFromArray($arrayApplicationData["APP_DATA"][$nextTaskAssignVariable]);
} else {
throw new Exception(G::LoadTranslation("ID_ACTIVITY_INVALID_USER_DATA_VARIABLE_FOR_MULTIPLE_INSTANCE_ACTIVITY", array(strtolower("ACT_UID"), $nextAssignedTask["TAS_UID"], $nextTaskAssignVariable)));
}
break;
2012-10-09 12:40:24 -04:00
default:
throw (new Exception( 'Invalid Task Assignment method for Next Task ' ));
break;
2012-10-09 12:40:24 -04:00
}
return $userFields;
2010-12-02 23:34:41 +00:00
}
2012-10-09 12:40:24 -04:00
/* getDenpendentUser
*
* @param string $USR_UID
* @return string $aRow['USR_REPORTS_TO']
*/
function getDenpendentUser ($USR_UID)
{
$user = new \ProcessMaker\BusinessModel\User();
$manager = $user->getUsersManager($USR_UID);
//Return
return ($manager !== false)? $manager : $USR_UID;
2012-10-09 12:40:24 -04:00
}
/* setTasLastAssigned
*
* @param string $tasUid
* @param string $usrUid
* @throws Exception $e
* @return void
*/
2012-10-09 12:40:24 -04:00
function setTasLastAssigned ($tasUid, $usrUid)
{
try {
$oTask = TaskPeer::retrieveByPk( $tasUid );
$oTask->setTasLastAssigned( $usrUid );
$oTask->save();
} catch (Exception $e) {
throw ($e);
}
2010-12-02 23:34:41 +00:00
}
/**
* Execute Event
*
* @param string $dummyTaskUid Unique id of Element Origin (unique id of Task) This is the nextTask
* @param array $applicationData Case data
* @param bool $flagEventExecuteBeforeGateway Execute event before gateway
* @param bool $flagEventExecuteAfterGateway Execute event after gateway
*
* @return void
*/
private function executeEvent($dummyTaskUid, array $applicationData, $flagEventExecuteBeforeGateway = true, $flagEventExecuteAfterGateway = true, $elementOriUid='')
{
try {
//Verify if the Project is BPMN
$bpmn = new \ProcessMaker\Project\Bpmn();
if (!$bpmn->exists($applicationData["PRO_UID"])) {
return;
}
//Element origin and dest
$arrayElement = array();
$elementTaskRelation = new \ProcessMaker\BusinessModel\ElementTaskRelation();
$arrayElementTaskRelationData = $elementTaskRelation->getElementTaskRelationWhere(
[
ElementTaskRelationPeer::PRJ_UID => $applicationData["PRO_UID"],
ElementTaskRelationPeer::ELEMENT_TYPE => "bpmnEvent",
ElementTaskRelationPeer::TAS_UID => $dummyTaskUid
],
true
);
if(is_null($arrayElementTaskRelationData)){
$arrayOtherElement = array();
$arrayOtherElement = $bpmn->getElementsBetweenElementOriginAndElementDest(
$elementOriUid,
"bpmnActivity",
$dummyTaskUid,
"bpmnActivity"
);
$count = 0;
foreach ($arrayOtherElement as $value) {
if($value[1] === 'bpmnEvent'){
$arrayElement[$count]["uid"] = $value[0];
$arrayElement[$count++]["type"] = $value[1];
}
}
}
if (!is_null($arrayElementTaskRelationData)) {
$arrayElement[0]["uid"] = $arrayElementTaskRelationData["ELEMENT_UID"];
$arrayElement[0]["type"] = "bpmnEvent";
}
//Throw Events
$messageApplication = new \ProcessMaker\BusinessModel\MessageApplication();
$emailEvent = new \ProcessMaker\BusinessModel\EmailEvent();
$arrayEventExecute = ["BEFORE" => $flagEventExecuteBeforeGateway, "AFTER" => $flagEventExecuteAfterGateway];
$positionEventExecute = "BEFORE";
2016-11-21 18:02:50 -05:00
$aContext = $this->context;
$aContext['appUid'] = $applicationData["APP_UID"];
$aContext['proUid'] = $applicationData["PRO_UID"];
if(sizeof($arrayElement)){
foreach ($arrayElement as $value) {
switch ($value['type']) {
case 'bpmnEvent':
if ($arrayEventExecute[$positionEventExecute]) {
$event = \BpmnEventPeer::retrieveByPK($value['uid']);
if (!is_null($event)) {
if (preg_match("/^(?:END|INTERMEDIATE)$/", $event->getEvnType()) && $event->getEvnMarker() === 'MESSAGETHROW') {
//Message-Application throw
$result = $messageApplication->create($applicationData["APP_UID"], $applicationData["PRO_UID"], $value['uid'], $applicationData);
2016-11-21 18:02:50 -05:00
$aContext['envUid'] = $value['uid'];
$aContext['envType'] = $event->getEvnType();
$aContext['envMarker'] = $event->getEvnMarker();
$aContext['action'] = 'Message application throw';
//Logger
Bootstrap::registerMonolog('CaseDerivation', 200, 'Case Derivation', $aContext, $this->sysSys, 'processmaker.log');
}
if (preg_match("/^(?:END|INTERMEDIATE)$/", $event->getEvnType()) && $event->getEvnMarker() === 'EMAIL') {
//Email-Event throw
$result = $emailEvent->sendEmail($applicationData["APP_UID"], $applicationData["PRO_UID"], $value['uid'], $applicationData);
2016-11-21 18:02:50 -05:00
$aContext['envUid'] = $value['uid'];
$aContext['envType'] = $event->getEvnType();
$aContext['envMarker'] = $event->getEvnMarker();
$aContext['action'] = 'Email event throw';
//Logger
Bootstrap::registerMonolog('CaseDerivation', 200, 'Case Derivation', $aContext, $this->sysSys, 'processmaker.log');
}
}
}
break;
case 'bpmnGateway':
$positionEventExecute = 'AFTER';
break;
2015-11-22 13:43:30 -04:00
}
}
}
2015-11-20 15:17:47 -04:00
} catch (Exception $e) {
throw $e;
}
}
/**
* Update counters
*
* @param array $arrayCurrentDelegationData
* @param array $arrayNextDelegationData
* @param mixed $taskNextDelegation
* @param array $arrayApplicationData
* @param int $delIndexNew
* @param mixed $aSp
* @param bool $removeList
*
* @return void
*/
2016-11-18 15:11:22 -05:00
private function updateList(array $arrayCurrentDelegationData, array $arrayNextDelegationData, $taskNextDelegation, array $arrayApplicationData, $delIndexNew, $aSp, $removeList)
{
/*----------------------------------********---------------------------------*/
try {
if ($arrayNextDelegationData["TAS_UID"] != "-1") {
$regexpTaskTypeToExclude = "WEBENTRYEVENT|END-MESSAGE-EVENT|START-MESSAGE-EVENT|INTERMEDIATE-THROW-MESSAGE-EVENT|INTERMEDIATE-CATCH-MESSAGE-EVENT|SCRIPT-TASK|INTERMEDIATE-CATCH-TIMER-EVENT";
if (!preg_match("/^(?:" . $regexpTaskTypeToExclude . ")$/", $taskNextDelegation->getTasType())) {
if (!empty($delIndexNew) && empty($aSp)) {
$appDelegation = AppDelegationPeer::retrieveByPK($arrayApplicationData["APP_UID"], $delIndexNew);
$arrayApplicationData2 = $appDelegation->toArray(BasePeer::TYPE_FIELDNAME);
$arrayApplicationData2["APP_STATUS"] = $arrayCurrentDelegationData["APP_STATUS"];
$taskCurrent = TaskPeer::retrieveByPK($arrayCurrentDelegationData["TAS_UID"]);
if ($taskCurrent->getTasType() == "INTERMEDIATE-CATCH-MESSAGE-EVENT") {
$removeList = false;
}
$arrayApplicationData2["REMOVED_LIST"] = $removeList;
$inbox = new ListInbox();
2017-02-21 16:36:51 -04:00
$inbox->newRow($arrayApplicationData2, $arrayApplicationData["CURRENT_USER_UID"], (($arrayNextDelegationData["TAS_ASSIGN_TYPE"] == "SELF_SERVICE")? true : false));
}
}
}
} catch (Exception $e) {
throw $e;
}
/*----------------------------------********---------------------------------*/
}
2017-03-03 15:22:25 -04:00
/**
* This function prepare the information before call the derivate function
*
* We can route a case from differents ways from cases_Derivate and derivateCase used in PMFDerivateCase
* before this we need to process the information
*
* @param array $aDataForPrepareInfo
* @param array $tasks
* @param string $rouType
* @param array $aCurrentDerivation
* @return array $arrayDerivationResult
*/
function beforeDerivate($aDataForPrepareInfo, $tasks, $rouType, $aCurrentDerivation)
{
$aPInformation = $this->prepareInformation($aDataForPrepareInfo);
$oRoute = new \ProcessMaker\Core\RoutingScreen();
$nextTasks = $oRoute->mergeDataDerivation($tasks, $aPInformation, $rouType);
//Get all route types
$aRouteTypes = array();
foreach ($aPInformation as $key => $value) {
$aRouteTypes[$key]['ROU_NEXT_TASK'] = $value['ROU_NEXT_TASK'];
$aRouteTypes[$key]['ROU_TYPE'] = $value['ROU_TYPE'];
}
$aCurrentDerivation['ROUTE_TYPES'] = $aRouteTypes;
//Derivate the case
$arrayDerivationResult = $this->derivate($aCurrentDerivation, $nextTasks);
return $arrayDerivationResult;
}
2017-07-06 16:36:53 -04:00
/** Route the case
* If need to create another thread we can execute the doDerivate
*
* @param array $currentDelegation
* @param array $nextDelegations
2017-07-06 16:36:53 -04:00
* @param bool $removeList
*
* @return void
2017-07-06 16:36:53 -04:00
* @throws /Exception
*/
function derivate(array $currentDelegation, array $nextDelegations, $removeList = true)
2012-10-09 12:40:24 -04:00
{
2017-10-10 12:33:25 -04:00
$this->sysSys = (!empty(config("system.workspace")))? config("system.workspace") : "Undefined";
2016-11-21 18:02:50 -05:00
$this->context = Bootstrap::getDefaultContextLog();
$aContext = $this->context;
2017-07-06 16:36:53 -04:00
$this->removeList = $removeList;
$arrayDerivationResult = [];
2012-10-09 12:40:24 -04:00
//define this...
if (! defined( 'TASK_FINISH_PROCESS' )) {
2012-10-09 12:40:24 -04:00
define( 'TASK_FINISH_PROCESS', - 1 );
}
if (! defined( 'TASK_FINISH_TASK' )) {
2012-10-09 12:40:24 -04:00
define( 'TASK_FINISH_TASK', - 2 );
}
2012-10-09 12:40:24 -04:00
$this->case = new cases();
2015-06-25 15:59:34 -04:00
//Get data for this DEL_INDEX current
2012-10-09 12:40:24 -04:00
$appFields = $this->case->loadCase( $currentDelegation['APP_UID'], $currentDelegation['DEL_INDEX'] );
2016-11-21 18:02:50 -05:00
$aContext['appUid'] = $currentDelegation['APP_UID'];
$aContext['delIndex'] = $currentDelegation['DEL_INDEX'];
2015-06-25 15:59:34 -04:00
unset($appFields['APP_ROUTING_DATA']);
2015-06-25 15:59:34 -04:00
//We close the current derivation, then we'll try to derivate to each defined route
2012-10-09 12:40:24 -04:00
$this->case->CloseCurrentDelegation( $currentDelegation['APP_UID'], $currentDelegation['DEL_INDEX'] );
//Get data for current delegation (current Task)
$task = TaskPeer::retrieveByPK($currentDelegation["TAS_UID"]);
$bpmnActivity = BpmnActivityPeer::retrieveByPK($currentDelegation["TAS_UID"]);
$flagTaskIsMultipleInstance = false;
$flagTaskAssignTypeIsMultipleInstance = false;
if (!is_null($task) && !is_null($bpmnActivity)) {
$flagTaskIsMultipleInstance = $bpmnActivity->getActType() == "TASK" && preg_match("/^(?:EMPTY|USERTASK|MANUALTASK)$/", $bpmnActivity->getActTaskType()) && $bpmnActivity->getActLoopType() == "PARALLEL";
$flagTaskAssignTypeIsMultipleInstance = preg_match("/^(?:MULTIPLE_INSTANCE|MULTIPLE_INSTANCE_VALUE_BASED)$/", $task->getTasAssignType());
}
$currentDelegation["TAS_ASSIGN_TYPE"] = $task->getTasAssignType();
$currentDelegation["TAS_MI_COMPLETE_VARIABLE"] = $task->getTasMiCompleteVariable();
$currentDelegation["TAS_MI_INSTANCE_VARIABLE"] = $task->getTasMiInstanceVariable();
$arrayNextDerivation = array();
$flagFirstIteration = true;
2015-06-25 15:59:34 -04:00
2012-10-09 12:40:24 -04:00
foreach ($nextDelegations as $nextDel) {
//BpmnEvent - END-MESSAGE-EVENT, END-EMAIL-EVENT, INTERMEDIATE-THROW-EMAIL-EVENT
//Check and get unique id
if (preg_match("/^(.{32})\/(\-1)$/", $nextDel["TAS_UID"], $arrayMatch)) {
$nextDel["TAS_UID"] = $arrayMatch[2];
$nextDel["TAS_UID_DUMMY"] = $arrayMatch[1];
}
2017-07-06 16:36:53 -04:00
//Review if is a Subprocesses then we update the $nextDel
if (!empty($nextDel['TAS_PARENT'])) {
$subProcessNextDel = $this->getNextInfoSubProcess($nextDel, $appFields['PRO_UID']);
if(count($subProcessNextDel) > 0) {
$nextDel = $subProcessNextDel;
$aSP = $this->aSP;
2012-10-09 12:40:24 -04:00
} else {
continue;
}
}
//get open threads
$openThreads = $this->case->GetOpenThreads( $currentDelegation['APP_UID'] );
//if we are derivating to finish process but there are no more open thread then we are finishing only the task, we are not finishing the whole process
if (($nextDel['TAS_UID'] == TASK_FINISH_PROCESS) && (($openThreads + 1) > 1)) {
$nextDel['TAS_UID'] = TASK_FINISH_TASK;
}
$taskNextDel = TaskPeer::retrieveByPK($nextDel["TAS_UID"]); //Get data for next delegation (next Task)
$bpmnActivityNextDel = BpmnActivityPeer::retrieveByPK($nextDel["TAS_UID"]);
$flagTaskNextDelIsMultipleInstance = false;
$flagTaskNextDelAssignTypeIsMultipleInstance = false;
if (!is_null($taskNextDel) && !is_null($bpmnActivityNextDel)) {
$flagTaskNextDelIsMultipleInstance = $bpmnActivityNextDel->getActType() == "TASK" && preg_match("/^(?:EMPTY|USERTASK|MANUALTASK)$/", $bpmnActivityNextDel->getActTaskType()) && $bpmnActivityNextDel->getActLoopType() == "PARALLEL";
$flagTaskNextDelAssignTypeIsMultipleInstance = preg_match("/^(?:MULTIPLE_INSTANCE|MULTIPLE_INSTANCE_VALUE_BASED)$/", $taskNextDel->getTasAssignType());
}
2017-07-06 16:36:53 -04:00
$this->flagUpdateList = true;
2016-11-21 18:02:50 -05:00
$aContext['tasUid'] = $nextDel['TAS_UID'];
2012-10-09 12:40:24 -04:00
switch ($nextDel['TAS_UID']) {
case TASK_FINISH_PROCESS:
2017-07-06 16:36:53 -04:00
$this->finishProcess(
$currentDelegation,
$nextDel,
$appFields,
$flagFirstIteration,
$aContext
);
2012-10-09 12:40:24 -04:00
break;
case TASK_FINISH_TASK:
2017-07-06 16:36:53 -04:00
$this->finishTask(
$currentDelegation,
$nextDel,
$appFields,
$flagFirstIteration,
$flagTaskAssignTypeIsMultipleInstance,
$aContext
);
2012-10-09 12:40:24 -04:00
break;
default:
//Get all siblingThreads
$canDerivate = false;
2017-01-10 17:51:08 -04:00
$nextDel['TAS_ID'] = $taskNextDel->getTasId();
2012-10-09 12:40:24 -04:00
switch ($currentDelegation['TAS_ASSIGN_TYPE']) {
case 'CANCEL_MI':
case 'STATIC_MI':
2017-07-06 16:36:53 -04:00
$canDerivate = $this->canRouteTasAssignStaticMi($currentDelegation);
2012-10-09 12:40:24 -04:00
break;
default:
$routeType = $currentDelegation["ROU_TYPE"];
$routeType = ($flagTaskIsMultipleInstance && $flagTaskAssignTypeIsMultipleInstance)? "SEC-JOIN" : $routeType;
switch ($routeType) {
case "SEC-JOIN":
2017-07-06 16:36:53 -04:00
$canDerivate = $this->canRouteTypeSecJoin(
$flagTaskIsMultipleInstance,
$flagTaskAssignTypeIsMultipleInstance,
$currentDelegation,
$appFields,
$nextDel
);
$arraySiblings = $this->arraySiblings;
break;
default:
$canDerivate = true;
2015-11-13 15:05:26 -04:00
//Check if the previous is a SEC-JOIN and check threads
if(isset($nextDel["ROU_PREVIOUS_TYPE"])){
if($nextDel["ROU_PREVIOUS_TYPE"] == "SEC-JOIN"){
2017-07-06 16:36:53 -04:00
$arrayOpenThread = $this->case->searchOpenPreviousTasks(
$nextDel["ROU_PREVIOUS_TASK"],
$currentDelegation["APP_UID"]
);
$arraySiblings = $this->case->getOpenSiblingThreads(
$nextDel["ROU_PREVIOUS_TASK"],
$currentDelegation["APP_UID"],
$currentDelegation["DEL_INDEX"],
$currentDelegation["TAS_UID"]
);
2016-06-30 09:31:34 -04:00
if(is_array($arrayOpenThread) && is_array($arraySiblings)){
$arrayOpenThread = array_merge($arrayOpenThread, $arraySiblings);
}
2015-11-13 15:05:26 -04:00
$canDerivate = empty($arrayOpenThread);
}
}
break;
2012-10-09 12:40:24 -04:00
}
break;
}
2012-10-09 12:40:24 -04:00
if ($canDerivate) {
2017-07-06 16:36:53 -04:00
/**
* CREATE a new index/thread in the AppDelegation
*/
$nextDel['USR_UID'] = (!isset($nextDel['USR_UID'])) ? '' : $nextDel['USR_UID'];
//Throw Events
2017-07-06 16:36:53 -04:00
$this->executeEvent(
$nextDel["TAS_UID"],
$appFields,
true,
true,
$currentDelegation["TAS_UID"]
);
2017-07-06 16:36:53 -04:00
//Route the case
$aSP = (isset($aSP))? $aSP : null;
$taskNextDelAssignType = ($flagTaskNextDelIsMultipleInstance && $flagTaskNextDelAssignTypeIsMultipleInstance)? $taskNextDel->getTasAssignType() : "";
switch ($taskNextDelAssignType) {
case "MULTIPLE_INSTANCE":
case "MULTIPLE_INSTANCE_VALUE_BASED":
2017-07-06 16:36:53 -04:00
$arrayDerivationResult = $this->routeMultipleInstance(
$currentDelegation,
$nextDel,
$taskNextDel,
$appFields,
$aSP,
$this->removeList
);
$iNewDelIndex = $this->iNewDelIndex;
break;
default:
$iNewDelIndex = $this->doDerivation($currentDelegation, $nextDel, $appFields, $aSP);
2017-07-06 16:36:53 -04:00
//When the users route the case in the same time
2016-04-14 15:51:36 -04:00
if($iNewDelIndex !== 0){
2017-07-06 16:36:53 -04:00
$arrayDerivationResult[] = [
'DEL_INDEX' => $iNewDelIndex,
'TAS_UID' => $nextDel['TAS_UID'],
'USR_UID' => (isset($nextDel['USR_UID']))? $nextDel['USR_UID'] : ''
];
2016-04-14 15:51:36 -04:00
}
break;
}
2016-11-25 13:06:25 -05:00
//Execute Service Task
if (function_exists('executeServiceTaskByActivityUid')) {
$appFields["APP_DATA"] = executeServiceTaskByActivityUid($nextDel["TAS_UID"], $appFields);
}
2015-06-25 15:59:34 -04:00
//Execute Script-Task
$scriptTask = new \ProcessMaker\BusinessModel\ScriptTask();
2015-06-29 17:19:59 -04:00
$appFields["APP_DATA"] = $scriptTask->execScriptByActivityUid($nextDel["TAS_UID"], $appFields);
//Create record in table APP_ASSIGN_SELF_SERVICE_VALUE
2016-11-25 13:06:25 -05:00
$regexpTaskTypeToExclude = "SCRIPT-TASK|INTERMEDIATE-THROW-EMAIL-EVENT|SERVICE-TASK";
if (!is_null($taskNextDel) && !preg_match("/^(?:" . $regexpTaskTypeToExclude . ")$/", $taskNextDel->getTasType())) {
2017-07-06 16:36:53 -04:00
$this->createRecordAppSelfServiceValue(
$taskNextDel,
$iNewDelIndex,
$nextDel["TAS_UID"],
$appFields
);
}
2015-06-25 15:59:34 -04:00
2017-07-06 16:36:53 -04:00
//Elements with automatic execution
$aTaskTypeToInclude = array('SCRIPT-TASK', 'INTERMEDIATE-THROW-EMAIL-EVENT', 'INTERMEDIATE-THROW-MESSAGE-EVENT', 'SERVICE-TASK');
//Prepare information when the current is $aTaskTypeToInclude and the next element does not have user
if (!is_null($taskNextDel) && in_array($taskNextDel->getTasType(), $aTaskTypeToInclude)) {
$arrayNextDerivation[] = $this->routePrepareInformationNextTask(
$currentDelegation,
$iNewDelIndex,
$nextDel
);
2015-06-25 15:59:34 -04:00
}
} else {
2017-07-06 16:36:53 -04:00
/**
* NO CREATE a new index/thread in the AppDelegation
*/
$this->doRouteWithoutThread($appFields, $currentDelegation, $nextDel, $arraySiblings, $flagTaskIsMultipleInstance, $flagTaskAssignTypeIsMultipleInstance, $flagFirstIteration);
}
2017-07-06 16:36:53 -04:00
break;
}
2016-11-23 11:27:07 -05:00
//$flagUpdateList is updated when is parallel
2017-07-06 16:36:53 -04:00
if(!is_null($taskNextDel) && $this->flagUpdateList){
$this->updateList(
$currentDelegation,
$nextDel,
$taskNextDel,
$appFields,
(isset($iNewDelIndex))? $iNewDelIndex : 0,
(isset($aSP))? $aSP : null,
$this->removeList
);
}
2015-06-25 15:59:34 -04:00
2017-07-06 16:36:53 -04:00
$this->removeList = false;
$flagFirstIteration = false;
unset($aSP);
}
2012-10-09 12:40:24 -04:00
/* Start Block : UPDATES APPLICATION */
//Set THE APP_STATUS
$appFields['APP_STATUS'] = $currentDelegation['APP_STATUS'];
/* Start Block : Count the open threads of $currentDelegation['APP_UID'] */
$openThreads = $this->case->GetOpenThreads( $currentDelegation['APP_UID'] );
2017-07-06 11:36:40 -04:00
$flagUpdateCase = false;
2012-10-09 12:40:24 -04:00
//check if there is any paused thread
$existThreadPaused = false;
if (isset($arraySiblings['pause'])) {
if (!empty($arraySiblings['pause'])) {
$existThreadPaused = true;
}
}
if ($openThreads == 0 && !$existThreadPaused) {
2012-10-09 12:40:24 -04:00
//Close case
$appFields["APP_STATUS"] = "COMPLETED";
$appFields["APP_FINISH_DATE"] = "now";
$this->verifyIsCaseChild($currentDelegation["APP_UID"], $currentDelegation["DEL_INDEX"]);
2017-07-06 11:36:40 -04:00
$flagUpdateCase = true;
2010-12-02 23:34:41 +00:00
}
2012-10-09 12:40:24 -04:00
2017-07-06 11:36:40 -04:00
//The variable $iNewDelIndex will be true if we created a new index the variable
if (isset($iNewDelIndex)) {
2012-10-09 12:40:24 -04:00
$appFields["DEL_INDEX"] = $iNewDelIndex;
2017-07-06 11:36:40 -04:00
$excludeTasUid = array(TASK_FINISH_PROCESS, TASK_FINISH_TASK);
2017-07-20 16:57:23 -04:00
//If the last TAS_UID value is not valid we will check for the valid TAS_UID value
2017-07-06 11:36:40 -04:00
if (in_array($nextDel["TAS_UID"], $excludeTasUid) && is_array($arrayDerivationResult) && isset(current($arrayDerivationResult)["TAS_UID"])) {
$appFields["TAS_UID"] = current($arrayDerivationResult)["TAS_UID"];
2017-07-20 16:57:23 -04:00
} else {
$appFields["TAS_UID"] = $nextDel["TAS_UID"];
2017-07-06 11:36:40 -04:00
}
$flagUpdateCase = true;
2010-12-02 23:34:41 +00:00
}
2012-10-09 12:40:24 -04:00
2017-07-06 11:36:40 -04:00
if ($flagUpdateCase) {
2012-10-09 12:40:24 -04:00
//Start Block : UPDATES APPLICATION
$this->case->updateCase( $currentDelegation["APP_UID"], $appFields );
//End Block : UPDATES APPLICATION
}
//Start the next derivations (Script-Task)
if (!empty($arrayNextDerivation)) {
foreach ($arrayNextDerivation as $value) {
$this->derivate($value["currentDelegation"], $value["nextDelegations"]);
}
}
//Return
return $arrayDerivationResult;
2012-10-09 12:40:24 -04:00
}
2017-07-06 16:36:53 -04:00
/** We can create a new thread in the appDelegation
* This function is used in derivate
*
* @param array $currentDelegation
* @param array $nextDel
* @param array $appFields
* @param array $aSP
*
* @return integer $iNewDelIndex
* @throws /Exception
*/
2012-10-09 12:40:24 -04:00
function doDerivation ($currentDelegation, $nextDel, $appFields, $aSP = null)
{
$case = new \ProcessMaker\BusinessModel\Cases();
$arrayApplicationData = $case->getApplicationRecordByPk($currentDelegation['APP_UID'], [], false);
$arrayRoutingData = (!is_null($arrayApplicationData['APP_ROUTING_DATA']) && (string)($arrayApplicationData['APP_ROUTING_DATA']) != '')? unserialize($arrayApplicationData['APP_ROUTING_DATA']) : [];
2012-10-09 12:40:24 -04:00
$iAppThreadIndex = $appFields['DEL_THREAD'];
$delType = 'NORMAL';
$sendNotifications = false;
$sendNotificationsMobile = false;
2012-10-09 12:40:24 -04:00
$appDelegation = new AppDelegation();
$taskNextDel = TaskPeer::retrieveByPK($nextDel["TAS_UID"]);
$arrayAppDelegationPrevious = $appDelegation->getPreviousDelegationValidTask($currentDelegation['APP_UID'], $currentDelegation['DEL_INDEX'], true);
$taskUidOrigin = $arrayAppDelegationPrevious['TAS_UID'];
$taskUidDest = $taskNextDel->getTasUid();
if (array_key_exists($taskUidOrigin . '/' . $taskUidDest, $arrayRoutingData)) {
2016-10-01 15:27:37 -04:00
if(isset($arrayRoutingData[$taskUidOrigin . '/' . $taskUidDest]['USR_UID'])){
$nextDel['USR_UID'] = $arrayRoutingData[$taskUidOrigin . '/' . $taskUidDest]['USR_UID'];
}
unset($arrayRoutingData[$taskUidOrigin . '/' . $taskUidDest]);
}
if ($taskNextDel->getTasType() == 'NORMAL' &&
$taskNextDel->getTasAssignType() != 'SELF_SERVICE' &&
(is_null($nextDel['USR_UID']) || $nextDel['USR_UID'] == '')
) {
throw new Exception(G::LoadTranslation('ID_NO_USERS'));
}
2012-10-09 12:40:24 -04:00
if (is_numeric( $nextDel['DEL_PRIORITY'] )) {
$nextDel['DEL_PRIORITY'] = (isset( $nextDel['DEL_PRIORITY'] ) ? ($nextDel['DEL_PRIORITY'] >= 1 && $nextDel['DEL_PRIORITY'] <= 5 ? $nextDel['DEL_PRIORITY'] : '3') : '3');
} else {
$nextDel['DEL_PRIORITY'] = 3;
}
2012-10-09 12:40:24 -04:00
switch ($nextDel['TAS_ASSIGN_TYPE']) {
2010-12-02 23:34:41 +00:00
case 'CANCEL_MI':
case 'STATIC_MI':
2012-10-09 12:40:24 -04:00
// Create new delegation depending on the no of users in the group
2017-07-06 16:36:53 -04:00
$iNewDelIndex = $this->doDerivationStaticMi(
$appFields,
$currentDelegation,
$nextDel,
$iAppThreadIndex,
$delType
);
2012-10-09 12:40:24 -04:00
break;
case 'BALANCED':
2017-07-06 16:36:53 -04:00
$this->setTasLastAssigned($nextDel['TAS_UID'], $nextDel['USR_UID']);
//No Break, need no execute the default ones....
default:
2016-04-15 16:46:47 -04:00
$delPrevious = 0;
if($this->flagControlMulInstance){
$criteriaMulti = new Criteria("workflow");
$criteriaMulti->addSelectColumn(AppDelegationPeer::DEL_PREVIOUS);
$criteriaMulti->add(AppDelegationPeer::TAS_UID, $currentDelegation['TAS_UID'], Criteria::EQUAL);
$criteriaMultiR = AppDelegationPeer::doSelectRS($criteriaMulti);
$criteriaMultiR->setFetchmode(ResultSet::FETCHMODE_ASSOC);
$criteriaMultiR->next();
$row = $criteriaMultiR->getRow();
$delPrevious = $row['DEL_PREVIOUS'];
}
2012-10-09 12:40:24 -04:00
// Create new delegation
2017-01-10 17:51:08 -04:00
$iNewDelIndex = $this->case->newAppDelegation(
$appFields['PRO_UID'],
$currentDelegation['APP_UID'],
$nextDel['TAS_UID'],
2017-05-18 09:46:19 -04:00
$this->verifyCurrentUserInTask($nextDel, $aSP),
2017-01-10 17:51:08 -04:00
$currentDelegation['DEL_INDEX'],
$nextDel['DEL_PRIORITY'],
$delType,
$iAppThreadIndex,
$nextDel,
$this->flagControl,
$this->flagControlMulInstance,
$delPrevious,
$appFields['APP_NUMBER'],
$appFields['PRO_ID'],
$nextDel['TAS_ID']
);
2012-10-09 12:40:24 -04:00
break;
}
if (array_key_exists('NEXT_ROUTING', $nextDel) && is_array($nextDel['NEXT_ROUTING']) && !empty($nextDel['NEXT_ROUTING'])) {
if (array_key_exists('TAS_UID', $nextDel['NEXT_ROUTING'])) {
$arrayRoutingData[$currentDelegation['TAS_UID'] . '/' . $nextDel['NEXT_ROUTING']['TAS_UID']] = $nextDel['NEXT_ROUTING'];
} else {
foreach ($nextDel['NEXT_ROUTING'] as $value) {
$arrayRoutingData[$currentDelegation['TAS_UID'] . '/' . $value['TAS_UID']] = $value;
}
}
}
$application = new Application();
$result = $application->update(['APP_UID' => $currentDelegation['APP_UID'], 'APP_ROUTING_DATA' => serialize($arrayRoutingData)]);
2017-03-02 16:30:01 -04:00
//We updated the information relate to APP_THREAD
2012-10-09 12:40:24 -04:00
$iAppThreadIndex = $appFields['DEL_THREAD'];
2017-03-06 18:08:16 -04:00
$isUpdatedThread = false;
2017-03-02 16:30:01 -04:00
if (isset($currentDelegation['ROUTE_TYPES']) && sizeof($currentDelegation['ROUTE_TYPES']) > 1) {
//If the next is more than one thread: Parallel or other
foreach ($currentDelegation['ROUTE_TYPES'] as $key => $value) {
if ($value['ROU_NEXT_TASK'] === $nextDel['TAS_UID']) {
2017-03-06 18:08:16 -04:00
$isUpdatedThread = true;
2017-03-02 16:30:01 -04:00
$routeType = ($value['ROU_TYPE'] === 'EVALUATE') ? 'PARALLEL-AND-EXCLUSIVE' : $value['ROU_TYPE'];
$this->updateAppThread($routeType, $currentDelegation['APP_UID'], $iAppThreadIndex, $iNewDelIndex);
}
}
2017-03-06 18:08:16 -04:00
}
if (!$isUpdatedThread) {
2017-03-02 16:30:01 -04:00
//If the next is a sequential derivation
$this->updateAppThread($currentDelegation['ROU_TYPE'], $currentDelegation['APP_UID'], $iAppThreadIndex, $iNewDelIndex);
}
2017-07-06 16:36:53 -04:00
//if there are SubProcess to create
if (isset($aSP)) {
//Check if is SelfService the task in the SubProcess
$isSelfService = (empty($aSP['USR_UID'])) ? true : false;
2012-10-09 12:40:24 -04:00
//Create the new case in the sub-process
2017-02-21 16:36:51 -04:00
//Set the initial date to null the time its created
2017-07-06 16:36:53 -04:00
$aNewCase = $this->case->startCase( $aSP['TAS_UID'], $aSP['USR_UID'], true, $appFields, $isSelfService);
2015-06-25 15:59:34 -04:00
2017-07-06 16:36:53 -04:00
//Load the TAS_UID related to the SubProcess
$taskNextDel = TaskPeer::retrieveByPK($aSP["TAS_UID"]); //Sub-Process
2012-10-09 12:40:24 -04:00
//Copy case variables to sub-process case
$aFields = unserialize( $aSP['SP_VARIABLES_OUT'] );
$aNewFields = array ();
$aOldFields = $this->case->loadCase( $aNewCase['APPLICATION'] );
foreach ($aFields as $sOriginField => $sTargetField) {
$sOriginField = trim($sOriginField, " @#%?$=");
$sTargetField = trim($sTargetField, " @#%?$=");
2012-10-09 12:40:24 -04:00
$aNewFields[$sTargetField] = isset( $appFields['APP_DATA'][$sOriginField] ) ? $appFields['APP_DATA'][$sOriginField] : '';
2016-07-15 14:52:57 -04:00
if (array_key_exists($sOriginField . '_label', $appFields['APP_DATA'])) {
$aNewFields[$sTargetField . '_label'] = $appFields['APP_DATA'][$sOriginField . '_label'];
}
2012-10-09 12:40:24 -04:00
}
2017-07-06 16:36:53 -04:00
//We will to update the new case
2012-10-09 12:40:24 -04:00
$aOldFields['APP_DATA'] = array_merge( $aOldFields['APP_DATA'], $aNewFields );
$aOldFields['APP_STATUS'] = 'TO_DO';
2017-07-06 16:36:53 -04:00
$this->case->updateCase(
$aNewCase['APPLICATION'],
$aOldFields
);
2012-10-09 12:40:24 -04:00
//Create a registry in SUB_APPLICATION table
2017-07-06 16:36:53 -04:00
$aSubApplication = array (
'APP_UID' => $aNewCase['APPLICATION'],
'APP_PARENT' => $currentDelegation['APP_UID'],
'DEL_INDEX_PARENT' => $iNewDelIndex,
'DEL_THREAD_PARENT' => $iAppThreadIndex,
'SA_STATUS' => 'ACTIVE',
'SA_VALUES_OUT' => serialize($aNewFields),
'SA_INIT_DATE' => date('Y-m-d H:i:s')
2012-10-09 12:40:24 -04:00
);
if ($aSP['SP_SYNCHRONOUS'] == 0) {
$aSubApplication['SA_STATUS'] = 'FINISHED';
$aSubApplication['SA_FINISH_DATE'] = $aSubApplication['SA_INIT_DATE'];
}
$oSubApplication = new SubApplication();
$oSubApplication->create( $aSubApplication );
2017-07-06 16:36:53 -04:00
2012-10-09 12:40:24 -04:00
//Update the AppDelegation to execute the update trigger
$AppDelegation = AppDelegationPeer::retrieveByPK( $aNewCase['APPLICATION'], $aNewCase['INDEX'] );
$AppDelegation->save();
//Create record in table APP_ASSIGN_SELF_SERVICE_VALUE
if ($taskNextDel->getTasAssignType() == "SELF_SERVICE" && trim($taskNextDel->getTasGroupVariable()) != "") {
$nextTaskGroupVariable = trim($taskNextDel->getTasGroupVariable(), " @#");
2012-10-09 12:40:24 -04:00
if (isset($aOldFields["APP_DATA"][$nextTaskGroupVariable])) {
$dataVariable = $aOldFields["APP_DATA"][$nextTaskGroupVariable];
$dataVariable = (is_array($dataVariable))? $dataVariable : trim($dataVariable);
if (!empty($dataVariable)) {
$appAssignSelfServiceValue = new AppAssignSelfServiceValue();
2016-12-08 17:02:13 -05:00
$appAssignSelfServiceValue->create($aNewCase["APPLICATION"], $aNewCase["INDEX"], array("PRO_UID" => $aNewCase["PROCESS"], "TAS_UID" => $aSP["TAS_UID"], "GRP_UID" => ""), $dataVariable);
}
}
}
2017-07-06 16:36:53 -04:00
//We will to send the notifications
$sendNotificationsMobile = $this->sendNotificationsMobile($aOldFields, $aSP, $aNewCase['INDEX']);
$nextTaskData = $taskNextDel->toArray(BasePeer::TYPE_FIELDNAME);
$nextTaskData['USR_UID'] = $aSP['USR_UID'];
$sendNotifications = $this->notifyAssignedUser($appFields, $nextTaskData, $aNewCase['INDEX']);
2017-07-06 16:36:53 -04:00
//If is ASYNCHRONOUS we will to route the case master
2012-10-09 12:40:24 -04:00
if ($aSP['SP_SYNCHRONOUS'] == 0) {
$this->case->setDelInitDate( $currentDelegation['APP_UID'], $iNewDelIndex );
2017-03-23 16:13:40 -04:00
$aDeriveTasks = $this->prepareInformation(
array (
'USER_UID' => -1,
'APP_UID' => $currentDelegation['APP_UID'],
'DEL_INDEX' => $iNewDelIndex
)
);
2012-10-09 12:40:24 -04:00
if (isset($aDeriveTasks[1])) {
2012-10-09 12:40:24 -04:00
if ($aDeriveTasks[1]['ROU_TYPE'] != 'SELECT') {
$nextDelegations2 = array();
2012-10-09 12:40:24 -04:00
foreach ($aDeriveTasks as $aDeriveTask) {
2017-03-23 16:13:40 -04:00
$nextDelegations2[] = array(
'TAS_UID' => $aDeriveTask['NEXT_TASK']['TAS_UID'],
'USR_UID' => $aDeriveTask['NEXT_TASK']['USER_ASSIGNED']['USR_UID'],
'TAS_ASSIGN_TYPE' => $aDeriveTask['NEXT_TASK']['TAS_ASSIGN_TYPE'],
'TAS_DEF_PROC_CODE' => $aDeriveTask['NEXT_TASK']['TAS_DEF_PROC_CODE'],
'DEL_PRIORITY' => 3,
'TAS_PARENT' => $aDeriveTask['NEXT_TASK']['TAS_PARENT'],
2017-04-12 10:42:25 -04:00
'ROU_PREVIOUS_TYPE' => isset($aDeriveTask['NEXT_TASK']['ROU_PREVIOUS_TYPE']) ? $aDeriveTask['NEXT_TASK']['ROU_PREVIOUS_TYPE'] : '',
'ROU_PREVIOUS_TASK' => isset($aDeriveTask['NEXT_TASK']['ROU_PREVIOUS_TASK']) ? $aDeriveTask['NEXT_TASK']['ROU_PREVIOUS_TASK'] : ''
2012-10-09 12:40:24 -04:00
);
}
2017-03-23 16:13:40 -04:00
$currentDelegation2 = array(
'APP_UID' => $currentDelegation['APP_UID'],
'DEL_INDEX' => $iNewDelIndex,
'APP_STATUS' => 'TO_DO',
'TAS_UID' => $currentDelegation['TAS_UID'],
'ROU_TYPE' => $aDeriveTasks[1]['ROU_TYPE'],
2012-10-09 12:40:24 -04:00
);
$openThreads = 0;
if ($currentDelegation2['ROU_TYPE'] == 'SEC-JOIN') {
$openThreads = $this->case->GetOpenThreads($currentDelegation['APP_UID']);
}
if ($openThreads == 0) {
$this->derivate($currentDelegation2, $nextDelegations2);
} else {
$oSubApplication = new SubApplication();
$aSubApplication['SA_STATUS'] = 'ACTIVE';
$oSubApplication->update($aSubApplication);
}
2012-10-09 12:40:24 -04:00
}
}
}
2017-07-06 16:36:53 -04:00
}
if ($iNewDelIndex !== 0 && !$sendNotificationsMobile) {
$this->sendNotificationsMobile($appFields, $nextDel, $iNewDelIndex);
}
if ($iNewDelIndex !== 0 && !$sendNotifications) {
$nextTaskData = $taskNextDel->toArray(BasePeer::TYPE_FIELDNAME);
$nextTaskData['USR_UID'] = $nextDel['USR_UID'];
$this->notifyAssignedUser($appFields, $nextTaskData, $iNewDelIndex);
}
2012-10-09 12:40:24 -04:00
return $iNewDelIndex;
}
2017-05-18 09:46:19 -04:00
/**
* This function returns the current user Checking cases where USR_ID exists or checking a subprocess (SYNCHRONOUS)
* @param $nextDel
* @param null $aSP
* @return string
*/
function verifyCurrentUserInTask($nextDel, $aSP = null)
{
if (isset($aSP) && $aSP["SP_SYNCHRONOUS"] == "1") {
$currentUser = "";
} else {
$currentUser = isset($nextDel['USR_UID']) ? $nextDel['USR_UID'] : "";
}
return $currentUser;
}
2017-03-02 16:30:01 -04:00
/**
* This function create, update and closed a new record related to appThread
*
* Related to route type we can change the records in the APP_THREAD table
* @param string $routeType this variable recibe information about the derivation
* @return void
*/
function updateAppThread($routeType, $appUid, $iAppThreadIndex, $iNewDelIndex) {
switch ($routeType) {
case 'PARALLEL':
case 'PARALLEL-BY-EVALUATION':
case 'PARALLEL-AND-EXCLUSIVE':
$this->case->closeAppThread($appUid, $iAppThreadIndex);
$iNewThreadIndex = $this->case->newAppThread($appUid, $iNewDelIndex, $iAppThreadIndex);
$this->case->updateAppDelegation($appUid, $iNewDelIndex, $iNewThreadIndex);
break;
default:
$this->case->updateAppThread($appUid, $iAppThreadIndex, $iNewDelIndex);
break;
}
}
2012-10-09 12:40:24 -04:00
/* verifyIsCaseChild
*
* @param string $sApplicationUID
* @return void
*/
function verifyIsCaseChild ($sApplicationUID, $delIndex = 0)
2012-10-09 12:40:24 -04:00
{
//Obtain the related row in the table SUB_APPLICATION
$oCriteria = new Criteria( 'workflow' );
$oCriteria->add( SubApplicationPeer::APP_UID, $sApplicationUID );
$oDataset = SubApplicationPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$oDataset->next();
$aSA = $oDataset->getRow();
if ($aSA) {
//Obtain the related row in the table SUB_PROCESS
$oCase = new Cases();
$aParentCase = $oCase->loadCase( $aSA['APP_PARENT'], $aSA['DEL_INDEX_PARENT'] );
$oCriteria = new Criteria( 'workflow' );
$oCriteria->add( SubProcessPeer::PRO_PARENT, $aParentCase['PRO_UID'] );
$oCriteria->add( SubProcessPeer::TAS_PARENT, $aParentCase['TAS_UID'] );
$oDataset = SubProcessPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$oDataset->next();
$aSP = $oDataset->getRow();
if ($aSP['SP_SYNCHRONOUS'] == 1 || $aSA['SA_STATUS'] == "ACTIVE") {
$appFields = $oCase->loadCase($sApplicationUID, $delIndex);
2012-10-09 12:40:24 -04:00
//Copy case variables to parent case
$aFields = unserialize($aSP['SP_VARIABLES_IN']);
$aNewFields = array();
2012-10-09 12:40:24 -04:00
foreach ($aFields as $sOriginField => $sTargetField) {
$sOriginField = str_replace('@', '', $sOriginField);
$sOriginField = str_replace('#', '', $sOriginField);
$sOriginField = str_replace('%', '', $sOriginField);
$sOriginField = str_replace('?', '', $sOriginField);
$sOriginField = str_replace('$', '', $sOriginField);
$sOriginField = str_replace('=', '', $sOriginField);
$sTargetField = str_replace('@', '', $sTargetField);
$sTargetField = str_replace('#', '', $sTargetField);
$sTargetField = str_replace('%', '', $sTargetField);
$sTargetField = str_replace('?', '', $sTargetField);
$sTargetField = str_replace('$', '', $sTargetField);
$sTargetField = str_replace('=', '', $sTargetField);
$aNewFields[$sTargetField] = isset($appFields['APP_DATA'][$sOriginField]) ? $appFields['APP_DATA'][$sOriginField] : '';
2016-07-15 14:52:57 -04:00
if (array_key_exists($sOriginField . '_label', $appFields['APP_DATA'])) {
$aNewFields[$sTargetField . '_label'] = $appFields['APP_DATA'][$sOriginField . '_label'];
} else {
if (array_key_exists($sTargetField . '_label', $aParentCase['APP_DATA'])) {
$aNewFields[$sTargetField . '_label'] = '';
}
}
2012-10-09 12:40:24 -04:00
}
$aParentCase['APP_DATA'] = array_merge($aParentCase['APP_DATA'], $aNewFields);
$oCase->updateCase($aSA['APP_PARENT'], $aParentCase);
2015-02-27 16:27:11 -04:00
/*----------------------------------********---------------------------------*/
$inbox = new ListInbox();
2015-06-25 15:59:34 -04:00
$inbox->update($aParentCase);
2015-02-27 16:27:11 -04:00
/*----------------------------------********---------------------------------*/
2015-06-25 15:59:34 -04:00
2012-10-09 12:40:24 -04:00
//Update table SUB_APPLICATION
$oSubApplication = new SubApplication();
$oSubApplication->update(array('APP_UID' => $sApplicationUID, 'APP_PARENT' => $aSA['APP_PARENT'], 'DEL_INDEX_PARENT' => $aSA['DEL_INDEX_PARENT'], 'DEL_THREAD_PARENT' => $aSA['DEL_THREAD_PARENT'], 'SA_STATUS' => 'FINISHED', 'SA_VALUES_IN' => serialize($aNewFields), 'SA_FINISH_DATE' => date('Y-m-d H:i:s')
));
2015-06-25 15:59:34 -04:00
2012-10-09 12:40:24 -04:00
//Derive the parent case
$aDeriveTasks = $this->prepareInformation(array('USER_UID' => -1, 'APP_UID' => $aSA['APP_PARENT'], 'DEL_INDEX' => $aSA['DEL_INDEX_PARENT']
));
if (isset($aDeriveTasks[1])) {
2012-10-09 12:40:24 -04:00
if ($aDeriveTasks[1]['ROU_TYPE'] != 'SELECT') {
$nextDelegations2 = array();
2012-10-09 12:40:24 -04:00
foreach ($aDeriveTasks as $aDeriveTask) {
if (!isset($aDeriveTask['NEXT_TASK']['USER_ASSIGNED']['USR_UID'])) {
2012-10-09 12:40:24 -04:00
$selectedUser = $aDeriveTask['NEXT_TASK']['USER_ASSIGNED'][0];
unset($aDeriveTask['NEXT_TASK']['USER_ASSIGNED']);
2012-10-09 12:40:24 -04:00
$aDeriveTask['NEXT_TASK']['USER_ASSIGNED'] = $selectedUser;
$myLabels = array($aDeriveTask['NEXT_TASK']['TAS_TITLE'], $aParentCase['APP_NUMBER'], $selectedUser['USR_USERNAME'], $selectedUser['USR_FIRSTNAME'], $selectedUser['USR_LASTNAME']
2012-10-09 12:40:24 -04:00
);
if ($aDeriveTask['NEXT_TASK']['TAS_ASSIGN_TYPE'] == "MANUAL") {
G::SendTemporalMessage('ID_TASK_WAS_ASSIGNED_TO_USER', 'warning', 'labels', 10, null, $myLabels);
2015-12-21 12:40:13 -04:00
}
2012-10-09 12:40:24 -04:00
}
$nextDelegations2[] = array(
'TAS_UID' => $aDeriveTask['NEXT_TASK']['TAS_UID'],
'USR_UID' => $aDeriveTask['NEXT_TASK']['USER_ASSIGNED']['USR_UID'],
'TAS_ASSIGN_TYPE' => $aDeriveTask['NEXT_TASK']['TAS_ASSIGN_TYPE'],
'TAS_DEF_PROC_CODE' => $aDeriveTask['NEXT_TASK']['TAS_DEF_PROC_CODE'],
'DEL_PRIORITY' => 3,
'TAS_PARENT' => $aDeriveTask['NEXT_TASK']['TAS_PARENT'],
'ROU_PREVIOUS_TASK' => isset($aDeriveTask['NEXT_TASK']['ROU_PREVIOUS_TASK']) ? $aDeriveTask['NEXT_TASK']['ROU_PREVIOUS_TASK'] : '',
'ROU_PREVIOUS_TYPE' => isset($aDeriveTask['NEXT_TASK']['ROU_PREVIOUS_TYPE']) ? $aDeriveTask['NEXT_TASK']['ROU_PREVIOUS_TYPE'] : ''
2012-10-09 12:40:24 -04:00
);
}
$currentDelegation2 = array('APP_UID' => $aSA['APP_PARENT'], 'DEL_INDEX' => $aSA['DEL_INDEX_PARENT'], 'APP_STATUS' => 'TO_DO', 'TAS_UID' => $aParentCase['TAS_UID'], 'ROU_TYPE' => $aDeriveTasks[1]['ROU_TYPE']
2012-10-09 12:40:24 -04:00
);
$this->derivate($currentDelegation2, $nextDelegations2);
if ($delIndex > 0) {
$flagNotification = false;
if ($appFields["CURRENT_USER_UID"] == '') {
$oCriteriaTaskDummy = new Criteria('workflow');
$oCriteriaTaskDummy->add(TaskPeer::PRO_UID, $appFields['PRO_UID']);
$oCriteriaTaskDummy->add(TaskPeer::TAS_UID, $appFields['TAS_UID']);
$oCriteriaTaskDummy->add(
$oCriteriaTaskDummy->getNewCriterion(TaskPeer::TAS_TYPE, 'SCRIPT-TASK', Criteria::EQUAL)->addOr(
$oCriteriaTaskDummy->getNewCriterion(TaskPeer::TAS_TYPE, 'INTERMEDIATE-THROW-EMAIL-EVENT', Criteria::EQUAL))
);
$oCriteriaTaskDummy->setLimit(1);
$oDataset = AppDelegationPeer::doSelectRS($oCriteriaTaskDummy);
$oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
$oDataset->next();
if ($row = $oDataset->getRow()) {
$flagNotification = true;
}
}
if (!$flagNotification) {
// Send notifications - Start
$oUser = new Users();
$aUser = $oUser->load($appFields["CURRENT_USER_UID"]);
$sFromName = $aUser["USR_FIRSTNAME"] . " " . $aUser["USR_LASTNAME"] . ($aUser["USR_EMAIL"] != "" ? " <" . $aUser["USR_EMAIL"] . ">" : "");
try {
$oCase->sendNotifications($appFields["TAS_UID"],
$nextDelegations2,
$appFields["APP_DATA"],
$sApplicationUID,
$delIndex,
$sFromName);
} catch (Exception $e) {
G::SendTemporalMessage(G::loadTranslation("ID_NOTIFICATION_ERROR") . " - " . $e->getMessage(), "warning", "string", null, "100%");
}
// Send notifications - End
}
}
2012-10-09 12:40:24 -04:00
}
}
2010-12-02 23:34:41 +00:00
}
}
}
2012-10-09 12:40:24 -04:00
/* getDerivatedCases
* get all derivated cases and subcases from any task,
* this function is useful to know who users have been assigned and what task they do.
*
* @param string $sParentUid
* @param string $sDelIndexParent
* @return array $derivation
*
*/
2012-10-09 12:40:24 -04:00
function getDerivatedCases ($sParentUid, $sDelIndexParent)
{
$oCriteria = new Criteria( 'workflow' );
$cases = array ();
$derivation = array ();
//get the child delegations , of parent delIndex
$children = array ();
$oCriteria->clearSelectColumns();
$oCriteria->addSelectColumn( AppDelegationPeer::DEL_INDEX );
$oCriteria->add( AppDelegationPeer::APP_UID, $sParentUid );
$oCriteria->add( AppDelegationPeer::DEL_PREVIOUS, $sDelIndexParent );
$oDataset = AppDelegationPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
2010-12-02 23:34:41 +00:00
$oDataset->next();
$aRow = $oDataset->getRow();
2012-10-09 12:40:24 -04:00
while (is_array( $aRow )) {
$children[] = $aRow['DEL_INDEX'];
$oDataset->next();
$aRow = $oDataset->getRow();
}
//foreach child , get the info of their derivations and subprocesses
foreach ($children as $keyChild => $child) {
$oCriteria = new Criteria( 'workflow' );
$oCriteria->clearSelectColumns();
$oCriteria->addSelectColumn( SubApplicationPeer::APP_UID );
$oCriteria->addSelectColumn( AppDelegationPeer::APP_UID );
$oCriteria->addSelectColumn( AppDelegationPeer::DEL_INDEX );
$oCriteria->addSelectColumn( AppDelegationPeer::PRO_UID );
$oCriteria->addSelectColumn( AppDelegationPeer::TAS_UID );
$oCriteria->addSelectColumn( AppDelegationPeer::USR_UID );
$oCriteria->addSelectColumn( UsersPeer::USR_USERNAME );
$oCriteria->addSelectColumn( UsersPeer::USR_FIRSTNAME );
$oCriteria->addSelectColumn( UsersPeer::USR_LASTNAME );
$oCriteria->add( SubApplicationPeer::APP_PARENT, $sParentUid );
$oCriteria->add( SubApplicationPeer::DEL_INDEX_PARENT, $child );
$oCriteria->addJoin( SubApplicationPeer::APP_UID, AppDelegationPeer::APP_UID );
$oCriteria->addJoin( AppDelegationPeer::USR_UID, UsersPeer::USR_UID );
$oDataset = SubApplicationPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$oDataset->next();
$aRow = $oDataset->getRow();
while (is_array( $aRow )) {
$oProcess = new Process();
$proFields = $oProcess->load( $aRow['PRO_UID'] );
$oCase = new Application();
$appFields = $oCase->load( $aRow['APP_UID'] );
$oTask = new Task();
$tasFields = $oTask->load( $aRow['TAS_UID'] );
$derivation[] = array ('processId' => $aRow['PRO_UID'],'processTitle' => $proFields['PRO_TITLE'],'caseId' => $aRow['APP_UID'],'caseNumber' => $appFields['APP_NUMBER'],'taskId' => $aRow['TAS_UID'],'taskTitle' => $tasFields['TAS_TITLE'],'userId' => $aRow['USR_UID'],'userName' => $aRow['USR_USERNAME'],'userFullname' => $aRow['USR_FIRSTNAME'] . ' ' . $aRow['USR_LASTNAME']
);
2010-12-02 23:34:41 +00:00
2012-10-09 12:40:24 -04:00
$oDataset->next();
$aRow = $oDataset->getRow();
}
}
return $derivation;
}
2010-12-02 23:34:41 +00:00
2012-10-09 12:40:24 -04:00
function getGrpUser ($aData)
{
$oTasks = new Tasks();
$oGroups = new Groups();
$oContent = new Content();
$aGroup = array ();
$aUsers = array ();
$aGroup = $oTasks->getGroupsOfTask( $aData['ROU_NEXT_TASK'], 1 );
$aGrpUid = $aGroup[0]['GRP_UID'];
$sGrpName = $oContent->load( 'GRP_TITLE', '', $aGrpUid, 'en' );
$aGrp['GRP_NAME'] = $sGrpName;
$aGrp['GRP_UID'] = $aGrpUid;
$aUsers = $oGroups->getUsersOfGroup( $aGroup[0]['GRP_UID'] );
foreach ($aUsers as $aKey => $userid) {
2010-12-02 23:34:41 +00:00
$aData[$aKey] = $userid;
2012-10-09 12:40:24 -04:00
}
return $aGrp;
}
function checkReplacedByUser ($user)
{
if (is_string( $user )) {
$userInstance = UsersPeer::retrieveByPK( $user );
} else {
$userInstance = $user;
}
if (! is_object( $userInstance )) {
throw new Exception( "The user with the UID '$user' doesn't exist." );
}
if ($userInstance->getUsrStatus() == 'ACTIVE') {
return $userInstance->getUsrUid();
} else {
$userReplace = trim( $userInstance->getUsrReplacedBy() );
if ($userReplace != '') {
return $this->checkReplacedByUser( UsersPeer::retrieveByPK( $userReplace ) );
} else {
return '';
}
}
}
/**
* @param $appFields
* @param $nextDel
* @param $iNewDelIndex
* @return bool
*/
private function sendNotificationsMobile($appFields, $nextDel, $iNewDelIndex)
{
try {
$notificationMobile = new \ProcessMaker\BusinessModel\Light\NotificationDevice();
if ($notificationMobile->checkMobileNotifications()) {
$notificationMobile->routeCaseNotificationDevice($appFields, $nextDel, $iNewDelIndex);
}
return true;
} catch (Exception $e) {
\G::log(G::loadTranslation('ID_NOTIFICATION_ERROR') . '|' . $e->getMessage(), PATH_DATA, "mobile.log");
}
}
/**
* @param $appFields
* @param $nextDel
* @param $iNewDelIndex
* @return bool
*/
public function notifyAssignedUser($appFields, $nextDel, $iNewDelIndex)
{
try {
if ($nextDel['TAS_RECEIVE_LAST_EMAIL'] == 'TRUE') {
$taskData = array();
$userLogged = $this->userLogged->load($appFields['APP_DATA']['USER_LOGGED']);
$fromName = $userLogged['USR_FIRSTNAME'] . ' ' . $userLogged['USR_LASTNAME'];
$sFromData = $fromName . ($userLogged['USR_EMAIL'] != '' ? ' <' . $userLogged['USR_EMAIL'] . '>' : '');
$dataEmail = $this->case->loadDataSendEmail($nextDel, $appFields['APP_DATA'], $sFromData, 'RECEIVE');
$dataEmail['applicationUid'] = $appFields['APP_UID'];
$dataEmail['delIndex'] = $iNewDelIndex;
array_push($taskData, $nextDel);
$this->case->sendMessage($dataEmail, $appFields['APP_DATA'], $taskData);
}
return true;
} catch (Exception $e) {
\G::log(G::loadTranslation('ID_NOTIFICATION_ERROR') . '|' . $e->getMessage());
}
}
2017-07-06 16:36:53 -04:00
2017-07-06 11:36:40 -04:00
/**
* @param array $currentDelegation
* @param array $nextDel
* @param array $appFields
* @param boolean $flagFirstIteration
* @param boolean $flagTaskAssignTypeIsMultipleInstance
* @param array $aContext
* @return void
*/
public function finishTask($currentDelegation, $nextDel, $appFields, $flagFirstIteration = true, $flagTaskAssignTypeIsMultipleInstance = false, $aContext = array()) {
$iAppThreadIndex = $appFields['DEL_THREAD'];
$this->case->closeAppThread($currentDelegation['APP_UID'], $iAppThreadIndex);
if (isset($nextDel["TAS_UID_DUMMY"])) {
$criteria = new Criteria("workflow");
$criteria->addSelectColumn(RoutePeer::TAS_UID);
$criteria->addJoin(RoutePeer::TAS_UID, AppDelegationPeer::TAS_UID);
$criteria->add(RoutePeer::PRO_UID, $appFields['PRO_UID']);
$criteria->add(RoutePeer::ROU_NEXT_TASK, isset($nextDel['ROU_PREVIOUS_TASK']) ? $nextDel['ROU_PREVIOUS_TASK'] : '');
$criteria->add(RoutePeer::ROU_TYPE, isset($nextDel['ROU_PREVIOUS_TYPE']) ? $nextDel['ROU_PREVIOUS_TYPE'] : '');
$criteria->add(AppDelegationPeer::DEL_THREAD_STATUS, 'OPEN');
$rsCriteria = RoutePeer::doSelectRS($criteria);
$rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC);
$executeEvent = ($rsCriteria->next()) ? false : true;
$multiInstanceCompleted = true;
if ($flagTaskAssignTypeIsMultipleInstance) {
$multiInstanceCompleted = $this->case->multiInstanceIsCompleted(
$appFields['APP_UID'],
$appFields['TAS_UID'],
$appFields['DEL_PREVIOUS']);
}
$taskDummy = TaskPeer::retrieveByPK($nextDel["TAS_UID_DUMMY"]);
if (preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $taskDummy->getTasType())
&& $multiInstanceCompleted && $executeEvent
) {
$this->executeEvent($nextDel["TAS_UID_DUMMY"], $appFields, $flagFirstIteration, true);
}
}
$aContext['action'] = 'finish-task';
//Logger
Bootstrap::registerMonolog('CaseDerivation', 200, 'Case Derivation', $aContext, $this->sysSys, 'processmaker.log');
}
2017-07-06 16:36:53 -04:00
/**
* Finish the process
* Close the threads and update the status to COMPLETED
* @param array $currentDelegation
* @param array $nextDel
* @param array $appFields
* @param boolean $flagFirstIteration
* @param array $aContext
* @return void
*/
public function finishProcess($currentDelegation, $nextDel, $appFields, $flagFirstIteration = true, $aContext = array()){
/*Close all delegations of $currentDelegation['APP_UID'] */
$this->case->closeAllDelegations( $currentDelegation['APP_UID'] );
$this->case->closeAllThreads( $currentDelegation['APP_UID'] );
//I think we need to change the APP_STATUS to completed,
if (!isset($nextDel['ROU_CONDITION'])) {
$nextDel['ROU_CONDITION'] = '';
}
//Execute the Intermediate Event After the End of Process
$this->executeEvent($nextDel["TAS_UID"], $appFields, true, true);
if (isset($nextDel["TAS_UID_DUMMY"]) ) {
$taskDummy = TaskPeer::retrieveByPK($nextDel["TAS_UID_DUMMY"]);
if (preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $taskDummy->getTasType())) {
//Throw Events
$this->executeEvent($nextDel["TAS_UID_DUMMY"], $appFields, $flagFirstIteration, true);
}
}
$aContext['action'] = 'end-process';
//Logger
Bootstrap::registerMonolog('CaseDerivation', 200, 'Case Derivation', $aContext, $this->sysSys, 'processmaker.log');
}
/**
* Get the next route information when is a subProcess
* This function changes the following important variables:
* $aSP (array) with the subProcess information
* $newNextDel (array) the next delegation related to the subProcess
* @param array $nextDel
* @param array $proUid
* @return array $newNextDel
*/
public function getNextInfoSubProcess($nextDel, $proUid)
{
$newNextDel = array();
$oCriteria = new Criteria('workflow');
$oCriteria->add(SubProcessPeer::PRO_PARENT, $proUid);
$oCriteria->add(SubProcessPeer::TAS_PARENT, $nextDel['TAS_PARENT']);
$oDataset = SubProcessPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$oDataset->next();
$aSP = $oDataset->getRow();
if (is_array($aSP)) {
$this->aSP = $aSP;
$oTask = new Task();
$aTaskNext = $oTask->load($nextDel['TAS_UID']);
//When is MULTIPLE_INSTANCE catch the first user
if($aTaskNext["TAS_ASSIGN_TYPE"] == "MULTIPLE_INSTANCE"){
$spUserUid = $this->getAllUsersFromAnyTask($nextDel["TAS_UID"]);
foreach($spUserUid as $row){
$firstUserUid = $row;
continue;
}
$this->aSP['USR_UID'] = $firstUserUid;
}else{
$this->aSP['USR_UID'] = $nextDel['USR_UID'];
}
$aTask = $oTask->load($nextDel['TAS_PARENT']);
$newNextDel = array (
'TAS_UID' => $aTask['TAS_UID'],
'USR_UID' => $this->aSP['USR_UID'],
'TAS_ASSIGN_TYPE' => $aTask['TAS_ASSIGN_TYPE'],
'TAS_DEF_PROC_CODE' => $aTask['TAS_DEF_PROC_CODE'],
'DEL_PRIORITY' => 3,
'TAS_PARENT' => '',
'ROU_PREVIOUS_TYPE' => isset($nextDel['ROU_PREVIOUS_TYPE']) ? $nextDel['ROU_PREVIOUS_TYPE'] : '',
'ROU_PREVIOUS_TASK' => isset($nextDel['ROU_PREVIOUS_TASK']) ? $nextDel['ROU_PREVIOUS_TASK'] : ''
);
}
return $newNextDel;
}
/**
* @deprecated
* Review if can route a case with the assign task STATIC_MI
* @param array $currentDelegation
* @return boolean $canRoute
*/
public function canRouteTasAssignStaticMi($currentDelegation){
$arrayOpenThread = $this->case->GetAllOpenDelegation($currentDelegation);
$aData = $this->case->loadCase( $currentDelegation['APP_UID'] );
if (isset( $aData['APP_DATA'][str_replace( '@@', '', $currentDelegation['TAS_MI_INSTANCE_VARIABLE'] )] )) {
$sMIinstanceVar = $aData['APP_DATA'][str_replace( '@@', '', $currentDelegation['TAS_MI_INSTANCE_VARIABLE'] )];
} else {
$sMIinstanceVar = $aData['APP_DATA']['TAS_MI_INSTANCE_VARIABLE'];
}
if (isset( $aData['APP_DATA'][str_replace( '@@', '', $currentDelegation['TAS_MI_COMPLETE_VARIABLE'] )] )) {
$sMIcompleteVar = $aData['APP_DATA'][str_replace( '@@', '', $currentDelegation['TAS_MI_COMPLETE_VARIABLE'] )];
} else {
$sMIcompleteVar = $aData['APP_DATA']['TAS_MI_COMPLETE_VARIABLE'];
}
$discriminateThread = $sMIinstanceVar - $sMIcompleteVar;
// -1 because One App Delegation is closed by above Code
if ($discriminateThread == count($arrayOpenThread)) {
$canRoute = true;
} else {
$canRoute = false;
}
return $canRoute;
}
/**
* Review if can route a case with Join we will check if review the siblings are open
* @param boolean $flagMultipleInstance
* @param boolean $flagTypeMultipleInstance
* @param array $currentDelegation
* @param array $appFields
* @param array $nextDel
* @return boolean $canRoute
*/
public function canRouteTypeSecJoin($flagMultipleInstance, $flagTypeMultipleInstance, $currentDelegation, $appFields, $nextDel)
{
$arrayOpenThread = ($flagMultipleInstance && $flagTypeMultipleInstance)? $this->case->searchOpenPreviousTasks($currentDelegation["TAS_UID"], $currentDelegation["APP_UID"]) : array();
if (
$flagMultipleInstance
&& $flagTypeMultipleInstance
&& isset($nextDel["ROU_PREVIOUS_TYPE"])
&& $nextDel["ROU_PREVIOUS_TYPE"] == 'SEC-JOIN'
) {
$appDelegation = new AppDelegation();
$arraySiblings = $appDelegation->getAllTasksBeforeSecJoin(
$nextDel["ROU_PREVIOUS_TASK"],
$currentDelegation["APP_UID"],
$appFields['DEL_PREVIOUS'],
'OPEN'
);
} else {
$arraySiblings = $this->case->getOpenSiblingThreads(
$nextDel["TAS_UID"],
$currentDelegation["APP_UID"],
$currentDelegation["DEL_INDEX"],
$currentDelegation["TAS_UID"]
);
}
$this->arraySiblings = $arraySiblings;
if(is_array($arrayOpenThread) && is_array($arraySiblings)){
$arrayOpenThread = array_merge($arrayOpenThread, $arraySiblings);
}
$canRoute = empty($arrayOpenThread);
if($canRoute){
if($flagMultipleInstance && $flagTypeMultipleInstance){
$this->flagControlMulInstance = true;
}else{
$this->flagControl = true;
}
}
return $canRoute;
}
/**
* Route a case with Multiple Instance
* This function changes the following important variables:
* flagUpdateList (boolean) if we will update the list tables
* removeList (boolean) if will be remove the row in the list tables
* iNewDelIndex (integer) new index created in the table appDelegation
* $arrayDerivationResult (array) information related to the new index created in the table appDelegation
* @param array $currentDelegation
* @param array $nextDel
* @param string $taskNextDel
* @param array $appFields
* @param array $aSP
* @param boolean $removeList
* @return array $arrayDerivationResult
* @throws \Exception
*/
public function routeMultipleInstance($currentDelegation, $nextDel, $taskNextDel, $appFields, $aSP, $removeList)
{
$arrayDerivationResult = [];
$arrayUser = $this->getNextAssignedUser(
array(
"APP_UID" => $currentDelegation["APP_UID"],
"NEXT_TASK" => $taskNextDel->toArray(BasePeer::TYPE_FIELDNAME)
)
);
if (empty($arrayUser)) {
throw new Exception(G::LoadTranslation("ID_NO_USERS"));
}
foreach ($arrayUser as $value2) {
$currentDelegationAux = array_merge($currentDelegation, array("ROU_TYPE" => "PARALLEL"));
$nextDelAux = array_merge($nextDel, array("USR_UID" => $value2["USR_UID"]));
$iNewDelIndex = $this->doDerivation($currentDelegationAux, $nextDelAux, $appFields, $aSP);
$this->updateList($currentDelegationAux, $nextDelAux, $taskNextDel, $appFields, $iNewDelIndex, $aSP, $removeList);
$this->iNewDelIndex = $iNewDelIndex;
$this->flagUpdateList = false;
$this->removeList= false;
$arrayDerivationResult[] = [
'DEL_INDEX' => $iNewDelIndex,
'TAS_UID' => $nextDelAux['TAS_UID'],
'USR_UID' => (isset($nextDelAux['USR_UID']))? $nextDelAux['USR_UID'] : ''
];
}
return $arrayDerivationResult;
}
/**
* When we route a case we will to create a record in the table APP_ASSIGN_SELF_SERVICE_VALUE if the task is SELF_SERVICE
* @param object $taskNextDel
* @param integer $iNewDelIndex
* @param string $nextTasUid
* @param array $appFields
* @return void
*/
public function createRecordAppSelfServiceValue($taskNextDel, $iNewDelIndex, $nextTasUid, $appFields)
{
if ($taskNextDel->getTasAssignType() == "SELF_SERVICE" && trim($taskNextDel->getTasGroupVariable()) != "") {
$nextTaskGroupVariable = trim($taskNextDel->getTasGroupVariable(), " @#");
if (isset($appFields["APP_DATA"][$nextTaskGroupVariable])) {
$dataVariable = $appFields["APP_DATA"][$nextTaskGroupVariable];
$dataVariable = (is_array($dataVariable))? $dataVariable : trim($dataVariable);
if (!empty($dataVariable)) {
$appAssignSelfServiceValue = new AppAssignSelfServiceValue();
$appAssignSelfServiceValue->create(
$appFields["APP_UID"],
$iNewDelIndex,
array(
"PRO_UID" => $appFields["PRO_UID"],
"TAS_UID" => $nextTasUid,
"GRP_UID" => ""
),
$dataVariable
);
}
}
}
}
/**
* When we route a case we will to get the information about the next task
* This function changes the following important variables:
* $arrayNextDerivation (array) information related to the new index created in the table appDelegation
* @param array $currentDelegation
* @param integer $iNewDelIndex
* @param array $nextDel
* @return array $arrayDerivationResult
* @throws \Exception
*/
public function routePrepareInformationNextTask($currentDelegation, $iNewDelIndex, $nextDel)
{
$nextDelegationsAux = array();
$taskNextDelNextDelRouType = "";
$i = 0;
//Get for $nextDel["TAS_UID"] your next Task
$currentDelegationAux = array_merge(
$currentDelegation,
array(
"DEL_INDEX" => $iNewDelIndex,
"TAS_UID" => $nextDel["TAS_UID"]
)
);
$arrayTaskNextDelNextDelegations = $this->prepareInformation(
array(
"USER_UID" => $_SESSION["USER_LOGGED"],
"APP_UID" => $currentDelegation["APP_UID"],
"DEL_INDEX" => $iNewDelIndex
)
);
foreach ($arrayTaskNextDelNextDelegations as $key => $value) {
$arrayTaskNextDelNextDel = $value;
switch ($arrayTaskNextDelNextDel['NEXT_TASK']['TAS_ASSIGN_TYPE']) {
case 'MANUAL':
$arrayTaskNextDelNextDel['NEXT_TASK']['USER_ASSIGNED']['USR_UID'] = '';
break;
case 'MULTIPLE_INSTANCE':
if (!isset($arrayTaskNextDelNextDel['NEXT_TASK']['USER_ASSIGNED']['0']['USR_UID'])) {
throw new Exception(G::LoadTranslation('ID_NO_USERS'));
}
$arrayTaskNextDelNextDel['NEXT_TASK']['USER_ASSIGNED']['USR_UID'] = '';
break;
case 'MULTIPLE_INSTANCE_VALUE_BASED':
$arrayTaskNextDelNextDel['NEXT_TASK']['USER_ASSIGNED']['USR_UID'] = '';
break;
default:
if (!isset($arrayTaskNextDelNextDel['NEXT_TASK']['USER_ASSIGNED']['USR_UID'])) {
throw new Exception(G::LoadTranslation('ID_NO_USERS'));
}
break;
}
$taskNextDelNextDelRouType = $arrayTaskNextDelNextDel["ROU_TYPE"];
$nextDelegationsAux[++$i] = array(
"TAS_UID" => $arrayTaskNextDelNextDel["NEXT_TASK"]["TAS_UID"],
"USR_UID" => $arrayTaskNextDelNextDel["NEXT_TASK"]["USER_ASSIGNED"]["USR_UID"],
"TAS_ASSIGN_TYPE" => $arrayTaskNextDelNextDel["NEXT_TASK"]["TAS_ASSIGN_TYPE"],
"TAS_DEF_PROC_CODE" => $arrayTaskNextDelNextDel["NEXT_TASK"]["TAS_DEF_PROC_CODE"],
"DEL_PRIORITY" => "",
"TAS_PARENT" => $arrayTaskNextDelNextDel["NEXT_TASK"]["TAS_PARENT"],
"ROU_PREVIOUS_TYPE" => isset($arrayTaskNextDelNextDel["NEXT_TASK"]["ROU_PREVIOUS_TYPE"]) ? $arrayTaskNextDelNextDel["NEXT_TASK"]["ROU_PREVIOUS_TYPE"] : '',
"ROU_PREVIOUS_TASK" => isset($arrayTaskNextDelNextDel["NEXT_TASK"]["ROU_PREVIOUS_TASK"]) ? $arrayTaskNextDelNextDel["NEXT_TASK"]["ROU_PREVIOUS_TASK"] : ''
);
}
$currentDelegationAux["ROU_TYPE"] = $taskNextDelNextDelRouType;
$arrayNextDerivation = array(
"currentDelegation" => $currentDelegationAux,
"nextDelegations" => $nextDelegationsAux
);
return $arrayNextDerivation;
}
/**
* When we route a case but we will not create a index/thread in the AppDelegation
* We will to execute Events
* We will to close thread when is a Gateway to Gateway
* @param array $appFields
* @param array $currentDelegation
* @param array $nextDel
* @param array $arraySiblings
* @param boolean $flagMultipleInstance
* @param boolean $flagTypeMultipleInstance
* @param boolean $flagFirstIteration
* @return void
*/
public function doRouteWithoutThread($appFields, $currentDelegation, $nextDel, $arraySiblings = array(), $flagMultipleInstance = false, $flagTypeMultipleInstance = false, $flagFirstIteration = false)
{
$iAppThreadIndex = $appFields['DEL_THREAD'];
$routeType = $currentDelegation["ROU_TYPE"];
$routeType = ($flagMultipleInstance && $flagTypeMultipleInstance)? "SEC-JOIN" : $routeType;
switch ($routeType) {
case 'SEC-JOIN':
//If the all Siblings are done execute the events
if (sizeof($arraySiblings) === 0 && !$flagTypeMultipleInstance) {
//Throw Events
$this->executeEvent($nextDel["TAS_UID"], $appFields, $flagFirstIteration, false);
}
//Close thread
$this->case->closeAppThread( $currentDelegation['APP_UID'], $iAppThreadIndex );
break;
default:
if ($nextDel['ROU_PREVIOUS_TYPE'] == 'SEC-JOIN') {
$criteria = new Criteria('workflow');
$criteria->clearSelectColumns();
$criteria->addSelectColumn(AppThreadPeer::APP_THREAD_PARENT);
$criteria->add(AppThreadPeer::APP_UID, $appFields['APP_UID']);
$criteria->add(AppThreadPeer::APP_THREAD_STATUS, 'OPEN');
$criteria->add(AppThreadPeer::APP_THREAD_INDEX, $iAppThreadIndex);
$rsCriteria = AppThreadPeer::doSelectRS($criteria);
$rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC);
if ($rsCriteria->next()) {
$this->case->closeAppThread($currentDelegation['APP_UID'], $iAppThreadIndex);
}
}
if ($currentDelegation['TAS_ASSIGN_TYPE'] == 'STATIC_MI' || $currentDelegation['TAS_ASSIGN_TYPE'] == 'CANCEL_MI') {
$this->case->closeAppThread( $currentDelegation['APP_UID'], $iAppThreadIndex );
}
break;
}
}
/**
* @deprecated
* We create a new index in the tables with the assign task STATIC_MI
* @param array $appFields
* @param array $currentDelegation
* @param array $nextDel
* @param integer $iAppThreadIndex
* @param string $delType
* @return integer $iNewDelIndex, the index created
*/
public function doDerivationStaticMi($appFields, $currentDelegation, $nextDel, $iAppThreadIndex, $delType = 'NORMAL')
{
$iNewAppThreadIndex = $appFields['DEL_THREAD'];
$this->case->closeAppThread( $currentDelegation['APP_UID'], $iAppThreadIndex );
foreach ($nextDel['NEXT_TASK']['USER_ASSIGNED'] as $key => $aValue) {
//Incrementing the Del_thread First so that new delegation has new del_thread
$iNewAppThreadIndex += 1;
//Creating new delegation according to users in group
$iMIDelIndex = $this->case->newAppDelegation(
$appFields['PRO_UID'],
$currentDelegation['APP_UID'],
$nextDel['TAS_UID'],
(isset( $aValue['USR_UID'] ) ? $aValue['USR_UID'] : ''),
$currentDelegation['DEL_INDEX'],
$nextDel['DEL_PRIORITY'],
$delType,
$iNewAppThreadIndex,
$nextDel,
$appFields['APP_NUMBER'],
$appFields['PRO_ID'],
$nextDel['TAS_ID']
);
$iNewThreadIndex = $this->case->newAppThread(
$currentDelegation['APP_UID'],
$iMIDelIndex,
$iAppThreadIndex
);
//Setting the del Index for Updating the AppThread delIndex
if ($key == 0) {
$iNewDelIndex = $iMIDelIndex - 1;
}
}
return $iNewDelIndex;
}
2017-07-12 16:38:29 -04:00
}