60 lines
1.9 KiB
PHP
Executable File
60 lines
1.9 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\SupportTicket;
|
|
use App\Models\User;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
|
|
final class SupportTicketController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$tickets = SupportTicket::query()
|
|
->with('assignee')
|
|
->when($request->filled('status'), fn ($q) => $q->where('status', $request->string('status')))
|
|
->latest()
|
|
->paginate(50)
|
|
->withQueryString();
|
|
|
|
return view('admin.support.index', compact('tickets'));
|
|
}
|
|
|
|
public function show(SupportTicket $ticket)
|
|
{
|
|
$ticket->load(['user', 'assignee']);
|
|
if (auth()->user()) {
|
|
auth()->user()->unreadNotifications()->get()
|
|
->filter(fn ($notification) => (int) ($notification->data['support_ticket_id'] ?? 0) === $ticket->id)
|
|
->each->markAsRead();
|
|
}
|
|
|
|
return view('admin.support.show', [
|
|
'ticket' => $ticket,
|
|
'admins' => User::query()->where('is_admin', true)->orderBy('name')->get(['id', 'name', 'email']),
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request, SupportTicket $ticket): RedirectResponse
|
|
{
|
|
$data = $request->validate([
|
|
'status' => ['required', 'in:new,open,waiting,resolved,closed'],
|
|
'priority' => ['required', 'in:low,normal,high,urgent'],
|
|
'assigned_to' => ['nullable', 'integer', 'exists:users,id'],
|
|
]);
|
|
|
|
if ($data['assigned_to'] ?? null) {
|
|
abort_unless(User::whereKey($data['assigned_to'])->where('is_admin', true)->exists(), 422);
|
|
}
|
|
|
|
$data['resolved_at'] = in_array($data['status'], ['resolved', 'closed'], true)
|
|
? ($ticket->resolved_at ?? now())
|
|
: null;
|
|
$ticket->update($data);
|
|
|
|
return back()->with('status', 'Support ticket updated.');
|
|
}
|
|
}
|