Bulkl path fix reverse

This commit is contained in:
Dennis Eichhorn 2017-02-12 21:43:10 +01:00
parent 5211020f9b
commit 1460a646f7
35 changed files with 2623 additions and 0 deletions

44
Admin/Activate.php Normal file
View File

@ -0,0 +1,44 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Admin;
use phpOMS\DataStorage\Database\DatabasePool;
use phpOMS\Module\ActivateAbstract;
use phpOMS\Module\InfoManager;
/**
* Navigation class.
*
* @category Modules
* @package Modules\Admin
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class Activate extends ActivateAbstract
{
/**
* {@inheritdoc}
*/
public static function activate(DatabasePool $dbPool, InfoManager $info)
{
parent::activate($dbPool, $info);
}
}

44
Admin/Deactivate.php Normal file
View File

@ -0,0 +1,44 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Admin;
use phpOMS\DataStorage\Database\DatabasePool;
use phpOMS\Module\DeactivateAbstract;
use phpOMS\Module\InfoManager;
/**
* Navigation class.
*
* @category Modules
* @package Modules\Admin
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class Deactivate extends DeactivateAbstract
{
/**
* {@inheritdoc}
*/
public static function deactivate(DatabasePool $dbPool, InfoManager $info)
{
parent::deactivate($dbPool, $info);
}
}

View File

@ -0,0 +1,79 @@
[
{
"id": 1001101001,
"pid": "754a08ddf8bcb1cf22f310f09206dd783d42f7dd",
"type": 1,
"subtype": 1,
"name": "Tasks",
"uri": "/{/lang}/backend/task/dashboard?{?}",
"target": "self",
"icon": "fa fa-bolt",
"order": 15,
"from": "Tasks",
"permission": null,
"parent": 0,
"children": [
{
"id": 1001102001,
"pid": "43ec7cda8be033d7b20996708a2fca644e5dde86",
"type": 3,
"subtype": 1,
"name": "List",
"uri": "/{/lang}/backend/task/dashboard?{?}",
"target": "self",
"icon": null,
"order": 1,
"from": "Tasks",
"permission": null,
"parent": 1001101001,
"children": [
{
"id": 1001102101,
"pid": "43ec7cda8be033d7b20996708a2fca644e5dde86",
"type": 0,
"subtype": 1,
"name": "Tasks",
"uri": "/{/lang}/backend/task/single?{?}",
"target": "self",
"icon": null,
"order": 1,
"from": "Tasks",
"permission": null,
"parent": 1001102001,
"children": []
}
]
},
{
"id": 1001103001,
"pid": "43ec7cda8be033d7b20996708a2fca644e5dde86",
"type": 3,
"subtype": 1,
"name": "Create",
"uri": "/{/lang}/backend/task/create?{?}",
"target": "self",
"icon": null,
"order": 10,
"from": "Tasks",
"permission": null,
"parent": 1001101001,
"children": []
},
{
"id": 1001104001,
"pid": "43ec7cda8be033d7b20996708a2fca644e5dde86",
"type": 3,
"subtype": 1,
"name": "Analysis",
"uri": "/{/lang}/backend/task/analysis?{?}",
"target": "self",
"icon": null,
"order": 20,
"from": "Tasks",
"permission": null,
"parent": 1001101001,
"children": []
}
]
}
]

View File

@ -0,0 +1,40 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Admin\Install;
use phpOMS\DataStorage\Database\DatabasePool;
/**
* Navigation class.
*
* @category Modules
* @package Modules\Admin
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class Navigation
{
public static function install(string $path, DatabasePool $dbPool)
{
$navData = json_decode(file_get_contents(__DIR__ . '/Navigation.install.json'), true);
$class = '\\Modules\\Navigation\\Admin\\Installer';
/** @var $class \Modules\Navigation\Admin\Installer */
$class::installExternal($dbPool, $navData);
}
}

153
Admin/Installer.php Normal file
View File

@ -0,0 +1,153 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Admin;
use phpOMS\DataStorage\Database\DatabaseType;
use phpOMS\DataStorage\Database\DatabasePool;
use phpOMS\Module\InfoManager;
use phpOMS\Module\InstallerAbstract;
/**
* Tasks install class.
*
* @category Modules
* @package Modules\Tasks
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class Installer extends InstallerAbstract
{
/**
* {@inheritdoc}
*/
public static function install(string $path, DatabasePool $dbPool, InfoManager $info)
{
parent::install($path, $dbPool, $info);
switch ($dbPool->get('core')->getType()) {
case DatabaseType::MYSQL:
$dbPool->get('core')->con->beginTransaction();
$dbPool->get('core')->con->prepare(
'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'task` (
`task_id` int(11) NOT NULL AUTO_INCREMENT,
`task_title` varchar(60) DEFAULT NULL,
`task_desc` text NOT NULL,
`task_type` tinyint(1) NOT NULL,
`task_status` tinyint(1) NOT NULL,
`task_due` datetime NOT NULL,
`task_done` datetime DEFAULT NULL,
`task_schedule` int(11) DEFAULT NULL,
`task_created_by` int(11) NOT NULL,
`task_created_at` datetime NOT NULL,
PRIMARY KEY (`task_id`),
KEY `task_schedule` (`task_schedule`),
KEY `task_created_by` (`task_created_by`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;'
)->execute();
$dbPool->get('core')->con->prepare(
'ALTER TABLE `' . $dbPool->get('core')->prefix . 'task`
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_ibfk_1` FOREIGN KEY (`task_schedule`) REFERENCES `' . $dbPool->get('core')->prefix . 'schedule` (`schedule_id`),
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_ibfk_2` FOREIGN KEY (`task_created_by`) REFERENCES `' . $dbPool->get('core')->prefix . 'account` (`account_id`);'
)->execute();
$dbPool->get('core')->con->prepare(
'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'task_media` (
`task_media_id` int(11) NOT NULL AUTO_INCREMENT,
`task_media_src` int(11) NULL,
`task_media_dst` int(11) NULL,
PRIMARY KEY (`task_media_id`),
KEY `task_media_src` (`task_media_src`),
KEY `task_media_dst` (`task_media_dst`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;'
)->execute();
$dbPool->get('core')->con->prepare(
'ALTER TABLE `' . $dbPool->get('core')->prefix . 'task_media`
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_media_ibfk_1` FOREIGN KEY (`task_media_src`) REFERENCES `' . $dbPool->get('core')->prefix . 'task` (`task_id`),
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_media_ibfk_2` FOREIGN KEY (`task_media_dst`) REFERENCES `' . $dbPool->get('core')->prefix . 'media` (`media_id`);'
)->execute();
$dbPool->get('core')->con->prepare(
'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'task_account` (
`task_account_id` int(11) NOT NULL AUTO_INCREMENT,
`task_account_task` int(11) NOT NULL,
`task_account_seen` tinyint(1) NOT NULL,
`task_account_account` int(11) NOT NULL,
`task_account_type` tinyint(1) NOT NULL,
PRIMARY KEY (`task_account_id`),
KEY `task_account_task` (`task_account_task`),
KEY `task_account_account` (`task_account_account`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;'
)->execute();
$dbPool->get('core')->con->prepare(
'ALTER TABLE `' . $dbPool->get('core')->prefix . 'task_account`
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_account_ibfk_1` FOREIGN KEY (`task_account_task`) REFERENCES `' . $dbPool->get('core')->prefix . 'task` (`task_id`),
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_account_ibfk_2` FOREIGN KEY (`task_account_account`) REFERENCES `' . $dbPool->get('core')->prefix . 'account` (`account_id`);'
)->execute();
$dbPool->get('core')->con->prepare(
'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'task_element` (
`task_element_id` int(11) NOT NULL AUTO_INCREMENT,
`task_element_desc` text NOT NULL,
`task_element_task` int(11) NOT NULL,
`task_element_created_by` int(11) NOT NULL,
`task_element_status` tinyint(1) NOT NULL,
`task_element_due` datetime NOT NULL,
`task_element_forwarded` int(11) DEFAULT NULL,
`task_element_created_at` datetime NOT NULL,
PRIMARY KEY (`task_element_id`),
KEY `task_element_task` (`task_element_task`),
KEY `task_element_created_by` (`task_element_created_by`),
KEY `task_element_forwarded` (`task_element_forwarded`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;'
)->execute();
$dbPool->get('core')->con->prepare(
'ALTER TABLE `' . $dbPool->get('core')->prefix . 'task_element`
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_element_ibfk_1` FOREIGN KEY (`task_element_task`) REFERENCES `' . $dbPool->get('core')->prefix . 'task` (`task_id`),
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_element_ibfk_2` FOREIGN KEY (`task_element_created_by`) REFERENCES `' . $dbPool->get('core')->prefix . 'account` (`account_id`),
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_element_ibfk_3` FOREIGN KEY (`task_element_forwarded`) REFERENCES `' . $dbPool->get('core')->prefix . 'account` (`account_id`);'
)->execute();
$dbPool->get('core')->con->prepare(
'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'task_element_media` (
`task_element_media_id` int(11) NOT NULL AUTO_INCREMENT,
`task_element_media_src` int(11) NULL,
`task_element_media_dst` int(11) NULL,
PRIMARY KEY (`task_element_media_id`),
KEY `task_element_media_src` (`task_element_media_src`),
KEY `task_element_media_dst` (`task_element_media_dst`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;'
)->execute();
$dbPool->get('core')->con->prepare(
'ALTER TABLE `' . $dbPool->get('core')->prefix . 'task_element_media`
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_element_media_ibfk_1` FOREIGN KEY (`task_element_media_src`) REFERENCES `' . $dbPool->get('core')->prefix . 'task_element` (`task_element_id`),
ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'task_element_media_ibfk_2` FOREIGN KEY (`task_element_media_dst`) REFERENCES `' . $dbPool->get('core')->prefix . 'media` (`media_id`);'
)->execute();
$dbPool->get('core')->con->commit();
break;
}
}
}

18
Admin/Routes/Web/Api.php Normal file
View File

@ -0,0 +1,18 @@
<?php
use phpOMS\Router\RouteVerb;
return [
'^.*/api/task(\?.*|$)' => [
[
'dest' => '\Modules\Tasks\Controller:apiTaskCreate',
'verb' => RouteVerb::SET,
],
],
'^.*/api/task/element.*$' => [
[
'dest' => '\Modules\Tasks\Controller:apiTaskElementCreate',
'verb' => RouteVerb::SET,
],
],
];

View File

@ -0,0 +1,30 @@
<?php
use phpOMS\Router\RouteVerb;
return [
'^.*/backend/task/dashboard.*$' => [
[
'dest' => '\Modules\Tasks\Controller:viewTaskDashboard',
'verb' => RouteVerb::GET,
],
],
'^.*/backend/task/single.*$' => [
[
'dest' => '\Modules\Tasks\Controller:viewTaskView',
'verb' => RouteVerb::GET,
],
],
'^.*/backend/task/create.*$' => [
[
'dest' => '\Modules\Tasks\Controller:viewTaskCreate',
'verb' => RouteVerb::GET,
],
],
'^.*/backend/task/analysis.*$' => [
[
'dest' => '\Modules\Tasks\Controller:viewTaskAnalysis',
'verb' => RouteVerb::GET,
],
],
];

3
Admin/Routes/console.php Normal file
View File

@ -0,0 +1,3 @@
<?php
$moduleRoutes = [];

3
Admin/Routes/socket.php Normal file
View File

@ -0,0 +1,3 @@
<?php
$moduleRoutes = [];

55
Admin/Uninstall.php Normal file
View File

@ -0,0 +1,55 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Admin;
use phpOMS\DataStorage\Database\DatabasePool;
use phpOMS\DataStorage\Database\Schema\Builder;
use phpOMS\Module\InfoManager;
use phpOMS\Module\UninstallAbstract;
/**
* Navigation class.
*
* @category Modules
* @package Modules\Admin
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class Uninstall extends UninstallAbstract
{
/**
* {@inheritdoc}
*/
public static function uninstall(DatabasePool $dbPool, InfoManager $info)
{
parent::uninstall($dbPool, $info);
$query = new Builder($dbPool->get());
$query->prefix($dbPool->get('core')->getPrefix())->drop(
'task_element',
'task_account',
'task'
);
$dbPool->get()->con->prepare($query->toSql())->execute();
}
}

47
Admin/Update.php Normal file
View File

@ -0,0 +1,47 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Admin;
use phpOMS\DataStorage\Database\DatabasePool;
use phpOMS\Module\InfoManager;
use phpOMS\Module\UpdateAbstract;
use phpOMS\System\File\Directory;
/**
* Navigation class.
*
* @category Modules
* @package Modules\Admin
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class Update extends UpdateAbstract
{
/**
* {@inheritdoc}
*/
public static function update(DatabasePool $dbPool, InfoManager $info)
{
Directory::deletePath(__DIR__ . '/Update');
mkdir('Update');
parent::update($dbPool, $info);
}
}

279
Controller.php Normal file
View File

@ -0,0 +1,279 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks;
use Model\Message\FormValidation;
use Model\Message\Redirect;
use Model\Message\Reload;
use Modules\Tasks\Models\Task;
use Modules\Tasks\Models\TaskElement;
use Modules\Tasks\Models\TaskElementMapper;
use Modules\Tasks\Models\TaskMapper;
use Modules\Tasks\Models\TaskStatus;
use Modules\Tasks\Models\TaskType;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Module\ModuleAbstract;
use phpOMS\Module\WebInterface;
use phpOMS\Uri\UriFactory;
use phpOMS\Views\View;
/**
* Task class.
*
* @category Modules
* @package Modules\Tasks
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class Controller extends ModuleAbstract implements WebInterface
{
/**
* Module path.
*
* @var string
* @since 1.0.0
*/
/* public */ const MODULE_PATH = __DIR__;
/**
* Module version.
*
* @var string
* @since 1.0.0
*/
/* public */ const MODULE_VERSION = '1.0.0';
/**
* Module name.
*
* @var string
* @since 1.0.0
*/
/* public */ const MODULE_NAME = 'Tasks';
/**
* Providing.
*
* @var string
* @since 1.0.0
*/
protected static $providing = [
'Navigation'
];
/**
* Dependencies.
*
* @var string
* @since 1.0.0
*/
protected static $dependencies = [
];
/**
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return \Serializable
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function viewTaskDashboard(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable
{
$view = new View($this->app, $request, $response);
$view->setTemplate('/Modules/Tasks/Theme/Backend/task-dashboard');
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1001101001, $request, $response));
$tasks = TaskMapper::getNewest(25);
$view->addData('tasks', $tasks);
return $view;
}
/**
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return \Serializable
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function viewTaskView(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable
{
$view = new View($this->app, $request, $response);
$view->setTemplate('/Modules/Tasks/Theme/Backend/task-single');
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1001101001, $request, $response));
$task = TaskMapper::get((int) $request->getData('id'));
$view->addData('task', $task);
return $view;
}
/**
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return \Serializable
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function viewTaskCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable
{
$view = new View($this->app, $request, $response);
$view->setTemplate('/Modules/Tasks/Theme/Backend/task-create');
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1001101001, $request, $response));
return $view;
}
/**
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return \Serializable
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function viewTaskAnalysis(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable
{
$view = new View($this->app, $request, $response);
$view->setTemplate('/Modules/Tasks/Theme/Backend/task-analysis');
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1001101001, $request, $response));
return $view;
}
private function validateTaskCreate(RequestAbstract $request) : array
{
$val = [];
if (
($val['title'] = empty($request->getData('title')))
|| ($val['description'] = empty($request->getData('description')))
|| ($val['due'] = !((bool)strtotime($request->getData('due'))))
|| ($val['forward'] = !(is_numeric($request->getData('forward') ?? 0)))
) {
return $val;
}
return [];
}
public function openNav(int $account) : int
{
return TaskMapper::countUnread($account);
}
/**
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return \Serializable
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function apiTaskCreate(RequestAbstract $request, ResponseAbstract $response, $data = null)
{
if (!empty($val = $this->validateTaskCreate($request))) {
$response->set('task_create', new FormValidation($val));
return;
}
$task = new Task();
$task->setTitle($request->getData('title') ?? '');
$task->setDescription($request->getData('description') ?? '');
$task->setCreatedBy($request->getAccount());
$task->setCreatedAt(new \DateTime('now'));
$task->setDue(new \DateTime($request->getData('due') ?? 'now'));
$task->setStatus(TaskStatus::OPEN);
$task->setType(TaskType::SINGLE);
$element = new TaskElement();
$element->setForwarded($request->getData('forward') ?? $request->getAccount());
$element->setCreatedAt($task->getCreatedAt());
$element->setCreatedBy($task->getCreatedBy());
$element->setDue($task->getDue());
$element->setStatus(TaskStatus::OPEN);
$task->addElement($element);
TaskMapper::create($task);
$response->set($request->__toString(), $task->jsonSerialize());
}
private function validateTaskElementCreate(RequestAbstract $request) : array
{
$val = [];
if (
($val['status'] = !TaskStatus::isValidValue((int) $request->getData('status')))
|| ($val['due'] = !((bool)strtotime($request->getData('due'))))
|| ($val['task'] = !(is_numeric($request->getData('task'))))
|| ($val['forward'] = !(is_numeric(empty($request->getData('forward')) ? $request->getAccount() : $request->getData('forward'))))
) { // todo: validate correct task
return $val;
}
return [];
}
/**
* @param RequestAbstract $request Request
* @param ResponseAbstract $response Response
* @param mixed $data Generic data
*
* @return \Serializable
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function apiTaskElementCreate(RequestAbstract $request, ResponseAbstract $response, $data = null)
{
if (!empty($val = $this->validateTaskElementCreate($request))) {
$response->set('task_element_create', new FormValidation($val));
return;
}
$element = new TaskElement();
$element->setForwarded($request->getData('forward') ?? $request->getAccount());
$element->setCreatedAt(new \DateTime('now'));
$element->setCreatedBy($request->getAccount());
$element->setDue(new \DateTime($request->getData('due') ?? 'now'));
$element->setStatus($request->getData('status'));
$element->setTask($request->getData('task'));
$element->setDescription($request->getData('description'));
TaskElementMapper::create($element);
$response->set($request->__toString(), $element->jsonSerialize());
}
}

34
Models/NullTask.php Normal file
View File

@ -0,0 +1,34 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright 2013 Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
/**
* Task class.
*
* @category Modules
* @package Framework
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class NullTask extends Task
{
}

View File

@ -0,0 +1,34 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
/**
* Task class.
*
* @category Modules
* @package Framework
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class NullTaskElement extends TaskElement
{
}

0
Models/Stats.php Normal file
View File

447
Models/Task.php Normal file
View File

@ -0,0 +1,447 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
use Modules\Calendar\Models\Schedule;
use phpOMS\Datatypes\Exception\InvalidEnumValue;
/**
* Task class.
*
* @category Tasks
* @package Modules
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class Task implements \JsonSerializable
{
/**
* ID.
*
* @var int
* @since 1.0.0
*/
protected $id = 0;
/**
* Title.
*
* @var string
* @since 1.0.0
*/
protected $title = '';
/**
* Creator.
*
* @var int
* @since 1.0.0
*/
protected $createdBy = 0;
/**
* Created.
*
* @var \DateTime
* @since 1.0.0
*/
protected $createdAt = null;
/**
* Description.
*
* @var string
* @since 1.0.0
*/
protected $description = '';
/**
* Type.
*
* @var TaskType
* @since 1.0.0
*/
protected $type = TaskType::SINGLE;
/**
* Status.
*
* @var TaskStatus
* @since 1.0.0
*/
protected $status = TaskStatus::OPEN;
/**
* Due.
*
* @var \DateTime
* @since 1.0.0
*/
protected $due = null;
/**
* Done.
*
* @var \DateTime
* @since 1.0.0
*/
protected $done = null;
/**
* Task elements.
*
* @var TaskElement[]
* @since 1.0.0
*/
protected $taskElements = [];
/**
* Schedule
*
* @var Schedule
* @since 1.0.0
*/
protected $schedule = null;
protected $media = [];
/**
* Constructor.
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function __construct()
{
$this->createdAt = new \DateTime('now');
$this->due = new \DateTime('now');
$this->due->modify('+1 day');
$this->schedule = new Schedule();
}
/**
* Adding new task element.
*
* @param TaskElement $element Task element
*
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function addElement(TaskElement $element) : int
{
$this->taskElements[] = $element;
end($this->taskElements);
$key = key($this->taskElements);
reset($this->taskElements);
return $key;
}
/**
* @return \DateTime
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getCreatedAt() : \DateTime
{
return $this->createdAt ?? new \DateTime();
}
/**
* @param \DateTime $created
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setCreatedAt(\DateTime $created)
{
$this->createdAt = $created;
}
/**
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getCreatedBy() : int
{
return $this->createdBy;
}
/**
* @param int $id
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setCreatedBy(int $id)
{
$this->createdBy = $id;
$this->schedule->setCreatedBy($id);
}
/**
* @return string
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getDescription() : string
{
return $this->description;
}
/**
* @param string $description
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setDescription(string $description)
{
$this->description = $description;
}
/**
* @return \DateTime
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getDone() : \DateTime
{
return $this->done ?? new \DateTime('now');
}
/**
* @param \DateTime $done
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setDone(\DateTime $done)
{
$this->done = $done;;
}
/**
* @return \DateTime
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getDue() : \DateTime
{
return $this->due;
}
/**
* @param \DateTime $due
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setDue(\DateTime $due)
{
$this->due = $due;
}
/**
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getId() : int
{
return $this->id;
}
/**
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getStatus() : int
{
return $this->status;
}
/**
* @param int $status
*
* @throws InvalidEnumValue
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setStatus(int $status)
{
if(!TaskStatus::isValidValue($status)) {
throw new InvalidEnumValue($status);
}
$this->status = $status;
}
/**
* @return string
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getTitle() : string
{
return $this->title;
}
/**
* @param string $title
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setTitle(string $title)
{
$this->title = $title;
}
/**
* Remove Element from list.
*
* @param int $id Task element
*
* @return bool
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function removeElement($id) : bool
{
if (isset($this->taskElements[$id])) {
unset($this->taskElements[$id]);
return true;
}
return false;
}
/**
* Get task elements.
*
* @return TaskElement[]
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getTaskElements() : array
{
return $this->taskElements;
}
/**
* Get task elements.
*
* @param int $id Element id
*
* @return TaskElement
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getTaskElement(int $id) : TaskElement
{
return $this->taskElements[$id] ?? new NullTaskElement();
}
/**
* Get task type.
*
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getType() : int
{
return $this->type;
}
/**
* Set task type.
*
* @param int $type Task type
*
* @return void
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setType(int $type = TaskType::SINGLE)
{
$this->type = $type;
}
/**
* Get schedule.
*
* @return Schedule
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getSchedule() : Schedule {
return $this->schedule;
}
private function toArray() : array
{
return [
'id' => $this->id,
'createdBy' => $this->createdBy,
'createdAt' => $this->createdAt,
'title' => $this->title,
'description' => $this->description,
'status' => $this->status,
'type' => $this->type,
'type' => $this->type,
'due' => $this->due->format('Y-m-d H:i:s'),
'done' => (!isset($this->done) ? null : $this->done->format('Y-m-d H:i:s')),
];
}
/**
* Specify data which should be serialized to JSON
* @link http://php.net/manual/en/jsonserializable.jsonserialize.php
* @return mixed data which can be serialized by <b>json_encode</b>,
* which is a value of any type other than a resource.
* @since 5.4.0
*/
public function jsonSerialize()
{
return $this->toArray();
}
}

317
Models/TaskElement.php Normal file
View File

@ -0,0 +1,317 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
use phpOMS\Datatypes\Exception\InvalidEnumValue;
/**
* Task class.
*
* @category Modules
* @package Framework
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class TaskElement implements \JsonSerializable
{
/**
* Id.
*
* @var int
* @since 1.0.0
*/
private $id = 0;
/**
* Description.
*
* @var string
* @since 1.0.0
*/
private $description = '';
/**
* Task.
*
* @var int
* @since 1.0.0
*/
private $task = 0;
/**
* Creator.
*
* @var int
* @since 1.0.0
*/
private $createdBy = 0;
/**
* Created.
*
* @var \DateTime
* @since 1.0.0
*/
private $createdAt = null;
/**
* Status.
*
* @var int
* @since 1.0.0
*/
private $status = TaskStatus::OPEN;
/**
* Due.
*
* @var \DateTime
* @since 1.0.0
*/
private $due = null;
/**
* Forwarded to.
*
* @var int
* @since 1.0.0
*/
private $forwarded = 0;
private $media = [];
/**
* Constructor.
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function __construct()
{
$this->due = new \DateTime('now');
$this->due->modify('+1 day');
$this->createdAt = new \DateTime('now');
}
/**
* @return \DateTime
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getCreatedAt() : \DateTime
{
return $this->createdAt;
}
/**
* @param \DateTime $created
*
* @return void
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setCreatedAt(\DateTime $created)
{
$this->createdAt = $created;
}
/**
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getCreatedBy() : int
{
return $this->createdBy;
}
/**
* @param int $creator
*
* @return void
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setCreatedBy(int $creator)
{
$this->createdBy = $creator;
if($this->forwarded === 0) {
$this->setForwarded($this->createdBy);
}
}
/**
* @return string
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getDescription() : string
{
return $this->description;
}
/**
* @param string $description
*
* @return void
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setDescription(string $description)
{
$this->description = $description;
}
/**
* @return \DateTime
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getDue() : \DateTime
{
return $this->due;
}
/**
* @param \DateTime $due
*
* @return void
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setDue(\DateTime $due)
{
$this->due = $due;
}
/**
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getForwarded() : int
{
return $this->forwarded;
}
/**
* @param int $forwarded
*
* @return void
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setForwarded(int $forwarded)
{
$this->forwarded = $forwarded;
}
/**
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getId() : int
{
return $this->id;
}
/**
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getStatus() : int
{
return $this->status;
}
/**
* @param int $status
*
* @return void
*
* @throws InvalidEnumValue
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setStatus(int $status)
{
if(!TaskStatus::isValidValue($status)) {
throw new InvalidEnumValue($status);
}
$this->status = $status;
}
/**
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getTask() : int
{
return $this->task;
}
/**
* @param int $task
*
* @return void
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setTask(int $task)
{
$this->task = $task;
}
public function toArray() : array {
return [
'id' => $this->id,
'task' => $this->task,
'createdBy' => $this->createdBy,
'createdAt' => $this->createdAt,
'description' => $this->description,
'status' => $this->status,
'forward' => $this->forwarded,
'due' => isset($this->due) ? $this->due->format('Y-m-d H:i:s') : null,
];
}
public function jsonSerialize() {
return $this->toArray();
}
}

View File

@ -0,0 +1,115 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
use Modules\Media\Models\MediaMapper;
use phpOMS\DataStorage\Database\DataMapperAbstract;
use phpOMS\DataStorage\Database\RelationType;
/**
* Mapper class.
*
* @category Tasks
* @package Modules
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class TaskElementMapper extends DataMapperAbstract
{
/**
* Columns.
*
* @var array
* @since 1.0.0
*/
protected static $columns = [
'task_element_id' => ['name' => 'task_element_id', 'type' => 'int', 'internal' => 'id'],
'task_element_desc' => ['name' => 'task_element_desc', 'type' => 'string', 'internal' => 'description'],
'task_element_status' => ['name' => 'task_element_status', 'type' => 'int', 'internal' => 'status'],
'task_element_due' => ['name' => 'task_element_due', 'type' => 'DateTime', 'internal' => 'due'],
'task_element_forwarded' => ['name' => 'task_element_forwarded', 'type' => 'int', 'internal' => 'forwarded'],
'task_element_task' => ['name' => 'task_element_task', 'type' => 'int', 'internal' => 'task'],
'task_element_created_by' => ['name' => 'task_element_created_by', 'type' => 'int', 'internal' => 'createdBy'],
'task_element_created_at' => ['name' => 'task_element_created_at', 'type' => 'DateTime', 'internal' => 'createdAt'],
];
/**
* Has many relation.
*
* @var array
* @since 1.0.0
*/
protected static $hasMany = [
'media' => [
'mapper' => MediaMapper::class,
'table' => 'task_element_media',
'dst' => 'task_element_media_dst',
'src' => 'task_element_media_src',
],
];
/**
* Primary table.
*
* @var string
* @since 1.0.0
*/
protected static $table = 'task_element';
/**
* Created at.
*
* @var string
* @since 1.0.0
*/
protected static $createdAt = 'task_created_at';
/**
* Primary field name.
*
* @var string
* @since 1.0.0
*/
protected static $primaryField = 'task_element_id';
/**
* Create object.
*
* @param mixed $obj Object
* @param int $relations Behavior for relations creation
*
* @return mixed
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public static function create($obj, int $relations = RelationType::ALL)
{
try {
$objId = parent::create($obj, $relations);
} catch (\Exception $e) {
var_dump($e->getMessage());
return false;
}
return $objId;
}
}

202
Models/TaskMapper.php Normal file
View File

@ -0,0 +1,202 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
use Modules\Calendar\Models\ScheduleMapper;
use Modules\Media\Models\MediaMapper;
use Modules\Tasks\Models\TaskElementMapper;
use phpOMS\DataStorage\Database\DataMapperAbstract;
use phpOMS\DataStorage\Database\Query\Builder;
use phpOMS\DataStorage\Database\Query\Column;
use phpOMS\DataStorage\Database\RelationType;
/**
* Mapper class.
*
* @category Tasks
* @package Modules
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class TaskMapper extends DataMapperAbstract
{
/**
* Columns.
*
* @var array
* @since 1.0.0
*/
protected static $columns = [
'task_id' => ['name' => 'task_id', 'type' => 'int', 'internal' => 'id'],
'task_title' => ['name' => 'task_title', 'type' => 'string', 'internal' => 'title'],
'task_desc' => ['name' => 'task_desc', 'type' => 'string', 'internal' => 'description'],
'task_type' => ['name' => 'task_type', 'type' => 'int', 'internal' => 'type'],
'task_status' => ['name' => 'task_status', 'type' => 'int', 'internal' => 'status'],
'task_due' => ['name' => 'task_due', 'type' => 'DateTime', 'internal' => 'due'],
'task_done' => ['name' => 'task_done', 'type' => 'DateTime', 'internal' => 'done'],
'task_schedule' => ['name' => 'task_schedule', 'type' => 'int', 'internal' => 'schedule'],
'task_created_by' => ['name' => 'task_created_by', 'type' => 'int', 'internal' => 'createdBy'],
'task_created_at' => ['name' => 'task_created_at', 'type' => 'DateTime', 'internal' => 'createdAt'],
];
/**
* Has many relation.
*
* @var array
* @since 1.0.0
*/
protected static $hasMany = [
'taskElements' => [
'mapper' => TaskElementMapper::class,
'table' => 'task_element',
'dst' => 'task_element_task',
'src' => null,
],
'media' => [ // todo: maybe make this a has one and then link to collection instead of single media files!
'mapper' => MediaMapper::class,
'table' => 'task_media',
'dst' => 'task_media_dst',
'src' => 'task_media_src',
],
];
/**
* Has one relation.
*
* @var array
* @since 1.0.0
*/
protected static $ownsOne = [
'schedule' => [
'mapper' => ScheduleMapper::class,
'src' => 'task_schedule',
],
];
/**
* Primary table.
*
* @var string
* @since 1.0.0
*/
protected static $table = 'task';
/**
* Created at.
*
* @var string
* @since 1.0.0
*/
protected static $createdAt = 'task_created_at';
/**
* Primary field name.
*
* @var string
* @since 1.0.0
*/
protected static $primaryField = 'task_id';
/**
* Create object.
*
* @param mixed $obj Object
* @param int $relations Behavior for relations creation
*
* @return mixed
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public static function create($obj, int $relations = RelationType::ALL)
{
try {
$objId = parent::create($obj, $relations);
$query = new Builder(self::$db);
$query->prefix(self::$db->getPrefix())
->insert(
'account_permission_account',
'account_permission_from',
'account_permission_for',
'account_permission_id1',
'account_permission_id2',
'account_permission_r',
'account_permission_w',
'account_permission_m',
'account_permission_d',
'account_permission_p'
)
->into('account_permission')
->values($obj->getCreatedBy(), 'task', 'task', 1, $objId, 1, 1, 1, 1, 1);
self::$db->con->prepare($query->toSql())->execute();
} catch (\Exception $e) {
var_dump($e->getMessage());
return false;
}
return $objId;
}
public static function countUnread(int $user) : int
{
try {
$query = new Builder(self::$db);
$query->prefix(self::$db->getPrefix())
->count()
->from(self::$table)
->where(self::$table . '.task_created_by', '=', $user)
->where(self::$table . '.task_status', '=', TaskStatus::OPEN, 'and');
$sth = self::$db->con->prepare($query->toSql());
$sth->execute();
$count = $sth->fetchAll()[0][0] ?? 0;
} catch (\Exception $e) {
var_dump($e->getMessage());
return false;
}
return $count;
}
/**
* Find.
*
* @param array $columns Columns to select
*
* @return Builder
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public static function find(...$columns) : Builder
{
return parent::find(...$columns)->from('account_permission')
->where('account_permission.account_permission_for', '=', 'task')
->where('account_permission.account_permission_id1', '=', 1)
->where('task.task_id', '=', new Column('account_permission.account_permission_id2'))
->where('account_permission.account_permission_r', '=', 1);
}
}

42
Models/TaskPriority.php Normal file
View File

@ -0,0 +1,42 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
use phpOMS\Datatypes\Enum;
/**
* Task priority enum.
*
* @category Tasks
* @package Modules
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
abstract class TaskPriority extends Enum
{
/* public */ const VLOW = 1;
/* public */ const LOW = 2;
/* public */ const MEDIUM = 3;
/* public */ const HIGH = 4;
/* public */ const VHIGH = 5;
}

44
Models/TaskStatus.php Normal file
View File

@ -0,0 +1,44 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
use phpOMS\Datatypes\Enum;
/**
* Task status enum.
*
* @category Tasks
* @package Modules
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
abstract class TaskStatus extends Enum
{
/* public */ const OPEN = 1;
/* public */ const WORKING = 2;
/* public */ const SUSPENDED = 3;
/* public */ const CANCELED = 4;
/* public */ const DONE = 5;
/* public */ const CLOSED = 6;
}

38
Models/TaskTemplate.php Normal file
View File

@ -0,0 +1,38 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
/**
* Task class.
*
* @category Modules
* @package Tasks
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class TaskTemplate extends Task
{
/**
* Type.
*
* @var TaskType
* @since 1.0.0
*/
private $type = TaskType::TEMPLATE;
}

36
Models/TaskType.php Normal file
View File

@ -0,0 +1,36 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
use phpOMS\Datatypes\Enum;
/**
* Task type enum.
*
* @category Tasks
* @package Modules
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
abstract class TaskType extends Enum
{
/* public */ const TEMPLATE = 1;
/* public */ const SINGLE = 2;
/* public */ const HIDDEN = 3;
}

36
Models/TaskVisibility.php Normal file
View File

@ -0,0 +1,36 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace Modules\Tasks\Models;
use phpOMS\Datatypes\Enum;
/**
* Task status enum.
*
* @category Tasks
* @package Modules
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
abstract class TaskVisibility extends Enum
{
/* public */ const TO = 1;
/* public */ const CC = 2;
/* public */ const BCC = 3;
}

1
README.md Normal file
View File

@ -0,0 +1 @@
# Tasks #

View File

@ -0,0 +1,20 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
return ['Navigation' => [
'Analysis' => 'Analysis',
'Create' => 'Create',
'Tasks' => 'Tasks',
]];

View File

@ -0,0 +1,67 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
return ['Tasks' => [
'Account' => 'Account',
'All' => 'All',
'AverageProcessTime' => 'Avg. Process Time',
'AverageAmount' => 'Average Amount',
'BCC' => 'BCC',
'CC' => 'CC',
'Created' => 'Created',
'Creator' => 'Creator',
'Default' => 'Default',
'Day' => 'Day',
'Due' => 'Due',
'Forwarded' => 'Forwarded',
'From' => 'From',
'Group' => 'Group',
'History' => 'History',
'Interval' => 'Interval',
'InTime' => 'In Time',
'Message' => 'Message',
'Media' => 'Media',
'Month' => 'Month',
'Name' => 'Name',
'New' => 'New',
'Open' => 'Open',
'Person' => 'Person',
'Priority' => 'Priority',
'Received' => 'Received',
'Redirected' => 'Redirected',
'Select' => 'Select',
'Settings' => 'Settings',
'SharedVisibility' => 'Visibility is shared across all',
'Size' => 'Size',
'Statistics' => 'Statistics',
'Status' => 'Status',
'Task' => 'Task',
'Tasks' => 'Tasks',
'Template' => 'Template',
'Time' => 'Time',
'Title' => 'Title',
'To' => 'To',
'Today' => 'Today',
'Type' => 'Type',
'Upload' => 'Upload',
'Week' => 'Week',
'Year' => 'Year',
'S1' => 'Open',
'S2' => 'Working',
'S3' => 'Suspended',
'S4' => 'Canceled',
'S5' => 'Done',
'S6' => 'Closed',
]];

View File

@ -0,0 +1,3 @@
<section id="task-dashboard" draggable>
Task
</section>

View File

@ -0,0 +1,66 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
/**
* @var \phpOMS\Views\View $this
*/
echo $this->getData('nav')->render(); ?>
<div class="row">
<div class="col-xs-12 col-md-6">
<section class="box wf-100">
<header><h1><?= $this->getText('Account'); ?></h1></header>
<div class="inner">
<form>
<table class="layout wf-100">
<tr><td><label for="iAccount"><?= $this->getText('Account'); ?></label>
<tr><td><span class="input"><button type="button" formaction=""><i class="fa fa-book"></i></button><input type="number" min="1" id="iAccount" name="account" placeholder="&#xf007; Guest" required></span>
<tr><td><label for="iFrom"><?= $this->getText('From'); ?></label>
<tr><td><input type="datetime-local" id="iFrom" name="from" value="<?= (new \DateTime('NOW'))->format('Y-m-d\TH:i:s') ?>">
<tr><td><label for="iTo"><?= $this->getText('To'); ?></label>
<tr><td><input type="datetime-local" id="iTo" name="to" value="<?= (new \DateTime('NOW'))->format('Y-m-d\TH:i:s') ?>">
<tr><td><input type="submit" value="<?= $this->getText('Submit', 0, 0); ?>">
</table>
</form>
</div>
</section>
</div>
<div class="col-xs-12 col-md-6">
<section class="box wf-100">
<header><h1><?= $this->getText('Statistics'); ?></h1></header>
<div class="inner">
<table class="list wf-100">
<tr><td><?= $this->getText('Received'); ?><td>0
<tr><td><?= $this->getText('Created'); ?><td>0
<tr><td><?= $this->getText('Forwarded'); ?><td>0
<tr><td><?= $this->getText('AverageAmount'); ?><td>0
<tr><td><?= $this->getText('AverageProcessTime'); ?><td>0
<tr><td><?= $this->getText('InTime'); ?><td>0
</table>
</div>
</section>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<section class="box wf-100">
<header><h1><?= $this->getText('History'); ?></h1></header>
<div class="inner" style="height: 300px">
</div>
</section>
</div>
</div>

View File

@ -0,0 +1,66 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
/**
* @var \phpOMS\Views\View $this
*/
echo $this->getData('nav')->render(); ?>
<div class="row">
<div class="col-xs-12 col-md-6">
<section class="box wf-100">
<header><h1><?= $this->getText('Task'); ?></h1></header>
<div class="inner">
<form id="fTask" method="POST" action="<?= \phpOMS\Uri\UriFactory::build('/{/lang}/api/task?{?}&csrf={$CSRF}'); ?>">
<table class="layout wf-100">
<tbody>
<tr><td colspan="2"><label for="iReceiver"><?= $this->getText('To'); ?></label>
<tr><td><span class="input"><button type="button" data-action='[{"listener": "click", "action": [{"type": "popup", "tpl": "acc-grp-tpl", "aniIn": "fadeIn", "aniOut": "fadeOut", "stay": 5000}]}]' formaction=""><i class="fa fa-book"></i></button><input type="number" min="1" id="iReceiver" name="receiver" placeholder="&#xf007; Guest" required></span><td><button><?= $this->getText('Add', 0, 0); ?></button>
<tr><td colspan="2"><label for="iObserver"><?= $this->getText('CC'); ?></label>
<tr><td><span class="input"><button type="button" formaction=""><i class="fa fa-book"></i></button><input type="number" min="1" id="iObserver" name="observer" placeholder="&#xf007; Guest"></span><td><button><?= $this->getText('Add', 0, 0); ?></button>
<tr><td colspan="2"><label for="iDue"><?= $this->getText('Due'); ?></label>
<tr><td><input type="datetime-local" id="iDue" name="due" value="<?= (new \DateTime('NOW'))->format('Y-m-d\TH:i:s') ?>"><td>
<tr><td colspan="2"><label for="iTitle"><?= $this->getText('Title'); ?></label>
<tr><td><input type="text" id="iTitle" name="title" placeholder="&#xf040; <?= $this->getText('Title'); ?>" required><td>
<tr><td colspan="2"><label for="iMessage"><?= $this->getText('Message'); ?></label>
<tr><td><textarea id="iMessage" name="description" placeholder="&#xf040;" required></textarea><td>
<tr><td colspan="2"><input type="submit" value="<?= $this->getText('Create', 0, 0); ?>"><input type="hidden" name="type" value="<?= \Modules\Tasks\Models\TaskType::SINGLE; ?>">
</table>
</form>
</div>
</section>
</div>
<div class="col-xs-12 col-md-6">
<section class="box wf-100">
<header><h1><?= $this->getText('Media'); ?></h1></header>
<div class="inner">
<form>
<table class="layout wf-100">
<tbody>
<tr><td colspan="2"><label for="iMedia"><?= $this->getText('Media'); ?></label>
<tr><td><input type="text" id="iMedia" placeholder="&#xf15b; File"><td><button><?= $this->getText('Select'); ?></button>
<tr><td colspan="2"><label for="iUpload"><?= $this->getText('Upload'); ?></label>
<tr><td><input type="file" id="iUpload" form="fTask"><input form="fTask" type="hidden" name="type"><td>
</table>
</form>
</div>
</section>
</div>
</div>
<?php include ROOT_PATH . '/Modules/Profile/Theme/Backend/acc-grp-popup.tpl.php'; ?>

View File

@ -0,0 +1,90 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
/**
* @var \phpOMS\Views\View $this
* @var \Modules\Tasks\Models\Task[] $tasks
*/
$tasks = $this->getData('tasks');
echo $this->getData('nav')->render(); ?>
<div class="row">
<div class="col-xs-12 col-md-9">
<div class="box">
<table class="table">
<caption><?= $this->getText('Tasks'); ?></caption>
<thead>
<td><?= $this->getText('Status'); ?>
<td><?= $this->getText('Due'); ?>
<td class="full"><?= $this->getText('Title'); ?>
<td><?= $this->getText('Creator'); ?>
<td><?= $this->getText('Created'); ?>
<tfoot>
<tbody>
<?php $c = 0; foreach($tasks as $key => $task) : $c++;
$url = \phpOMS\Uri\UriFactory::build('/{/lang}/backend/task/single?{?}&id=' . $task->getId());
$color = 'darkred';
if($task->getStatus() === \Modules\Tasks\Models\TaskStatus::DONE) { $color = 'green'; }
elseif($task->getStatus() === \Modules\Tasks\Models\TaskStatus::OPEN) { $color = 'darkblue'; }
elseif($task->getStatus() === \Modules\Tasks\Models\TaskStatus::WORKING) { $color = 'purple'; }
elseif($task->getStatus() === \Modules\Tasks\Models\TaskStatus::CANCELED) { $color = 'red'; }
elseif($task->getStatus() === \Modules\Tasks\Models\TaskStatus::SUSPENDED) { $color = 'yellow'; } ;?>
<tr>
<td><a href="<?= $url; ?>"><span class="tag <?= $color; ?>"><?= $this->getText('S' . $task->getStatus()); ?></span></a>
<td><a href="<?= $url; ?>"><?= $task->getDue()->format('Y-m-d H:i'); ?></a>
<td><a href="<?= $url; ?>"><?= $task->getTitle(); ?></a>
<td><a href="<?= $url; ?>"><?= $task->getCreatedBy(); ?></a>
<td><a href="<?= $url; ?>"><?= $task->getCreatedAt()->format('Y-m-d H:i'); ?></a>
<?php endforeach; if($c == 0) : ?>
<tr><td colspan="6" class="empty"><?= $this->getText('Empty', 0, 0); ?>
<?php endif; ?>
</table>
</div>
</div>
<div class="col-xs-12 col-md-3">
<section class="box wf-100">
<header><h1><?= $this->getText('Settings'); ?></h1></header>
<div class="inner">
<form>
<table class="layout wf-100">
<tr><td><label for="iIntervarl"><?= $this->getText('Interval'); ?></label>
<tr><td><select id="iIntervarl" name="interval">
<option><?= $this->getText('All'); ?>
<option><?= $this->getText('Day'); ?>
<option><?= $this->getText('Week'); ?>
<option selected><?= $this->getText('Month'); ?>
<option><?= $this->getText('Year'); ?>
</select>
</table>
</form>
</div>
</section>
<section class="box wf-100">
<header><h1><?= $this->getText('Settings'); ?></h1></header>
<div class="inner">
<table class="list">
<tr><th><?= $this->getText('Received'); ?><td>0
<tr><th><?= $this->getText('Created'); ?><td>0
<tr><th><?= $this->getText('Forwarded'); ?><td>0
<tr><th><?= $this->getText('AverageAmount'); ?><td>0
<tr><th><?= $this->getText('AverageProcessTime'); ?><td>0
<tr><th><?= $this->getText('InTime'); ?><td>0
</table>
</div>
</section>
</div>
</div>

View File

@ -0,0 +1,115 @@
<?php
/**
* Orange Management
*
* PHP Version 7.1
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
/**
* @var \phpOMS\Views\View $this
* @var \Modules\Tasks\Models\Task $task
*/
$task = $this->getData('task');
$elements = $task->getTaskElements();
$cElements = count($elements);
if($task->getStatus() === \Modules\Tasks\Models\TaskStatus::DONE) { $color = 'green'; }
elseif($task->getStatus() === \Modules\Tasks\Models\TaskStatus::OPEN) { $color = 'darkblue'; }
elseif($task->getStatus() === \Modules\Tasks\Models\TaskStatus::WORKING) { $color = 'purple'; }
elseif($task->getStatus() === \Modules\Tasks\Models\TaskStatus::CANCELED) { $color = 'red'; }
elseif($task->getStatus() === \Modules\Tasks\Models\TaskStatus::SUSPENDED) { $color = 'yellow'; }
echo $this->getData('nav')->render(); ?>
<div class="row">
<div class="col-xs-12">
<section class="box wf-100">
<header><h1><?= $task->getTitle(); ?></h1></header>
<div class="inner">
<div class="floatRight">Due <?= $task->getDue()->format('Y-m-d H:i'); ?></div>
<div>Created <?= $task->getCreatedAt()->format('Y-m-d H:i'); ?></div>
</div>
<div class="inner">
<blockquote>
<?= $task->getDescription(); ?>
</blockquote>
</div>
<div class="inner">
<div class="pAlignTable">
<div class="vCenterTable wf-100">Created <?= $task->getCreatedBy(); ?></div>
<span class="vCenterTable nobreak tag <?= $color; ?>"><?= $this->getText('S' . $task->getStatus()); ?></span>
</div>
</div>
</section>
<?php $c = 0;
foreach ($elements as $key => $element) : $c++;
if($element->getStatus() === \Modules\Tasks\Models\TaskStatus::DONE) { $color = 'green'; }
elseif($element->getStatus() === \Modules\Tasks\Models\TaskStatus::OPEN) { $color = 'darkblue'; }
elseif($element->getStatus() === \Modules\Tasks\Models\TaskStatus::WORKING) { $color = 'purple'; }
elseif($element->getStatus() === \Modules\Tasks\Models\TaskStatus::CANCELED) { $color = 'red'; }
elseif($element->getStatus() === \Modules\Tasks\Models\TaskStatus::SUSPENDED) { $color = 'yellow'; } ?>
<section class="box wf-100">
<div class="inner pAlignTable">
<div class="vCenterTable wf-100"><?= $element->getCreatedBy(); ?> - <?= $element->getCreatedAt()->format('Y-m-d H:i'); ?></div>
<span class="vCenterTable tag <?= $color; ?>"><?= $this->getText('S' . $element->getStatus()); ?></span>
</div>
<?php if ($element->getDescription() !== '') : ?>
<div class="inner">
<blockquote>
<?= $element->getDescription(); ?>
</blockquote>
</div>
<?php endif; ?>
<div class="inner pAlignTable">
<?php if ($element->getForwarded() !== 0) : ?>
<div class="vCenterTable wf-100">Forwarded <?= $element->getForwarded(); ?></div>
<?php endif; ?>
<?php if ($element->getStatus() !== \Modules\Tasks\Models\TaskStatus::CANCELED ||
$element->getStatus() !== \Modules\Tasks\Models\TaskStatus::DONE ||
$element->getStatus() !== \Modules\Tasks\Models\TaskStatus::SUSPENDED || $c != $cElements
) : ?>
<div class="vCenterTable nobreak">Due <?= $element->getDue()->format('Y-m-d H:i'); ?></div>
<?php endif; ?>
</section>
<?php endforeach; ?>
<section class="box wf-100">
<div class="inner">
<form id="taskElementCreate" method="POST" action="<?= \phpOMS\Uri\UriFactory::build('/{/lang}/api/task/element?{?}&csrf={$CSRF}'); ?>">
<table class="layout wf-100">
<tr><td><label for="iMessage"><?= $this->getText('Message'); ?></label>
<tr><td><textarea id="iMessage" name="description"></textarea>
<tr><td><label for="iDue"><?= $this->getText('Due'); ?></label>
<tr><td><input type="datetime-local" id="iDue" name="due" value="<?= !empty($elements) ? end($elements)->getDue()->format('Y-m-d\TH:i:s') : $task->getDue()->format('Y-m-d\TH:i:s'); ?>">
<tr><td><label for="iStatus"><?= $this->getText('Status'); ?></label>
<tr><td><select id="iStatus" name="status">
<option value="<?= \Modules\Tasks\Models\TaskStatus::OPEN; ?>" selected>Open
<option value="<?= \Modules\Tasks\Models\TaskStatus::WORKING; ?>">Working
<option value="<?= \Modules\Tasks\Models\TaskStatus::SUSPENDED; ?>">Suspended
<option value="<?= \Modules\Tasks\Models\TaskStatus::CANCELED; ?>">Canceled
<option value="<?= \Modules\Tasks\Models\TaskStatus::DONE; ?>">Done
</select>
<tr><td><label for="iReceiver"><?= $this->getText('To'); ?></label>
<tr><td><input type="text" id="iReceiver" name="forward" value="<?= $this->request->getAccount(); ?>" placeholder="&#xf007; Guest">
<tr><td colspan="2"><label for="iMedia"><?= $this->getText('Media'); ?></label>
<tr><td><input type="text" id="iMedia" placeholder="&#xf15b; File"><td><button><?= $this->getText('Select'); ?></button>
<tr><td colspan="2"><label for="iUpload"><?= $this->getText('Upload'); ?></label>
<tr><td><input type="file" id="iUpload" form="fTask"><input form="fTask" type="hidden" name="type"><td>
<tr><td><input type="submit" value="<?= $this->getText('Create', 0, 0); ?>"><input type="hidden" name="task" value="<?= $this->request->getData('id') ?>"><input type="hidden" name="type" value="1">
</table>
</form>
</div>
</section>
</div>
</div>

0
Views/TaskCreate.php Normal file
View File

BIN
img/module_teaser_small.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

55
info.json Normal file
View File

@ -0,0 +1,55 @@
{
"name": {
"id": 1001100000,
"internal": "Tasks",
"external": "OMS Tasks"
},
"version": "1.0.0",
"requirements": {
"phpOMS": "1.0.0",
"phpOMS-db": "1.0.0"
},
"creator": {
"name": "Orange Management",
"website": "www.spl1nes.com"
},
"description": "Tasks module.",
"directory": "Tasks",
"dependencies": {
"Admin" : "1.0.0",
"Calendar" : "1.0.0",
"Media" : "1.0.0"
},
"providing": {
"Navigation": "*"
},
"load": [
{
"pid": [
"43ec7cda8be033d7b20996708a2fca644e5dde86"
],
"type": 4,
"for": 0,
"from": "Tasks",
"file": "Tasks"
},
{
"pid": [
"754a08ddf8bcb1cf22f310f09206dd783d42f7dd"
],
"type": 4,
"from": "Tasks",
"for": "Navigation",
"file": "Tasks"
},
{
"pid": [
"754a08ddf8bcb1cf22f310f09206dd783d42f7dd"
],
"type": 5,
"from": "Tasks",
"for": "Navigation",
"file": "Navigation"
}
]
}