Files
nnterp-react-admin/app/Http/Controllers/HelpdeskTicketController.php
2026-03-13 20:49:46 +08:00

148 lines
5.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Events\CreateHelpdeskTicket;
use App\Events\UpdateHelpdeskTicket;
use App\Events\DestroyHelpdeskTicket;
use App\Http\Requests\StoreHelpdeskTicketRequest;
use App\Http\Requests\UpdateHelpdeskTicketRequest;
use App\Models\HelpdeskTicket;
use App\Models\HelpdeskCategory;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Inertia\Inertia;
class HelpdeskTicketController extends Controller
{
public function index()
{
if(Auth::user()->can('manage-helpdesk-tickets')){
$tickets = HelpdeskTicket::query()
->with(['category', 'creator'])
->where(function($q) {
if(Auth::user()->can('manage-any-helpdesk-tickets')) {
// Get all tickets
} elseif(Auth::user()->can('manage-own-helpdesk-tickets')) {
$q->where('created_by', creatorId());
} else {
$q->whereRaw('1 = 0');
}
})
->when(request('title'), fn($q) => $q->where(function($query) {
$query->where('title', 'like', '%' . request('title') . '%')
->orWhere('ticket_id', 'like', '%' . request('title') . '%');
}))
->when(request('status'), fn($q) => $q->where('status', request('status')))
->when(request('priority'), fn($q) => $q->where('priority', request('priority')))
->when(request('category_id'), fn($q) => $q->where('category_id', request('category_id')))
->when(request('company_id') && Auth::user()->type === 'superadmin', fn($q) => $q->where('created_by', request('company_id')))
->when(request('sort'), fn($q) => $q->orderBy(request('sort'), request('direction', 'asc')), fn($q) => $q->latest())
->paginate(request('per_page', 10))
->withQueryString();
$categories = HelpdeskCategory::where('is_active', true)
->get(['id', 'name']);
$companies = [];
if(Auth::user()->type === 'superadmin') {
$companies = User::where('type', 'company')
->get(['id', 'name']);
}
return Inertia::render('helpdesk/tickets/index', [
'tickets' => $tickets,
'categories' => $categories,
'companies' => $companies,
]);
}
else{
return back()->with('error', __('Permission denied'));
}
}
public function store(StoreHelpdeskTicketRequest $request)
{
if(Auth::user()->can('create-helpdesk-tickets')){
$validated = $request->validated();
$ticket = new HelpdeskTicket();
$ticket->title = $validated['title'];
$ticket->description = $validated['description'];
$ticket->priority = $validated['priority'];
$ticket->category_id = $validated['category_id'];
if(Auth::user()->type === 'superadmin' && isset($validated['company_id'])) {
$ticket->created_by = $validated['company_id'];
} else {
$ticket->created_by = creatorId();
}
$ticket->save();
CreateHelpdeskTicket::dispatch($request, $ticket);
return back()->with('success', __('The ticket has been created successfully.'));
}
else{
return back()->with('error', __('Permission denied'));
}
}
public function show(HelpdeskTicket $helpdeskTicket)
{
if(Auth::user()->can('view-helpdesk-tickets') && (Auth::user()->can('manage-any-helpdesk-tickets') || $helpdeskTicket->created_by === creatorId())){
$helpdeskTicket->load(['category', 'creator', 'replies.creator']);
return Inertia::render('helpdesk/tickets/show', [
'ticket' => $helpdeskTicket,
]);
}
else{
return redirect()->route('helpdesk-tickets.index')->with('error', __('Permission denied'));
}
}
public function update(UpdateHelpdeskTicketRequest $request, HelpdeskTicket $helpdeskTicket)
{
if(Auth::user()->can('edit-helpdesk-tickets')){
$validated = $request->validated();
$helpdeskTicket->title = $validated['title'];
$helpdeskTicket->description = $validated['description'];
$helpdeskTicket->status = $validated['status'];
$helpdeskTicket->priority = $validated['priority'];
$helpdeskTicket->category_id = $validated['category_id'];
if($validated['status'] === 'resolved' && !$helpdeskTicket->resolved_at) {
$helpdeskTicket->resolved_at = now();
}
$helpdeskTicket->save();
UpdateHelpdeskTicket::dispatch($request, $helpdeskTicket);
return back()->with('success', __('The ticket has been updated successfully'));
}
else{
return redirect()->route('helpdesk-tickets.index')->with('error', __('Permission denied'));
}
}
public function destroy(HelpdeskTicket $helpdeskTicket)
{
if(Auth::user()->can('delete-helpdesk-tickets')){
DestroyHelpdeskTicket::dispatch($helpdeskTicket);
$helpdeskTicket->delete();
return back()->with('success', __('The ticket has been deleted.'));
}
else{
return redirect()->route('helpdesk-tickets.index')->with('error', __('Permission denied'));
}
}
}