Merge branch 'develop' into trunk
This commit is contained in:
commit
a5d4c58604
27 changed files with 764 additions and 526 deletions
11
.gitlab/issue_templates/bug.md
Normal file
11
.gitlab/issue_templates/bug.md
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
## Comportement constaté
|
||||
|
||||
|
||||
## Comportement attendu
|
||||
|
||||
|
||||
## Solution envisagée
|
||||
|
||||
|
||||
## Étapes pour la reproduction du bug
|
||||
*
|
||||
7
.gitlab/issue_templates/feature.md
Normal file
7
.gitlab/issue_templates/feature.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
## Présentation du besoin
|
||||
|
||||
|
||||
## Implémentation
|
||||
|
||||
|
||||
## Maquettes, documentations...
|
||||
|
|
@ -50,7 +50,7 @@ class TaskType extends BaseEnumRoutable
|
|||
protected static function prices(): array
|
||||
{
|
||||
return [
|
||||
'web' => 460,
|
||||
'web' => 500,
|
||||
'seo' => 690,
|
||||
// * Linked to packages table
|
||||
'package' => 0,
|
||||
|
|
|
|||
38
app/Enums/MessageType.php
Normal file
38
app/Enums/MessageType.php
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
use Kwaadpepper\Enum\BaseEnumRoutable;
|
||||
|
||||
/**
|
||||
* @method static self private()
|
||||
* @method static self public()
|
||||
*/
|
||||
class MessageType extends BaseEnumRoutable
|
||||
{
|
||||
/**
|
||||
* Enum values
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected static function values(): array
|
||||
{
|
||||
return [
|
||||
'private' => 1,
|
||||
'public' => 2
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Enum labels
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected static function labels(): array
|
||||
{
|
||||
return [
|
||||
'private' => trans('Privé'),
|
||||
'public' => trans('Public'),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -14,6 +14,7 @@ use Kwaadpepper\Enum\BaseEnumRoutable;
|
|||
* @method static self projects()
|
||||
* @method static self management()
|
||||
* @method static self absence()
|
||||
* @method static self leaddev()
|
||||
*
|
||||
*/
|
||||
class ActivityType extends BaseEnumRoutable
|
||||
|
|
@ -32,6 +33,7 @@ class ActivityType extends BaseEnumRoutable
|
|||
'projects' => trans('Projets & Réunions'),
|
||||
'management' => trans('Organisation management'),
|
||||
'absence' => trans('Absence'),
|
||||
'leaddev' => trans('Lead Dev')
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -48,7 +50,8 @@ class ActivityType extends BaseEnumRoutable
|
|||
'dev' => '#00b0f0',
|
||||
'projects' => '#ffe699',
|
||||
'management' => '#f4b084',
|
||||
'absence' => '#aeaaaa'
|
||||
'absence' => '#aeaaaa',
|
||||
'leaddev' => '#ff7979'
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ use Kwaadpepper\Enum\BaseEnumRoutable;
|
|||
* @method static self projects()
|
||||
* @method static self management()
|
||||
* @method static self absence()
|
||||
* @method static self leaddev()
|
||||
*/
|
||||
class CellType extends BaseEnumRoutable
|
||||
{
|
||||
|
|
@ -30,7 +31,8 @@ class CellType extends BaseEnumRoutable
|
|||
'dev' => '#00b0f0',
|
||||
'projects' => '#ffe699',
|
||||
'management' => '#f4b084',
|
||||
'absence' => '#aeaaaa'
|
||||
'absence' => '#aeaaaa',
|
||||
'leaddev' => '#ff7979'
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -48,6 +50,7 @@ class CellType extends BaseEnumRoutable
|
|||
'projects' => trans('Projets & Réunions'),
|
||||
'management' => trans('Organisation management'),
|
||||
'absence' => trans('Absence'),
|
||||
'leaddev' => trans('Lead Dev')
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,14 +7,9 @@ use Kwaadpepper\Enum\BaseEnumRoutable;
|
|||
/**
|
||||
* @method static self new()
|
||||
* @method static self estimateTodo()
|
||||
* @method static self estimateValidated()
|
||||
* @method static self estimateDone()
|
||||
* @method static self toPlan()
|
||||
* @method static self planned()
|
||||
* @method static self inprogress()
|
||||
* @method static self takenInAccount()
|
||||
* @method static self waiting()
|
||||
* @method static self waitingValidation()
|
||||
* @method static self processed()
|
||||
* @method static self recette()
|
||||
* @method static self production()
|
||||
* @method static self archived()
|
||||
|
|
@ -31,17 +26,12 @@ class TicketStatus extends BaseEnumRoutable
|
|||
return [
|
||||
'new' => 1,
|
||||
'estimateTodo' => 2,
|
||||
'estimateValidated' => 3,
|
||||
'toPlan' => 4,
|
||||
'planned' => 5,
|
||||
'inprogress' => 7,
|
||||
'waiting' => 9,
|
||||
'processed' => 10,
|
||||
'recette' => 12,
|
||||
'production' => 13,
|
||||
'archived' => 15,
|
||||
'estimateDone' => 16,
|
||||
'waitingValidation' => 17,
|
||||
'takenInAccount' => 3,
|
||||
'waiting' => 4,
|
||||
'waitingValidation' => 5,
|
||||
'recette' => 6,
|
||||
'production' => 7,
|
||||
'archived' => 8,
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -55,14 +45,9 @@ class TicketStatus extends BaseEnumRoutable
|
|||
return [
|
||||
'new' => trans('Nouveau'),
|
||||
'estimateTodo' => trans('Devis à faire'),
|
||||
'estimateValidated' => trans('Devis validé'),
|
||||
'estimateDone' => trans('Devis réalisé'),
|
||||
'toPlan' => trans('À planifier'),
|
||||
'planned' => trans('Planifié'),
|
||||
'inprogress' => trans('En cours'),
|
||||
'waiting' => trans('En attente'),
|
||||
'waitingValidation' => trans('En attente validation'),
|
||||
'processed' => trans('Traité'),
|
||||
'takenInAccount' => trans('Pris en compte'),
|
||||
'waiting' => trans('En attente de réponse'),
|
||||
'waitingValidation' => trans('En attente de validation'),
|
||||
'recette' => trans('En recettage'),
|
||||
'production' => trans('En production'),
|
||||
'archived' => trans('Archivé'),
|
||||
|
|
@ -79,14 +64,9 @@ class TicketStatus extends BaseEnumRoutable
|
|||
return [
|
||||
'new' => 'text-danger',
|
||||
'estimateTodo' => 'text-info',
|
||||
'estimateValidated' => 'text-info',
|
||||
'estimateDone' => 'text-info',
|
||||
'toPlan' => 'text-info',
|
||||
'planned' => 'text-info',
|
||||
'inprogress' => 'text-dark',
|
||||
'takenInAccount' => 'text-info',
|
||||
'waiting' => 'text-white bg-danger',
|
||||
'waitingValidation' => 'text-warning bg-danger',
|
||||
'processed' => trans('Traité'),
|
||||
'recette' => 'text-primary',
|
||||
'production' => 'text-success',
|
||||
'archived' => 'text-secondary',
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ use Kwaadpepper\Enum\BaseEnumRoutable;
|
|||
* @method static self evolution()
|
||||
* @method static self br()
|
||||
* @method static self newsletter()
|
||||
* @method static self qrcode()
|
||||
* @method static self advice()
|
||||
*/
|
||||
class TicketType extends BaseEnumRoutable
|
||||
{
|
||||
|
|
@ -23,7 +25,9 @@ class TicketType extends BaseEnumRoutable
|
|||
'bug' => 0,
|
||||
'evolution' => 1,
|
||||
'br' => 2,
|
||||
'newsletter' => 3
|
||||
'newsletter' => 3,
|
||||
'qrcode' => 4,
|
||||
'advice' => 5
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -38,7 +42,9 @@ class TicketType extends BaseEnumRoutable
|
|||
'bug' => trans('Bug'),
|
||||
'evolution' => trans('Évolution'),
|
||||
'br' => trans('Demande BR'),
|
||||
'newsletter' => trans('Demande newsletter')
|
||||
'newsletter' => trans('Demande newsletter'),
|
||||
'qrcode' => trans('Demande de QR Code'),
|
||||
'advice' => trans('Conseil - Accompagnement')
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -53,7 +59,9 @@ class TicketType extends BaseEnumRoutable
|
|||
'bug' => 'bg-danger',
|
||||
'evolution' => 'bg-success',
|
||||
'br' => 'bg-primary',
|
||||
'newsletter' => 'bg-warning'
|
||||
'newsletter' => 'bg-warning',
|
||||
'qrcode' => 'bg-secondary',
|
||||
'advice' => 'bg-info'
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,9 @@ class TicketStatusChanged
|
|||
/** @var string */
|
||||
public $message;
|
||||
|
||||
/** @var boolean */
|
||||
public $is_private;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
|
|
@ -34,13 +37,20 @@ class TicketStatusChanged
|
|||
* @param \App\Enums\TicketStatus $status
|
||||
* @param \App\Models\User|null $user
|
||||
* @param string|null $message
|
||||
* @param boolean $is_private
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Ticket $ticket, TicketStatus $status, User $user = null, string $message = null)
|
||||
{
|
||||
$this->ticket = $ticket;
|
||||
$this->status = $status;
|
||||
$this->user = $user;
|
||||
$this->message = $message;
|
||||
public function __construct(
|
||||
Ticket $ticket,
|
||||
TicketStatus $status,
|
||||
User $user = null,
|
||||
string $message = null,
|
||||
bool $is_private = false
|
||||
) {
|
||||
$this->ticket = $ticket;
|
||||
$this->status = $status;
|
||||
$this->user = $user;
|
||||
$this->message = $message;
|
||||
$this->is_private = $is_private;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,12 +44,10 @@ class Controller extends BaseController
|
|||
[
|
||||
TicketStatus::new(),
|
||||
TicketStatus::estimateTodo(),
|
||||
TicketStatus::estimateValidated(),
|
||||
TicketStatus::toPlan(),
|
||||
TicketStatus::planned(),
|
||||
TicketStatus::waiting(),
|
||||
TicketStatus::production(),
|
||||
TicketStatus::archived()
|
||||
TicketStatus::archived(),
|
||||
TicketStatus::takenInAccount()
|
||||
]
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ class EstimationController extends Controller
|
|||
/** @var \App\Models\Credit\Estimation */
|
||||
$estimation = $ticket->estimation;
|
||||
if ($request->answer) {
|
||||
$ticket->status = TicketStatus::toPlan();
|
||||
$ticket->status = TicketStatus::takenInAccount();
|
||||
$estimation->status = EstimationStatus::accepted();
|
||||
} else {
|
||||
$ticket->status = TicketStatus::archived();
|
||||
|
|
|
|||
|
|
@ -2,9 +2,6 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Parsedown;
|
||||
|
||||
class HomeController extends Controller
|
||||
{
|
||||
/**
|
||||
|
|
@ -14,8 +11,6 @@ class HomeController extends Controller
|
|||
*/
|
||||
public function home()
|
||||
{
|
||||
$Parsedown = new Parsedown();
|
||||
$changelog = $Parsedown->text(File::get(\app_path('../CHANGELOG.md')));
|
||||
return view('home', ['changelog' => $changelog]);
|
||||
return view('home');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -433,7 +433,7 @@ class TicketController extends Controller
|
|||
|
||||
/** @var \App\Models\User|null */
|
||||
if ($assignedUser = User::whereId($request->assign)->first()) {
|
||||
$message = trans(':admin à assigné le ticket n°:ticketNumber à :assignedAdmin', [
|
||||
$message = trans(':admin a assigné le ticket n°:ticketNumber à :assignedAdmin', [
|
||||
'admin' => $user->name,
|
||||
'ticketNumber' => $ticket->id,
|
||||
'assignedAdmin' => $assignedUser->name,
|
||||
|
|
@ -441,7 +441,7 @@ class TicketController extends Controller
|
|||
$ticket->assignedUser()->associate($assignedUser);
|
||||
} else {
|
||||
$message = trans(
|
||||
':admin modifié l\'assignation du ticket n°:ticketNumber, il n\'est plus assigné à quelqu\'un.',
|
||||
':admin a modifié l\'assignation du ticket n°:ticketNumber, il n\'est plus assigné à quelqu\'un.',
|
||||
[
|
||||
'admin' => $user->name,
|
||||
'ticketNumber' => $ticket->id,
|
||||
|
|
@ -454,7 +454,7 @@ class TicketController extends Controller
|
|||
|
||||
/** @var \App\Enums\TicketStatus */
|
||||
$oldStatus = $ticket->status;
|
||||
event(new TicketStatusChanged($ticket, $oldStatus, null, $message));
|
||||
event(new TicketStatusChanged($ticket, $oldStatus, null, $message, true));
|
||||
event(new NotifySubscriptions($ticket, $message, collect([$ticket->user])));
|
||||
|
||||
/** @var \App\Models\User */
|
||||
|
|
|
|||
|
|
@ -2,7 +2,9 @@
|
|||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use App\Enums\MessageType;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Kwaadpepper\Enum\Rules\EnumIsValidRule;
|
||||
|
||||
class CreateMessage extends FormRequest
|
||||
{
|
||||
|
|
@ -17,6 +19,12 @@ class CreateMessage extends FormRequest
|
|||
if (!($user = auth()->user())) {
|
||||
return false;
|
||||
}
|
||||
if (
|
||||
!auth()->user()->can('createPrivateMessage', request()->route()->ticket)
|
||||
&& $this->is_private == MessageType::private()
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
return auth()->check() and auth()->user()->sites and (
|
||||
$user->isAdmin() or
|
||||
auth()->user()->sites->contains(request()->route()->ticket->site_id)
|
||||
|
|
@ -33,7 +41,8 @@ class CreateMessage extends FormRequest
|
|||
protected function prepareForValidation()
|
||||
{
|
||||
$this->merge([
|
||||
'subscribe' => $this->subscribe ? true : false
|
||||
'subscribe' => $this->subscribe ? true : false,
|
||||
'type' => $this->is_private ? MessageType::private()->value : MessageType::public()->value
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
@ -49,7 +58,11 @@ class CreateMessage extends FormRequest
|
|||
return [
|
||||
'subscribe' => 'required|boolean',
|
||||
'message' => 'required|min:' . ($user->isAdmin() ? '5' : '20'),
|
||||
'file_message' => 'sometimes|mimes:jpeg,jpg,png,pdf|max:2048'
|
||||
'file_message' => 'sometimes|mimes:jpeg,jpg,png,pdf|max:2048',
|
||||
'type' => [
|
||||
'required',
|
||||
new EnumIsValidRule(MessageType::class)
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
namespace App\Listeners;
|
||||
|
||||
use App\Enums\MessageType;
|
||||
use App\Enums\TicketStatus;
|
||||
use App\Events\TicketStatusChanged;
|
||||
use App\Models\Message;
|
||||
|
||||
|
|
@ -12,19 +14,89 @@ class AddStatusMessages
|
|||
*
|
||||
* @param \App\Events\TicketStatusChanged $event
|
||||
* @return void
|
||||
* @phpcs:disable Generic.Metrics.CyclomaticComplexity
|
||||
*/
|
||||
public function handle(TicketStatusChanged $event)
|
||||
{
|
||||
$message = new Message();
|
||||
$message->ticket_id = $event->ticket->id;
|
||||
$message->type = MessageType::public();
|
||||
if ($event->is_private) {
|
||||
$message->type = MessageType::private();
|
||||
}
|
||||
if ($event->message) {
|
||||
$message->message = $event->message;
|
||||
} elseif ($event->user) {
|
||||
// phpcs:ignore Generic.Files.LineLength.TooLong
|
||||
$message->message = "<b>{$event->user->name}</b> a modifié le statut en <b>{$event->ticket->status->label}</b>";
|
||||
$message->message = sprintf(
|
||||
"<b>%s</b> %s <b>%s</b>",
|
||||
$event->user->name,
|
||||
__("a modifié le statut en"),
|
||||
$event->ticket->status->label
|
||||
);
|
||||
} else {
|
||||
$message->message = "Le statut est passé à : <b>{$event->ticket->status->label}</b>";
|
||||
$message->message = sprintf(
|
||||
"%s : <b>%s</b>",
|
||||
__("Le statut est passé à"),
|
||||
$event->ticket->status->label
|
||||
);
|
||||
}
|
||||
switch ($event->ticket->status) {
|
||||
case TicketStatus::new():
|
||||
$message->message = sprintf(
|
||||
"%s<br>%s<br>",
|
||||
$message->message,
|
||||
__("Votre ticket a été créé, nous allons en prendre connaissance.")
|
||||
);
|
||||
break;
|
||||
case TicketStatus::estimateTodo():
|
||||
$message->message = sprintf(
|
||||
"%s<br>%s<br>",
|
||||
$message->message,
|
||||
__("Votre ticket nécessite une estimation, nous allons vous proposer un devis.")
|
||||
);
|
||||
break;
|
||||
case TicketStatus::takenInAccount():
|
||||
$message->message .= sprintf("<br>" .
|
||||
__("Votre ticket est dans le processus de traitement.") . "<br>");
|
||||
break;
|
||||
case TicketStatus::waiting():
|
||||
$message->message = sprintf(
|
||||
"%s<br>%s<br>",
|
||||
$message->message,
|
||||
__("Nous attendons une réponse de votre part pour procéder à la suite du traitement.")
|
||||
);
|
||||
break;
|
||||
case TicketStatus::waitingValidation():
|
||||
$message->message = sprintf(
|
||||
"%s<br>%s<br>",
|
||||
$message->message,
|
||||
__("Nous attendons une validation de votre part pour procéder au traitement.")
|
||||
);
|
||||
break;
|
||||
case TicketStatus::recette():
|
||||
$message->message = sprintf(
|
||||
"%s<br>%s<br>",
|
||||
$message->message,
|
||||
__("Le traitement à été réalisé et mis à disposition sur la plateforme de recette.
|
||||
Vous pouvez vérifier que la solution mise en œuvre correspond à la demande.")
|
||||
);
|
||||
break;
|
||||
case TicketStatus::production():
|
||||
$message->message = sprintf(
|
||||
"%s<br>%s<br>",
|
||||
$message->message,
|
||||
__("La solution à été mise en ligne.
|
||||
Vous pouvez vérifier sur le site de production que tout fonctionne comme attendu.")
|
||||
);
|
||||
break;
|
||||
case TicketStatus::archived():
|
||||
$message->message = sprintf(
|
||||
"%s<br>%s<br>",
|
||||
$message->message,
|
||||
__("Ce ticket est clos.")
|
||||
);
|
||||
break;
|
||||
} //end switch
|
||||
$message->save();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,14 +2,17 @@
|
|||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Enums\MessageType;
|
||||
use App\Events\NotifySubscriptions;
|
||||
use App\Events\NotifyTicketCreator;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Kwaadpepper\Enum\Traits\CastsEnums;
|
||||
|
||||
class Message extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
use CastsEnums;
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
|
|
@ -17,7 +20,17 @@ class Message extends Model
|
|||
* @var array
|
||||
*/
|
||||
protected $fillable = [
|
||||
'message'
|
||||
'message',
|
||||
'type'
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes that should be cast to Enums.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $enumCasts = [
|
||||
'type' => MessageType::class
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -63,8 +63,10 @@ class Ticket extends Model
|
|||
protected static function booted()
|
||||
{
|
||||
static::creating(function (Ticket $ticket) {
|
||||
// If evolution force the ticket status on estimateTodo.
|
||||
if ($ticket->type->equals(TicketType::evolution())) {
|
||||
// If bug force the ticket status on new. All the others are estimateTodo.
|
||||
if ($ticket->type->equals(TicketType::bug())) {
|
||||
$ticket->status = TicketStatus::new();
|
||||
} else {
|
||||
$ticket->status = TicketStatus::estimateTodo();
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -46,6 +46,10 @@ class TicketPolicy extends RootPolicy
|
|||
]),
|
||||
'suscribeToTicket' => TicketStaticRules::make('ticketIsNotArchived', $model),
|
||||
'createMessage' => TicketStaticRules::make('ticketIsNotArchived', $model),
|
||||
'createPrivateMessage' => StaticRules::and([
|
||||
URR::make('userIsAdmin', $user),
|
||||
TicketStaticRules::make('ticketIsNotArchived', $model),
|
||||
]),
|
||||
'updateMessage' => StaticRules::or([
|
||||
URR::make('userIsAdmin', $user),
|
||||
TicketStaticRules::make('ticketIsNotArchived', $model),
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@
|
|||
"php": "^7.3|^8.0",
|
||||
"carlos-meneses/laravel-mpdf": "^2.1",
|
||||
"doctrine/dbal": "^3.1",
|
||||
"erusev/parsedown": "^1.7",
|
||||
"fideloper/proxy": "^4.4",
|
||||
"fruitcake/laravel-cors": "^2.0",
|
||||
"guzzlehttp/guzzle": "^7.0.1",
|
||||
|
|
@ -41,8 +40,12 @@
|
|||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true,
|
||||
"composer/package-versions-deprecated": true
|
||||
}
|
||||
"composer/package-versions-deprecated": true,
|
||||
"php-http/discovery": true
|
||||
},
|
||||
"gitlab-domains": [
|
||||
"lab.s-web.fr"
|
||||
]
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
|
|
@ -75,10 +78,10 @@
|
|||
"@php artisan key:generate --ansi"
|
||||
]
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"repositories": {
|
||||
"lab.s-web.fr": {
|
||||
"type": "composer",
|
||||
"url": "https://gitlab.com/api/v4/group/16669037/-/packages/composer/packages.json"
|
||||
"url": "https://lab.s-web.fr/api/v4/group/23/-/packages/composer/packages.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
767
composer.lock
generated
767
composer.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -245,6 +245,7 @@ return [
|
|||
'TableRow' => App\Enums\Planning\TableRow::class,
|
||||
'ActivityEnum' => App\Enums\MacroSchedule\Activity::class,
|
||||
'ProjectStatus' => App\Enums\ProjectStatus::class,
|
||||
'MessageTypeEnum' => App\Enums\MessageType::class,
|
||||
],
|
||||
|
||||
];
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
use App\Models\Ticket;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class ChangeTicketsStatus extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Ticket::whereIn('status', [4, 5, 7, 10])
|
||||
->update(['status' => 3]);
|
||||
Ticket::where('status', 9)
|
||||
->update(['status' => 4]);
|
||||
Ticket::where('status', 17)
|
||||
->update(['status' => 5]);
|
||||
Ticket::where('status', 12)
|
||||
->update(['status' => 6]);
|
||||
Ticket::where('status', 13)
|
||||
->update(['status' => 7]);
|
||||
Ticket::where('status', 15)
|
||||
->update(['status' => 8]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Ticket::where('status', 3)
|
||||
->update(['status' => 10]);
|
||||
Ticket::where('status', 4)
|
||||
->update(['status' => 9]);
|
||||
Ticket::where('status', 5)
|
||||
->update(['status' => 17]);
|
||||
Ticket::where('status', 6)
|
||||
->update(['status' => 12]);
|
||||
Ticket::where('status', 7)
|
||||
->update(['status' => 13]);
|
||||
Ticket::where('status', 8)
|
||||
->update(['status' => 15]);
|
||||
}
|
||||
}
|
||||
42
database/migrations/2023_04_06_122125_add_message_type.php
Normal file
42
database/migrations/2023_04_06_122125_add_message_type.php
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
use App\Enums\MessageType;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddMessageType extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('messages', function (Blueprint $table) {
|
||||
$table->unsignedTinyInteger('type')
|
||||
->comment('Message Type defined by an enum.')
|
||||
->after('message');
|
||||
});
|
||||
// Set all existing messages as public.
|
||||
$messages = DB::table('messages')->get();
|
||||
collect($messages)->map(function (object $message) {
|
||||
DB::table('messages')->where('id', $message->id)
|
||||
->update(['type' => MessageType::public()]);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('messages', function (Blueprint $table) {
|
||||
$table->dropColumn('type');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -5,15 +5,13 @@
|
|||
<div class="row">
|
||||
<div class="col">
|
||||
<h1>Bienvenue sur le support LDC WEB.</h1>
|
||||
<p>Pour consulter vos tickets, merci de vous connecter : <a href="{{ route('login') }}">Connexion</a></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-4">
|
||||
<h3>Changements</h3>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col">
|
||||
{!! $changelog !!}
|
||||
<a href="{{ route('ticket.create') }}" class="btn btn-primary">
|
||||
{{ __('Créer un ticket') }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,9 @@
|
|||
.absence, .Sat, .Sun {
|
||||
background-color: {{CellType::absence()->value}} !important;
|
||||
}
|
||||
.leaddev {
|
||||
background-color: {{CellType::leaddev()->value}} !important;
|
||||
}
|
||||
.empty {
|
||||
background-color: #FFF !important;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -126,6 +126,16 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@can('createPrivateMessage', $ticket)
|
||||
<div class="row mt-4">
|
||||
<div class="col">
|
||||
<div class="form-check">
|
||||
<input name="is_private" type="checkbox" class="form-check-input" id="setPrivate" autocomplete="off" value="{{MessageTypeEnum::private()}}">
|
||||
<label class="form-check-label" for="setPrivate">{{ __('Rendre le message privé') }}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="reset" class="btn btn-sm btn-danger" data-bs-dismiss="modal">{{ __('Fermer') }}</button>
|
||||
|
|
@ -141,59 +151,67 @@
|
|||
@endcan
|
||||
</h4>
|
||||
@foreach ($messages as $message)
|
||||
@if ($message->user_id === null)
|
||||
<div class="offset-md-3 col-md-6 alert alert-info text-center text-dark">
|
||||
{!! nl2br(clean($message->message)) !!} - <span class="fw-bold text-light">Le {{ \Carbon\Carbon::parse($message->created_at)->format('d/m/Y à H:i')}}</span>
|
||||
<small class="fw-bold">({{ __('Message système') }})</small>
|
||||
</div>
|
||||
@else
|
||||
<div class="@if($message->user_id === Auth::user()->id)offset-md-4 alert-dark @else alert-light @endif col-md-8 alert">
|
||||
{!! ToolboxHelper::plainToHtml($message->message) !!}
|
||||
@if ($message->file !== null)
|
||||
<br><a @if(ToolboxHelper::isImageFile($message->file))data-fslightbox="gallery" @endif href="{{ asset($message->file) }}" target="_blank">Ouvrir la pièce jointe</a><br>
|
||||
@endif<br><br>
|
||||
<small class="text-muted fw-bold">
|
||||
{!! __('Créé le :date par <b>:userName</b>', [
|
||||
'date' => \Carbon\Carbon::parse($message->created_at)->format('d/m/Y à H:i'),
|
||||
'userName' => $message->user ? $message->user->name : __('Utilisateur supprimé')
|
||||
]) !!}
|
||||
</small>
|
||||
@if($message->user_id === Auth::user()->id)
|
||||
@can('updateMessage', $ticket, $message)
|
||||
<button type="button" class="btn btn-sm btn-primary float-end" data-bs-toggle="modal" data-bs-target="#updateMessageModal{{$message->id}}">
|
||||
{{ __('Modifier le message') }}
|
||||
</button>
|
||||
<div class="modal fade" id="updateMessageModal{{$message->id}}" tabindex="-1" aria-labelledby="updateMessageModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<form action="{{ route('ticket.message.update', ['ticket'=>$ticket, 'message'=>$message]) }}" method="POST" enctype="multipart/form-data">
|
||||
@method('PUT')
|
||||
@csrf
|
||||
<input type="hidden" name="ticket_id" value="{{ $ticket->id }}">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="messageModalLabel">
|
||||
{{ __('Modification du message n°:messageid', ['messageid' => $message->id]) }}
|
||||
</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{__('Fermer') }}"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<textarea name="message" class="form-control" rows="10">{{ $message->message }}</textarea>
|
||||
@if (
|
||||
$message->type->equals(MessageTypeEnum::public()) ||
|
||||
(Auth::user()->can('createPrivateMessage', $ticket))
|
||||
)
|
||||
@if ($message->user_id === null)
|
||||
<div class="offset-md-3 col-md-6 alert alert-info text-center text-dark">
|
||||
{!! nl2br(clean($message->message)) !!} - <span class="fw-bold text-light">Le {{ \Carbon\Carbon::parse($message->created_at)->format('d/m/Y à H:i')}}</span>
|
||||
<small class="fw-bold">({{ __('Message système') }})</small>
|
||||
</div>
|
||||
@else
|
||||
<div class="@if($message->user_id === Auth::user()->id)offset-md-4 alert-dark @else alert-light @endif @if($message->type->equals(MessageTypeEnum::private())) border border-danger border-2 @endif col-md-8 alert">
|
||||
@if ($message->type->equals(MessageTypeEnum::private()))
|
||||
<i class="fa-solid fa-lock"></i>
|
||||
@endif
|
||||
{!! ToolboxHelper::plainToHtml($message->message) !!}
|
||||
@if ($message->file !== null)
|
||||
<br><a @if(ToolboxHelper::isImageFile($message->file))data-fslightbox="gallery" @endif href="{{ asset($message->file) }}" target="_blank">Ouvrir la pièce jointe</a><br>
|
||||
@endif<br><br>
|
||||
<small class="text-muted fw-bold">
|
||||
{!! __('Créé le :date par <b>:userName</b>', [
|
||||
'date' => \Carbon\Carbon::parse($message->created_at)->format('d/m/Y à H:i'),
|
||||
'userName' => $message->user ? $message->user->name : __('Utilisateur supprimé')
|
||||
]) !!}
|
||||
</small>
|
||||
@if($message->user_id === Auth::user()->id)
|
||||
@can('updateMessage', $ticket, $message)
|
||||
<button type="button" class="btn btn-sm btn-primary float-end" data-bs-toggle="modal" data-bs-target="#updateMessageModal{{$message->id}}">
|
||||
{{ __('Modifier le message') }}
|
||||
</button>
|
||||
<div class="modal fade" id="updateMessageModal{{$message->id}}" tabindex="-1" aria-labelledby="updateMessageModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<form action="{{ route('ticket.message.update', ['ticket'=>$ticket, 'message'=>$message]) }}" method="POST" enctype="multipart/form-data">
|
||||
@method('PUT')
|
||||
@csrf
|
||||
<input type="hidden" name="ticket_id" value="{{ $ticket->id }}">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="messageModalLabel">
|
||||
{{ __('Modification du message n°:messageid', ['messageid' => $message->id]) }}
|
||||
</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{__('Fermer') }}"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<textarea name="message" class="form-control" rows="10">{{ $message->message }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="reset" class="btn btn-sm btn-danger" data-bs-dismiss="modal">{{ __('Fermer') }}</button>
|
||||
<button type="submit" class="btn btn-sm btn-success">{{ __('Envoyer') }}</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="modal-footer">
|
||||
<button type="reset" class="btn btn-sm btn-danger" data-bs-dismiss="modal">{{ __('Fermer') }}</button>
|
||||
<button type="submit" class="btn btn-sm btn-success">{{ __('Envoyer') }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endcan
|
||||
@endif
|
||||
</div>
|
||||
@endcan
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
@endforeach
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -32,8 +32,6 @@ use Illuminate\Support\Facades\Route;
|
|||
|
|
||||
*/
|
||||
|
||||
Route::get('/', [HomeController::class, 'home'])->middleware('guest')->name('home');
|
||||
|
||||
Route::middleware(['throttle:credentials'])->group(function () {
|
||||
// * guest:web middleware specified in AuthController
|
||||
Auth::routes([
|
||||
|
|
@ -58,6 +56,8 @@ Route::get('/ping', function () {
|
|||
})->withoutMiddleware('auth');
|
||||
|
||||
Route::middleware('auth:web')->group(function () {
|
||||
// * Home
|
||||
Route::get('/', [HomeController::class, 'home'])->name('home');
|
||||
|
||||
// * Macro planning
|
||||
Route::get('/macroplanning', [ScheduleMacroController::class, 'show'])->name('macroplanning.show');
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue