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

277 lines
9.3 KiB
PHP
Raw Normal View History

2020-11-18 10:23:51 +01:00
<?php
namespace App\Http\Controllers;
2021-06-18 17:02:14 +02:00
use App\Enums\Role;
2021-04-18 20:31:07 +02:00
use App\Enums\TicketStatus;
use App\Enums\TicketType;
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;
2021-07-23 11:34:16 +02:00
use App\Models\Site;
2020-11-18 10:23:51 +01:00
use App\Models\Ticket;
use App\Models\User;
2021-04-18 20:31:07 +02:00
use Exception;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
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)
{
2021-06-18 16:29:16 +02:00
/** @var \App\Models\User */
$user = auth()->user();
2021-07-23 11:34:16 +02:00
$tickets = Ticket::with('site')->has('site');
2021-07-23 11:04:09 +02:00
if (!$user->isAdmin()) {
2021-07-23 11:34:16 +02:00
$tickets = $tickets->whereHas('site', function ($q) use ($user) {
2021-06-18 17:02:14 +02:00
$q->whereHas('users', function ($q) use ($user) {
$q->whereId($user->id);
});
2021-06-18 16:29:16 +02:00
});
2021-06-18 17:02:14 +02:00
}
$tickets = $tickets->where('status', $request->status ? '=' : '<>', TicketStatus::archived());
if ($request->search) {
$tickets = $this->searchTicket($tickets, $request);
2021-04-18 20:31:07 +02:00
}
$tickets = $this->filterTickets($tickets, $request);
$tickets = $tickets->paginate();
2021-04-18 20:31:07 +02:00
2021-07-23 11:34:16 +02:00
$sites = Site::select('id', 'name')->orderBy('name')->get();
2021-07-23 11:34:16 +02:00
return view('ticket.index', compact('tickets', 'sites'));
}
private function filterTickets(Builder $tickets, Request $request): Builder
{
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);
}
if ($request->sort_way) {
Session::put('tickets.sort_way', $request->sort_way);
}
if ($request->pr) {
Session::put('tickets.pr', $request->pr);
}
Session::save();
2021-04-21 15:08:47 +02:00
if (Session::has('tickets.pr')) {
2021-07-23 11:34:16 +02:00
$tickets = $tickets->where('site_id', Session::get('tickets.pr'));
2021-04-21 15:08:47 +02:00
}
if (
Session::has('tickets.sort_col') and
Session::has('tickets.sort_way') and
in_array(Session::get('tickets.sort_col'), [
2021-07-23 11:34:16 +02:00
'id', 'site_id', 'created_at', 'created_by',
'type', 'status'
])
) {
$tickets = $tickets->orderBy(
Session::get('tickets.sort_col'),
Session::get('tickets.sort_way')
);
2020-11-18 10:23:51 +01:00
}
return $tickets;
}
2021-04-18 20:31:07 +02:00
private function searchTicket(Builder $tickets, Request $request): Builder
{
$words = explode(' ', $request->search);
return $tickets->where(function ($q) use ($words) {
foreach ($words as $word) {
if (!strlen($word)) {
continue;
}
$q = $q->where(function ($q) use ($word) {
$s = collect(TicketStatus::toArray())->filter(function (TicketStatus $t) use ($word) {
return strpos(strtolower($t->label), $word) !== false;
})->map(function (TicketStatus $ticket) {
return $ticket->value;
});
$t = collect(TicketType::toArray())->filter(function (TicketType $t) use ($word) {
return strpos(strtolower($t->label), $word) !== false;
})->map(function (TicketType $ticket) {
return $ticket->value;
});
$q->where('text', 'LIKE', "%$word%")
->orWhereIn('status', $s)
->orWhereIn('type', $t)
->orWhere('file', 'LIKE', "%$word%")
->orWhere('file2', 'LIKE', "%$word%")
->orWhereHas('user', function ($q) use ($word) {
$q->where('name', 'LIKE', "%$word%");
});
});
}
});
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()
{
2021-06-23 19:48:22 +02:00
$user = Auth::user();
2021-06-24 11:32:22 +02:00
if ($user->role->value === 1) {
2021-07-23 11:34:16 +02:00
$sites = Site::orderBy('name')->get();
2021-06-23 19:48:22 +02:00
} else {
2021-07-23 11:34:16 +02:00
$sites = $user->sites;
2021-06-23 19:48:22 +02:00
}
2021-07-23 11:34:16 +02:00
if (!count($sites)) {
return redirect()->route('site.create')
2021-04-18 20:31:07 +02:00
->with('warning', 'Vous devez tout d\'abord créer un projet pour y ajouter un ticket');
}
2021-07-23 11:34:16 +02:00
return view('ticket.create', compact('sites'));
2020-11-18 10:23:51 +01:00
}
2021-04-18 20:31:07 +02:00
public function store(StoreTicket $request)
{
2021-07-23 11:34:16 +02:00
$site = Site::findOrFail($request->site_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) {
2021-07-23 11:34:16 +02:00
$ticket->file = Ticket::saveFile($site, $ticket, $ticket->type, $request->file_ticket);
}
2021-04-18 20:31:07 +02:00
if ($request->file_ticket2) {
2021-07-23 11:34:16 +02:00
$ticket->file2 = Ticket::saveFile($site, $ticket, $ticket->type, $request->file_ticket2);
2020-11-18 10:23:51 +01:00
}
2021-06-23 19:48:22 +02:00
if ($request->type === TicketType::evolution()) {
$ticket->status = TicketStatus::estimateTodo();
}
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)
{
2021-06-24 11:32:22 +02:00
$user = Auth::user();
if ($user->role->value === 1) {
2021-07-23 11:34:16 +02:00
$sites = Site::orderBy('name')->get();
2021-06-24 11:32:22 +02:00
} else {
2021-07-23 11:34:16 +02:00
$sites = $user->sites;
2021-06-24 11:32:22 +02:00
}
2021-07-23 11:34:16 +02:00
return view('ticket.edit', compact('ticket', 'sites'));
2020-11-18 10:23:51 +01:00
}
2021-04-18 20:31:07 +02:00
public function update(UpdateTicket $request, Ticket $ticket)
{
2021-07-23 11:34:16 +02:00
$site = Site::findOrFail($request->site_id);
2021-04-18 20:31:07 +02:00
$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);
}
2021-07-23 11:34:16 +02:00
$ticket->file = Ticket::saveFile($site, $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);
}
2021-07-23 11:34:16 +02:00
$ticket->file2 = Ticket::saveFile($site, $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);
2021-05-18 20:07:42 +02:00
/** @var \App\Models\User */
$user = auth()->user();
2021-07-21 09:44:29 +02:00
// Toggle auth user subscription
2021-05-18 20:07:42 +02:00
if ($request->subscribe) {
if (!$user->subscriptions()->find($ticket->id)) {
$user->subscriptions()->attach($ticket->id);
}
} elseif ($user->subscriptions()->find($ticket->id)) {
2021-05-18 20:07:42 +02:00
$user->subscriptions()->detach($ticket->id);
}
2021-04-18 20:31:07 +02:00
if ($request->file_message) {
2021-07-23 11:34:16 +02:00
$siteSlug = Str::slug($ticket->site->name);
$fileMessage = $request->file_message;
2021-07-23 12:06:08 +02:00
$fileName = $siteSlug . '-ticket-' . $ticket->id .
'-message-' . $message->id . '.' . $fileMessage->extension();
2021-07-23 11:34:16 +02:00
$fileMessage->move(public_path('fichiers/' . $siteSlug . '/' . $ticket->id . '/'), $fileName);
$filePath = 'fichiers/' . $siteSlug . '/' . $ticket->id . '/' . $fileName;
$message->file = $filePath;
}
2021-07-21 09:44:29 +02:00
$message->saveOrFail();
2021-05-18 22:52:46 +02:00
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
}