70 lines
2.4 KiB
PHP
Executable File
70 lines
2.4 KiB
PHP
Executable File
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Modules\Helpdesk\Services;
|
|
|
|
use App\Models\User;
|
|
use Modules\Helpdesk\Models\Ticket;
|
|
|
|
final class CannedResponseRenderer
|
|
{
|
|
public function render(string $template, Ticket $ticket, ?User $actor = null): string
|
|
{
|
|
$this->hydrateTicketUsers($ticket);
|
|
$ticket->loadMissing(['status', 'priority', 'category', 'project', 'team']);
|
|
$actor?->loadMissing('company');
|
|
|
|
return strtr($template, [
|
|
'{{ ticket.reference }}' => $ticket->reference,
|
|
'{{ ticket.subject }}' => $ticket->subject,
|
|
'{{ ticket.status }}' => (string) ($ticket->status?->name ?? ''),
|
|
'{{ ticket.priority }}' => (string) ($ticket->priority?->name ?? ''),
|
|
'{{ ticket.category }}' => (string) ($ticket->category?->name ?? ''),
|
|
'{{ ticket.project }}' => (string) ($ticket->project?->title ?? ''),
|
|
'{{ ticket.team }}' => (string) ($ticket->team?->name ?? ''),
|
|
'{{ requester.name }}' => (string) ($ticket->owner?->name ?? ''),
|
|
'{{ agent.name }}' => (string) ($ticket->agent?->name ?? ''),
|
|
'{{ actor.name }}' => (string) ($actor?->name ?? ''),
|
|
'{{ ticket.url }}' => route('helpdesk.tickets.show', ['ticket' => $ticket->getKey()]),
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Load requester/agent with one query if the caller has not already attached them.
|
|
*/
|
|
private function hydrateTicketUsers(Ticket $ticket): void
|
|
{
|
|
if ($ticket->relationLoaded('owner') && $ticket->relationLoaded('agent')) {
|
|
return;
|
|
}
|
|
|
|
$userIds = collect([$ticket->user_id, $ticket->agent_id])
|
|
->filter()
|
|
->map(static fn (mixed $id): int => (int) $id)
|
|
->unique()
|
|
->values();
|
|
|
|
if ($userIds->isEmpty()) {
|
|
$ticket->setRelation('user', null);
|
|
$ticket->setRelation('owner', null);
|
|
$ticket->setRelation('agent', null);
|
|
|
|
return;
|
|
}
|
|
|
|
$users = User::query()
|
|
->with('company')
|
|
->whereIn('id', $userIds)
|
|
->get()
|
|
->keyBy('id');
|
|
|
|
$owner = $users->get((int) $ticket->user_id);
|
|
$agent = $ticket->agent_id === null ? null : $users->get((int) $ticket->agent_id);
|
|
|
|
$ticket->setRelation('user', $owner);
|
|
$ticket->setRelation('owner', $owner);
|
|
$ticket->setRelation('agent', $agent);
|
|
}
|
|
}
|