ldc-supportweb/app/Http/Controllers/TicketController.php

226 lines
7.6 KiB
PHP
Raw Normal View History

2020-11-18 10:23:51 +01:00
<?php
namespace App\Http\Controllers;
2021-04-18 20:31:07 +02:00
use App\Enums\TicketStatus;
use App\Enums\TicketType;
use App\Events\NotifySubscriptions;
use App\Events\TicketStatusChanged;
2021-04-18 20:31:07 +02:00
use App\Http\Requests\ChangeTicketStatus;
use App\Http\Requests\CreateMessage;
use App\Http\Requests\SortTickets;
use App\Http\Requests\StoreTicket;
use App\Http\Requests\UpdateTicket;
use App\Mail\NewTicket;
use App\Models\Message;
2020-11-18 10:23:51 +01:00
use App\Models\Project;
use App\Models\Ticket;
use App\Models\User;
2021-04-18 20:31:07 +02:00
use Exception;
2020-11-18 10:23:51 +01:00
use Illuminate\Support\Facades\Auth;
2021-04-18 20:31:07 +02:00
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Mail;
2021-04-21 15:08:47 +02:00
use Illuminate\Support\Facades\Session;
2020-11-18 10:23:51 +01:00
use Illuminate\Support\Str;
class TicketController extends Controller
{
2021-04-18 20:31:07 +02:00
public function __construct()
2021-04-15 16:47:57 +02:00
{
2021-04-18 20:31:07 +02:00
$this->authorizeResource(Ticket::class, 'ticket');
}
2021-04-15 16:47:57 +02:00
2021-04-18 20:31:07 +02:00
public function index(SortTickets $request)
{
$tickets = Ticket::query();
2021-05-04 12:37:15 +02:00
if (auth()->user()->project_id) {
$tickets = $tickets->where('project_id', auth()->user()->project_id);
}
2021-04-15 16:47:57 +02:00
2021-04-18 20:31:07 +02:00
if ($request->status) {
$tickets = $tickets->where('status', TicketStatus::archived());
2020-11-18 10:23:51 +01:00
} else {
2021-04-18 20:31:07 +02:00
$tickets = $tickets->where('status', '<>', TicketStatus::archived());
}
2021-04-21 15:48:48 +02:00
if ($request->rst) {
Session::remove('tickets.pr');
Session::remove('tickets.sort_col');
Session::remove('tickets.sort_way');
}
2021-04-21 15:08:47 +02:00
if ($request->prs) {
Session::remove('tickets.pr');
}
if ($request->sort_col) {
Session::put('tickets.sort_col', $request->sort_col);
Session::save();
}
if ($request->sort_way) {
Session::put('tickets.sort_way', $request->sort_way);
Session::save();
}
if ($request->pr) {
Session::put('tickets.pr', $request->pr);
Session::save();
}
if (Session::has('tickets.pr')) {
$tickets = $tickets->where('project_id', Session::get('tickets.pr'));
}
if (Session::has('tickets.sort_col') and Session::has('tickets.sort_way')) {
switch (Session::get('tickets.sort_col')) {
2021-04-18 20:31:07 +02:00
case 'id':
2021-04-21 15:08:47 +02:00
$tickets = $tickets->orderBy('id', Session::get('tickets.sort_way'));
2021-04-18 20:31:07 +02:00
break;
case 'project':
2021-04-21 15:08:47 +02:00
$tickets = $tickets->orderBy('project_id', Session::get('tickets.sort_way'));
2021-04-18 20:31:07 +02:00
break;
case 'created_at':
2021-04-21 15:08:47 +02:00
$tickets = $tickets->orderBy('created_at', Session::get('tickets.sort_way'));
2021-04-18 20:31:07 +02:00
break;
case 'created_by':
2021-04-21 15:08:47 +02:00
$tickets = $tickets->orderBy('created_by', Session::get('tickets.sort_way'));
2021-04-18 20:31:07 +02:00
break;
case 'type':
2021-04-21 15:08:47 +02:00
$tickets = $tickets->orderBy('type', Session::get('tickets.sort_way'));
2021-04-18 20:31:07 +02:00
break;
case 'status':
2021-04-21 15:08:47 +02:00
$tickets = $tickets->orderBy('status', Session::get('tickets.sort_way'));
2021-04-18 20:31:07 +02:00
break;
}
2020-11-18 10:23:51 +01:00
}
2021-04-18 20:31:07 +02:00
$tickets = $tickets->paginate();
2021-04-21 15:08:47 +02:00
$projects = Project::select('id', 'name')->get();
return view('ticket.index', compact('tickets', 'projects'));
2020-11-18 10:23:51 +01:00
}
2021-04-18 20:31:07 +02:00
public function show(Ticket $ticket)
{
$messages = $ticket->messages()->orderBy('created_at', 'DESC')->get();
2021-04-18 20:31:07 +02:00
$isSubscribed = (bool)$ticket->subscriptions()->where('user_id', Auth::user()->id)->count();
return view('ticket.show', compact('ticket', 'messages', 'isSubscribed'));
}
2021-04-18 20:31:07 +02:00
public function create()
{
2020-11-18 10:23:51 +01:00
$projects = Project::all();
2021-04-18 20:31:07 +02:00
if (!count($projects)) {
return redirect()->route('project.create')
->with('warning', 'Vous devez tout d\'abord créer un projet pour y ajouter un ticket');
}
2020-11-18 10:23:51 +01:00
return view('ticket.create', compact('projects'));
}
2021-04-18 20:31:07 +02:00
public function store(StoreTicket $request)
{
$project = Project::findOrFail($request->project_id);
2020-11-26 12:23:19 +01:00
2021-04-18 20:31:07 +02:00
$ticket = new Ticket($request->validated());
2021-04-18 20:31:07 +02:00
if ($request->file_ticket) {
$ticket->file = Ticket::saveFile($project, $ticket, $ticket->type, $request->file_ticket);
}
2021-04-18 20:31:07 +02:00
if ($request->file_ticket2) {
$ticket->file2 = Ticket::saveFile($project, $ticket, $ticket->type, $request->file_ticket2);
2020-11-18 10:23:51 +01:00
}
2021-04-18 20:31:07 +02:00
$ticket->user()->associate(auth()->user());
$ticket->saveOrFail();
/** @var \App\Models\User */
$user = auth()->user();
$user->subscriptions()->toggle($ticket->id);
2020-11-26 12:23:19 +01:00
2021-04-18 20:31:07 +02:00
if (config('mail.MAIL_ADMIN')) {
Mail::to(config('mail.MAIL_ADMIN'))->send(new NewTicket($ticket));
} else {
throw new Exception('Missing MAIL_ADMIN in .env');
}
return redirect()->route('ticket.show', $ticket)->with('success', 'Ticket enregistré !');
2020-11-18 10:23:51 +01:00
}
2021-04-18 20:31:07 +02:00
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass
public function edit(Ticket $ticket)
{
$projects = Project::all();
return view('ticket.edit', compact('ticket', 'projects'));
2020-11-18 10:23:51 +01:00
}
2021-04-18 20:31:07 +02:00
public function update(UpdateTicket $request, Ticket $ticket)
{
$project = Project::findOrFail($request->project_id);
$ticket->fill($request->validated());
2020-11-26 12:23:19 +01:00
2021-04-18 20:31:07 +02:00
if ($request->file_ticket) {
if (File::exists($ticket->file)) {
File::delete($ticket->file);
}
$ticket->file = Ticket::saveFile($project, $ticket, $ticket->type, $request->file_ticket);
2020-11-18 10:23:51 +01:00
}
2021-04-18 20:31:07 +02:00
if ($request->file_ticket2) {
if (File::exists($ticket->file2)) {
File::delete($ticket->file2);
}
$ticket->file2 = Ticket::saveFile($project, $ticket, $ticket->type, $request->file_ticket2);
}
2020-11-18 10:23:51 +01:00
$ticket->save();
2021-04-18 20:31:07 +02:00
return redirect()->route('ticket.edit', $ticket->id)->with('success', 'Modifications enregistrées !');
2020-11-18 10:23:51 +01:00
}
2021-04-18 20:31:07 +02:00
public function changeStatus(ChangeTicketStatus $request, Ticket $ticket)
{
$ticket->fill($request->validated());
$ticket->save();
return back();
}
2021-04-18 20:31:07 +02:00
public function createMessage(CreateMessage $request, Ticket $ticket)
{
$fileMessage = $request->file_message;
2021-04-18 20:31:07 +02:00
$message = new Message($request->validated());
$message->user()->associate(auth()->user());
$message->ticket()->associate($ticket);
$message->save();
2021-04-18 20:31:07 +02:00
if ($request->file_message) {
$projectSlug = Str::slug($ticket->project->name);
$fileMessage = $request->file_message;
$fileName = $projectSlug . '-ticket-' . $ticket->id . '-message-' . $message->id . '.' . $fileMessage->extension();
$fileMessage->move(public_path('fichiers/' . $projectSlug . '/' . $ticket->id . '/'), $fileName);
$filePath = 'fichiers/' . $projectSlug . '/' . $ticket->id . '/' . $fileName;
$message->file = $filePath;
$message->save();
}
event(new NotifySubscriptions(
$message->ticket,
trans('Nouvelle réponse de :name :<br> :message', [
'name' => $message->user->name,
'message' => $message->message
])
));
return back();
}
2021-04-18 20:31:07 +02:00
public function setToArchive(Ticket $ticket)
{
$ticket->status = TicketStatus::archived();
$ticket->saveOrFail();
return redirect()->route('ticket.index');
}
public function subscribe(Ticket $ticket)
{
User::find(Auth::user()->id)->subscriptions()->toggle($ticket->id);
return back();
}
2020-11-18 10:23:51 +01:00
}