diff --git a/CHANGELOG.md b/CHANGELOG.md index 036deda..cf74a24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +### 29.09 -> 1.0.3 +- Correction des avertissements avant cloture des tickets +- Ajout d'un bouton pour les utilisateurs afin de réouvrir un ticket clos +- Ajout de messages de confirmation sur les actions de tickets + ### 29.09 -> 1.0.2 - Modification Un ticket qui est marqué comme traité ou en production depuis plus de 15 jours et sans activité sera automatiquement clos et archivé - Modification Il n'est désomrais plus possible de répondre à un ticket archivé dans touts les cas diff --git a/app/Http/Controllers/TicketController.php b/app/Http/Controllers/TicketController.php index 6e96c46..148f320 100644 --- a/app/Http/Controllers/TicketController.php +++ b/app/Http/Controllers/TicketController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers; use App\Enums\TicketStatus; use App\Enums\TicketType; +use App\Events\NotifySubscriptions; +use App\Events\TicketStatusChanged; use App\Http\Requests\ChangeTicketStatus; use App\Http\Requests\CreateMessage; use App\Http\Requests\SortTickets; @@ -177,7 +179,8 @@ class TicketController extends Controller throw new Exception('Missing MAIL_ADMIN in .env'); } - return redirect()->route('ticket.show', $ticket)->with('success', 'Ticket enregistré !'); + return redirect()->route('ticket.show', $ticket) + ->with('success', 'Ticket enregistré !'); } // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass @@ -213,7 +216,8 @@ class TicketController extends Controller $ticket->save(); - return redirect()->route('ticket.edit', $ticket->id)->with('success', 'Modifications enregistrées !'); + return redirect()->route('ticket.edit', $ticket->id) + ->with('success', 'Modifications enregistrées !'); } public function changeStatus(ChangeTicketStatus $request, Ticket $ticket) @@ -221,7 +225,8 @@ class TicketController extends Controller $ticket->fill($request->validated()); $ticket->save(); - return back(); + return back() + ->with('warning', trans('Le status à été modifié')); } public function createMessage(CreateMessage $request, Ticket $ticket) @@ -256,19 +261,40 @@ class TicketController extends Controller $message->saveOrFail(); - return back(); + return back() + ->with('success', trans('Votre message à été ajouté')); } public function setToArchive(Ticket $ticket) { $ticket->status = TicketStatus::archived(); $ticket->saveOrFail(); - return redirect()->route('ticket.index'); + return redirect()->route('ticket.index') + ->with('warning', trans('Le ticket est archivé')); } public function subscribe(Ticket $ticket) { + /** @var \App\Models\User */ + $user = auth()->user(); User::find(Auth::user()->id)->subscriptions()->toggle($ticket->id); - return back(); + $status = $user->subscriptions()->where('ticket_id', $ticket->id)->exists(); + if ($status) { + return back() + ->with('success', trans('Vous avez été inscrit')); + } + return back()->with('warning', trans('Vous avez été désinscrit')); + } + + public function reopen(Ticket $ticket) + { + $message = "{$ticket->user->name} à réouvert le ticket n°{$ticket->id}"; + $oldStatus = $ticket->status; + $ticket->status = TicketStatus::inprogress(); + $ticket->saveQuietly(); + event(new TicketStatusChanged($ticket, $oldStatus, null, $message)); + event(new NotifySubscriptions($ticket, $message, collect($ticket->user))); + User::find(Auth::user()->id)->subscriptions()->toggle($ticket->id); + return back()->with('warning', trans('Votre ticket à été réouvert.')); } } diff --git a/app/Models/Project.php b/app/Models/Project.php index 3156765..bd762a1 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -31,7 +31,8 @@ class Project extends Model 'type' => CrudType::string(), 'validate' => [ 'string', - 'max:255' + 'max:255', + 'unique:sites,name' ], 'required' => true, 'nullable' => false, diff --git a/app/Models/Site.php b/app/Models/Site.php index 006d846..97611bc 100644 --- a/app/Models/Site.php +++ b/app/Models/Site.php @@ -35,7 +35,8 @@ class Site extends Model 'type' => CrudType::string(), 'validate' => [ 'string', - 'max:255' + 'max:255', + 'unique:sites,name' ], 'required' => true, 'nullable' => false, diff --git a/app/Policies/Rules/UserRoleRules.php b/app/Policies/Rules/UserRoleRules.php index d172415..0d4b185 100644 --- a/app/Policies/Rules/UserRoleRules.php +++ b/app/Policies/Rules/UserRoleRules.php @@ -23,6 +23,11 @@ abstract class UserRoleRules extends StaticRules return $user->role->equals(Role::developper()); } + protected static function userIsClient(User $user) + { + return $user->role->equals(Role::client()); + } + protected static function allowEveryOne() { return true; diff --git a/app/Policies/TicketPolicy.php b/app/Policies/TicketPolicy.php index 93b4dbc..6d36d35 100644 --- a/app/Policies/TicketPolicy.php +++ b/app/Policies/TicketPolicy.php @@ -45,7 +45,8 @@ class TicketPolicy extends RootPolicy SSR::make('userSitesHasTicket', $user, $model) ]), 'suscribeToTicket' => TicketStaticRules::make('ticketIsNotArchived', $model), - 'createMessage' => TicketStaticRules::make('ticketIsNotArchived', $model) + 'createMessage' => TicketStaticRules::make('ticketIsNotArchived', $model), + 'reopen' => URR::make('userIsClient', $user) ] ]; } diff --git a/composer.json b/composer.json index 56cabbc..8a7d504 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "ldcweb/supportweb", - "version": "1.0.2", + "version": "1.0.3", "type": "project", "description": "The Laravel Framework.", "keywords": [ diff --git a/resources/views/layout/app.blade.php b/resources/views/layout/app.blade.php index 04f4bb5..2bba5b5 100644 --- a/resources/views/layout/app.blade.php +++ b/resources/views/layout/app.blade.php @@ -28,7 +28,12 @@ @include('layout.nav')
- @yield('content') +
+
+ @include('modules.flashMessage') + @yield('content') +
+
@include('layout.footer') diff --git a/resources/views/modules/error-messages.blade.php b/resources/views/modules/error-messages.blade.php deleted file mode 100644 index a8d92e1..0000000 --- a/resources/views/modules/error-messages.blade.php +++ /dev/null @@ -1,14 +0,0 @@ -@if ($errors->any()) -
- -
-@endif -@if(session('warning')) -
- {{ session('warning') }} -
-@endif diff --git a/resources/views/ticket/create.blade.php b/resources/views/ticket/create.blade.php index cc643e6..b32cd72 100644 --- a/resources/views/ticket/create.blade.php +++ b/resources/views/ticket/create.blade.php @@ -1,24 +1,20 @@ @extends('layout.app') +@section('bodyClass', 'col-md-8') + @section('content') -
-
-
-
-
Créer un ticketRetour
-
-
- @csrf +
+
Créer un ticketRetour
+
+ + @csrf - @include('ticket.form-inputs') + @include('ticket.form-inputs') -
- -
- -
+
+
-
+
@endsection diff --git a/resources/views/ticket/edit.blade.php b/resources/views/ticket/edit.blade.php index 19bed6f..7462cbe 100644 --- a/resources/views/ticket/edit.blade.php +++ b/resources/views/ticket/edit.blade.php @@ -1,28 +1,24 @@ @extends('layout.app') +@section('bodyClass', 'col-md-8') + @section('content') -
-
-
-
-
Modifier un ticketRetour
-
-
- @csrf - @method('PUT') - @if (session('success')) -
{!! session('success') !!}
- @endif +
+
Modifier un ticketRetour
+
+ + @csrf + @method('PUT') + @if (session('success')) +
{!! session('success') !!}
+ @endif - @include('ticket.form-inputs') + @include('ticket.form-inputs') -
- -
- -
+
+
-
+
@endsection diff --git a/resources/views/ticket/form-inputs.blade.php b/resources/views/ticket/form-inputs.blade.php index 009f581..256db94 100644 --- a/resources/views/ticket/form-inputs.blade.php +++ b/resources/views/ticket/form-inputs.blade.php @@ -1,4 +1,3 @@ -@include('modules.error-messages') @php $userPr = Auth::user()->sites ?? collect([]); @endphp diff --git a/resources/views/ticket/show.blade.php b/resources/views/ticket/show.blade.php index dbeba5e..3bd05fa 100644 --- a/resources/views/ticket/show.blade.php +++ b/resources/views/ticket/show.blade.php @@ -1,140 +1,145 @@ @extends('layout.app') @section('content') -
-
-

- ← - Ticket n°{{ $ticket->id }} : {{ $ticket->site->name }} - {{ $ticket->type->label }} - {{--@cannot('createMessage', $ticket)--}} - {{ $ticket->status->label }} - {{--@endcan--}} -

-
- @can('suscribeToTicket', $ticket) -
- @csrf -
- - -
-
- @endcan - @can('changeStatus', $ticket) -
- @csrf - -
- @endcan -
-
-
-
- @if ($errors->any()) -
-
    - @foreach ($errors->all() as $error) -
  • {{ $error }}
  • - @endforeach -
+
+

+ ← + {{ __('Ticket n° :ticketId : :ticketSiteName - :ticketTypeLabel', [ + 'ticketId' => $ticket->id, + 'ticketSiteName' => $ticket->site->name, + 'ticketTypeLabel' => $ticket->type->label + ]) }} + {{ $ticket->status->label }} +

+
+ @can('suscribeToTicket', $ticket) +
+ @csrf +
+ +
+
+ @endcan + @can('changeStatus', $ticket) +
+ @csrf + +
+ @endcan + @if($ticket->status->equals(TicketStatus::archived())) + @can('reopen', $ticket) +
+ @csrf + +
+ @endcan @endif -

- Suivi - @can('createMessage', $ticket) - - - @endcan -

- @foreach ($messages as $message) - @if ($message->user_id === null) -
- {!! nl2br(clean($message->message)) !!} - Le {{ \Carbon\Carbon::parse($message->created_at)->format('d/m/Y à H:i')}} - (Message système) -
- @else -
- {!! Utils::plainToHtml($message->message) !!} - @if ($message->file !== null) -
Ouvrir la pièce jointe
- @endif

- Le {{ \Carbon\Carbon::parse($message->created_at)->format('d/m/Y à H:i')}} par {{ $message->user ? $message->user->name : __('Utilisateur supprimé') }} -
- @endif - @endforeach
-
-
-

Description

-

{!! Utils::plainToHtml($ticket->text) !!}

- Créé le {{ \Carbon\Carbon::parse($ticket->created_at)->format('d/m/Y à H:i') }} par {{ $ticket->user ? $ticket->user->name : __('Utilisateur supprimé') }} -
- @if ($ticket->file !== null || $ticket->file2 !== null) -
-
-

Pièces jointes

- -
- @endif
+
+
+

+ {{ __('Suivi') }} + @can('createMessage', $ticket) + + + @endcan +

+ @foreach ($messages as $message) + @if ($message->user_id === null) +
+ {!! nl2br(clean($message->message)) !!} - Le {{ \Carbon\Carbon::parse($message->created_at)->format('d/m/Y à H:i')}} + ({{ __('Message système') }}) +
+ @else +
+ {!! Utils::plainToHtml($message->message) !!} + @if ($message->file !== null) +
Ouvrir la pièce jointe
+ @endif

+ {!! __('Créé le :date par :userName', [ + 'date' => \Carbon\Carbon::parse($ticket->created_at)->format('d/m/Y à H:i'), + 'userName' => $ticket->user ? $ticket->user->name : __('Utilisateur supprimé') + ]) !!} +
+ @endif + @endforeach +
+
+
+

{{__('Description') }}

+

{!! Utils::plainToHtml($ticket->text) !!}

+ {!! __('Créé le :date par :userName', [ + 'date' => \Carbon\Carbon::parse($ticket->created_at)->format('d/m/Y à H:i'), + 'userName' => $ticket->user ? $ticket->user->name : __('Utilisateur supprimé') + ]) !!} +
+@if ($ticket->file !== null || $ticket->file2 !== null) +
+
+

{{ __('Pièces jointes') }}

+ +
+@endif @endsection diff --git a/routes/web.php b/routes/web.php index 54307d3..205ae0b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -57,6 +57,9 @@ Route::middleware(['auth'])->group(function () { Route::resource('sites.files', FileController::class); Route::prefix('/ticket')->name('ticket.')->group(function () { + Route::post('/{ticket}/reopen', [TicketController::class, 'reopen']) + ->middleware('can:reopen,ticket') + ->name('reopen'); Route::post('/{ticket}/status', [TicketController::class, 'changeStatus']) ->middleware('can:changeStatus,ticket') ->name('changeStatus');