. * * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. * */ G::LoadClass('processes'); G::LoadClass('tasks'); G::LoadClass('derivation'); require_once 'classes/model/Users.php'; require_once 'classes/model/Configuration.php'; require_once 'classes/model/Gateway.php'; require_once 'classes/model/Event.php'; class Xpdl extends processes { /** * This function creates a new Process, defined in the object $oData * @param array $aData * @param array $tasks * @param string $pmFilename * @return void */ function createProcessFromDataXpdl ($oData,$tasks) { $this->removeProcessRows ($oData->process['PRO_UID'] ); $uid = $this->createProcessRow($oData->process); $this->createTaskRows($oData->tasks); $newTasks=$this->verifyTasks($uid,$tasks); $this->createRouteRowsXpdl($uid,$oData->routes,$newTasks); $this->createLaneRows($oData->lanes); $this->createDynaformRows($oData->dynaforms); $this->createInputRows($oData->inputs); $this->createOutputRows($oData->outputs); $this->createStepRows($oData->steps); $this->createStepSupervisorRows(isset($oData->stepSupervisor) ? $oData->stepSupervisor : array()); $this->createTriggerRows($oData->triggers); $this->createStepTriggerRows($oData->steptriggers); $this->createTaskUserRows($oData->taskusers); $this->createGroupRow($oData->groupwfs); $this->createDBConnectionsRows(isset($oData->dbconnections) ? $oData->dbconnections : array()); $this->createReportTables(isset($oData->reportTables) ? $oData->reportTables : array(), isset($oData->reportTablesVars) ? $oData->reportTablesVars : array()); $this->createSubProcessRowsXpdl($uid,isset($oData->subProcess) ? $oData->subProcess : array(),$newTasks); $this->createCaseTrackerRows(isset($oData->caseTracker) ? $oData->caseTracker : array()); $this->createCaseTrackerObjectRows(isset($oData->caseTrackerObject) ? $oData->caseTrackerObject: array()); $this->createObjectPermissionsRows(isset($oData->objectPermissions) ? $oData->objectPermissions : array()); $this->createStageRows(isset($oData->stage) ? $oData->stage : array()); $this->createFieldCondition(isset($oData->fieldCondition) ? $oData->fieldCondition : array(), $oData->dynaforms); $this->createEventRows(isset($oData->event) ? $oData->event : array()); $this->createCaseSchedulerRows(isset($oData->caseScheduler) ? $oData->caseScheduler : array()); } /** * this function creates a new Process, defined in the object $oData * @param string $sProUid * @return boolean */ function updateProcessFromDataXpdl ($oData, $tasks ) { if(is_array($oData->process)) $this->updateProcessRow ($oData->process ); $this->removeProcessRows ($oData->process['PRO_UID'] ); $uid = $this->createProcessRow($oData->process); $this->createTaskRows($oData->tasks); $newTasks=$this->verifyTasks($uid,$tasks); $this->createRouteRowsXpdl($uid,$oData->routes,$newTasks); $this->createLaneRows ($oData->lanes ); $this->createDynaformRows ($oData->dynaforms ); $this->createInputRows ($oData->inputs ); $this->createOutputRows ($oData->outputs ); $this->createStepRows ($oData->steps ); $this->createStepSupervisorRows($oData->stepSupervisor); $this->createTriggerRows ($oData->triggers); $this->createStepTriggerRows ($oData->steptriggers); $this->createTaskUserRows ($oData->taskusers); $this->createGroupRow ($oData->groupwfs ); $this->createDBConnectionsRows($oData->dbconnections); $this->updateReportTables($oData->reportTables, $oData->reportTablesVars); $this->createSubProcessRows( $oData->subProcess ); $this->createCaseTrackerRows( $oData->caseTracker); $this->createCaseTrackerObjectRows( $oData->caseTrackerObject); $this->createObjectPermissionsRows( $oData->objectPermissions); $this->createStageRows( $oData->stage); $this->createFieldCondition($oData->fieldCondition, $oData->dynaforms); $this->createEventRows( $oData->event); $this->createCaseSchedulerRows( $oData->caseScheduler ); } /** * this function creates a new Process, defined in the object $oData * @param string $sProUid * @return boolean */ function createProcessFromDataPmxml ($oData ) { $this->removeProcessRows ($oData->process['PRO_UID'] ); $this->createProcessRow($oData->process); $this->createDynaformRows($oData->dynaforms); } /** * This function update the dynaforms * @param string $sProUid * @param array $fields * @return boolean */ // function updateDynaformsPmxml($uid,$fields) // { // $oData->dynaforms = $this->getDynaformRows ( $uid); // $count = sizeof($oData->dynaforms); // foreach ($fields as $val => $id){ // $oData->dynaforms[$count]= $id; // $count = $count + 1 ; // } // $this->createDynaformRows ($oData->dynaforms ); // } /** * This function create the subProcess from data * @param array $oData * @param array $tasks * @return void */ function createSubProcessFromDataXpdl ($oData,$tasks) { $this->removeProcessRows ($oData->process['PRO_UID'] ); $uid = $this->createProcessRow($oData->process); $this->createTaskRows($oData->tasks); $newTasks = $this->verifyTasks($uid,$tasks); $this->createRouteRowsXpdl($uid,$oData->routes,$newTasks); $this->createLaneRows($oData->lanes); $this->createDynaformRows($oData->dynaforms); $this->createInputRows($oData->inputs); $this->createOutputRows($oData->outputs); $this->createStepRows($oData->steps); $this->createStepSupervisorRows(isset($oData->stepSupervisor) ? $oData->stepSupervisor : array()); $this->createTriggerRows($oData->triggers); $this->createStepTriggerRows($oData->steptriggers); $this->createTaskUserRows($oData->taskusers); $this->createGroupRow($oData->groupwfs); $this->createDBConnectionsRows(isset($oData->dbconnections) ? $oData->dbconnections : array()); $this->createReportTables(isset($oData->reportTables) ? $oData->reportTables : array(), isset($oData->reportTablesVars) ? $oData->reportTablesVars : array()); $this->createSubProcessRowsXpdl($uid,isset($oData->subProcess) ? $oData->subProcess : array(),$newTasks); $this->createCaseTrackerRows(isset($oData->caseTracker) ? $oData->caseTracker : array()); $this->createCaseTrackerObjectRows(isset($oData->caseTrackerObject) ? $oData->caseTrackerObject: array()); $this->createObjectPermissionsRows(isset($oData->objectPermissions) ? $oData->objectPermissions : array()); $this->createStageRows(isset($oData->stage) ? $oData->stage : array()); $this->createFieldCondition(isset($oData->fieldCondition) ? $oData->fieldCondition : array(), $oData->dynaforms); $this->createEventRows(isset($oData->event) ? $oData->event : array()); $this->createCaseSchedulerRows(isset($oData->caseScheduler) ? $oData->caseScheduler : array()); } /** * This function verify the tasks of a process that was created with the tasks they were sent to the process * @param string $oProUid * @param array $fieldsTasks * @return array */ function verifyTasks($sProUid,$fieldsTasks) { $process = new Process( ); $oData->tasks = $this->getTaskRows($sProUid); $findTask= 0; $findNext= 0; foreach ($fieldsTasks as $taskVal => $idVal){ foreach ($oData->tasks as $task => $id ){ if($idVal['TAS_TITLE'] == $id['TAS_TITLE'] and $idVal['TAS_POSX'] == $id['TAS_POSX'] and $idVal['TAS_POSY'] == $id['TAS_POSY']){ if(isset($idVal['TAS_DESCRIPTION']) and isset($id['TAS_DESCRIPTION'])){ if($idVal['TAS_DESCRIPTION'] == $id['TAS_DESCRIPTION']){ $fieldsTasks[$taskVal]['TAS_UID_DATA'] = $id['TAS_UID']; } } $fieldsTasks[$taskVal]['TAS_UID_DATA'] = $id['TAS_UID']; } } } return $fieldsTasks; } /** * This function creates the rows of the process * @param string $sProUid * @param array $routes * @param array $fieldsTasks * @return void */ function createRouteRowsXpdl($sProUid,$routes,$fieldsTasks) { $process = new Process( ); $oData->tasks = $this->getTaskRows($sProUid); foreach ($routes as $taskRoute => $idRoute){ $findTask = 0; $findNext = 0; foreach ($oData->tasks as $task => $id ){ if($idRoute['TAS_UID'] == $id['TAS_UID']){ $findTask = 1; } if($idRoute['ROU_NEXT_TASK']!='-1'){ if($idRoute['ROU_NEXT_TASK'] == $id['TAS_UID']){ $findNext= 1; } } else{ $findNext= 1; } } if($findTask==0){ $id = $this->findIdTask($idRoute['TAS_UID'],$fieldsTasks); $routes[$taskRoute]['TAS_UID']=$id; } if($findNext==0){ $id = $this->findIdTask($idRoute['ROU_NEXT_TASK'],$fieldsTasks); $routes[$taskRoute]['ROU_NEXT_TASK']=$id; } } $this->createRouteRows($routes); } /** * Create Sub Process rows from an array, removing those subprocesses with * the same UID. * @param $SubProcess array * @return void. */ function createSubProcessRowsXpdl ($sProUid,$SubProcess,$tasks ) { $process = new Process(); $oData->tasks = $this->getTaskRows($sProUid); foreach ( $SubProcess as $key => $row ) { $findTask = 0; foreach ($oData->tasks as $task => $id ){ if($row['TAS_PARENT'] == $id['TAS_UID']){ $findTask = 1; } } if($findTask==0){ $id = $this->findIdTask($row['TAS_PARENT'],$tasks ); $SubProcess[$key]['TAS_PARENT']=$id; } $oSubProcess = new SubProcess(); if($oSubProcess->subProcessExists ($row['SP_UID'])){ $oSubProcess->remove($row['SP_UID']); } $res = $oSubProcess->create($row); } return; } /** * this function find the id of the task * @param string $idTask * @param array $routes * @return array */ function findIdTask($idTask,$routes) { foreach ($routes as $value => $id ){ if($id['TAS_UID'] == $idTask){ return $id['TAS_UID_DATA']; } } } /** * This function create the file .xpdl from a process * @param string $sProUid * @return void */ function xmdlProcess ( $sProUid = '') { $oProcess = new Process(); $oData->process = $this->getProcessRow( $sProUid, true ); $oData->tasks = $this->getTaskRows( $sProUid ); $oData->routes = $this->getRouteRows( $sProUid ); $oData->lanes = $this->getLaneRows( $sProUid ); $oData->inputs = $this->getInputRows( $sProUid ); $oData->outputs = $this->getOutputRows( $sProUid ); $oData->dynaforms = $this->getDynaformRows ( $sProUid ); $oData->steps = $this->getStepRows( $sProUid ); $oData->triggers = $this->getTriggerRows( $sProUid ); $oData->taskusers = $this->getTaskUserRows( $oData->tasks ); $oData->groupwfs = $this->getGroupwfRows( $oData->taskusers ); $oData->steptriggers = $this->getStepTriggerRows( $oData->tasks ); $oData->dbconnections = $this->getDBConnectionsRows($sProUid); $oData->reportTables = $this->getReportTablesRows($sProUid); $oData->reportTablesVars = $this->getReportTablesVarsRows($sProUid); $oData->stepSupervisor = $this->getStepSupervisorRows($sProUid); $oData->objectPermissions = $this->getObjectPermissionRows ($sProUid); $oData->subProcess = $this->getSubProcessRow ($sProUid); $oData->caseTracker = $this->getCaseTrackerRow ($sProUid); $oData->caseTrackerObject = $this->getCaseTrackerObjectRow ($sProUid); $oData->stage = $this->getStageRow ($sProUid); $oData->fieldCondition = $this->getFieldCondition($sProUid); $oData->event = $this->getEventRow ($sProUid); $oData->caseScheduler = $this->getCaseSchedulerRow ($sProUid); $path = PATH_DOCUMENT . 'output' . PATH_SEP; if ( !is_dir($path) ) { G::verifyPath($path, true); } $proTitle = (substr(G::inflect($oData->process['PRO_TITLE']), 0, 30)); $proTitle = ereg_replace("[^A-Za-z0-9_]", "", $proTitle); $index = ''; $lastIndex = ''; do { $filename = $path . $proTitle . $index . '.xpdl'; $lastIndex = $index; if ( $index == '' ) $index = 1; else $index ++; } while ( file_exists ( $filename ) ); $proTitle .= $lastIndex; $filenameOnly = $proTitle . '.xpdl'; $xml = fopen( $filename.'tpm', "wb"); $process = $oData->process; $coordinateMaximumY = 0; $coordinateMaximumX = 0; $lanes = $oData->lanes; foreach ($lanes as $keyLane => $valLane ) { if($valLane['SWI_TYPE']=="TEXT"){ $textLane = $valLane['SWI_TEXT']; $longText = strlen($textLane); $height = 0; $width = 0; if($longText < 40){ $height = 20; $width = ($longText*10)+ 10; } if($longText > 40){ $numberRows = $longText/40; $height = $numberRows * 20; $width = 250; } $coordinateX = $valLane['SWI_X'] + $width; $coordinateY = $valLane['SWI_Y'] + $height ; if($coordinateX > $coordinateMaximumX){ $coordinateMaximumX = $coordinateX; } if($coordinateY > $coordinateMaximumY){ $coordinateMaximumY = $coordinateY; } } } foreach ($oData->tasks as $keyLane => $val ) { $coordinateX = $val['TAS_POSX']+ 160; $coordinateY = $val['TAS_POSY']+ 38; if($coordinateX > $coordinateMaximumX){ $coordinateMaximumX = $coordinateX; } if($coordinateY > $coordinateMaximumY){ $coordinateMaximumY = $coordinateY; } } $data = $this->createPool($process,$coordinateMaximumX + 60,$coordinateMaximumY +60); fwrite ($xml, ''); fwrite ($xml, $data); $artifacts = ''; $artifacts .= $this->createArtifacts($lanes,'0'); $dataProcess =' '; $dataProcess.= ' '; $activitySets = ''; $subProcess = $oData->subProcess; $subProcesses = $this-> createSubProcessesXpdl($subProcess,$oData->tasks); $activitySets.= $subProcesses['ACTIVITIES']; $activitySets.= ''; $artifacts .= $subProcesses['ARTIFACTS']; $artifacts .=' '; fwrite ($xml,$artifacts); fwrite ($xml,$dataProcess); fwrite ($xml,$activitySets); // Here are generated activities of a file. XPDL // for this use the process tasks $tasks = $oData->tasks; $events = $oData->event; $scheduler = $oData->caseScheduler; $dataTasks = $this-> createActivitiesXpdl($tasks,$events,$scheduler); fwrite ($xml,$dataTasks['ACTIVITIES']); $taskHidden = $dataTasks['TASK_HIDDEN']; $routes = $oData->routes; $dataRoutes = $this-> createTransitionsXpdl($routes,$tasks,$taskHidden); fwrite ($xml,$dataRoutes['ACTIVITIES']); $data = ' '; fwrite ($xml, $data); fwrite ($xml, $dataTasks['TRANSITION']); fwrite ($xml, $dataRoutes['TRANSITION']); $data = ' '; fwrite ($xml, $data); fclose ($xml); $filenameLink = 'processes_DownloadFileXpdl?p=' . $proTitle . '&r=' . rand(100,1000); $result['FILENAMEXPDL'] = $proTitle.'.xpdl'; $result['FILENAME_LINKXPDL']= $filenameLink; return $result; } /** * This function create the pool from the process * @param array $process * @param string $coordinateMaximumX * @param string $coordinateMaximumY * @return string */ function createPool ($process,$coordinateMaximumX,$coordinateMaximumY) { $data = ''; $data .= ' 2.1 Process Maker '.$process['PRO_CREATE_DATE'].' '.$process['PRO_DESCRIPTION'].' CO '; return $data; } /** * This function generated the Artifacts of a file. XPDL * @param array $lanes * @param string $id * @return string */ function createArtifacts($lanes,$id) { $artifacts = ''; $idTask = ''; foreach ($lanes as $keyLane => $valLane ) { if($valLane['SWI_TYPE']=="TEXT"){ $idLane = $valLane['SWI_UID']; $textLane = $valLane['SWI_TEXT']; $coordinateX = $valLane['SWI_X']; $coordinateY = $valLane['SWI_Y']; $longText = strlen($textLane); if($longText < 40){ $height = 20; $width = ($longText*10)+ 10; } if($longText > 40){ $numberRows = $longText/40; $height = $numberRows * 20; $width = 250; } if($id != 0){ $idTask = ' ActivitySetId="'.$id.'"'; } $artifacts .=' '; } } return $artifacts; } /** * This function creates SubProcesses * @param array $tasks * @param array $subProcess * @return array */ function createSubProcessesXpdl($subProcess,$tasks) { $activitySets = ''; $dataCreated = ''; $artifacts = ''; foreach ($subProcess as $key => $row) { if($row['SP_UID'] != ''){ $idTask = $row['TAS_PARENT']; foreach ($tasks as $id => $value) { if($value['TAS_UID'] == $idTask){ $nameTask = htmlentities($value['TAS_TITLE']); } } $activitySets.=' '; if($row['PRO_UID'] != ''){ $dataSubProcess= $this->serializeProcess($row['PRO_UID']); $data = unserialize ($dataSubProcess); $tasks = $data->tasks; $subProcessData= $data->subProcess; $subProcessTask= $data->tasks; $lanes = $data->lanes; $events = $data->event; $scheduler = $data->caseScheduler; $artifacts = $this->createArtifacts($lanes,$idTask); $dataCreated = $this->createSubProcessesXpdl($subProcessData,$subProcessTask); $dataTasks = $this->createActivitiesXpdl($tasks,$events,$scheduler); $activitySets .=$dataTasks['ACTIVITIES']; $taskHidden = $dataTasks['TASK_HIDDEN']; $routes = $data->routes; $dataRoutes = $this->createTransitionsXpdl($routes,$tasks,$taskHidden); $activitySets .=$dataRoutes['ACTIVITIES']; $activitySets .= ' '; $activitySets .=$dataTasks['TRANSITION']; $activitySets .=$dataRoutes['TRANSITION']; $activitySets .= ' '; } else{ $data =' '; } $activitySets.=''; $activitySets.=$dataCreated; } } $fields['ACTIVITIES']= $activitySets; $fields['ARTIFACTS'] = $artifacts; return $fields; } /** * This function creates activities from the tasks * @param array $tasks * @return array */ function createActivitiesXpdl($tasks,$events,$scheduler) { $dataTasks = ' '; $transitions =' '; $start = 0; $implementation = ''; $taskHidden = array(); $description = ''; foreach ($tasks as $key => $val ) { $idTask = $val['TAS_UID']; $nameTask = $val['TAS_TITLE']; $coordinateX = $val['TAS_POSX']; $coordinateY = $val['TAS_POSY']; if($val['TAS_TYPE']== 'NORMAL' or $val['TAS_TYPE']== 'SUBPROCESS'){ if($val['TAS_TYPE']== 'NORMAL'){ $implementation = ' '; } if($val['TAS_TYPE']== 'SUBPROCESS'){ $implementation = ' '; } if(isset($val['TAS_DESCRIPTION'])){ $description = $val['TAS_DESCRIPTION']; } else{ $description = ''; } $fillColor = $val['TAS_COLOR']; if($val['TAS_START']=="TRUE"){ $start = 1; } if($start==1){ $start=0; $positionX=$coordinateX+65; $positionY=$coordinateY-45; $dataTasks .=' '.$description.' '; $transitions.=' '; } $dataTasks .=' '.$description.'' .$implementation.' '; } else{ if($val['TAS_TYPE']== 'HIDDEN'){ $taskHidden[] = $tasks[$key]; } } } $aux = $events; foreach ($events as $key => $row) { $aux[$key]= $row['TAS_UID']; } if(sizeof($events)> 0){ array_multisort($aux,SORT_ASC,$events); unset($aux); } $findTask = 0; $idTasks = array(); $arrayTasks = array(); $port = 5; foreach($events as $key => $val){ if($val['EVN_ACTION'] == 'SEND_MESSAGE' and $val['EVN_RELATED_TO'] == 'SINGLE'){ $idEvent = $val['EVN_UID']; $idTask = $val['TAS_UID']; foreach($tasks as $id => $value){ if($value['TAS_UID'] == $idTask){ $coordinateX = $value['TAS_POSX'] + 19; $coordinateY = $value['TAS_POSY'] + 38; $coordinateXM = $coordinateX + 96; $coordinateYM = $coordinateY + 65; } } foreach($arrayTasks as $id => $value){ if($idTask == $value['ID']){ $coordinateX = $value['X'] + 30; $coordinateY = $value['Y']; $coordinateXM = $value['XM']+ 30; $coordinateYM = $value['YM']; if($coordinateY < 30){ $coordinateX = $value['FIRSTX'] + 30; $coordinateY = $value['FIRSTY']; } $arrayTasks[$id]['X'] = $coordinateX; $arrayTasks[$id]['Y'] = $coordinateY; $arrayTasks[$id]['PORT'] = $port + 1; $findTask = 1; $port = $arrayTasks[$id]['PORT']; } } $description = $val['EVN_DESCRIPTION']; $arrayTo = $val['EVN_ACTION_PARAMETERS']; foreach($arrayTo as $idTo => $valueTo){ $to = $valueTo; } $to = explode('|',$to); $to = $to[0]; $oConfiguration = new Configuration(); $emailArray = $oConfiguration->load('Emails','','','',''); $arrayFrom = unserialize($emailArray['CFG_VALUE']); $from = $arrayFrom['MESS_ACCOUNT']; if($to == 'ext'){ $oUser = new Users(); $aUser = $oUser->load($_SESSION['USER_LOGGED']); $to = $aUser['USR_USERNAME']; } $dataTasks .=' TimeCycle false '.$description.' '.$description.' false '; $transitions.=' '; if($findTask == 0){ $idTasks['ID'] = $idTask; $idTasks['X'] = $coordinateX; $idTasks['Y'] = $coordinateY; $idTasks['FIRSTX'] = $coordinateX; $idTasks['FIRSTY'] = $coordinateY; $idTasks['XM'] = $coordinateXM; $idTasks['YM'] = $coordinateYM; $idTasks['PORT'] = $port; $arrayTasks[] = $idTasks; } } } $idTasks = array(); $arrayTasks = array(); $findTask = 0; foreach($scheduler as $key => $val){ if($val['SCH_OPTION'] == 4){ $idSch = $val['SCH_UID']; $name = $val['SCH_NAME']; $idTask = $val['TAS_UID']; foreach($tasks as $id => $value){ if($value['TAS_UID'] == $idTask){ $coordinateX = $value['TAS_POSX'] - 60; $coordinateY = $value['TAS_POSY'] + 5; } } foreach($arrayTasks as $id => $value){ if($idTask == $value['ID']){ $coordinateX = $value['X']; $coordinateY = $value['Y'] - 40; if($coordinateY < 30){ $coordinateX = $value['FIRSTX'] + 50; $coordinateY = $value['FIRSTY'] - 90; } $arrayTasks[$id]['X'] = $coordinateX; $arrayTasks[$id]['Y'] = $coordinateY; $findTask = 1; } } $time = $val['SCH_TIME_NEXT_RUN']; $time = explode(' ',$time); $time = $time[0]; $time = str_replace('-','/',$time); $dataTasks .=' TimeCycle false '; $transitions.=' '; if($findTask == 0){ $idTasks['ID'] = $idTask; $idTasks['X'] = $coordinateX; $idTasks['Y'] = $coordinateY; $idTasks['FIRSTX'] = $coordinateX; $idTasks['FIRSTY'] = $coordinateY; $arrayTasks[] = $idTasks; } } if($val['SCH_OPTION'] == 1){ $idSch = $val['SCH_UID']; $name = $val['SCH_NAME']; $idTask = $val['TAS_UID']; foreach($tasks as $id => $value){ if($value['TAS_UID'] == $idTask){ $coordinateX = $value['TAS_POSX'] - 60; $coordinateY = $value['TAS_POSY'] + 5; } } foreach($arrayTasks as $id => $value){ if($idTask == $value['ID']){ $coordinateX = $value['X']; $coordinateY = $value['Y'] - 40; if($coordinateY < 30){ $coordinateX = $value['FIRSTX'] + 50; $coordinateY = $value['FIRSTY'] - 90; } $arrayTasks[$id]['X'] = $coordinateX; $arrayTasks[$id]['Y'] = $coordinateY; $findTask = 1; } } $dataTasks .=' TimeCycle false '; $transitions.=' '; if($findTask == 0){ $idTasks['ID'] = $idTask; $idTasks['X'] = $coordinateX; $idTasks['Y'] = $coordinateY; $idTasks['FIRSTX'] = $coordinateX; $idTasks['FIRSTY'] = $coordinateY; $arrayTasks[] = $idTasks; } } } $data = array(); $data['ACTIVITIES'] = $dataTasks; $data['TRANSITION'] = $transitions; $data['TASK_HIDDEN']= $taskHidden; return $data; } /** * This function creates transitions * @param array $routes * @param array $tasks * @return array */ function createTransitionsXpdl($routes,$tasks,$taskHidden) { $cont = 0; $dataRoutes = ''; $endEvent = 1; $taskParallel = ''; $routeParallel = ''; $taskSecJoin = ''; $routeSecJoin = ''; $taskEvaluate = ''; $routeEvaluate = ''; $taskParallelEv = ''; $routeParallelEv = ''; $taskSelect = ''; $routeSelect = ''; $routeEnd = ''; $arraySecJoin = array(); $position = 0; $fillColor = ''; $transitions = ''; $condition = ''; $nextTask = ''; $findFrom = 0; $findTo = 0; $routesTasks = $routes; foreach ($routes as $key => $row) { if($row['ROU_TYPE'] == 'SEC-JOIN'){ $arraySecJoin[$position] = array(); $arraySecJoin[$position] = $row; $position = $position + 1; unset($routes[$key]); } } $aux = $arraySecJoin ; foreach ($arraySecJoin as $key => $row) { $aux[$key]= $row['ROU_NEXT_TASK']; } if(sizeof($arraySecJoin)> 0){ array_multisort($aux,SORT_ASC,$arraySecJoin); unset($aux); } foreach ($routes as $key => $row) { $uid[$key] = $row['TAS_UID']; $case[$key] = $row['ROU_CASE']; } if(sizeof($routes)> 0){ array_multisort($uid, SORT_ASC, $case, SORT_ASC, $routes); } $routes = array_merge($routes,$arraySecJoin); $routesTasks = $routes; foreach ($routes as $key => $val ) { $end = 0; $idRoute = $val['ROU_UID']; $idTask = $val['TAS_UID']; $nextTask = $val['ROU_NEXT_TASK']; $condition = htmlentities($val['ROU_CONDITION']); if($nextTask == "-1"){ $end = 1; } $typeRoute = $val['ROU_TYPE']; $route = ''; if ($typeRoute != "SEQUENTIAL" ){ switch($typeRoute){ case 'PARALLEL': $coordinateX = 0; $coordinateY = 0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } foreach ($taskHidden as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX = $idVal['TAS_POSX']; $coordinateY = $idVal['TAS_POSY']; $idRoute = $idTask; } } $positionX = $coordinateX + 60; $positionY = $coordinateY + 40; if($idTask != $taskParallel){ $taskParallel = $idTask; $routeParallel = $idRoute; $dataRoutes .=' false '; if($taskParallel != $routeParallel ){ $transitions.=' '; } $transitions.=' '; } else{ $transitions.=' '; } break; case 'SEC-JOIN': $coordinateX = 0; $coordinateY = 0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$nextTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } foreach ($taskHidden as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX = $idVal['TAS_POSX']; $coordinateY = $idVal['TAS_POSY']; $idRoute = $idTask; } } $positionX = $coordinateX + 60; $positionY = $coordinateY - 45; if($nextTask != $taskSecJoin){ $taskSecJoin = $nextTask; $routeSecJoin = $idRoute; $dataRoutes .=' false '; if($routeSecJoin != $taskSecJoin ){ $transitions.=' '; } $transitions.=' '; } else{ $transitions.=' '; } break; case 'EVALUATE': $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } foreach ($taskHidden as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX = $idVal['TAS_POSX']; $coordinateY = $idVal['TAS_POSY']; $idRoute = $idTask; } } $positionX=$coordinateX+60; $positionY=$coordinateY+40; if($idTask != $taskEvaluate){ $taskEvaluate = $idTask; $routeEvaluate = $idRoute; if($nextTask != "-1"){ $dataRoutes .=' false '; if($taskEvaluate != $routeEvaluate ){ $transitions.=' '; } $transitions.=' '.$condition.' '; } } else{ if($nextTask !="-1"){ $transitions.=' '.$condition.' '; } else{ $routeEnd = $routeEvaluate; } } break; case 'PARALLEL-BY-EVALUATION': $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } foreach ($taskHidden as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX = $idVal['TAS_POSX']; $coordinateY = $idVal['TAS_POSY']; $idRoute = $idTask; } } $positionX=$coordinateX+60; $positionY=$coordinateY+40; if($idTask != $taskParallelEv){ $taskParallelEv = $idTask; $routeParallelEv = $idRoute; $dataRoutes .=' false '; if($taskParallelEv != $routeParallelEv ){ $transitions.=' '; } $transitions.=' '.$condition.' '; } else{ $transitions.=' '.$condition.' '; } break; case 'SELECT': $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } foreach ($taskHidden as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX = $idVal['TAS_POSX']; $coordinateY = $idVal['TAS_POSY']; $idRoute = $idTask; } } $positionX=$coordinateX+60; $positionY=$coordinateY+40; if($idTask != $taskSelect){ $taskSelect = $idTask; $routeSelect = $idRoute; $dataRoutes .=' false '; if($taskSelect != $routeSelect ){ $transitions.=' '; } $transitions.=' '.$condition.' '; } else{ if($nextTask !="-1"){ $transitions.=' '.$condition.' '; } else{ $routeEnd = $routeSelect; } } break; case 'DISCRIMINATOR': $coordinateX = 0; $coordinateY = 0; $optional = $val['ROU_OPTIONAL']; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$nextTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } foreach ($taskHidden as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX = $idVal['TAS_POSX']; $coordinateY = $idVal['TAS_POSY']; $idRoute = $idTask; } } $positionX=$coordinateX+60; $positionY=$coordinateY-45; if($nextTask != $taskSecJoin){ $taskDiscriminator = $nextTask; $routeDiscriminator = $idRoute; $dataRoutes .=' false '; if($routeDiscriminator != $taskDiscriminator ){ $transitions.=' '; } $transitions.=' '; } else{ $transitions.=' '; } break; } } if($end==1){ if($typeRoute == "SEQUENTIAL"){ $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } $positionX=$coordinateX+65; $positionY=$coordinateY+40; $transitions.=' '; } else{ $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } $positionX = $coordinateX + 120; $positionY = $coordinateY + 40; $idTask = $routeEnd; $transitions.=' '; } $dataRoutes .=' false '; $end = 0; $endEvent = 0; } else{ if ($typeRoute == "SEQUENTIAL"){ $transitions.=' '; } foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']+190; $coordinateY=$idVal['TAS_POSY']+5; if(isset($idVal['TAS_DEF_MESSAGE'])){ if($idVal['TAS_DEF_MESSAGE'] != '' and $idVal['TAS_DEF_MESSAGE'] != Null){ $idEvent = G::generateUniqueID(); $example = new Derivation(); $fieldUserTo = $example->getAllUsersFromAnyTask($nextTask); $fieldUserTo = $example->getUsersFullNameFromArray($fieldUserTo); $fieldUserFrom = $example->getAllUsersFromAnyTask($idTask); $fieldUserFrom = $example->getUsersFullNameFromArray($fieldUserFrom); /*$oUser = new Users(); $aUser = $oUser->load($_SESSION['USER_LOGGED']); $from = $aUser['USR_USERNAME'];*/ $description = ''; $userFrom = ''; $userTo = ''; if(isset($fieldUserFrom[0]['USR_USERNAME'])){ $userFrom = $fieldUserFrom[0]['USR_USERNAME']; } if(isset($fieldUserTo[0]['USR_USERNAME'])){ $userTo = $fieldUserTo[0]['USR_USERNAME']; } $dataRoutes .=' '.$description.' '.$description.' false '; $transitions.=' '; } } } } } } $data = array(); $data['ACTIVITIES'] = $dataRoutes; $data['TRANSITION'] = $transitions; return $data; } /** * Get the process Data from a filename .XPDL * @param array $pmFilename * @return void */ function getProcessDataXpdl ( $pmFilename ) { if (! file_exists($pmFilename) ) throw ( new Exception ( 'Unable to read uploaded file, please check permissions. ')); if (! filesize($pmFilename) >= 9 ) throw ( new Exception ( 'Uploaded file is corrupted, please check the file before continue. ')); clearstatcache(); $idProcess = 0; $nameProcess = ''; $sw = 0; $file = new DOMDocument(); $file->load($pmFilename); $root = $file->documentElement; $node = $root->firstChild; $numberTasks = 0; $numberLanes = 0; $endArray = array(); $posEnd = 0; $startArray = array(); $posStart = 0; $isEnd = 0; $isStart = 0; $posRoutes = 0; $sequencial = 0; $posT = 0; $output = ''; $arrayRoutes = array(); $arrayLanes = array(); $routeTransitions = array (); $start = 0; $end = 0; $arrayScheduler = array(); $arrayMessages = array(); while ($node) { if ($node->nodeType == XML_ELEMENT_NODE) { $name = $node->nodeName; $content = $node->firstChild; if($content != array()){ $output = $content->nodeValue; } if(strpos($name,'Pools')!== false){ while ($content) { if ($content->nodeType == XML_ELEMENT_NODE) { $nameChild = $content->nodeName; $contentChild = $content->firstChild; if(strpos($nameChild,'Pool')!== false){ $namePool = $content->getAttribute('Name'); $idPool = str_replace('-','',$content->getAttribute('Process')); $process['ID'] = $idPool; $process['NAME']= $namePool; $process['DESCRIPTION'] = ''; $oData->process = $this->createProcess($process); } } $content = $content->nextSibling; } } if(strpos($name,'Artifacts')!== false){ while ($content) { if ($content->nodeType == XML_ELEMENT_NODE) { $nameChild = $content->nodeName; $contentChild = $content->firstChild; $idActivity = ''; if(strpos($nameChild,'Artifact')!== false){ $artifactType = $content->getAttribute('ArtifactType'); if($artifactType == 'Annotation'){ $textAnnotation = $content->getAttribute('TextAnnotation'); $idAnnotation = str_replace('-','',$content->getAttribute('Id')); $idActivity = str_replace('-','',$content->getAttribute('ActivitySetId')); $lanes = $this->findCoordinates($contentChild); $lanes['TEXT'] = $textAnnotation; $lanes['ID_PROCESS'] = $idPool; $lanes['ID_LANE'] = $idAnnotation; if($idActivity != ''){ $lanes['ID_PROCESS'] = $idActivity; } $arrayLanes[$numberLanes] = $this->createLanes($lanes); $numberLanes = $numberLanes +1; } } } $content = $content->nextSibling; } } if(strpos($name,'WorkflowProcesses')!== false){ while ($content) { if ($content->nodeType == XML_ELEMENT_NODE) { $nameChild = $content->nodeName; $contentChild = $content->firstChild; if(strpos($nameChild,'WorkflowProcess')!== false){ $nameWorkflow = $content->getAttribute('Name'); $idProcess = $content->getAttribute('Id'); $idProcess = trim(str_replace('-','',$idProcess)); $subProcesses = array(); if($nameWorkflow == $namePool and $idProcess == $idPool){ $idWorkflow = $idProcess; while ($contentChild) { if ($contentChild->nodeType == XML_ELEMENT_NODE){ $nameNode = $contentChild->nodeName; $contentNode = $contentChild->firstChild; if(strpos($nameNode,'ActivitySets')!== false){ $activitySet = $this->createSubProcesses($contentNode,$arrayLanes); $subProcesses = $activitySet['SUB_PROCESS']; $arraySubProcesses = $activitySet['SUBPROCESSES']; } if(strpos($nameNode,'Activities')!== false){ $activities = $this->createActivities($contentNode,$idProcess,$subProcesses); $oData->tasks = $activities['TASKS']; $startArray = $activities['START']; $endArray = $activities['END']; $arrayRoutes = $activities['ROUTES']; $arrayScheduler = $activities['SCHEDULER']; $arrayMessages = $activities['MESSAGES']; } if(strpos($nameNode,'Transitions')!== false){ $transitions = $this->createTransitions($contentNode,$oData->tasks,$arrayRoutes,$endArray,$startArray,$idProcess,$arrayScheduler,$arrayMessages); $oData->routes = $transitions['ROUTES']; $oData->tasks = $transitions['TASKS']; $routeTransitions = $transitions['TRANSITIONS']; $numberRoutes = $transitions['NUMBER']; $taskHidden = $transitions['TASKHIDDEN']; $arrayScheduler = $transitions['SCHEDULER']; $arrayMessages = $transitions['MESSAGES']; } } $contentChild = $contentChild->nextSibling; } } } } $content = $content->nextSibling; } } } $node = $node->nextSibling; } $oData->lanes = array(); $numberLanes = 0; foreach($arrayLanes as $key => $value) { if($value['PRO_UID'] == $idProcess){ $oData->lanes[$numberLanes] = $value; $numberLanes = $numberLanes + 1; } } $oData->inputs = array(); $oData->outputs = array(); $oData->dynaforms = array(); $oData->steps = array(); $oData->taskusers = array(); $oData->groupwfs = $this->getGroupwfRows( $oData->taskusers ); $oData->steptriggers = array(); $oData->dbconnections = array(); $oData->reportTables = array(); $oData->reportTablesVars = array(); $oData->stepSupervisor = array(); $oData->objectPermissions = array(); $oData->subProcess = array(); $numberSubProcess = 0; $arraySubProcess = $subProcesses; $numberSubProcess = sizeof($arraySubProcesses); $numberCount = 0; foreach($subProcesses as $key => $value) { foreach($oData->tasks as $keyTask => $valueTask) { if($value['ID_PROCESS'] == $valueTask['TAS_UID']){ $fields['TASK_PARENT'] = $valueTask['TAS_UID']; $idSubProcess = $valueTask['TAS_UID']; $findTask = 0; $newTasks = $this->getTaskRows($idSubProcess); foreach ($newTasks as $keyLane => $val ) { if($val['TAS_START']==='TRUE' and $findTask == 0){ $findTask = 1; $value['TASK_START']=$val['TAS_UID']; } } $fields['PROCESS_PARENT']= $idProcess; $fields['TAS_UID']= $value['TASK_START']; $oData->subProcess[$numberSubProcess]= $this->createSubProcess($fields,$arraySubProcess); $numberSubProcess = $numberSubProcess + 1; } } } $oData->caseTracker = array(); $oData->caseTrackerObject = array(); $oData->stage = array(); $oData->fieldCondition = array(); $oData->event = $this->createEventMessages($arrayMessages,$idProcess); $oData->triggers = array(); $oData->caseScheduler = $this->createScheduler($arrayScheduler,$idProcess); $oData->dynaformFiles = array(); $numberTransitions=sizeof($routeTransitions); if($numberTransitions > 0){ $routesArray = $this->createGateways($routeTransitions,$endArray,$oData->routes,$numberRoutes,$idProcess,$taskHidden); $oData->routes = $routesArray; } //print_r($oData);die; //print_r($arrayMessages);die; return $oData; } /** * This function sort a array * @param array $fields * @return array sorted */ function sortArray($fields) { $aux = $fields ; foreach ($fields as $key => $row) { $aux[$key] = $row['FROM']; } array_multisort($aux,SORT_ASC,$fields); return $fields; } /** * This functions verify the routes and removes the routes that are repeated * @param array $routeTransitions * @param array $endArray * @return array */ function verifyRoutes ($routeTransitions,$endArray,$taskHidden) { $findFirst = 0; $firstRoute = ''; $taskTo = ''; $taskFrom = ''; $routeArrayT = $routeTransitions; $findHidden = 0; foreach ($routeTransitions as $valRoute => $value){ $findHidden = 0; if($value['ROUTE'] == $firstRoute){ if($value['TOORFROM'] == 'TO'){ $taskFrom = $value['FROM']; } if($value['TOORFROM'] == 'FROM'){ $taskTo = $value['TO']; } if($taskFrom != ''){ foreach ($routeArrayT as $valRoutes => $values){ $isEventEnd = 0; foreach ($endArray as $endBase => $valueEnd){ if($valueEnd==$values['TO']){ $isEventEnd = 1; } } if($values['ROUTE'] == $value['ROUTE'] and $values['TO'] != $value['ROUTE'] and $isEventEnd == 0 and $findHidden == 0){ $taskFrom = $values['TO']; } else{ if($values['ROUTE'] == $value['ROUTE'] and $values['TO'] == $value['ROUTE'] and $isEventEnd == 0){ foreach ($taskHidden as $idHidden => $valueHidden){ if($valueHidden['ID_TASK'] == $values['TO']){ $taskFrom = $valueHidden['ID_TASK']; $findHidden= 1; } } } } } $routeTransitions[$valRoute]['TO']=$taskFrom; $taskFrom = ''; } if($taskTo != ''){ foreach ($routeArrayT as $valRoutes => $values){ if($values['ROUTE'] == $value['ROUTE'] and $values['FROM'] != $value['ROUTE'] and $findHidden == 0 ){ $taskTo = $values['FROM']; } } $routeTransitions[$valRoute]['FROM']=$taskTo; $taskTo = ''; } } else{ $firstRoute = $value['ROUTE']; $taskToE = ''; $taskFromE = ''; if($value['TOORFROM'] == 'TO'){ $taskFromE = $value['FROM']; } if($value['TOORFROM'] == 'FROM'){ $taskToE = $value['TO']; } if($taskFromE != ''){ $findHidden = 0; foreach ($routeArrayT as $valRoutes => $values){ $isEventEnd = 0; foreach ($endArray as $endBase => $valueEnd){ if($valueEnd==$values['TO']){ $isEventEnd = 1; } } if($values['ROUTE'] == $value['ROUTE'] and $values['TO'] != $value['ROUTE'] and $isEventEnd == 0 and $findHidden == 0){ $taskFromE = $values['TO']; } else{ if($values['ROUTE'] == $value['ROUTE'] and $values['TO'] == $value['ROUTE'] and $isEventEnd == 0){ foreach ($taskHidden as $idHidden => $valueHidden){ if($valueHidden['ID_TASK'] == $values['TO']){ $taskFromE = $valueHidden['ID_TASK']; $findHidden = 1; } } } } } $routeTransitions[$valRoute]['TO']=$taskFromE; $taskFromE = ''; } if($taskToE != ''){ foreach ($routeArrayT as $valRoutes => $values){ if($values['ROUTE'] == $value['ROUTE'] and $values['FROM'] != $value['ROUTE'] and $findHidden == 0){ $taskToE = $values['FROM']; } } $routeTransitions[$valRoute]['FROM']=$taskToE; $taskToE = ''; } } } $firstRoute = 0; $cont = 0; $routeChange = $routeTransitions; foreach ($routeTransitions as $valRoutes => $value){ $route = $value['ROUTE']; $type = $value['ROU_TYPE']; $countFrom = 0; $countTo = 0; foreach ($routeChange as $valRoutes2 => $values){ if($value['ROUTE'] == $values['ROUTE'] and $values['TOORFROM'] == 'TO'){ $countTo = $countTo + 1; } if($value['ROUTE'] == $values['ROUTE'] and $values['TOORFROM'] == 'FROM'){ $countFrom = $countFrom + 1; } } if($type == 'PARALLEL'){ if($countTo > $countFrom){ $routeTransitions[$valRoutes]['ROU_TYPE'] = 'SEC-JOIN'; } } } $routeArrayT2 = $routeTransitions; $routeArrayT1 = $routeTransitions; foreach ($routeArrayT1 as $valRoutes => $value){ if($firstRoute == 0){ $taskFirst = $value['ROUTE']; } if($taskFirst == $value['ROUTE']){ if($firstRoute == 0){ foreach ($routeArrayT2 as $valRoutes2 => $values){ if($values['ROUTE'] == $taskFirst and $values['FROM'] == $value['FROM'] and $values['TO'] == $value['TO'] and $values['ID'] != $value['ID']){ unset($routeArrayT2[$valRoutes2]); $firstRoute = 1; } } } } else{ $firstRoute = 0; } } return $routeArrayT2; } /** * this function creates an array for the process that will be created according to the data given in an array * @param array $fields * @return array $process */ function createProcess($fields) { $process = array(); $process['PRO_UID'] = $fields['ID']; $process['PRO_PARENT'] = $fields['ID']; $process['PRO_TIME'] = 1; $process['PRO_TIMEUNIT'] = 'DAYS'; $process['PRO_STATUS'] = 'ACTIVE'; $process['PRO_TYPE_DAY'] = ''; $process['PRO_TYPE'] = 'NORMAL'; $process['PRO_ASSIGNMENT'] = 'FALSE'; $process['PRO_SHOW_MAP'] = 0; $process['PRO_SHOW_MESSAGE'] = 0; $process['PRO_SHOW_DELEGATE'] = 0; $process['PRO_SHOW_DYNAFORM'] = 0; $process['PRO_CATEGORY'] = ''; $process['PRO_SUB_CATEGORY'] = ''; $process['PRO_INDUSTRY'] = 0; $process['PRO_UPDATE_DATE'] = date("D M j G:i:s T Y"); $process['PRO_CREATE_DATE'] = date("D M j G:i:s T Y"); $process['PRO_CREATE_USER'] = 00000000000000000000000000000001; $process['PRO_HEIGHT'] = 5000; $process['PRO_WIDTH'] = 10000; $process['PRO_TITLE_X'] = 0; $process['PRO_TITLE_Y'] = 0; $process['PRO_DEBUG'] = 0; $process['PRO_TITLE'] = $fields['NAME']; $process['PRO_DESCRIPTION'] = $fields['DESCRIPTION']; return $process; } /** * this function creates an array for the subProcess that will be created,according to the data given in an array * @param array $contentNode * @param array $arrayLanes * @return array */ function createSubProcesses($contentNode,$arrayLanes) { $activities = array(); $numberActivities = 0; $numberLanes = 0; $number = 0; $contentSubNode = $contentNode; $numberSub = 0; while ($contentSubNode){ if ($contentSubNode->nodeType == XML_ELEMENT_NODE){ $nameActivity = $contentSubNode->nodeName; $contentActivity = $contentSubNode->firstChild; if(strpos($nameActivity,'ActivitySet')!== false){ $idSetActivity = str_replace('-','',$contentSubNode->getAttribute('Id')); $arrayActivity[$number]['ID_PROCESS']= $idSetActivity; $number = $number + 1; } } $contentSubNode = $contentSubNode->nextSibling; } $number = 0; $arraySubProcesses = array(); while ($contentNode){ if ($contentNode->nodeType == XML_ELEMENT_NODE){ $isSubProcess = 0; $nameActivity = $contentNode->nodeName; $contentActivity = $contentNode->firstChild; $idSetActivity = 0; if(strpos($nameActivity,'ActivitySet')!== false){ $idSetActivity = str_replace('-','',$contentNode->getAttribute('Id')); if($idSetActivity !== 0){ $isSubProcess = 1; } $nameSetActivity = $contentNode->getAttribute('Name'); $contentChild = $contentNode->firstChild; $process['ID'] = $idSetActivity; $process['NAME'] = $nameSetActivity; $process['DESCRIPTION'] = ''; $subProcess->process = $this->createProcess($process); $activities[$number]['ID_PROCESS']= $idSetActivity ; while ($contentChild){ if ($contentChild->nodeType == XML_ELEMENT_NODE){ $nameChild = $contentChild->nodeName; $contentFirst = $contentChild->firstChild; if(strpos($nameChild,'Activities')!== false){ $arrayActivities = $this->createActivities($contentFirst,$idSetActivity,$arrayActivity); $subProcess->tasks = $arrayActivities['TASKS']; $startArray = $arrayActivities['START']; $endArray = $arrayActivities['END']; $arrayRoutes = $arrayActivities['ROUTES']; $arrayScheduler = $arrayActivities['SCHEDULER']; $arrayMessages = $arrayActivities['MESSAGES']; } if(strpos($nameChild,'Transitions')!== false){ $transitions = $this->createTransitions($contentFirst,$subProcess->tasks,$arrayRoutes,$endArray,$startArray,$idSetActivity,$arrayScheduler,$arrayMessages); $subProcess->routes = $transitions['ROUTES']; $subProcess->tasks = $transitions['TASKS']; $routeTransitions = $transitions['TRANSITIONS']; $numberRoutes = $transitions['NUMBER']; $arrayMessages = $transitions['MESSAGES']; } } $contentChild = $contentChild->nextSibling; } $values = $subProcess; if($isSubProcess == 1){ $arraySubProcesses[$numberSub]['ID_PROCESS']=$idSetActivity ; $arraySubProcesses[$numberSub]['TASKS'] =$subProcess->tasks; $numberSub = $numberSub+1; } $activities[$number]['TASK_START']= $startArray[0]['ID_TASK']; $number = $number + 1; $subProcess->lanes = array(); $numberLanes = 0; foreach($arrayLanes as $key => $value) { if($value['PRO_UID'] ==$idSetActivity){ $subProcess->lanes[$numberLanes] = $value; $numberLanes = $numberLanes + 1; } } $subProcess->inputs = array(); $subProcess->outputs = array(); $subProcess->dynaforms = array(); $subProcess->steps = array(); $subProcess->triggers = array(); $subProcess->taskusers = array(); $subProcess->groupwfs = $this->getGroupwfRows($subProcess->taskusers ); $subProcess->steptriggers = array(); $subProcess->dbconnections = array(); $subProcess->reportTables = array(); $subProcess->reportTablesVars = array(); $subProcess->stepSupervisor = array(); $subProcess->objectPermissions = array(); $subProcess->subProcess = array(); $subProcess->caseTracker = array(); $subProcess->caseTrackerObject = array(); $subProcess->stage = array(); $subProcess->fieldCondition = array(); $subProcess->event = array(); $subProcess->caseScheduler = array(); $subProcess->dynaformFiles = array(); $numberTransitions = sizeof($routeTransitions); if($numberTransitions > 0){ $routesArray = $this->createGateways($routeTransitions,$endArray,$subProcess->routes,$numberRoutes,$idProcess,''); $subProcess->routes = $routesArray; } $numberSubProcess = 0; foreach($subProcess->tasks as $key => $value) { if($value['TAS_TYPE'] === 'SUBPROCESS'){ $fields['TASK_PARENT'] = $value['TAS_UID']; $idSubProcess = $value['TAS_UID']; $newTasks = $this->getTaskRows($idSubProcess); $findTask = 0; foreach ($newTasks as $keyLane => $val ) { if($val['TAS_START']==='TRUE' and $findTask == 0){ $findTask = 1; $value['TASK_START']=$val['TAS_UID']; } } $fields['PROCESS_PARENT'] = $idSetActivity; $fields['TAS_UID'] = $value['TAS_UID']; $subProcess->subProcess[$numberSubProcess]= $this->createSubProcess($fields,$arrayActivity); $numberSubProcess = $numberSubProcess + 1; } } $this->createSubProcessFromDataXpdl($subProcess,$subProcess->tasks); } } $contentNode = $contentNode->nextSibling; } $arrayActivities['SUBPROCESSES'] = $arraySubProcesses; $arrayActivities['SUB_PROCESS'] = $activities; return $arrayActivities; } /** * This function creates an array for the task that will be created according to the data given in an array * @param array $fields * @return array $task */ function createTask($fields) { $task = array(); $task['PRO_UID'] = $fields['ID_PROCESS']; $task['TAS_UID'] = $fields['ID_TASK']; $task['TAS_TYPE'] = $fields['TASK_TYPE']; $task['TAS_DURATION'] = 1; $task['TAS_DELAY_TYPE'] =''; $task['TAS_TEMPORIZER'] = 0; $task['TAS_TYPE_DAY'] ='' ; $task['TAS_TIMEUNIT'] = 'DAYS'; $task['TAS_ALERT'] = 'FALSE'; $task['TAS_PRIORITY_VARIABLE'] = '@@SYS_CASE_PRIORITY'; $task['TAS_ASSIGN_TYPE'] = 'BALANCED'; $task['TAS_ASSIGN_VARIABLE'] = '@@SYS_NEXT_USER_TO_BE_ASSIGNED'; $task['TAS_ASSIGN_LOCATION'] = 'FALSE'; $task['TAS_ASSIGN_LOCATION_ADHOC']= 'FALSE'; $task['TAS_TRANSFER_FLY'] = 'FALSE'; $task['TAS_LAST_ASSIGNED'] = '00000000000000000000000000000001'; $task['TAS_USER'] = '0'; $task['TAS_CAN_UPLOAD'] = 'FALSE'; $task['TAS_VIEW_UPLOAD'] = 'FALSE'; $task['TAS_VIEW_ADDITIONAL_DOCUMENTATION']= 'FALSE'; $task['TAS_CAN_CANCEL'] = 'FALSE'; $task['TAS_OWNER_APP'] = 'FALSE'; $task['STG_UID'] = ''; $task['TAS_CAN_PAUSE'] = 'FALSE'; $task['TAS_CAN_SEND_MESSAGE'] = 'TRUE'; $task['TAS_CAN_DELETE_DOCS'] = 'FALSE'; $task['TAS_SELF_SERVICE'] = 'FALSE'; $task['TAS_START'] = 'FALSE'; $task['TAS_TO_LAST_USER'] = 'FALSE'; $task['TAS_SEND_LAST_EMAIL'] = 'FALSE'; $task['TAS_DERIVATION'] = 'NORMAL'; $task['TAS_POSX'] = $fields['X']; $task['TAS_POSY'] = $fields['Y']; $task['TAS_COLOR'] = ''; $task['TAS_DEF_MESSAGE'] = ''; $task['TAS_DEF_PROC_CODE'] = ''; $task['TAS_DEF_DESCRIPTION'] = ''; $task['TAS_TITLE'] = $fields['TAS_TITLE']; $task['TAS_DESCRIPTION'] = $fields['DESCRIPTION']; $task['TAS_DEF_TITLE'] = ''; return $task; } function createDataTask($fields) { $task = array(); $task['PRO_UID'] = $fields['ID_PROCESS']; $task['TAS_UID'] = $fields['ID_TASK']; $task['TAS_TYPE'] = $fields['TAS_TYPE']; $task['TAS_DURATION'] = 1; $task['TAS_DELAY_TYPE'] =''; $task['TAS_TEMPORIZER'] = 0; $task['TAS_TYPE_DAY'] ='' ; $task['TAS_TIMEUNIT'] = 'DAYS'; $task['TAS_ALERT'] = 'FALSE'; $task['TAS_PRIORITY_VARIABLE'] = '@@SYS_CASE_PRIORITY'; $task['TAS_ASSIGN_TYPE'] = 'BALANCED'; $task['TAS_ASSIGN_VARIABLE'] = '@@SYS_NEXT_USER_TO_BE_ASSIGNED'; $task['TAS_MI_INSTANCE_VARIABLE'] = '@@SYS_VAR_TOTAL_INSTANCE'; $task['TAS_MI_COMPLETE_VARIABLE'] = '@@SYS_VAR_TOTAL_INSTANCES_COMPLETE'; $task['TAS_ASSIGN_LOCATION'] = 'FALSE'; $task['TAS_ASSIGN_LOCATION_ADHOC']= 'FALSE'; $task['TAS_TRANSFER_FLY'] = 'FALSE'; $task['TAS_LAST_ASSIGNED'] = '00000000000000000000000000000001'; $task['TAS_USER'] = '0'; $task['TAS_CAN_UPLOAD'] = 'FALSE'; $task['TAS_VIEW_UPLOAD'] = 'FALSE'; $task['TAS_VIEW_ADDITIONAL_DOCUMENTATION']= 'FALSE'; $task['TAS_CAN_CANCEL'] = 'FALSE'; $task['TAS_OWNER_APP'] = 'FALSE'; $task['STG_UID'] = ''; $task['TAS_CAN_PAUSE'] = 'FALSE'; $task['TAS_CAN_SEND_MESSAGE'] = 'TRUE'; $task['TAS_CAN_DELETE_DOCS'] = 'FALSE'; $task['TAS_SELF_SERVICE'] = 'FALSE'; $task['TAS_START'] = $fields['START']; $task['TAS_TO_LAST_USER'] = 'FALSE'; $task['TAS_SEND_LAST_EMAIL'] = 'FALSE'; $task['TAS_DERIVATION'] = 'NORMAL'; $task['TAS_POSX'] = $fields['X']; $task['TAS_POSY'] = $fields['Y']; $task['TAS_COLOR'] = ''; $task['TAS_DEF_MESSAGE'] = ''; $task['TAS_DEF_PROC_CODE'] = ''; $task['TAS_DEF_DESCRIPTION'] = ''; $task['TAS_TITLE'] = $fields['TAS_TITLE']; $task['TAS_DESCRIPTION'] = $fields['DESCRIPTION']; $task['TAS_DEF_TITLE'] = ''; return $task; } /** * This function creates an array for the route that will be created according to the data given in an array * @param array $fields * @return array $route */ function createRoute($fields) { $route = array(); $route['ROU_UID'] = $fields['ROU_UID']; $route['ROU_PARENT'] = 0; $route['PRO_UID'] = $fields['ID_PROCESS']; $route['TAS_UID'] = $fields['FROM']; $route['ROU_NEXT_TASK'] = $fields['TO']; $route['ROU_CASE'] = 1; $route['ROU_TYPE'] = 'SEQUENTIAL'; $route['ROU_CONDITION'] = '' ; $route['ROU_TO_LAST_USER'] = 'FALSE'; $route['ROU_OPTIONAL'] = 'FALSE'; $route['ROU_SEND_EMAIL'] = 'TRUE'; $route['ROU_SOURCEANCHOR'] = 1; $route['ROU_TARGETANCHOR'] = 0; return $route; } /** * This function creates an array for the subProcess that will be created according to the data given in an array * @param array $fields * @return array $route */ function createSubProcess($fields) { $subProcess = array(); $subProcess['SP_UID'] = $fields['TAS_UID']; $subProcess['PRO_UID'] = $fields['TASK_PARENT']; $subProcess['TAS_UID'] = $fields['TAS_UID']; $subProcess['PRO_PARENT'] = $fields['PROCESS_PARENT']; $subProcess['TAS_PARENT'] = $fields['TASK_PARENT']; $subProcess['SP_TYPE'] = 'SIMPLE'; $subProcess['SP_SYNCHRONOUS'] = 0; $subProcess['SP_SYNCHRONOUS_TYPE'] = 'ALL' ; $subProcess['SP_SYNCHRONOUS_WAIT'] = 0; $subProcess['SP_VARIABLES_OUT'] = 'a:1:{s:0:"";s:0:"";}'; $subProcess['SP_VARIABLES_IN'] = 'a:1:{s:0:"";s:0:"";}'; $subProcess['SP_GRID_IN'] = ''; return $subProcess; } /** * This function creates an array for the routes that are not sequential that will be created according to the data given in an array * @param array $routeTransitions * @param array $endArray * @param array $dataRoutes * @param array $numberRoutes * @param string $idProcess * @return array $dataRoutes */ function createGateways($routeTransitions,$endArray,$dataRoutes,$numberRoutes,$idProcess,$taskHidden) { $valueCase = ''; $value = 1; $valueC = 1; $aux = $routeTransitions; foreach ($routeTransitions as $key => $row) { $aux[$key] = $row['ROUTE']; } array_multisort($aux,SORT_ASC,$routeTransitions); $routeArray = $this->verifyRoutes($routeTransitions,$endArray,$taskHidden); $routeArray = $this->sortArray($routeArray); foreach($routeArray as $valRoutes => $value){ $isEventEnd = 0; foreach ($endArray as $endBase => $valueEnd){ if($valueEnd['ID_TASK']==$value['TO']){ $isEventEnd = 1; } } $dataRoutes[$numberRoutes]= array(); $dataRoutes[$numberRoutes]['ROU_UID'] = $value['ID']; $dataRoutes[$numberRoutes]['ROU_PARENT'] = 0; $dataRoutes[$numberRoutes]['PRO_UID'] = $idProcess; $dataRoutes[$numberRoutes]['TAS_UID'] = $value['FROM']; if($isEventEnd == 0){ $dataRoutes[$numberRoutes]['ROU_NEXT_TASK'] = $value['TO']; } else{ $dataRoutes[$numberRoutes]['ROU_NEXT_TASK'] = '-1'; } if($valueCase == $value['FROM']){ $valueC = $valueC + 1; } else{ $valueC = 1; $valueCase = $value['FROM']; } if($valueCase == ''){ $valueC = 1; $valueCase = $value['FROM']; } $dataRoutes[$numberRoutes]['ROU_CASE'] = $valueC; $dataRoutes[$numberRoutes]['ROU_TYPE'] = $value['ROU_TYPE']; if($value['ROU_TYPE'] ==='DISCRIMINATOR'){ $dataRoutes[$numberRoutes]['ROU_CONDITION'] = $value['CONDITION_DIS']; $dataRoutes[$numberRoutes]['ROU_OPTIONAL'] = $value['TYPE_DIS']; } if($value['ROU_TYPE'] !=='DISCRIMINATOR'){ $dataRoutes[$numberRoutes]['ROU_CONDITION'] = $value['CONDITION']; $dataRoutes[$numberRoutes]['ROU_OPTIONAL'] = 'FALSE'; } $dataRoutes[$numberRoutes]['ROU_TO_LAST_USER'] = 'FALSE'; $dataRoutes[$numberRoutes]['ROU_SEND_EMAIL'] = 'TRUE'; $dataRoutes[$numberRoutes]['ROU_SOURCEANCHOR'] = 1; $dataRoutes[$numberRoutes]['ROU_TARGETANCHOR'] = 0; $numberRoutes = $numberRoutes + 1; } return $dataRoutes; } /** * This function creates an array for the lane that will be created according to the data given in an array * @param array $lanes * @return array $lane */ function createLanesPM($array,$idProcess) { $arrayLanes = array(); $field = array(); foreach ($array as $key=> $value){ $field['ID_LANE'] = $value['0']; $field['ID_PROCESS'] = $idProcess; $field['X'] = $value['2']; $field['Y'] = $value['3']; $field['WIDTH'] = $value['4']; $field['HEIGHT'] = $value['5']; $field['TEXT'] = $value['6']; $arrayLanes[]= $this->createLanes($field); } return $arrayLanes; } /** * This function creates an array for the lane that will be created according to the data given in an array * @param array $lanes * @return array $lane */ function createLanes($lanes) { $lane = array(); $lane['SWI_UID'] = $lanes['ID_LANE']; $lane['PRO_UID'] = $lanes['ID_PROCESS']; $lane['SWI_TYPE'] = 'TEXT'; $lane['SWI_X'] = $lanes['X']; $lane['SWI_Y'] = $lanes['Y']; $lane['SWI_TEXT'] = $lanes['TEXT']; $lane['SWI_WIDTH'] = $lanes['WIDTH']; $lane['SWI_HEIGHT']= $lanes['HEIGHT']; return $lane; } /** * This function creates an array for the lane that will be created according to the data given in an array * @param array $lanes * @return array $lane */ function createLanesNewPM($array) { $arrayLanes = array(); $field = array(); foreach ($array as $key=> $value){ if($value['SWI_TYPE'] == 'TEXT') { $field['0'] = $value['SWI_UID']; $field['1'] = $value['SWI_TEXT']; $field['2'] = $value['SWI_X']; $field['3'] = $value['SWI_Y']; $field['4'] = $value['SWI_WIDTH']; $field['5'] = $value['SWI_HEIGHT']; $arrayLanes[]= $field; } } return $arrayLanes; } /** * This function creates activities according the content of the node * @param object $contentNode * @param string $idProcess * @param string $ActivitySet * @return array $result */ function createActivities($contentNode,$idProcess,$activitySet) { $result = array(); $numberTasks = 0; $posRoutes = 0; $posEnd = 0; $posStart = 0; $arrayRoutes = array(); $endArray = array(); $endArray = array(); $startArray = array(); $arrayScheduler = array(); $scheduler = array(); $message = array(); $arrayMessages = array(); while ($contentNode){ if ($contentNode->nodeType == XML_ELEMENT_NODE){ $nameActivity = $contentNode->nodeName; $contentActivity = $contentNode->firstChild; if(strpos($nameActivity,'Activity')!== false){ $idActivity = $contentNode->getAttribute('Id'); $idActivity = trim(str_replace('-','',$idActivity)); $name = htmlentities($contentNode->getAttribute('Name')); $result = $this->createActivity($contentActivity); $result['ID_PROCESS']= $idProcess; $result['ID_TASK'] = $idActivity; $result['TAS_TITLE'] = $name; $result['TASK_TYPE'] = 'NORMAL'; foreach ($activitySet as $key => $value) { if($value['ID_PROCESS'] ==$idActivity){ $result['TASK_TYPE']= 'SUBPROCESS'; } } if($result['EVENT'] =='' and $result['ROUTE'] ==''){ $arrayTasks[$numberTasks]= $this->createTask($result); $numberTasks = $numberTasks +1; } else{ if($result['EVENT'] !='' and $result['TRIGGER']== 'None'){ if($result['EVENT'] =='END'){ $endArray[$posEnd] = $result; $posEnd = $posEnd+1; } if($result['EVENT'] =='START'){ $startArray[$posStart] = $result; $posStart= $posStart+1; } } else{ if($result['TRIGGER']== 'Timer'){ $scheduler['ID'] = $idActivity; $scheduler['NAME'] = $name; if($result['TIME'] == '' or $result['TIME'] == Null){ $scheduler['TIME'] = date("D M j G:i:s T Y"); } else{ $scheduler['TIME'] = $result['TIME']; } $scheduler['TYPE_TIME']= $result['TYPE_TIME']; $arrayScheduler[] = $scheduler; } if($result['TRIGGER']== 'Message'){ $message['ID'] = $idActivity; $message['NAME'] = $name; $message['TYPE_MESSAGE'] = $result['MESSAGE']; $arrayMessages[] = $message; } } if($result['ROUTE'] !=''){ $position = $this->findCoordinates($contentActivity); $arrayRoutes[$posRoutes]['ID'] = $idActivity; $arrayRoutes[$posRoutes]['ROUTE'] = $result['ROUTE']; $arrayRoutes[$posRoutes]['TYPE_DIS'] = $result['TYPE_DISCRIMINATOR']; $arrayRoutes[$posRoutes]['CONDITION_DIS'] = $result['CONDITION_DISCRIMINATOR']; $arrayRoutes[$posRoutes]['X'] = $position['X']; $arrayRoutes[$posRoutes]['Y'] = $position['Y']; $posRoutes = $posRoutes + 1; } } } } $contentNode = $contentNode->nextSibling; } $result['TASKS'] = $arrayTasks; $result['END'] = $endArray; $result['START'] = $startArray; $result['ROUTES'] = $arrayRoutes; $result['SCHEDULER']= $arrayScheduler; $result['MESSAGES'] = $arrayMessages; return $result; } /** * This function creates the scheduler * @param array $fields * @return array $result */ function createEventMessages($fields,$idProcess) { $result = array(); $event = array(); $example = new Derivation(); foreach($fields as $key => $value){ $oEvent = new Event(); $event['EVN_UID'] = $value['ID']; $event['PRO_UID'] = $idProcess; $event['EVN_RELATED_TO'] = 'SINGLE'; $event['TAS_UID'] = $value['ID_TASK']; $event['EVN_TAS_ESTIMATED_DURATION'] = '1'; $event['EVN_WHEN_OCCURS'] = 'AFTER'; $event['EVN_STATUS'] = 'ACTIVE'; $event['EVN_WHEN'] = 1; $event['EVN_MAX_ATTEMPTS'] = 3; $event['EVN_ACTION'] = 'SEND_MESSAGE'; $event['EVN_DESCRIPTION'] = $value['NAME']; $event['EVN_WHEN_OCCURS'] = 'AFTER_TIME'; $event['EVN_ACTION_PARAMETERS'] = array( 'SUBJECT' => 'subject', 'TO' => array('0'=>'usr|-1','1'=>'ext|'), 'CC' => array(), 'BCC' => array(), 'TEMPLATE' => 'alert_message.html' ); $result[] = $event; } return $result; } /** * This function creates the scheduler * @param array $fields * @return array $result */ function createScheduler($fields,$idProcess) { $result = array(); $example = new Derivation(); foreach($fields as $key => $value){ if($value['TYPE_TIME'] == 'TimeDate'){ //there is a scheduler one time only $value['OPTION']= 4; $result[]= $this->createArrayScheduler($value,$idProcess); } if($value['TYPE_TIME'] == 'TimeCycle'){ //we calculated if is daily or monthly, etc $time = $this->calculateTimeScheduler($value['TIME']); /*$value['OPTION']= $time['OPTION']; $value['TIME'] = $time['TIME'];*/ $value['OPTION']= '1'; } } //PRINT_r($result); return $result; } /** * This function creates the scheduler * @param array $fields * @return array $result */ function calculateTimeScheduler($time) { $result = array(); $result = split(' ',$time); //print_r($result); return $result; } /** * This function creates the array scheduler * @param string $time * @param string $type (TimeCycle or TimeDate) * @return array $result */ function createArrayScheduler($fields,$idProcess) { $result['SCH_UID'] = $fields['ID']; $result['SCH_DEL_USER_NAME'] = ''; $result['SCH_DEL_USER_PASS'] = ''; $result['SCH_DEL_USER_UID'] = ''; $result['SCH_NAME'] = $fields['NAME']; $result['PRO_UID'] = $idProcess; $result['TAS_UID'] = $fields['ID_TASK']; $result['SCH_TIME_NEXT_RUN'] = $fields['TIME']; $result['SCH_LAST_RUN_TIME'] = null; $result['SCH_STATE'] = 'ACTIVE'; $result['SCH_LAST_STATE'] = 'CREATED'; $result['USR_UID'] = '00000000000000000000000000000001'; $result['SCH_OPTION'] = $fields['OPTION']; $result['SCH_START_TIME'] = $fields['TIME']; $result['SCH_START_DATE'] = $fields['TIME']; $result['SCH_DAYS_PERFORM_TASK'] = ''; $result['SCH_EVERY_DAYS'] = '0'; $result['SCH_WEEK_DAYS'] = '0|0|0|0|0|0|0'; $result['SCH_START_DAY'] = ''; $result['SCH_MONTHS'] = '0|0|0|0|0|0|0|0|0|0|0|0'; $result['SCH_END_DATE'] = $fields['TIME']; $result['SCH_REPEAT_EVERY'] = ''; $result['SCH_REPEAT_UNTIL'] = ''; $result['SCH_REPEAT_STOP_IF_RUNNING'] = ''; return $result; } /** * This function creates transitions according the content of the node * @param object $contentNode * @param array $dataTask * @param array $arrayRoutes * @param array $endArray * @param array $startArray * @param string $idProcess * @return array $result */ function createTransitions($contentNode,$dataTasks,$arrayRoutes,$endArray,$startArray,$idProcess,$schedulerArray,$messages) { $numberRoutes = 0; $posT = 0; $output = ''; $routeTransitions = array(); $taskHidden = array(); $countHidden = 1; $dataRoutes = array(); $newFrom = 0; $isScheduler = 0; $isMessage = 0; while ($contentNode){ $isEnd = 0; $isStart = 0; $tasks = $dataTasks; if ($contentNode->nodeType == XML_ELEMENT_NODE){ $nameTransition = $contentNode->nodeName; $contentTransition = $contentNode->firstChild; if(strpos($nameTransition,'Transition')!== false){ $idTransition = $contentNode->getAttribute('Id'); $idTransition = trim(str_replace('-','',$idTransition)); $from = trim(str_replace('-','',$contentNode->getAttribute('From'))); $to = trim(str_replace('-','',$contentNode->getAttribute('To'))); $routes['ROU_UID'] = $idTransition; $routes['ID_PROCESS']= $idProcess; $routes['FROM'] = $from; $routes['TO'] = $to; $isScheduler = 0; $isMessage = 0; foreach ($startArray as $startBase => $value){ if($value['ID_TASK']==$from){ foreach($tasks as $tasksValue=> $taskId){ if($to==$taskId['TAS_UID']){ $taskId['TAS_START']='TRUE'; $dataTasks[$tasksValue]['TAS_START']='TRUE'; $isStart = 1; } } } } foreach ($schedulerArray as $startBase => $value){ if($value['ID']==$from){ $isScheduler = 1; $schedulerArray[$startBase]['ID_TASK'] = $to; foreach($tasks as $tasksValue=> $taskId){ if($to==$taskId['TAS_UID']){ $taskId['TAS_START']='TRUE'; $dataTasks[$tasksValue]['TAS_START']='TRUE'; $isStart = 1; } } } } foreach ($messages as $startBase => $value){ if($value['ID']==$from){ $isMessage = 1; $messages[$startBase]['ID_TASK'] = $to; } if($value['ID']==$to){ $isMessage = 1; $messages[$startBase]['ID_TASK'] = $from; } } $sequencial = 0; $findRoute = 0; foreach ($arrayRoutes as $routeBase => $value){ //change for task hidden if($value['ID']==$from){ if($findRoute == 0){ $typeT = 'FROM'; $valueRoute = $value['ID']; $typeRoute = $value['ROUTE']; $sequencial = 1; $conditionD = $value['CONDITION_DIS']; $typeD = $value['TYPE_DIS']; $findRoute = 1; } else{ $contendHidden = $contentTransition; $fieldsXY = $this->findCoordinatesTransition($to,$arrayRoutes); $hidden['ID_TASK'] = G::generateUniqueID(); $hidden['ID_PROCESS'] = $idProcess; $hidden['TAS_TITLE'] = ''; $hidden['TASK_TYPE'] = 'HIDDEN'; $hidden['DESCRIPTION'] = $countHidden; $hidden['X'] = $fieldsXY['X']; $hidden['Y'] = $fieldsXY['Y']; $taskHidden[] = $hidden; $dataTasks[] = $this->createTask($hidden); $countHidden = $countHidden + 1; $routeTransitions[$posT]['ID'] = G::generateUniqueID(); $routeTransitions[$posT]['ROUTE'] = $from; $routeTransitions[$posT]['FROM'] = $from; $routeTransitions[$posT]['TO'] = $hidden['ID_TASK']; $routeTransitions[$posT]['TOORFROM'] = 'FROM'; $routeTransitions[$posT]['ROU_TYPE'] = $value['ROUTE']; $routeTransitions[$posT]['CONDITION'] = $output; $routeTransitions[$posT]['CONDITION_DIS'] = $conditionD; $routeTransitions[$posT]['TYPE_DIS'] = $typeD; $output = ''; $posT = $posT + 1; $from = $hidden['ID_TASK']; } } if($value['ID']==$to){ if($findRoute == 0){ $typeT = 'TO'; $valueRoute = $value['ID']; $typeRoute = $value['ROUTE']; $sequencial = 1; $conditionD = $value['CONDITION_DIS']; $typeD = $value['TYPE_DIS']; $findRoute = 1; } else{ $contendHidden = $contentTransition; $fieldsXY = $this->findCoordinatesTransition($to,$arrayRoutes); $hidden['ID_TASK'] = G::generateUniqueID(); $hidden['ID_PROCESS'] = $idProcess; $hidden['TAS_TITLE'] = ''; $hidden['TASK_TYPE'] = 'HIDDEN'; $hidden['DESCRIPTION'] = $countHidden; $hidden['X'] = $fieldsXY['X']; $hidden['Y'] = $fieldsXY['Y']; $taskHidden[] = $hidden; $dataTasks[] = $this->createTask($hidden); $countHidden = $countHidden + 1; $routeTransitions[$posT]['ID'] = G::generateUniqueID(); $routeTransitions[$posT]['ROUTE'] = $from; $routeTransitions[$posT]['FROM'] = $from; $routeTransitions[$posT]['TO'] = $hidden['ID_TASK']; $routeTransitions[$posT]['TOORFROM'] = 'TO'; $routeTransitions[$posT]['ROU_TYPE'] = $typeRoute; $routeTransitions[$posT]['CONDITION'] = $output; $routeTransitions[$posT]['CONDITION_DIS'] = $conditionD; $routeTransitions[$posT]['TYPE_DIS'] = $typeD; $output = ''; $posT = $posT + 1; $from = $hidden['ID_TASK']; $conditionD = $value['CONDITION_DIS']; $typeRoute = $value['ROUTE']; $typeT = 'TO'; $valueRoute = $value['ID']; $sequencial = 1; $conditionD = $value['CONDITION_DIS']; $typeD = $value['TYPE_DIS']; } } } if($sequencial == 0){ foreach ($endArray as $endBase => $value){ if($value['ID_TASK']==$to){ foreach($tasks as $tasksValue=> $taskId){ if($from==$taskId['TAS_UID']){ $routes['TO'] = '-1'; $dataRoutes[$numberRoutes]= $this->createRoute($routes); $numberRoutes = $numberRoutes +1; $isEnd = 1; } } } } } if($sequencial == 1){ while ($contentTransition) { $nameCondition = $contentTransition->nodeName; $contentCondition = $contentTransition->firstChild; if(strpos($nameCondition,'Condition')!== false){ while ($contentCondition) { $nameExpression = $contentCondition->nodeName; $contentCondition1 = ''; if(strpos($nameExpression,'Expression')!== false){ $contentCondition1 = $contentCondition->firstChild; if($contentCondition1 != array()){ $output = $contentCondition1->nodeValue; } } $contentCondition = $contentCondition->nextSibling; } } $contentTransition = $contentTransition->nextSibling; } $routeTransitions[$posT]['ID'] = $idTransition; $routeTransitions[$posT]['ROUTE'] = $valueRoute; $routeTransitions[$posT]['FROM'] = $from; $routeTransitions[$posT]['TO'] = $to; $routeTransitions[$posT]['TOORFROM'] = $typeT; $routeTransitions[$posT]['ROU_TYPE'] = $typeRoute; $routeTransitions[$posT]['CONDITION'] = $output; $routeTransitions[$posT]['CONDITION_DIS'] = $conditionD; $routeTransitions[$posT]['TYPE_DIS'] = $typeD; $output = ''; $posT = $posT + 1; $sequencial = 1; } if($isEnd==0 and $isStart == 0 and $sequencial == 0 and $isScheduler == 0 and $isMessage == 0){ $dataRoutes[$numberRoutes]= $this->createRoute($routes); $numberRoutes = $numberRoutes +1; } } } $contentNode = $contentNode->nextSibling; } $routes = $routeTransitions; foreach($routeTransitions as $key => $id){ $findTo = 0; $findFrom = 0; foreach ($dataTasks as $keyHidden => $value){ if($id['FROM']== $value['TAS_UID']){ $findFrom= 1; } if($id['TO']== $value['TAS_UID']){ $findTo = 1; } } if($findTo == 0){ foreach($routes as $keyR => $idR){ if($id['TO'] == $idR['ROUTE']){ $routeTransitions[$key]['ROU_TYPE'] = $idR['ROU_TYPE']; $routeTransitions[$key]['ROUTE'] = $id['TO']; $routeTransitions[$key]['TOORFROM'] = 'TO'; } } } if($findFrom == 0){ foreach($routes as $keyR => $idR){ if($id['FROM'] == $idR['ROUTE']){ $routeTransitions[$key]['ROU_TYPE'] = $idR['ROU_TYPE']; $routeTransitions[$key]['ROUTE'] = $id['FROM']; $routeTransitions[$key]['TOORFROM'] = 'FROM'; } } } } $result['ROUTES'] = $dataRoutes; $result['TRANSITIONS']= $routeTransitions; $result['TASKS'] = $dataTasks; $result['NUMBER'] = $numberRoutes; $result['TASKHIDDEN'] = $taskHidden; $result['SCHEDULER'] = $schedulerArray; $result['MESSAGES'] = $messages; return $result; } /** * this function creates a array according to the data given in a node * @param object $contentNode * @return array */ function createActivity($contentNode) { $coordinates = array(); $event = ''; $typeRoute = ''; $markerVisible = ''; $typePM = ''; $isRoute = 0; $description = ''; $isSubProcess = 0 ; $trigger = ''; $time = ''; $typeTime = ''; $isMessage = 0; while ($contentNode) { if ($contentNode->nodeType == XML_ELEMENT_NODE) { $nameChild = $contentNode->nodeName; $contentChild = $contentNode->firstChild; if(strpos($nameChild,'Description')!== false){ $description = $contentNode->nodeValue; } if(strpos($nameChild,'ExtendedAttributes')!== false){ $result = $this->createExtended($contentChild); } if(strpos($nameChild,'BlockActivity')!== false){ $isSubProcess = 1; $idSubProcess = trim(str_replace('-','',$contentNode->getAttribute('ActivitySetId'))); } if(strpos($nameChild,'Event')!== false){ while ($contentChild) { if ($contentChild->nodeType == XML_ELEMENT_NODE) { $nameInfo = $contentChild->nodeName; $contentInfo = $contentChild->firstChild; if(strpos($nameInfo,'StartEvent')!== false){ $event = 'START'; $trigger = $contentChild->getAttribute('Trigger'); } if(strpos($nameInfo,'EndEvent')!== false){ $event = 'END'; $trigger = $contentChild->getAttribute('Trigger'); if($trigger == ''){ $trigger = 'None'; } } if(strpos($nameInfo,'IntermediateEvent')!== false){ $event = 'INTERMEDIATE'; $trigger = $contentChild->getAttribute('Trigger'); } } $contentChild = $contentChild->nextSibling; } if($trigger != 'None'){ if($trigger == 'Timer'){ while ($contentInfo) { $nameTrigger = $contentInfo->nodeName; $contentTrigger = $contentInfo->firstChild; if(strpos($nameTrigger,'TriggerTimer')!== false){ $time = $contentInfo->getAttribute('TimeCycle'); $typeTime = 'TimeCycle'; if($time == ''){ $time = $contentInfo->getAttribute('TimeDate'); $typeTime = 'TimeDate'; } } $contentInfo = $contentInfo->nextSibling; } } if($trigger == 'Message'){ $typeMessage = ''; $isMessage = 1; while ($contentInfo) { $nameTrigger = $contentInfo->nodeName; $contentTrigger = $contentInfo->firstChild; if(strpos($nameTrigger,'TriggerResultMessage')!== false){ $typeMessage = $contentInfo->getAttribute('CatchThrow'); } $contentInfo = $contentInfo->nextSibling; } } } } if(strpos($nameChild,'Route')!== false){ $typePM = ''; $typeRoute = $contentNode->getAttribute('GatewayType'); $markerVisible = $contentNode->getAttribute('MarkerVisible'); if($markerVisible !=''){ $coordinates['ROUTE'] = $markerVisible; } if($typeRoute !=''){ $coordinates['ROUTE'] = $typeRoute; } if($typeRoute =='' and $markerVisible ==''){ $coordinates['ROUTE'] = 'EVALUATE'; } switch($coordinates['ROUTE']){ case 'AND': $typePM = 'PARALLEL'; break; case 'true': $typePM = 'EVALUATE'; break; case 'EVALUATE': $typePM = 'EVALUATE'; break; case 'OR': $typePM = 'PARALLEL-BY-EVALUATION'; break; case 'Complex': $typePM = 'DISCRIMINATOR'; break; } $isRoute = 1; } if(strpos($nameChild,'NodeGraphicsInfos')!== false){ $coordinates = $this->findCoordinates($contentNode); $coordinates['EVENT'] = $event; $coordinates['TRIGGER'] = $trigger; $coordinates['TIME'] = $time; $coordinates['TYPE_TIME'] = $typeTime; $coordinates['DESCRIPTION'] = $description; $coordinates['TYPE_DISCRIMINATOR'] = $result['TYPE']; $coordinates['CONDITION_DISCRIMINATOR'] = $result['CONDITION']; if($isRoute == 1){ $coordinates['ROUTE']= $typePM; } else{ $coordinates['ROUTE']=''; } if($isMessage == 1){ $coordinates['MESSAGE']= $typeMessage; } else{ $coordinates['MESSAGE']=''; } } } $contentNode = $contentNode->nextSibling; } return $coordinates; } /** * This function return the type and the condition of a discriminator * @param object $contentNode * @return array */ function createExtended($contentNode) { $result = array(); $result['TYPE']= ''; $result['CONDITION'] = ''; $contentExtended = $contentNode; while ($contentExtended) { if ($contentExtended->nodeType == XML_ELEMENT_NODE) { $nameChildExtended = $contentExtended->nodeName; $contentChildExtended = $contentExtended->firstChild; if(strpos($nameChildExtended,'ExtendedAttribute')!== false){ $name = $contentExtended->getAttribute('Name'); if($name == 'option'){ $result['TYPE'] = $contentExtended->getAttribute('Value'); } if($name == 'condition'){ $result['CONDITION'] = $contentExtended->getAttribute('Value'); } } } $contentExtended = $contentExtended->nextSibling; } return $result; } /** * This function find the coordinates of a object * @param object $contentNode * @return array */ function findCoordinates($contentNode) { $coordinates = array(); while ($contentNode) { if ($contentNode->nodeType == XML_ELEMENT_NODE) { $nameChild = $contentNode->nodeName; $contentChild = $contentNode->firstChild; if(strpos($nameChild,'NodeGraphicsInfos')!== false){ while ($contentChild) { if ($contentChild->nodeType == XML_ELEMENT_NODE) { $nameInfo = $contentChild->nodeName; $contentInfo = $contentChild->firstChild; if(strpos($nameInfo,'NodeGraphicsInfo')!== false){ $coordinates['Height'] = $contentChild->getAttribute('Height'); $coordinates['Width'] = $contentChild->getAttribute('Width'); $coordinates['BorderColor'] = $contentChild->getAttribute('BorderColor'); $coordinates['FillColor'] = $contentChild->getAttribute('FillColor'); while ($contentInfo) { $nameCoordinate = $contentInfo->nodeName; $contentCoordinate = $contentInfo->firstChild; if(strpos($nameCoordinate,'Coordinates')!== false){ $coordinates['X'] = $contentInfo->getAttribute('XCoordinate'); $coordinates['Y'] = $contentInfo->getAttribute('YCoordinate'); } $contentInfo = $contentInfo->nextSibling; } } } $contentChild = $contentChild->nextSibling; } } } $contentNode = $contentNode->nextSibling; } return $coordinates; } /** * This function find the coordinates of a object * @param string $idRoute * @param array $aRoutes * @return array */ function findCoordinatesTransition($idRoute,$aRoutes) { $coordinates = array(); $size = sizeof($aRoutes); $count = 0; $find = 0; while($count < $size and $find == 0){ if($aRoutes[$count]['ID'] == $idRoute){ $coordinates['X'] = $aRoutes[$count]['X']; $coordinates['Y'] = $aRoutes[$count]['Y']; $find = 1; } $count = $count + 1; } return $coordinates; } /** * This function create the array Routes * @param array $dataTasks * @param array $arrayRoutes * @param array $aEvents * @param array $aGateways * @param string $idProcess * @return array */ function createArrayRoutes($dataTasks,$arrayRoutes,$aEvents,$aGateways,$aEnd,$idProcess) { $numberRoutes = 0; $posT = 0; $routeTransitions = array(); $dataRoutes = array(); $findRoute = 0; $hidden = array(); $taskHidden = array(); $countHidden = 0; foreach($arrayRoutes as $idRoute => $valueRoute){ $idTransition = $valueRoute['0']; $from = $valueRoute['1']; $to = $valueRoute['2']; $toPort = $valueRoute['3']; $fromPort = $valueRoute['4']; $routes['ROU_UID'] = $idTransition; $routes['ID_PROCESS']= $idProcess; $routes['FROM'] = $from; $routes['TO'] = $to; $sequencial = 0; $isEnd = 0; $typeRoute = ''; $typePM = ''; $findRoute = 0; $isEventIntermediate = 0; foreach ($aGateways as $routeBase => $value){ if($value['0']==$from){ if($findRoute == 0){ $typeT = 'FROM'; $valueRoute = $value['0']; $typeRoute = $value['1']; $positionX = $value['2']; $positionY = $value['3']; $sequencial = 1; $findRoute = 1; } else{ $hidden['ID_TASK'] = G::generateUniqueID(); $hidden['ID_PROCESS'] = $idProcess; $hidden['TAS_TITLE'] = ''; $hidden['TASK_TYPE'] = 'HIDDEN'; $hidden['DESCRIPTION'] = $countHidden; $hidden['X'] = $positionX; $hidden['Y'] = $positionY; $taskHidden[] = $hidden; $dataTasks[] = $this->createTask($hidden); $countHidden = $countHidden + 1; $routeTransitions[$posT]['ID'] = G::generateUniqueID(); $routeTransitions[$posT]['ROUTE'] = $from; $routeTransitions[$posT]['FROM'] = $from; $routeTransitions[$posT]['TO'] = $hidden['ID_TASK']; $routeTransitions[$posT]['TOORFROM'] = 'FROM'; $routeTransitions[$posT]['ROU_TYPE'] = $value['1']; $routeTransitions[$posT]['CONDITION'] = ''; $routeTransitions[$posT]['CONDITION_DIS'] = ''; $routeTransitions[$posT]['TYPE_DIS'] = ''; $posT = $posT + 1; $from = $hidden['ID_TASK']; } } if($value['0']==$to){ if($findRoute == 0){ $typeT = 'TO'; $valueRoute = $value['0']; $typeRoute = $value['1']; $positionX = $value['2']; $positionY = $value['3']; $sequencial = 1; $findRoute = 1; } else{ $hidden['ID_TASK'] = G::generateUniqueID(); $hidden['ID_PROCESS'] = $idProcess; $hidden['TAS_TITLE'] = ''; $hidden['TASK_TYPE'] = 'HIDDEN'; $hidden['DESCRIPTION'] = $countHidden; $hidden['X'] = $positionX; $hidden['Y'] = $positionY; $taskHidden[] = $hidden; $dataTasks[] = $this->createTask($hidden); $countHidden = $countHidden + 1; $routeTransitions[$posT]['ID'] = G::generateUniqueID(); $routeTransitions[$posT]['ROUTE'] = $from; $routeTransitions[$posT]['FROM'] = $from; $routeTransitions[$posT]['TO'] = $hidden['ID_TASK']; $routeTransitions[$posT]['TOORFROM'] = 'TO'; $routeTransitions[$posT]['ROU_TYPE'] = $typeRoute; $routeTransitions[$posT]['CONDITION'] = ''; $routeTransitions[$posT]['CONDITION_DIS'] = ''; $routeTransitions[$posT]['TYPE_DIS'] = ''; $posT = $posT + 1; $from = $hidden['ID_TASK']; $typeT = 'TO'; $valueRoute = $value['0']; $typeRoute = $value['1']; $sequencial = 1; } } } if($sequencial == 0){ foreach($aEvents as $id => $value){ if($routes['TO'] == $value['0']){ if($value['1']==='bpmnEventEndSignal' or $value['1']==='bpmnEventMessageEnd' ){ $routes['TO'] = '-1'; $dataRoutes[$numberRoutes]= $this->createRoute($routes); $numberRoutes = $numberRoutes +1; $isEnd = 1; } else{ $isEventIntermediate = 1; } } } } if($sequencial == 1){ $routeTransitions[$posT]['ID'] = $idTransition; $routeTransitions[$posT]['ROUTE'] = $valueRoute; $routeTransitions[$posT]['FROM'] = $from; $routeTransitions[$posT]['TO'] = $to; $routeTransitions[$posT]['TOORFROM'] = $typeT; $routeTransitions[$posT]['ROU_TYPE'] = $typeRoute; $routeTransitions[$posT]['CONDITION'] = ''; $routeTransitions[$posT]['CONDITION_DIS'] = ''; $routeTransitions[$posT]['TYPE_DIS'] = ''; $posT = $posT + 1; $sequencial = 1; } if($isEnd == 0 and $sequencial == 0 and $isEventIntermediate == 0){ $dataRoutes[$numberRoutes]= $this->createRoute($routes); $numberRoutes = $numberRoutes +1; } } foreach($routeTransitions as $id => $key){ $typeRoute = $key['ROU_TYPE']; switch($typeRoute){ case 'bpmnGatewayExclusiveData': $typePM = 'EVALUATE'; break; case 'bpmnGatewayInclusive': $typePM = 'PARALLEL-BY-EVALUATION'; break; case 'bpmnGatewayExclusiveEvent': $typePM = 'EVALUATE'; break; case 'bpmnGatewayComplex': $typePM = 'DISCRIMINATOR'; break; case 'bpmnGatewayParallel': $typePM = 'PARALLEL'; break; } $routeTransitions[$id]['ROU_TYPE'] = $typePM; } $routes = $routeTransitions; foreach($routeTransitions as $key => $id){ $findTo = 0; $findFrom = 0; foreach ($dataTasks as $keyHidden => $value){ if($id['FROM']== $value['TAS_UID']){ $findFrom= 1; } if($id['TO']== $value['TAS_UID']){ $findTo = 1; } } if($findTo == 0){ foreach($routes as $keyR => $idR){ if($id['TO'] == $idR['ROUTE']){ $routeTransitions[$key]['ROU_TYPE'] = $idR['ROU_TYPE']; $routeTransitions[$key]['ROUTE'] = $id['TO']; $routeTransitions[$key]['TOORFROM'] = 'TO'; } } } if($findFrom == 0){ foreach($routes as $keyR => $idR){ if($id['FROM'] == $idR['ROUTE']){ $routeTransitions[$key]['ROU_TYPE'] = $idR['ROU_TYPE']; $routeTransitions[$key]['ROUTE'] = $id['FROM']; $routeTransitions[$key]['TOORFROM'] = 'FROM'; } } } } $result['ROUTES'] = $dataRoutes; $result['TRANSITIONS']= $routeTransitions; $result['NUMBER'] = $numberRoutes; $result['TASKS'] = $dataTasks; $result['HIDDEN'] = $taskHidden; return $result; } /** * This function convert the array events in a array with the events end * @param object $aEvents * @param string $idProcess * @return array */ function convertArrayEnd($aEvents,$idProcess) { $result = array(); $posEnd = 1; $endArray = array(); foreach($aEvents as $id => $value){ if($value['1']==='bpmnEventEndSignal' or $value['1']==='bpmnEventMessageEnd'){ $result['ID_PROCESS'] = $idProcess; $result['ID_TASK'] = $value['0']; $endArray[$posEnd] = $result; $posEnd = $posEnd+1; } } return $endArray; } /** * This function create transitions from the array transitions for the new processmap * @param array $task * @param array $routes * @param array $events * @param array $countEvents * @param array $arrayRoutes * @param array $countRoutes * @return array */ function createTransitionsPM($tasks,$routes,$events,$countEvents,$arrayRoutes,$countRoutes) { $cont = 0 ; $dataRoutes = ''; $endEvent = 1 ; $taskParallel = ''; $routeParallel = ''; $taskSecJoin = ''; $routeSecJoin = ''; $taskDiscriminator = ''; $taskEvaluate = ''; $routeEvaluate = ''; $taskParallelEv = ''; $routeParallelEv = ''; $taskSelect = ''; $routeSelect = ''; $routeEnd = ''; $arraySecJoin = array(); $position = 0; $fillColor = ''; $transitions = ''; $arrayGateways = array(); $countG = 0; foreach ($routes as $key => $row) { if($row['ROU_TYPE'] == 'SEC-JOIN'){ $arraySecJoin[$position] = array(); $arraySecJoin[$position] = $row; $position = $position + 1; unset($routes[$key]); } } $aux = $arraySecJoin ; foreach ($arraySecJoin as $key => $row) { $aux[$key]= $row['ROU_NEXT_TASK']; } if(sizeof($arraySecJoin) > 0){ array_multisort($aux,SORT_ASC,$arraySecJoin); unset($aux); } foreach ($routes as $key => $row) { $uid[$key] = $row['TAS_UID']; $case[$key] = $row['ROU_CASE']; } if(sizeof($routes) > 0){ array_multisort($uid, SORT_ASC, $case, SORT_ASC, $routes); } $routes = array_merge($routes,$arraySecJoin); foreach ($routes as $key => $val ) { $end = 0; $idRoute = $val['ROU_UID']; $idTask = $val['TAS_UID']; $nextTask = $val['ROU_NEXT_TASK']; $condition = htmlentities($val['ROU_CONDITION']); $toPort = $val['ROU_TO_PORT']; $fromPort = $val['ROU_FROM_PORT']; //If End Event if($nextTask == "-1"){ $end=1; } $typeRoute = $val['ROU_TYPE']; $route = ''; //Get GAT_UID from ROUTE table based on ROU_UID $oRoute = new Route ( ); $aRouteDetails = $oRoute->load($idRoute); $sGateUID = $aRouteDetails['GAT_UID']; if($sGateUID == '') $sGateUID = $idRoute; if ($typeRoute != "SEQUENTIAL" ){ switch($typeRoute){ case 'PARALLEL': $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } $positionX=$coordinateX+62; $positionY=$coordinateY+55; if($idTask != $taskParallel){ $taskParallel = $idTask; $routeParallel = $idRoute; $arrayGateways[$countG]['0'] = $sGateUID; $arrayGateways[$countG]['1'] = 'bpmnGatewayParallel'; $arrayGateways[$countG]['2'] = $positionX; $arrayGateways[$countG]['3'] = $positionY; $countG = $countG + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $taskParallel; $arrayRoutes[$countRoutes]['2']= $routeParallel; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $routeParallel; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } else{ $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $routeParallel; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } break; case 'SEC-JOIN': $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$nextTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } $positionX=$coordinateX+60; $positionY=$coordinateY-45; if($nextTask != $taskSecJoin){ $taskSecJoin = $nextTask; $routeSecJoin = $idRoute; $arrayGateways[$countG]['0'] = $sGateUID; $arrayGateways[$countG]['1'] = 'bpmnGatewayParallel'; $arrayGateways[$countG]['2'] = $positionX; $arrayGateways[$countG]['3'] = $positionY; $countG = $countG + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $routeSecJoin; $arrayRoutes[$countRoutes]['2']= $taskSecJoin; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $idTask; $arrayRoutes[$countRoutes]['2']= $routeSecJoin; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } else{ $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $idTask; $arrayRoutes[$countRoutes]['2']= $routeSecJoin; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } break; case 'EVALUATE': $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } $positionX=$coordinateX+62; $positionY=$coordinateY+55; if($idTask != $taskEvaluate){ $taskEvaluate = $idTask; $routeEvaluate = $idRoute; if($nextTask != "-1"){ $arrayGateways[$countG]['0'] = $sGateUID; $arrayGateways[$countG]['1'] = 'bpmnGatewayExclusiveData'; $arrayGateways[$countG]['2'] = $positionX; $arrayGateways[$countG]['3'] = $positionY; $countG = $countG + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $taskEvaluate; $arrayRoutes[$countRoutes]['2']= $routeEvaluate; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $routeEvaluate; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } } else{ if($nextTask !="-1"){ $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $routeEvaluate; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } else{ $routeEnd = $routeEvaluate; } } break; case 'PARALLEL-BY-EVALUATION': $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX = $idVal['TAS_POSX']; $coordinateY = $idVal['TAS_POSY']; } } $positionX=$coordinateX+62; $positionY=$coordinateY+55; if($idTask != $taskParallelEv){ $taskParallelEv = $idTask; $routeParallelEv = $idRoute; $arrayGateways[$countG]['0'] = $sGateUID; $arrayGateways[$countG]['1'] = 'bpmnGatewayInclusive'; $arrayGateways[$countG]['2'] = $positionX; $arrayGateways[$countG]['3'] = $positionY; $countG = $countG + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $taskParallelEv; $arrayRoutes[$countRoutes]['2']= $routeParallelEv; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $routeParallelEv; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } else{ $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $routeParallelEv; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } break; case 'SELECT': $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } $positionX=$coordinateX+60; $positionY=$coordinateY+40; if($idTask != $taskSelect){ $taskSelect = $idTask; $routeSelect = $idRoute; $arrayGateways[$countG]['0'] = $sGateUID; $arrayGateways[$countG]['1'] = 'bpmnGatewayExclusiveData'; $arrayGateways[$countG]['2'] = $positionX; $arrayGateways[$countG]['3'] = $positionY; $countG = $countG + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $taskSelect; $arrayRoutes[$countRoutes]['2']= $routeSelect; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $routeSelect; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } else{ if($nextTask !="-1"){ $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $routeSelect; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } else{ $routeEnd = $routeSelect; } } break; case 'DISCRIMINATOR': $coordinateX = 0; $coordinateY = 0; $optional = $val['ROU_OPTIONAL']; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$nextTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } $positionX=$coordinateX+60; $positionY=$coordinateY-45; if($nextTask != $taskDiscriminator){ $taskDiscriminator = $nextTask; $routeDiscriminator = $idRoute; $arrayGateways[$countG]['0'] = $sGateUID; $arrayGateways[$countG]['1'] = 'bpmnGatewayComplex'; $arrayGateways[$countG]['2'] = $positionX; $arrayGateways[$countG]['3'] = $positionY; $countG = $countG + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $routeDiscriminator; $arrayRoutes[$countRoutes]['2']= $taskDiscriminator; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $idTask; $arrayRoutes[$countRoutes]['2']= $routeDiscriminator; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } else{ $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $idTask; $arrayRoutes[$countRoutes]['2']= $routeDiscriminator; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } break; } } if($end==1){ if($typeRoute == "SEQUENTIAL"){ $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } $positionX = $coordinateX+65; $positionY = $coordinateY+40; //$arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['0']= $idRoute; $arrayRoutes[$countRoutes]['1']= $idTask; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= $toPort; $arrayRoutes[$countRoutes]['4']= $fromPort; $countRoutes = $countRoutes + 1; } else{ $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } $positionX = $coordinateX + 120; $positionY = $coordinateY + 40; $idTask = $routeEnd; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $idTask; $arrayRoutes[$countRoutes]['2']= $idRoute; $arrayRoutes[$countRoutes]['3']= $toPort; $arrayRoutes[$countRoutes]['4']= $fromPort; $arrayRoutes[$countRoutes]['5']= $typeRoute; $countRoutes = $countRoutes + 1; } $events[$countEvents]['0'] = $idRoute; $events[$countEvents]['1'] = 'bpmnEventEmptyEnd'; $events[$countEvents]['2'] = $positionX-25; $events[$countEvents]['3'] = $positionY+35; $countEvents = $countEvents + 1; $end = 0; $endEvent = 0; } else{ if ($typeRoute == "SEQUENTIAL"){ //Will Check for Intermediate Timer $evn_uid = $val['ROU_EVN_UID']; if($evn_uid != '') { $coordinateX=0; $coordinateY=0; foreach ($tasks as $taskVal => $idVal ){ if($idVal['TAS_UID']==$idTask){ $coordinateX=$idVal['TAS_POSX']; $coordinateY=$idVal['TAS_POSY']; } } $positionX = $coordinateX + 65; $positionY = $coordinateY + 40; $oEvent = new Event(); $aEvent = $oEvent->load($evn_uid); $events[$countEvents]['0'] = $evn_uid; $events[$countEvents]['1'] = $aEvent['EVN_TYPE']; $events[$countEvents]['2'] = $positionX-25; $events[$countEvents]['3'] = $positionY+35; $countEvents = $countEvents + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $idTask; $arrayRoutes[$countRoutes]['2']= $evn_uid; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; $arrayRoutes[$countRoutes]['0']= G::generateUniqueID(); $arrayRoutes[$countRoutes]['1']= $evn_uid; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= '1'; $arrayRoutes[$countRoutes]['4']= '2'; $countRoutes = $countRoutes + 1; } else { $arrayRoutes[$countRoutes]['0']= $idRoute; $arrayRoutes[$countRoutes]['1']= $idTask; $arrayRoutes[$countRoutes]['2']= $nextTask; $arrayRoutes[$countRoutes]['3']= $toPort; $arrayRoutes[$countRoutes]['4']= $fromPort; $countRoutes = $countRoutes + 1; } } } } $data = array(); $data['GATEWAYS'] = $arrayGateways; $data['TRANSITION'] = $arrayRoutes; $data['EVENTS'] = $events; return $data; } /** * This function Removes duplicate values from an array bi-dimensional * @param array $array * @return array */ function super_unique($array) { $result = array_map("unserialize", array_unique(array_map("serialize", $array))); foreach ($result as $key => $value){ if ( is_array($value) ){ $result[$key] = $this->super_unique($value); } } return $result; } /** * This function create a array for open the process in the new processmap * @param array $array * @return array */ function createProcessPM($array) { $result = array(); $result['0'] = $array['PRO_UID']; $result['1'] = $array['PRO_TITLE']; $result['2'] = $array['PRO_DESCRIPTION']; return $result; } /** * This function creates an array for the lane that will be created according to the data given in an array * @param array $lanes * @return array $lane */ function createSubProcessesPM($array) { $arrayLanes = array(); $field = array(); foreach ($array as $key=> $value){ $field['0'] = $value['SWI_UID']; $field['1'] = $value['SWI_TEXT']; $field['2'] = $value['SWI_X']; $field['3'] = $value['SWI_Y']; $field['4'] = '';//$value['SWI_WIDTH']; $field['5'] = '';//$value['SWI_HEIGHT']; } return $arrayLanes; } /** * This function creates an array for the lane that will be created according to the data given in an array * @param array $lanes * @return array $lane */ function saveWebEntry($array) { $file = new DOMDocument(); foreach($array as $key => $value){ $link = $value->W_LINK; $link = split('>',$link); $link = split('<',$link[2]); $link = $link['0']; $uid = $value->W_PRO_UID; $name = $value->W_FILENAME; } } }