diff --git a/workflow/engine/classes/model/BpmnActivity.php b/workflow/engine/classes/model/BpmnActivity.php index b7f815cfa..f29cfd5d2 100644 --- a/workflow/engine/classes/model/BpmnActivity.php +++ b/workflow/engine/classes/model/BpmnActivity.php @@ -45,48 +45,19 @@ class BpmnActivity extends BaseBpmnActivity } } - // OVERRIDES - - public function setActUid($actUid) + public static function findOneBy($field, $value) { - parent::setActUid($actUid); - $this->bound->setElementUid($this->getActUid()); + $rows = self::findAllBy($field, $value); + + return empty($rows) ? null : $rows[0]; } - public function setPrjUid($prjUid) + public static function findAllBy($field, $value) { - parent::setPrjUid($prjUid); - $this->bound->setPrjUid($this->getPrjUid()); - } + $c = new Criteria('workflow'); + $c->add($field, $value, Criteria::EQUAL); - public function setProUid($proUid) - { - parent::setProUid($proUid); - - $process = BpmnProcessPeer::retrieveByPK($this->getProUid()); - $this->bound->setDiaUid($process->getDiaUid()); - } - - public function save($con = null) - { - parent::save($con); - - $this->setBoundDefaults(); - $this->bound->save($con); - } - - public function delete($con = null) - { - // first, delete the related bound object - if (! is_object($this->bound)) { - $this->bound = BpmnBound::findByElement('Activity', $this->getActUid()); - } - - if (is_object($this->bound)) { - $this->bound->delete($con); - } - - parent::delete($con); + return BpmnActivityPeer::doSelect($c); } public static function getAll($prjUid = null, $start = null, $limit = null, $filter = '', $returnType = null, $changeCaseTo=CASE_UPPER) @@ -118,10 +89,59 @@ class BpmnActivity extends BaseBpmnActivity break; } - + return $activities; } + // OVERRIDES + + public function setActUid($actUid) + { + parent::setActUid($actUid); + $this->bound->setElementUid($this->getActUid()); + } + + public function setPrjUid($prjUid) + { + parent::setPrjUid($prjUid); + $this->bound->setPrjUid($this->getPrjUid()); + } + + public function setProUid($proUid) + { + parent::setProUid($proUid); + + $process = BpmnProcessPeer::retrieveByPK($this->getProUid()); + $this->bound->setDiaUid($process->getDiaUid()); + } + + public function save($con = null) + { + parent::save($con); + + $this->setBoundDefaults(); + + if ($this->bound->getBouUid() == "") { + $this->bound->setBouUid(\ProcessMaker\Util\Hash::generateUID()); + } + + $this->bound->save($con); + } + + public function delete($con = null) + { + // first, delete the related bound object + if (! is_object($this->bound) || $this->bound->getBouUid() == "") { + $this->bound = BpmnBound::findByElement('Activity', $this->getActUid()); + } + + if (is_object($this->bound)) { + $this->bound->delete($con); + } + + parent::delete($con); + } + public function fromArray($data, $type = BasePeer::TYPE_FIELDNAME) { parent::fromArray($data, $type); @@ -143,7 +163,7 @@ class BpmnActivity extends BaseBpmnActivity $data = parent::toArray($type); $bouUid = $this->bound->getBouUid(); - if (empty($bouUid)) { + if (! empty($bouUid)) { $bound = BpmnBound::findByElement('Activity', $this->getActUid()); if (is_object($bound)) { diff --git a/workflow/engine/classes/model/BpmnBound.php b/workflow/engine/classes/model/BpmnBound.php index a2995e716..73ec071b2 100644 --- a/workflow/engine/classes/model/BpmnBound.php +++ b/workflow/engine/classes/model/BpmnBound.php @@ -17,16 +17,18 @@ require_once 'classes/model/om/BaseBpmnBound.php'; class BpmnBound extends BaseBpmnBound { public static function findOneBy($field, $value) + { + $rows = self::findAllBy($field, $value); + + return empty($rows) ? null : $rows[0]; + } + + public static function findAllBy($field, $value) { $c = new Criteria('workflow'); + $c->add($field, $value, Criteria::EQUAL); - $c->add($field, $value, CRITERIA::EQUAL ); - - $rs = ContentPeer::doSelectRS($c); - //$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $rs->next(); - - return $rs->getRow(); + return BpmnBoundPeer::doSelect($c); } public static function findByElement($type, $uid) diff --git a/workflow/engine/src/ProcessMaker/Project/BpmnProject.php b/workflow/engine/src/ProcessMaker/Project/BpmnProject.php index 1292b0eeb..6e6221375 100644 --- a/workflow/engine/src/ProcessMaker/Project/BpmnProject.php +++ b/workflow/engine/src/ProcessMaker/Project/BpmnProject.php @@ -46,6 +46,8 @@ class BpmnProject //extends ProjectHandler */ protected $project; + protected $prjUid; + /** * @var \BpmnProcess */ @@ -56,36 +58,6 @@ class BpmnProject //extends ProjectHandler */ protected $diagram; - /** - * @var array of \BpmnActivities objects - */ - protected $activities = array(); - - /** - * @var array of \BpmnEvents objects - */ - protected $events = array(); - - /** - * @var array on \BpmnFlow objects - */ - protected $flows = array(); - - /** - * @var array of \BpmnArtifact objects - */ - protected $artifacts = array(); - - /** - * @var array of \BpmnLaneset objects - */ - protected $laneset = array(); - - /** - * @var array of \BpmnLanes objects - */ - protected $lanes = array(); - public function __construct($data = null) { @@ -96,8 +68,15 @@ class BpmnProject //extends ProjectHandler public static function load($prjUid) { + $project = ProjectPeer::retrieveByPK($prjUid); + + if (! is_object($project)) { + return null; + } + $me = new BpmnProject(); - $me->project = ProjectPeer::retrieveByPK($prjUid); + $me->project = $project; + $me->prjUid = $me->project->getPrjUid(); return $me; } @@ -114,6 +93,31 @@ class BpmnProject //extends ProjectHandler $this->project->fromArray($data, BasePeer::TYPE_FIELDNAME); $this->project->setPrjCreateDate(date("Y-m-d H:i:s")); $this->project->save(); + + $this->prjUid = $this->project->getPrjUid(); + } + + public function remove() + { + /* + * 1. Remove Diagram related objects + * 2. Remove Project related objects + */ + + $activities = $this->getActivities(); + + foreach ($activities as $activity) { + $this->removeActivity($activity["ACT_UID"]); + } + + $process = ProcessPeer::retrieveByPK($this->getProcess("object")->getProUid()); + $process->delete(); + + $diagram = DiagramPeer::retrieveByPK($this->getDiagram("object")->getDiaUid()); + $diagram->delete(); + + $project = ProjectPeer::retrieveByPK($this->getUid()); + $project->delete(); } public function addDiagram($data = array()) @@ -164,37 +168,29 @@ class BpmnProject //extends ProjectHandler $activity->setProUid($this->getProcess("object")->getProUid()); $activity->save(); - $this->activities[$activity->getActUid()] = $activity; + return $activity->getActUid(); } - public function getActivity($actUid) + public function getActivity($actUid, $retType = 'array') { - if (empty($this->activities) || ! array_key_exists($actUid, $this->activities)) { - $activity = ActivityPeer::retrieveByPK($actUid); + $activity = ActivityPeer::retrieveByPK($actUid); - if (! is_object($activity)) { - return null; - } - - $this->activities[$actUid] = $activity; + if ($retType != "object" && ! empty($activity)) { + $activity = $activity->toArray(); } - return $this->activities[$actUid]; + return $activity; } - public function getActivities() + public function getActivities($retType = 'array') { - if (empty($this->activities)) { - $this->activities = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object'); - } + return Activity::getAll($this->getUid(), null, null, '', $retType); + } - $activitiesList = array(); - - foreach ($this->activities as $activity) { - $activitiesList[] = $activity->toArray(); - } - - return $activitiesList; + public function removeActivity($actUid) + { + $activity = ActivityPeer::retrieveByPK($actUid); + $activity->delete(); } public function addEvent($data) @@ -226,19 +222,9 @@ class BpmnProject //extends ProjectHandler return $this->events[$evnUid]; } - public function getEvents() + public function getEvents($retType) { - if (empty($this->events)) { - $this->events = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object'); - } - - $eventsList = array(); - - foreach ($this->events as $event) { - $eventsList[] = $event->toArray(); - } - - return $eventsList; + return Event::getAll($this->project->getPrjUid(), null, null, '', 'object'); } public function addGateway($data) @@ -270,19 +256,9 @@ class BpmnProject //extends ProjectHandler return $this->gateways[$gatUid]; } - public function getGateways() + public function getGateways($retType = 'array') { - if (empty($this->gateways)) { - $this->gateways = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object'); - } - - $gatewaysList = array(); - - foreach ($this->gateways as $gateway) { - $gatewaysList[] = $gateway->toArray(); - } - - return $gatewaysList; + return Activity::getAll($this->project->getPrjUid(), null, null, '', $retType); } public function addFlow($data) @@ -313,19 +289,9 @@ class BpmnProject //extends ProjectHandler return $this->flows[$floUid]; } - public function getFlows() + public function getFlows($retType = 'array') { - if (empty($this->flows)) { - $this->flows = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object'); - } - - $flowsList = array(); - - foreach ($this->flows as $flow) { - $flowsList[] = $flow->toArray(); - } - - return $flowsList; + return Activity::getAll($this->project->getPrjUid(), null, null, '', $retType); } public function addArtifact($data) @@ -383,7 +349,7 @@ class BpmnProject //extends ProjectHandler throw new \Exception("Error: There is not an initialized project."); } - return $this->project->getPrjUid(); + return $this->prjUid; } public function getProject($retType = "array") diff --git a/workflow/engine/src/Tests/Model/BpmnActivityTest.php b/workflow/engine/src/Tests/Model/BpmnActivityTest.php new file mode 100644 index 000000000..78fde8753 --- /dev/null +++ b/workflow/engine/src/Tests/Model/BpmnActivityTest.php @@ -0,0 +1,254 @@ +setPrjUid(self::$prjUid); + $project->setPrjName("Dummy Project"); + $project->save(); + + $process = new \BpmnDiagram(); + $process->setDiaUid(self::$diaUid); + $process->setPrjUid(self::$prjUid); + $process->save(); + + $process = new \BpmnProcess(); + $process->setProUid(self::$proUid); + $process->setPrjUid(self::$prjUid); + $process->setDiaUid(self::$diaUid); + $process->save(); + + self::$data1 = array( + "ACT_UID" => "864215906402045618170352f1198ddc", + "PRJ_UID" => self::$prjUid, + "PRO_UID" => self::$proUid, + "ACT_NAME" => "Activity #1", + "BOU_X" => "51", + "BOU_Y" => "52" + ); + + self::$data2 = array( + "ACT_UID" => "70352f1198ddc8642159064020456181", + "PRJ_UID" => self::$prjUid, + "PRO_UID" => self::$proUid, + "ACT_NAME" => "Activity #2", + "BOU_X" => "53", + "BOU_Y" => "54" + ); + } + + public static function tearDownAfterClass() + { + $activities = BpmnActivity::findAllBy(BpmnActivityPeer::PRJ_UID, self::$prjUid); + foreach ($activities as $activity) { + $activity->delete(); + } + + $bounds = BpmnBound::findAllBy(BpmnBoundPeer::PRJ_UID, self::$prjUid); + foreach ($bounds as $bound) { + $bound->delete(); + } + + $process = BpmnProcessPeer::retrieveByPK(self::$proUid); + $process->delete(); + + $diagram = BpmnDiagramPeer::retrieveByPK(self::$diaUid); + $diagram->delete(); + + $project = BpmnProjectPeer::retrieveByPK(self::$prjUid); + $project->delete(); + } + + public function testNew() + { + $activity = new BpmnActivity(); + $activity->setActUid(self::$data1["ACT_UID"]); + $activity->setPrjUid(self::$data1["PRJ_UID"]); + $activity->setProUid(self::$data1["PRO_UID"]); + $activity->setActName(self::$data1["ACT_NAME"]); + $activity->getBound()->setBouX(self::$data1["BOU_X"]); + $activity->getBound()->setBouY(self::$data1["BOU_Y"]); + $activity->save(); + + $activity2 = BpmnActivityPeer::retrieveByPK($activity->getActUid()); + + $this->assertNotNull($activity2); + + return $activity; + } + + public function testNewUsingFromArray() + { + $activity = new BpmnActivity(); + $activity->fromArray(self::$data2); + + $activity->save(); + + $activity2 = BpmnActivityPeer::retrieveByPK($activity->getActUid()); + + $this->assertNotNull($activity2); + + return $activity; + } + + /** + * @depends testNew + */ + public function testToArrayFromTestNew($activity) + { + $expected = array( + "ACT_UID" => self::$data1["ACT_UID"], + "PRJ_UID" => self::$data1["PRJ_UID"], + "PRO_UID" => self::$data1["PRO_UID"], + "ACT_NAME" => self::$data1["ACT_NAME"], + "ACT_TYPE" => "TASK", + "ACT_IS_FOR_COMPENSATION" => "0", + "ACT_START_QUANTITY" => "1", + "ACT_COMPLETION_QUANTITY" => "1", + "ACT_TASK_TYPE" => "EMPTY", + "ACT_IMPLEMENTATION" => "", + "ACT_INSTANTIATE" => "0", + "ACT_SCRIPT_TYPE" => "", + "ACT_SCRIPT" => "", + "ACT_LOOP_TYPE" => "NONE", + "ACT_TEST_BEFORE" => "0", + "ACT_LOOP_MAXIMUM" => "0", + "ACT_LOOP_CONDITION" => "", + "ACT_LOOP_CARDINALITY" => "0", + "ACT_LOOP_BEHAVIOR" => "NONE", + "ACT_IS_ADHOC" => "0", + "ACT_IS_COLLAPSED" => "1", + "ACT_COMPLETION_CONDITION" => "", + "ACT_ORDERING" => "PARALLEL", + "ACT_CANCEL_REMAINING_INSTANCES" => "1", + "ACT_PROTOCOL" => "", + "ACT_METHOD" => "", + "ACT_IS_GLOBAL" => "0", + "ACT_REFERER" => "", + "ACT_DEFAULT_FLOW" => "", + "ACT_MASTER_DIAGRAM" => "", + "DIA_UID" => "18171550f1198ddc8642045664020352", + "ELEMENT_UID" => self::$data1["ACT_UID"], + "BOU_ELEMENT" => "pm_canvas", + "BOU_ELEMENT_TYPE" => "bpmnActivity", + "BOU_X" => self::$data1["BOU_X"], + "BOU_Y" => self::$data1["BOU_Y"], + "BOU_WIDTH" => "0", + "BOU_HEIGHT" => "0", + "BOU_REL_POSITION" => "0", + "BOU_SIZE_IDENTICAL" => "0", + "BOU_CONTAINER" => "bpmnDiagram" + ); + + $result = $activity->toArray(); + $bouUid = $result["BOU_UID"]; + + $this->assertNotEmpty($bouUid); + $this->assertEquals(32, strlen($bouUid)); + + unset($result["BOU_UID"]); + + $this->assertEquals($expected, $result); + } + + /** + * @depends testNewUsingFromArray + */ + public function testToArrayFromTestNewUsingFromArray($activity) + { + $expected = array( + "ACT_UID" => self::$data2["ACT_UID"], + "PRJ_UID" => self::$data2["PRJ_UID"], + "PRO_UID" => self::$data2["PRO_UID"], + "ACT_NAME" => self::$data2["ACT_NAME"], + "ACT_TYPE" => "TASK", + "ACT_IS_FOR_COMPENSATION" => "0", + "ACT_START_QUANTITY" => "1", + "ACT_COMPLETION_QUANTITY" => "1", + "ACT_TASK_TYPE" => "EMPTY", + "ACT_IMPLEMENTATION" => "", + "ACT_INSTANTIATE" => "0", + "ACT_SCRIPT_TYPE" => "", + "ACT_SCRIPT" => "", + "ACT_LOOP_TYPE" => "NONE", + "ACT_TEST_BEFORE" => "0", + "ACT_LOOP_MAXIMUM" => "0", + "ACT_LOOP_CONDITION" => "", + "ACT_LOOP_CARDINALITY" => "0", + "ACT_LOOP_BEHAVIOR" => "NONE", + "ACT_IS_ADHOC" => "0", + "ACT_IS_COLLAPSED" => "1", + "ACT_COMPLETION_CONDITION" => "", + "ACT_ORDERING" => "PARALLEL", + "ACT_CANCEL_REMAINING_INSTANCES" => "1", + "ACT_PROTOCOL" => "", + "ACT_METHOD" => "", + "ACT_IS_GLOBAL" => "0", + "ACT_REFERER" => "", + "ACT_DEFAULT_FLOW" => "", + "ACT_MASTER_DIAGRAM" => "", + "DIA_UID" => "18171550f1198ddc8642045664020352", + "ELEMENT_UID" => self::$data2["ACT_UID"], + "BOU_ELEMENT" => "pm_canvas", + "BOU_ELEMENT_TYPE" => "bpmnActivity", + "BOU_X" => self::$data2["BOU_X"], + "BOU_Y" => self::$data2["BOU_Y"], + "BOU_WIDTH" => "0", + "BOU_HEIGHT" => "0", + "BOU_REL_POSITION" => "0", + "BOU_SIZE_IDENTICAL" => "0", + "BOU_CONTAINER" => "bpmnDiagram" + ); + + $result = $activity->toArray(); + $bouUid = $result["BOU_UID"]; + + $this->assertNotEmpty($bouUid); + $this->assertEquals(32, strlen($bouUid)); + + unset($result["BOU_UID"]); + + $this->assertEquals($expected, $result); + } + + /** + * @depends testNew + * @depends testNewUsingFromArray + * @param $activity1 \BpmnActivity + * @param $activity2 \BpmnActivity + */ + public function testDelete($activity1, $activity2) + { + $actUid = $activity1->getActUid(); + $activity = BpmnActivityPeer::retrieveByPK($actUid); + $activity->delete(); + + $this->assertNull(BpmnActivityPeer::retrieveByPK($actUid)); + // the previous call must delete the bound object related to activity too. + $this->assertNull(BpmnBound::findByElement("Activity", $actUid)); + + + $actUid = $activity2->getActUid(); + $activity = BpmnActivityPeer::retrieveByPK($actUid); + $activity->delete(); + + $this->assertNull(BpmnActivityPeer::retrieveByPK($actUid)); + // the previous call must delete the bound object related to activity too. + $this->assertNull(BpmnBound::findByElement("Activity", $actUid)); + } + +} \ No newline at end of file diff --git a/workflow/engine/src/Tests/ProcessMaker/BpmnProjectTest.php b/workflow/engine/src/Tests/ProcessMaker/BpmnProjectTest.php index b14e85dc4..dcc485625 100644 --- a/workflow/engine/src/Tests/ProcessMaker/BpmnProjectTest.php +++ b/workflow/engine/src/Tests/ProcessMaker/BpmnProjectTest.php @@ -43,8 +43,7 @@ class BpmnProjectTest extends PHPUnit_Framework_TestCase $bp->addDiagram($data); // Load from DB - $bpLoaded = BpmnProject::load($bp->getUid()); - $diagramData = $bpLoaded->getDiagram(); + $diagramData = $bp->getDiagram(); $this->assertEquals($data["DIA_NAME"], $diagramData["DIA_NAME"]); $this->assertEquals($bp->getUid(), $diagramData["PRJ_UID"]); @@ -66,9 +65,7 @@ class BpmnProjectTest extends PHPUnit_Framework_TestCase $bp->addProcess($data); // Load from DB - $bpLoaded = BpmnProject::load($bp->getUid()); - $processData = $bpLoaded->getProcess(); - + $processData = $bp->getProcess(); $this->assertEquals($data["PRO_NAME"], $processData["PRO_NAME"]); $this->assertEquals($bp->getUid(), $processData["PRJ_UID"]); @@ -87,15 +84,12 @@ class BpmnProjectTest extends PHPUnit_Framework_TestCase "BOU_Y" => "50" ); - $processData = $bp->getProcess(); - - // Save to DB $bp->addActivity($data); // Load from DB - $bpLoaded = BpmnProject::load($bp->getUid()); - $activities = $bpLoaded->getActivities(); + $processData = $bp->getProcess(); + $activities = $bp->getActivities(); $this->assertCount(1, $activities); @@ -105,8 +99,138 @@ class BpmnProjectTest extends PHPUnit_Framework_TestCase $this->assertEquals($value, $activityData[$key]); } - $this->assertEquals($bpLoaded->getUid(), $activityData["PRJ_UID"]); + $this->assertEquals($bp->getUid(), $activityData["PRJ_UID"]); $this->assertEquals($processData["PRO_UID"], $activityData["PRO_UID"]); } + + /** + * @depends testCreate + * @param $bp \ProcessMaker\Project\BpmnProject + * @return array + */ + public function testAddActivityWithUid($bp) + { + $actUid = "f1198ddc864204561817155064020352"; + + $data = array( + "ACT_UID" => $actUid, + "ACT_NAME" => "Activity #X", + "BOU_X" => "50", + "BOU_Y" => "50" + ); + + // Save to DB + $bp->addActivity($data); + + // Load from DB + $activities = $bp->getActivities(); + + $uids = array(); + + foreach ($activities as $activity) { + array_push($uids, $activity["ACT_UID"]); + } + + $this->assertTrue(in_array($actUid, $uids)); + + return $data; + } + + /** + * @depends testCreate + * @depends testAddActivityWithUid + * @param $bp \ProcessMaker\Project\BpmnProject + * @param $data + */ + public function testGetActivity($bp, $data) + { + // Load from DB + $activityData = $bp->getActivity($data["ACT_UID"]); + + // in data is set the determinated UID for activity created in previous step + foreach ($data as $key => $value) { + $this->assertEquals($value, $activityData[$key]); + } + + // Testing with an invalid uid + $this->assertNull($bp->getActivity("INVALID-UID")); + } + + /** + * @depends testCreate + * @depends testAddActivityWithUid + * @param $bp \ProcessMaker\Project\BpmnProject + * @param $data + */ + public function testRemoveActivity($bp, $data) + { + $this->assertCount(2, $bp->getActivities()); + + $bp->removeActivity($data["ACT_UID"]); + + $this->assertCount(1, $bp->getActivities()); + } + + public function testGetActivities() + { + // Create a new BpmnProject and save to DB + $bp = new BpmnProject(array( + "PRJ_NAME" => "Test BPMN Project #2", + "PRJ_DESCRIPTION" => "Description for - Test BPMN Project #1", + "PRJ_AUTHOR" => "00000000000000000000000000000001" + )); + $bp->addDiagram(); + $bp->addProcess(); + + $this->assertCount(0, $bp->getActivities()); + + // Save to DB + $bp->addActivity(array( + "ACT_NAME" => "Activity #2", + "BOU_X" => "50", + "BOU_Y" => "50" + )); + + $bp->addActivity(array( + "ACT_NAME" => "Activity #3", + "BOU_X" => "50", + "BOU_Y" => "50" + )); + + $this->assertCount(2, $bp->getActivities()); + + return $bp; + } + + /** + * @depends testGetActivities + * @param $bp \ProcessMaker\Project\BpmnProject + * @return null|\ProcessMaker\Project\BpmnProject + */ + public function testLoad($bp) + { + $prjUid = $bp->getUid(); + $bp2 = BpmnProject::load($prjUid); + + $this->assertNotNull($bp2); + $this->assertEquals($bp->getActivities(), $bp2->getActivities()); + $this->assertEquals($bp->getDiagram(), $bp2->getDiagram()); + $this->assertEquals($bp->getProcess(), $bp2->getProcess()); + + return $bp2; + } + + /** + * @depends testLoad + * @param $bp \ProcessMaker\Project\BpmnProject + */ + public function testRemove($bp) + { + $prjUid = $bp->getUid(); + + $bp->remove(); + + $this->assertNull(BpmnProject::load($prjUid)); + } } diff --git a/workflow/engine/src/Tests/pm-bootstrap.php b/workflow/engine/src/Tests/pm-bootstrap.php index a641f26ae..1d58d659d 100644 --- a/workflow/engine/src/Tests/pm-bootstrap.php +++ b/workflow/engine/src/Tests/pm-bootstrap.php @@ -68,6 +68,7 @@ Bootstrap::LoadThirdParty("smarty/libs", "Smarty.class"); Bootstrap::registerSystemClasses(); Bootstrap::registerDir('src', PATH_HOME . 'engine/src/'); +Bootstrap::registerDir('model', PATH_CORE . 'classes' . PATH_SEP . 'model'); $config = System::getSystemConfiguration();