Beispiel #1
0
 public function searchByDomains($params, $allowed_domains)
 {
     $this->load($params);
     $domains_name = [];
     foreach ($allowed_domains as $domain) {
         $domains_name[] = $domain->name;
     }
     if ($this->status && $this->domain) {
         if ($this->status == "enabled") {
             $workflows = BpmWorkflow::find()->where(['domain' => $this->domain])->andWhere(['in', 'domain', $domains_name])->andWhere(['active' => BpmWorkflow::STATUS_ENABLED])->orderBy(['domain' => SORT_ASC]);
         } else {
             $workflows = BpmWorkflow::find()->where(['domain' => $this->domain])->andWhere(['in', 'domain', $domains_name])->andWhere(['active' => BpmWorkflow::STATUS_DISABLED])->orderBy(['domain' => SORT_ASC]);
         }
     } else {
         if ($this->domain) {
             $workflows = BpmWorkflow::find()->where(['domain' => $this->domain])->andWhere(['in', 'domain', $domains_name])->orderBy(['domain' => SORT_ASC]);
         } else {
             if ($this->status) {
                 if ($this->status == "enabled") {
                     $workflows = BpmWorkflow::find()->where(['in', 'domain', $domains_name])->andWhere(['in', 'domain', $domains_name])->andWhere(['active' => BpmWorkflow::STATUS_ENABLED])->orderBy(['domain' => SORT_ASC]);
                 } else {
                     $workflows = BpmWorkflow::find()->where(['in', 'domain', $domains_name])->andWhere(['in', 'domain', $domains_name])->andWhere(['active' => BpmWorkflow::STATUS_DISABLED])->orderBy(['domain' => SORT_ASC]);
                 }
             } else {
                 $workflows = BpmWorkflow::find()->where(['in', 'domain', $domains_name])->orderBy(['domain' => SORT_ASC]);
             }
         }
     }
     $dataProvider = new ActiveDataProvider(['query' => $workflows, 'sort' => false, 'pagination' => ['pageSize' => 15]]);
     return $dataProvider;
 }
Beispiel #2
0
use meican\bpm\models\BpmWorkflow;
use meican\base\grid\Grid;
\meican\bpm\assets\Index::register($this);
$this->params['header'] = ["Workflows", ['Home', 'Workflows']];
?>

<div class="box box-default">
    <div class="box-body">               
	<?php 
echo Grid::widget(['options' => ['class' => 'list'], 'dataProvider' => $data, 'filterModel' => $searchModel, 'id' => 'gridDevices', 'layout' => "{items}{summary}{pager}", 'columns' => array(['class' => 'yii\\grid\\ActionColumn', 'template' => '{delete}', 'contentOptions' => function ($model) {
    return ['class' => 'btn-delete', 'id' => $model->id];
}, 'buttons' => ['delete' => function ($url, $model) {
    return Html::a('<span class="fa fa-trash"></span>', '#');
}], 'headerOptions' => ['style' => 'width: 2%;']], ['class' => 'yii\\grid\\ActionColumn', 'template' => '{update}', 'buttons' => ['update' => function ($url, $model) {
    return Html::a('<span class="fa fa-pencil"></span>', $url);
}], 'headerOptions' => ['style' => 'width: 2%;']], ['class' => 'yii\\grid\\ActionColumn', 'template' => '{copy}', 'buttons' => ['copy' => function ($url, $model) {
    return Html::a('<span class="fa fa-copy"></span>', $url);
}], 'headerOptions' => ['style' => 'width: 2%;']], ['label' => Yii::t("bpm", 'Name'), 'value' => 'name', 'headerOptions' => ['style' => 'width: 35%;']], ['label' => Yii::t("bpm", 'Domain'), 'value' => 'domain', 'filter' => Html::activeDropDownList($searchModel, 'domain', ArrayHelper::map(BpmWorkflow::find()->select(["domain"])->distinct(true)->orderBy(['domain' => SORT_ASC])->asArray()->all(), 'domain', 'domain'), ['class' => 'form-control', 'prompt' => Yii::t("bpm", 'any')]), 'headerOptions' => ['style' => 'width: 35%;']], ['format' => 'raw', 'label' => 'Status', 'value' => function ($model) {
    return Html::input('checkbox', '', $model->id, ['id' => 'toggle-' . $model->id, 'class' => 'toggle-event-class', 'checked' => !$model->isDisabled(), 'data-toggle' => "toggle", 'data-size' => "mini", "data-on" => Yii::t("bpm", "Enabled"), "data-off" => Yii::t("bpm", "Disabled"), "data-width" => "100", "data-onstyle" => "success", "data-offstyle" => "warning"]);
}, 'filter' => Html::activeDropDownList($searchModel, 'status', ["enabled" => Yii::t("bpm", "Enabled"), "disabled" => Yii::t("bpm", "Disabled")], ['class' => 'form-control', 'prompt' => Yii::t("circuits", 'any')]), 'headerOptions' => ['style' => 'width: 18%;']])]);
?>
	</div>
</div>

<?php 
Modal::begin(['id' => 'delete-workflow-modal', 'headerOptions' => ['hidden' => 'hidden'], 'footer' => '<button id="delete-btn" class="btn btn-danger">' . Yii::t("bpm", "Delete") . '</button><button id="cancel-btn" class="btn btn-default">' . Yii::t("bpm", "Cancel") . '</button>']);
echo '<p style="text-align: left; height: 100%; width:100%;">' . Yii::t("bpm", "Delete this workflows?") . '</p>';
Modal::end();
Modal::begin(['id' => 'disable-workflow-modal', 'headerOptions' => ['hidden' => 'hidden'], 'footer' => '<button id="confirm-btn" class="btn btn-danger">' . Yii::t("bpm", "Yes") . '</button><button id="cancel-btn" class="btn btn-default">' . Yii::t("bpm", "Cancel") . '</button>']);
echo '<p style="text-align: left; height: 100%; width:100%;" id="disable-message"></p>';
Modal::end();
Beispiel #3
0
 /**
  * @param string $type
  */
 public function saveWorkflow($type = null)
 {
     if ($type != 'copy') {
         $request = json_decode($_POST['model'], true);
     } else {
         $request = json_decode($this->json, true);
     }
     if ($type == 'update') {
         $id = $_POST['id'];
     }
     $params = $request['params'];
     $working = json_decode($params['working']);
     //Read the nodes and check if them are complete
     $this->nodes = [];
     $idCount = 0;
     foreach ($working->modules as $module) {
         $node = new GraphNode();
         $node->id = $idCount;
         $node->setName($module->name);
         //If are elements that have camps to complete
         if ($node->type > 0 && $node->type < 20) {
             if ($node->type == 3) {
                 // Filter by bandwidth
                 if (isset($module->value->post)) {
                     if ($module->value->post->bandwidth != "") {
                         if (is_numeric($module->value->post->bandwidth)) {
                             $aux = $module->value->post->bandwidth;
                             $node->value = $aux;
                             $node->operator = $module->value->post->operator;
                         } else {
                             $msg = Yii::t("bpm", 'Please, insert a numeric bandwidth at the node:') . "\n" . Yii::t("bpm", $node->getRealName());
                             $response = array('error' => $msg);
                             echo json_encode($response);
                             return;
                         }
                     } else {
                         $msg = Yii::t("bpm", 'Please, insert a bandwidth at the node:') . "\n" . Yii::t("bpm", $node->getRealName());
                         $response = array('error' => $msg);
                         echo json_encode($response);
                         return;
                     }
                 } else {
                     $msg = Yii::t("bpm", 'Please, complete the node:') . "\n" . Yii::t("bpm", $node->getRealName());
                     $response = array('error' => $msg);
                     echo json_encode($response);
                     return;
                 }
             } else {
                 if ($node->type == 8) {
                     //Filter by duration
                     if (isset($module->value->post)) {
                         if ($module->value->post->duration != "") {
                             if (is_numeric($module->value->post->duration)) {
                                 $node->value = $module->value->post->duration . "_" . $module->value->post->unit;
                                 $node->operator = $module->value->post->operator;
                             } else {
                                 $msg = Yii::t("bpm", 'Please, insert a numeric duration at the node:') . "\n" . Yii::t("bpm", $node->getRealName());
                                 $response = array('error' => $msg);
                                 echo json_encode($response);
                                 return;
                             }
                         } else {
                             $msg = Yii::t("bpm", 'Please, insert a duration at the node:') . "\n" . Yii::t("bpm", $node->getRealName());
                             $response = array('error' => $msg);
                             echo json_encode($response);
                             return;
                         }
                     } else {
                         $msg = Yii::t("bpm", 'Please, complete the node:') . "\n" . Yii::t("bpm", $node->getRealName());
                         $response = array('error' => $msg);
                         echo json_encode($response);
                         return;
                     }
                 } else {
                     if ($node->type == 6) {
                         //Filter by schedule
                         if (isset($module->value->post)) {
                             $date = DateUtils::now();
                             $date = explode(" ", $date);
                             $date = $date[0];
                             $date = explode("-", $date);
                             $date = $date[2] . "/" . $date[1] . "/" . $date[0];
                             $init = $module->value->post->init[0];
                             $init .= ":" . $module->value->post->init[1];
                             $init = DateUtils::toUTC($date, $init);
                             $init = explode(" ", $init);
                             $init = $init[1];
                             $initAux = explode(":", $init);
                             $init = $initAux[0] . ':' . $initAux[1];
                             $module->value->post->init[0] = $initAux[0];
                             $module->value->post->init[1] = $initAux[1];
                             $finish = $module->value->post->finish[0];
                             $finish .= ":" . $module->value->post->finish[1];
                             $finish = DateUtils::toUTC($date, $finish);
                             $finish = explode(" ", $finish);
                             $finish = $finish[1];
                             $finishAux = explode(":", $finish);
                             $finish = $finishAux[0] . ':' . $finishAux[1];
                             $module->value->post->finish[0] = $finishAux[0];
                             $module->value->post->finish[1] = $finishAux[1];
                             $timeInterval = $init . '-' . $finish;
                             $node->value = $timeInterval;
                         } else {
                             $msg = Yii::t("bpm", 'Please, complete the node:') . "\n" . Yii::t("bpm", $node->getRealName());
                             $response = array('error' => $msg);
                             echo json_encode($response);
                             return;
                         }
                     } else {
                         if ($node->type == 1) {
                             //Filter by domain
                             if (isset($module->value->post)) {
                                 $node->operator = $module->value->post->dom_operator;
                                 $node->value = $module->value->post->value;
                             } else {
                                 $msg = Yii::t("bpm", 'Please, complete the node:') . "\n" . Yii::t("bpm", $node->getRealName());
                                 $response = array('error' => $msg);
                                 echo json_encode($response);
                                 return;
                             }
                         } else {
                             if (isset($module->value->post)) {
                                 $node->value = $module->value->post;
                             } else {
                                 $msg = Yii::t("bpm", 'Please, complete the node:') . "\n" . Yii::t("bpm", $node->getRealName());
                                 $response = array('error' => $msg);
                                 echo json_encode($response);
                                 return;
                             }
                         }
                     }
                 }
             }
         }
         $this->nodes[] = $node;
         $idCount++;
     }
     //Check if have a New Request and a Accept
     $haveNewRequest = false;
     $haveTerminalNode = false;
     foreach ($this->nodes as $node) {
         if ($node->type == 0) {
             if ($haveNewRequest == false) {
                 $haveNewRequest = true;
             } else {
                 $msg = Yii::t("bpm", 'Please, insert just one node ') . "\n" . Yii::t("bpm", $node->getRealName());
                 $response = array('error' => $msg);
                 echo json_encode($response);
                 return;
             }
         } else {
             if ($node->type == 20 || $node->type == 30) {
                 $haveTerminalNode = true;
             }
         }
     }
     if ($haveNewRequest == false) {
         $msg = Yii::t("bpm", 'Please, insert a Arriving a New Request node.');
         $response = array('error' => $msg);
         echo json_encode($response);
         return;
     }
     if ($haveTerminalNode == false) {
         $msg = Yii::t("bpm", 'Please, insert a Authorization Accept or Authorization Denied node.');
         $response = array('error' => $msg);
         echo json_encode($response);
         return;
     }
     //Save wires on their respective nodes
     foreach ($working->wires as $value) {
         if ($this->nodes[$value->src->moduleId]->type != 0) {
             if (strcmp($value->src->terminal, "_OUTPUT_YES") == 0) {
                 $this->nodes[$value->src->moduleId]->addAdjacency($value->tgt->moduleId, 0);
             } else {
                 $this->nodes[$value->src->moduleId]->addAdjacency($value->tgt->moduleId, 1);
             }
         } else {
             $this->nodes[$value->src->moduleId]->addAdjacency($value->tgt->moduleId, 0);
         }
         $this->nodes[$value->tgt->moduleId]->setEntryConnected();
     }
     //Print the nodes and their adjacencies for check
     foreach ($this->nodes as $node) {
         Yii::trace("Adjacencies node: " . Yii::t("bpm", $node->getRealName()) . ":");
         Yii::trace($node->entryConnected);
         foreach ($node->adjacency as $adjacency) {
             Yii::trace($adjacency);
         }
     }
     //Check if all nodes are connected
     foreach ($this->nodes as $node) {
         $res = $node->isConnected();
         if ($res == "notCon") {
             $msg = Yii::t("bpm", 'Please, connect the node:') . "\n" . Yii::t("bpm", $node->getRealName());
             $response = array('error' => $msg);
             echo json_encode($response);
             return;
         } else {
             if ($res == "repeated") {
                 $msg = Yii::t("bpm", 'Please, do not connect the two outputs of ') . Yii::t("bpm", $node->getRealName()) . Yii::t("bpm", ' in the same entry.');
                 $response = array('error' => $msg);
                 echo json_encode($response);
                 return;
             }
         }
     }
     //Search and remove repeated nodes
     $AcceptNodeId = -1;
     $DenyNodeId = -1;
     foreach ($this->nodes as $node) {
         if ($node->type == 20) {
             //Accept
             if ($AcceptNodeId == -1) {
                 $AcceptNodeId = $node->id;
             } else {
                 foreach ($this->nodes as $nodeAux) {
                     foreach ($nodeAux->adjacency as $adjacency) {
                         if ($adjacency == $node->id) {
                             if ($nodeAux->type != 0) {
                                 $nodeAux->addAdjacency($AcceptNodeId, $nodeAux->removeAdjacency($adjacency));
                             } else {
                                 $nodeAux->removeAdjacency($adjacency);
                                 $nodeAux->addAdjacency($AcceptNodeId, 0);
                             }
                         }
                     }
                 }
                 unset($this->nodes[$node->id]);
             }
         } else {
             if ($node->type == 30) {
                 //Deny
                 if ($DenyNodeId == -1) {
                     $DenyNodeId = $node->id;
                 } else {
                     foreach ($this->nodes as $nodeAux) {
                         foreach ($nodeAux->adjacency as $adjacency) {
                             if ($adjacency == $node->id) {
                                 if ($nodeAux->type != 0) {
                                     $way = $nodeAux->removeAdjacency($adjacency);
                                     $nodeAux->addAdjacency($DenyNodeId, $way);
                                 } else {
                                     $nodeAux->removeAdjacency($adjacency);
                                     $nodeAux->addAdjacency($DenyNodeId);
                                 }
                             }
                         }
                     }
                     unset($this->nodes[$node->id]);
                 }
             }
         }
     }
     //Print the nodes and their adjacencies for check
     foreach ($this->nodes as $node) {
         Yii::trace("Adjacencies node: " . Yii::t("bpm", $node->getRealName()) . ":");
         foreach ($node->adjacency as $adjacency) {
             Yii::trace($adjacency);
         }
     }
     //Save workflow in database
     $work = new BpmWorkflow();
     //If update remove depreciated Workflow
     if ($type == 'update') {
         $workAux = BpmWorkflow::findOne(['id' => $id]);
         if ($workAux != null) {
             $other = BpmWorkflow::findOne(['name' => $params['name'], 'domain' => $working->properties->domains_owner]);
             if (isset($other)) {
                 if ($other->id != $id) {
                     $response = array('error' => Yii::t("bpm", 'This name already exist in this Domain.'));
                     echo json_encode($response);
                     return;
                 }
             }
             $work = $workAux;
         }
     } else {
         if (BpmWorkflow::findOne(['name' => $params['name'], 'domain' => $working->properties->domains_owner])) {
             $response = array('error' => Yii::t("bpm", 'This name already exist in this Domain.'));
             echo json_encode($response);
             return;
         }
     }
     $work->name = $params['name'];
     $work->domain = $working->properties->domains_owner;
     $work->active = 0;
     //Monta json
     $request['params']['working'] = json_encode($working);
     $json_aux = json_encode($request);
     if ($type != 'copy') {
         $work->json = json_encode($request);
     } else {
         $work->json = $json_aux;
     }
     if (!$work->save()) {
         $response = array('error' => "Not saved.");
         Yii::trace($work);
         Yii::trace($work->getErrors());
         echo json_encode($response);
         return;
     }
     //Get workflow_id in DB
     $db_workflow_id = BpmWorkflow::findOne(['name' => $work->name, 'domain' => $working->properties->domains_owner])->id;
     //Save nodes
     BpmNode::deleteAll(['workflow_id' => $work->id]);
     foreach ($this->nodes as $node) {
         $nodeDB = new BpmNode();
         $nodeDB->workflow_id = $db_workflow_id;
         $nodeDB->type = $node->name;
         $nodeDB->index = $node->id;
         if ($node->value) {
             $nodeDB->value = $node->value;
         }
         if ($node->operator) {
             $nodeDB->operator = $node->operator;
         }
         if (!$nodeDB->save()) {
             BpmWorkflow::findOne(['id' => $db_workflow_id])->delete();
             Yii::trace($nodeDB->getErrors());
             $response = array('error' => Yii::t("bpm", 'Error. Not saved.'));
             echo json_encode($response);
             return;
         }
     }
     //Save wires
     foreach ($this->nodes as $node) {
         $nodeDB = BpmNode::findOne(['workflow_id' => $db_workflow_id, 'index' => $node->id]);
         if (isset($node->adjacency[0])) {
             $nodeDB->output_yes = BpmNode::findOne(['workflow_id' => $db_workflow_id, 'index' => $node->adjacency[0]])->id;
         }
         if (isset($node->adjacency[1])) {
             $nodeDB->output_no = BpmNode::findOne(['workflow_id' => $db_workflow_id, 'index' => $node->adjacency[1]])->id;
         }
         if (!$nodeDB->save()) {
             BpmWorkflow::findOne(['id' => $db_workflow_id])->delete();
             $response = array('error' => Yii::t("bpm", 'Error. Not saved.'));
             echo json_encode($response);
             return;
         }
     }
     $response = array('error' => null);
     echo json_encode($response);
 }
Beispiel #4
0
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getWorkflow()
 {
     return $this->hasOne(BpmWorkflow::className(), ['id' => 'workflow_id']);
 }
Beispiel #5
0
 /**
  * 
  * @param unknown $connection_id
  * @param unknown $domainTop
  */
 public static function startFlow($connection_id, $domainTop)
 {
     $domain = Domain::findOne(['name' => $domainTop]);
     $workflow = BpmWorkflow::findOne(['domain' => $domainTop, 'active' => 1]);
     Yii::trace("!!!! INICIA WORKFLOW !!!! ");
     Yii::trace("Connection ID: " . $connection_id);
     Yii::trace("Domain: " . $domainTop);
     if (isset($workflow) && isset($domain)) {
         Yii::trace("Workflow ID: " . $workflow->id);
         $initNode = BpmNode::findOne(['workflow_id' => $workflow->id, 'type' => 'New_Request']);
         $node = BpmNode::findOne(['id' => $initNode->output_yes]);
         $flowLine = new BpmFlow();
         $flowLine->node_id = $node->id;
         $flowLine->type = $node->type;
         $flowLine->value = $node->value;
         $flowLine->workflow_id = $workflow->id;
         $flowLine->connection_id = $connection_id;
         $flowLine->domain = $domainTop;
         if ($flowLine->type == 'Request_Group_Authorization' || $flowLine->type == 'Request_User_Authorization') {
             $flowLine->status = self::STATUS_WAITING;
         } else {
             $flowLine->status = self::STATUS_READY;
         }
         if ($node->operator != null) {
             $flowLine->operator = $node->operator;
         }
         if (!$flowLine->save()) {
             Yii::$app->getSession()->setFlash('error', 'Unsuccessful save');
         }
         return;
     } else {
         Yii::trace("Sem Workflow ATIVO.");
     }
     if (!$domain) {
         Yii::trace("Dominio não existe mais na base. ACEITO.");
     } else {
         if ($domain->default_policy == Domain::ACCEPT_ALL) {
             Yii::trace("ACEITO pela POLITICA PADRÃO.");
             $auth = new ConnectionAuth();
             $auth->domain = $domainTop;
             $auth->status = Connection::AUTH_STATUS_APPROVED;
             $auth->type = ConnectionAuth::TYPE_WORKFLOW;
             $auth->connection_id = $connection_id;
             $auth->save();
         } else {
             Yii::trace("NEGADO pela POLITICA PADRÃO.");
             BpmFlow::deleteAll(['connection_id' => $connection_id]);
             $conn = Connection::findOne(['id' => $connection_id]);
             $conn->auth_status = Connection::AUTH_STATUS_REJECTED;
             if (!$conn->save()) {
             }
             $auth = new ConnectionAuth();
             $auth->domain = $domainTop;
             $auth->status = Connection::AUTH_STATUS_REJECTED;
             $auth->type = ConnectionAuth::TYPE_WORKFLOW;
             $auth->connection_id = $connection_id;
             $auth->save();
         }
     }
 }
 public function actionSaveWorkflow()
 {
     $work = new BpmWorkflow();
     $work->saveWorkflow();
 }
Beispiel #7
0
 public function getOwnedWorkflows()
 {
     return BpmWorkflow::find()->where(['domain_id' => $this->id]);
 }