code fixes

This commit is contained in:
Dennis Eichhorn 2024-03-15 20:24:39 +00:00
parent c58c926de4
commit 94852a562c
6 changed files with 52 additions and 37 deletions

View File

@ -16,7 +16,9 @@ namespace Modules\Support\Controller;
use Modules\Admin\Models\AccountMapper; use Modules\Admin\Models\AccountMapper;
use Modules\Admin\Models\ContactType; use Modules\Admin\Models\ContactType;
use Modules\Messages\Models\EmailMapper;
use Modules\Support\Models\NullSupportApp; use Modules\Support\Models\NullSupportApp;
use Modules\Support\Models\SettingsEnum;
use Modules\Support\Models\SupportApp; use Modules\Support\Models\SupportApp;
use Modules\Support\Models\SupportAppMapper; use Modules\Support\Models\SupportAppMapper;
use Modules\Support\Models\Ticket; use Modules\Support\Models\Ticket;
@ -29,8 +31,6 @@ use Modules\Tasks\Models\TaskType;
use phpOMS\Message\Http\RequestStatusCode; use phpOMS\Message\Http\RequestStatusCode;
use phpOMS\Message\RequestAbstract; use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract; use phpOMS\Message\ResponseAbstract;
use Modules\Messages\Models\EmailMapper;
use Modules\Support\Models\SettingsEnum;
/** /**
* Api controller for the tickets module. * Api controller for the tickets module.
@ -93,6 +93,16 @@ final class ApiController extends Controller
$this->createStandardCreateResponse($request, $response, $ticket); $this->createStandardCreateResponse($request, $response, $ticket);
} }
/**
* Create email notification regarding ticket
*
* @param Ticket $ticket Ticket the notification is for
* @param string $language Language of the email (e.g. 'en', 'de')
*
* @return void
*
* @since 1.0.0
*/
public function notifyEmail(Ticket $ticket, string $language) : void public function notifyEmail(Ticket $ticket, string $language) : void
{ {
// @todo decide what to send via email // @todo decide what to send via email
@ -109,20 +119,16 @@ final class ApiController extends Controller
->with('attributes/types') ->with('attributes/types')
->with('attributes/value') ->with('attributes/value')
->with('account/contacts') ->with('account/contacts')
->where('account', $ticket->task->for->id) ->where('account', $ticket->task->for?->id)
->where('attributes/types/name', ['support_emails', 'support_email_address'], 'IN') ->where('attributes/types/name', ['support_emails', 'support_email_address'], 'IN')
->execute(); ->execute();
if ($client->getAttribute('support_emails')->value->getValue() === false) {
return;
}
// @todo should this really be a string? Shouldn't this be a contact element? Same goes for billing. // @todo should this really be a string? Shouldn't this be a contact element? Same goes for billing.
$email = $client->getAttribute('support_email_address')->value->getValue(); $email = $client->getAttribute('support_email_address')->value->valueStr;
$account = $client->account; $account = $client->account;
} }
if ($email === '' || $email === null) { if (empty($email)) {
$supplier = null; $supplier = null;
if ($this->app->moduleManager->isActive('SupplierManagement')) { if ($this->app->moduleManager->isActive('SupplierManagement')) {
@ -131,36 +137,40 @@ final class ApiController extends Controller
->with('attributes/types') ->with('attributes/types')
->with('attributes/value') ->with('attributes/value')
->with('account/contacts') ->with('account/contacts')
->where('account', $ticket->task->for->id) ->where('account', $ticket->task->for?->id)
->where('attributes/types/name', ['support_emails', 'support_email_address'], 'IN') ->where('attributes/types/name', ['support_emails', 'support_email_address'], 'IN')
->execute(); ->execute();
if ($supplier->getAttribute('support_emails')->value->getValue() === false) {
return;
}
} }
if ($supplier->getAttribute('support_emails')->value->getValue() === false) { if ($supplier === null) {
return; return;
} }
// @todo should this really be a string? Shouldn't this be a contact element? Same goes for billing. // @todo should this really be a string? Shouldn't this be a contact element? Same goes for billing.
$email = $supplier->getAttribute('support_email_address')->value->getValue(); $email = $supplier->getAttribute('support_email_address')->value->valueStr;
$account = $supplier->account; $account = $supplier->account;
} }
if ($email === '' || $email === null) { if (empty($email)) {
$account = AccountMapper::get() $account = AccountMapper::get()
->with('contacts') ->with('contacts')
->where('id', $ticket->task->for->id) ->where('id', $ticket->task->for?->id)
->execute(); ->execute();
$email = $account->getContactByType(ContactType::EMAIL)->content; $email = $account->getContactByType(ContactType::EMAIL)->content;
} }
if ($email === '' || $email === null) { if (empty($email)) {
return; return;
} }
$handler = $this->app->moduleManager->get('Admin', 'Api')->setUpServerMailHandler(); $handler = $this->app->moduleManager->get('Admin', 'Api')->setUpServerMailHandler();
/** @var \Model\Setting $billingTemplate */ /** @var \Model\Setting $supportTemplate */
$supportTemplate = $this->app->appSettings->get( $supportTemplate = $this->app->appSettings->get(
names: SettingsEnum::SUPPORT_EMAIL_TEMPLATE, names: SettingsEnum::SUPPORT_EMAIL_TEMPLATE,
module: 'Support' module: 'Support'
@ -189,9 +199,9 @@ final class ApiController extends Controller
$mail->template = \array_merge( $mail->template = \array_merge(
$mail->template, $mail->template,
[ [
'{user_name}' => $account->login, '{user_name}' => $account?->login,
'{ticket_id}' => $ticket->id, '{ticket_id}' => $ticket->id,
'{ticket_status}' => $lang['Tasks']['S' . $ticket->task->status], '{ticket_status}' => $lang['Tasks']['S' . $ticket->task->status],
'{ticket_subject}' => $ticket->task->title, '{ticket_subject}' => $ticket->task->title,
] ]
); );
@ -358,7 +368,7 @@ final class ApiController extends Controller
$this->createModel($request->header->account, $element, TicketElementMapper::class, 'ticket_element', $request->getOrigin()); $this->createModel($request->header->account, $element, TicketElementMapper::class, 'ticket_element', $request->getOrigin());
$this->updateModel($request->header->account, $old, $ticket->task, TaskMapper::class, 'ticket', $request->getOrigin()); $this->updateModel($request->header->account, $old, $ticket->task, TaskMapper::class, 'ticket', $request->getOrigin());
$ticket->task->taskElements[] = $element; $ticket->task->taskElements[] = $element->taskElement;
$this->notifyEmail($ticket, $response->header->l11n->language); $this->notifyEmail($ticket, $response->header->l11n->language);

View File

@ -16,22 +16,22 @@ namespace Modules\Support\Controller;
use Model\SettingMapper; use Model\SettingMapper;
use Modules\Media\Models\MediaMapper; use Modules\Media\Models\MediaMapper;
use Modules\Profile\Models\SettingsEnum as ProfileSettingsEnum;
use Modules\Support\Models\SupportAppMapper; use Modules\Support\Models\SupportAppMapper;
use Modules\Support\Models\TicketMapper; use Modules\Support\Models\TicketMapper;
use Modules\Support\Views\TicketView; use Modules\Support\Views\TicketView;
use phpOMS\Asset\AssetType;
use phpOMS\Contract\RenderableInterface;
use phpOMS\DataStorage\Database\Query\OrderType;
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\AccountRelationMapper;
use Modules\Tasks\Models\TaskElementMapper; use Modules\Tasks\Models\TaskElementMapper;
use Modules\Tasks\Models\TaskMapper; use Modules\Tasks\Models\TaskMapper;
use Modules\Tasks\Models\TaskStatus; use Modules\Tasks\Models\TaskStatus;
use Modules\Tasks\Models\TaskType; use Modules\Tasks\Models\TaskType;
use phpOMS\Asset\AssetType;
use phpOMS\Contract\RenderableInterface;
use phpOMS\DataStorage\Database\Query\Builder; use phpOMS\DataStorage\Database\Query\Builder;
use phpOMS\DataStorage\Database\Query\OrderType;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Views\View;
/** /**
* Support controller class. * Support controller class.
@ -102,7 +102,7 @@ final class BackendController extends Controller
$view->data['tickets'] = $mapperQuery->execute(); $view->data['tickets'] = $mapperQuery->execute();
$view->data['stats'] = TicketMapper::getStatOverview($request->header->account); $view->data['stats'] = TicketMapper::getStatOverview();
return $view; return $view;
} }
@ -140,7 +140,6 @@ final class BackendController extends Controller
->with('app') ->with('app')
->where('task/tags/title/language', $request->header->l11n->language); ->where('task/tags/title/language', $request->header->l11n->language);
/** @var \Modules\Support\Models\Ticket */
$view->data['ticket'] = $request->hasData('for') $view->data['ticket'] = $request->hasData('for')
? $mapperQuery->where('task', (int) $request->getData('for'))->execute() ? $mapperQuery->where('task', (int) $request->getData('for'))->execute()
: $mapperQuery->where('id', (int) $request->getData('id'))->execute(); : $mapperQuery->where('id', (int) $request->getData('id'))->execute();
@ -160,7 +159,7 @@ final class BackendController extends Controller
$view->data['tickets'] = TicketMapper::getAll() $view->data['tickets'] = TicketMapper::getAll()
->with('task') ->with('task')
->where('task/for', $view->data['ticket']->task->for->id) ->where('task/for', $view->data['ticket']->task->for?->id)
->sort('createdAt', OrderType::DESC) ->sort('createdAt', OrderType::DESC)
->offset(1) ->offset(1)
->limit(5) ->limit(5)
@ -171,7 +170,7 @@ final class BackendController extends Controller
$view->data['hasContractManagement'] = $this->app->moduleManager->isActive('ContractManagement'); $view->data['hasContractManagement'] = $this->app->moduleManager->isActive('ContractManagement');
if ($view->data['hasContractManagement']) { if ($view->data['hasContractManagement']) {
$view->data['contracts'] = \Modules\ContractManagement\Models\ContractMapper::getAll() $view->data['contracts'] = \Modules\ContractManagement\Models\ContractMapper::getAll()
->where('account', $view->data['ticket']->task->for->id) ->where('account', $view->data['ticket']->task->for?->id)
->where('end', $dt, '>=') // @todo consider to also allow $end === null ->where('end', $dt, '>=') // @todo consider to also allow $end === null
->sort('createdAt', OrderType::DESC) ->sort('createdAt', OrderType::DESC)
->limit(5) ->limit(5)

View File

@ -14,7 +14,6 @@ declare(strict_types=1);
namespace Modules\Support\Models; namespace Modules\Support\Models;
use Modules\Admin\Models\AccountMapper;
use Modules\Tasks\Models\AccountRelationMapper; use Modules\Tasks\Models\AccountRelationMapper;
use Modules\Tasks\Models\TaskElementMapper; use Modules\Tasks\Models\TaskElementMapper;
use Modules\Tasks\Models\TaskMapper; use Modules\Tasks\Models\TaskMapper;
@ -88,7 +87,7 @@ final class TicketMapper extends DataMapperFactory
'app' => [ 'app' => [
'mapper' => SupportAppMapper::class, 'mapper' => SupportAppMapper::class,
'external' => 'support_ticket_app', 'external' => 'support_ticket_app',
] ],
]; ];
/** /**
@ -107,7 +106,14 @@ final class TicketMapper extends DataMapperFactory
*/ */
public const PRIMARYFIELD = 'support_ticket_id'; public const PRIMARYFIELD = 'support_ticket_id';
public static function getStatOverview(int $account) : array /**
* Get general ticket stats
*
* @return array{total:int, unassigned:int, open:int, closed:int, inprogress:int}
*
* @since 1.0.0
*/
public static function getStatOverview() : array
{ {
$start = SmartDateTime::startOfMonth(); $start = SmartDateTime::startOfMonth();

View File

@ -20,7 +20,7 @@ return ['Support' => [
'AverageProcessTime' => 'Durchschn. Prozess Zeit', 'AverageProcessTime' => 'Durchschn. Prozess Zeit',
'Closed' => 'Geschlossen', 'Closed' => 'Geschlossen',
'Completion' => 'Abgeschlossen', 'Completion' => 'Abgeschlossen',
'Advanced' => 'Fortgeschritten', 'Advanced' => 'Fortgeschritten',
'Created' => 'Erstellt', 'Created' => 'Erstellt',
'Creator' => 'Ersteller', 'Creator' => 'Ersteller',
'Day' => 'Tag', 'Day' => 'Tag',

View File

@ -20,7 +20,7 @@ return ['Support' => [
'AverageProcessTime' => 'Avg. Process Time', 'AverageProcessTime' => 'Avg. Process Time',
'Closed' => 'Closed', 'Closed' => 'Closed',
'Completion' => 'Completion', 'Completion' => 'Completion',
'Advanced' => 'Advanced', 'Advanced' => 'Advanced',
'Created' => 'Created', 'Created' => 'Created',
'Creator' => 'Creator', 'Creator' => 'Creator',
'Day' => 'Day', 'Day' => 'Day',

View File

@ -15,7 +15,7 @@ declare(strict_types=1);
use phpOMS\Uri\UriFactory; use phpOMS\Uri\UriFactory;
/** /**
* @var \phpOMS\Views\View $this * @var \phpOMS\Views\View $this
*/ */
echo $this->data['nav']->render(); ?> echo $this->data['nav']->render(); ?>