From 8480819da4782ac6437d6e6290b20768a97394c3 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 5 Feb 2024 01:07:16 +0000 Subject: [PATCH] fix support lists --- Controller/BackendController.php | 55 ++++++++++ Models/TicketMapper.php | 47 ++++++++ Theme/Backend/support-list.tpl.php | 7 +- Theme/Backend/user-support-dashboard.tpl.php | 109 +++++++++++++++++++ 4 files changed, 217 insertions(+), 1 deletion(-) diff --git a/Controller/BackendController.php b/Controller/BackendController.php index adad74f..77e8a2b 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -26,6 +26,12 @@ use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Views\View; use Modules\Profile\Models\SettingsEnum as ProfileSettingsEnum; +use Modules\Tasks\Models\AccountRelationMapper; +use Modules\Tasks\Models\TaskElementMapper; +use Modules\Tasks\Models\TaskMapper; +use Modules\Tasks\Models\TaskStatus; +use Modules\Tasks\Models\TaskType; +use phpOMS\DataStorage\Database\Query\Builder; /** * Support controller class. @@ -80,6 +86,9 @@ final class BackendController extends Controller ->with('task') ->with('task/createdBy') ->with('task/for') + ->with('task/taskElements') + ->with('task/taskElements/accRelation') + ->with('task/taskElements/accRelation/relation') ->with('app') ->limit(25); @@ -251,10 +260,56 @@ final class BackendController extends Controller */ public function viewPrivateSupportDashboard(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { + $head = $response->data['Content']->head; + $head->addAsset(AssetType::CSS, 'Modules/Tasks/Theme/Backend/css/styles.css?v=1.0.0'); + $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/Support/Theme/Backend/user-support-dashboard'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1002901101, $request, $response); + // @todo Use ticket implementation "getAnyRelatedToUser($request->header->account) + $mapperQuery = TicketMapper::getAnyRelatedToUser($request->header->account) + ->with('task') + ->with('task/createdBy') + ->with('task/for') + ->with('task/taskElements') + ->with('task/taskElements/accRelation') + ->with('task/taskElements/accRelation/relation') + ->with('app') + ->sort('task/createdAt', OrderType::DESC) + ->limit(25); + + if ($request->getData('ptype') === 'p') { + $mapperQuery->where('id', $request->getDataInt('id') ?? 0, '<'); + } elseif ($request->getData('ptype') === 'n') { + $mapperQuery->where('id', $request->getDataInt('id') ?? 0, '>'); + } else { + $mapperQuery->where('id', 0, '>'); + } + + $view->data['tickets'] = $mapperQuery->execute(); + + $openQuery = new Builder($this->app->dbPool->get(), true); + $openQuery->innerJoin(TaskMapper::TABLE, TaskMapper::TABLE . '_d2_task') + ->on(TicketMapper::TABLE . '_d1.support_ticket_task', '=', TaskMapper::TABLE . '_d2_task.task_id') + ->innerJoin(TaskElementMapper::TABLE) + ->on(TaskMapper::TABLE . '_d2_task.' . TaskMapper::PRIMARYFIELD, '=', TaskElementMapper::TABLE . '.task_element_task') + ->innerJoin(AccountRelationMapper::TABLE) + ->on(TaskElementMapper::TABLE . '.' . TaskElementMapper::PRIMARYFIELD, '=', AccountRelationMapper::TABLE . '.task_account_task_element') + ->andWhere(AccountRelationMapper::TABLE . '.task_account_account', '=', $request->header->account); + + /** @var \Modules\Tasks\Models\Task[] $open */ + $open = TicketMapper::getAll() + ->with('task') + ->with('task/createdBy') + ->where('task/type', TaskType::TEMPLATE, '!=') + ->where('task/status', TaskStatus::OPEN) + ->sort('task/createdAt', OrderType::DESC) + ->query($openQuery) + ->execute(); + + $view->data['open'] = $open; + return $view; } diff --git a/Models/TicketMapper.php b/Models/TicketMapper.php index 38ca0ee..9fe73c7 100755 --- a/Models/TicketMapper.php +++ b/Models/TicketMapper.php @@ -15,9 +15,14 @@ declare(strict_types=1); namespace Modules\Support\Models; use Modules\Admin\Models\AccountMapper; +use Modules\Tasks\Models\AccountRelationMapper; +use Modules\Tasks\Models\TaskElementMapper; use Modules\Tasks\Models\TaskMapper; use Modules\Tasks\Models\TaskStatus; +use Modules\Tasks\Models\TaskType; use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; +use phpOMS\DataStorage\Database\Mapper\ReadMapper; +use phpOMS\DataStorage\Database\Query\Builder; use phpOMS\Stdlib\Base\SmartDateTime; /** @@ -114,4 +119,46 @@ final class TicketMapper extends DataMapperFactory 'inprogress' => self::count()->with('task')->where('task/status', TaskStatus::WORKING)->execute(), ]; } + + /** + * Get tasks that have something to do with the user + * + * @param int $user User + * + * @return ReadMapper + * + * @since 1.0.0 + */ + public static function getAnyRelatedToUser(int $user) : ReadMapper + { + $query = new Builder(self::$db, true); + $query->innerJoin(TaskMapper::TABLE, TaskMapper::TABLE . '_d2_task') + ->on(self::TABLE . '_d1.support_ticket_task', '=', TaskMapper::TABLE . '_d2_task.task_id') + ->innerJoin(TaskElementMapper::TABLE) + ->on(TaskMapper::TABLE . '_d2_task.task_id', '=', TaskElementMapper::TABLE . '.task_element_task') + ->on(TaskMapper::TABLE . '_d2_task.task_type', '!=', TaskType::TEMPLATE) + ->innerJoin(AccountRelationMapper::TABLE) + ->on(TaskElementMapper::TABLE . '.task_element_id', '=', AccountRelationMapper::TABLE . '.task_account_task_element') + ->where(AccountRelationMapper::TABLE . '.task_account_account', '=', $user) + ->orWhere(TaskMapper::TABLE . '_d2_task.task_created_by', '=', $user) + ->groupBy(self::PRIMARYFIELD); + + // @todo Improving query performance by using raw queries and result arrays for large responses like this + $sql = <<query($query); + } } diff --git a/Theme/Backend/support-list.tpl.php b/Theme/Backend/support-list.tpl.php index 49ebbf1..7b6c188 100755 --- a/Theme/Backend/support-list.tpl.php +++ b/Theme/Backend/support-list.tpl.php @@ -50,7 +50,12 @@ echo $this->data['nav']->render(); ?> getHtml('P' . $ticket->task->priority, 'Tasks'); ?> printHtml($ticket->task->title); ?> printHtml($ticket->task->createdBy->name1); ?> printHtml($ticket->task->createdBy->name2); ?> - printHtml($ticket->task->createdBy->name1); ?> printHtml($ticket->task->createdBy->name2); ?> + task->getResponsible(); + foreach ($responsibles as $responsible) : ?> + + printHtml($responsible->name1); ?> printHtml($responsible->name2); ?> + + printHtml($ticket->task->for->name1); ?> printHtml($ticket->task->for->name2); ?> printHtml($ticket->task->createdAt->format('Y-m-d H:i')); ?> diff --git a/Theme/Backend/user-support-dashboard.tpl.php b/Theme/Backend/user-support-dashboard.tpl.php index 8b13789..dd47fdf 100755 --- a/Theme/Backend/user-support-dashboard.tpl.php +++ b/Theme/Backend/user-support-dashboard.tpl.php @@ -1 +1,110 @@ +data['nav']->render(); ?> + +
+
+
+
getHtml('Open'); ?>download
+
+ + + + data['open'] as $key => $ticket) : ++$c; + $url = UriFactory::build('{/base}/support/ticket?{?}&id=' . $ticket->id); + ?> + +
getHtml('Status'); ?> + getHtml('Priority'); ?> + getHtml('Title'); ?> + getHtml('Creator'); ?> + getHtml('Assigned'); ?> + getHtml('For'); ?> + getHtml('Created'); ?> +
+ + getHtml('S' . $ticket->task->status, 'Tasks'); ?> + + getHtml('P' . $ticket->task->priority, 'Tasks'); ?> + printHtml($ticket->task->title); ?> + printHtml($ticket->task->createdBy->name1); ?> printHtml($ticket->task->createdBy->name2); ?> + task->getResponsible(); + foreach ($responsibles as $responsible) : ?> + + printHtml($responsible->name1); ?> printHtml($responsible->name2); ?> + + + printHtml($ticket->task->for->name1); ?> printHtml($ticket->task->for->name2); ?> + printHtml($ticket->task->createdAt->format('Y-m-d H:i')); ?> + +
getHtml('Empty', '0', '0'); ?> + +
+
+
+
+
+ +
+
+
+
getHtml('Tickets'); ?>download
+
+ + + + data['tickets'] as $key => $ticket) : ++$c; + $url = UriFactory::build('{/base}/support/ticket?{?}&id=' . $ticket->id); + ?> + +
getHtml('Status'); ?> + getHtml('Priority'); ?> + getHtml('Title'); ?> + getHtml('Creator'); ?> + getHtml('Assigned'); ?> + getHtml('For'); ?> + getHtml('Created'); ?> +
+ + getHtml('S' . $ticket->task->status, 'Tasks'); ?> + + getHtml('P' . $ticket->task->priority, 'Tasks'); ?> + printHtml($ticket->task->title); ?> + printHtml($ticket->task->createdBy->name1); ?> printHtml($ticket->task->createdBy->name2); ?> + task->getResponsible(); + foreach ($responsibles as $responsible) : ?> + + printHtml($responsible->name1); ?> printHtml($responsible->name2); ?> + + + printHtml($ticket->task->for->name1); ?> printHtml($ticket->task->for->name2); ?> + printHtml($ticket->task->createdAt->format('Y-m-d H:i')); ?> + +
getHtml('Empty', '0', '0'); ?> + +
+
+
+
+
\ No newline at end of file