diff --git a/README.md b/README.md index 6adecc5..65d13b7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ # TODO -- App\Http\Controllers\Bo\UserController::stats() : refator this using carbon. - App\Models\Message:booted(): investigate why this make errors on prod, diff --git a/app/Enums/Planning/ActivityTypeEnum.php b/app/Enums/Planning/ActivityTypeEnum.php deleted file mode 100644 index 92ea276..0000000 --- a/app/Enums/Planning/ActivityTypeEnum.php +++ /dev/null @@ -1,118 +0,0 @@ -name => 'Support', - self::rnd->name => 'R&D', - self::dev->name => 'Développement/Facturable', - self::projects->name => 'Projets & Réunions', - self::management->name => 'Organisation management', - self::absence->name => 'Absence', - self::leaddev->name => 'Lead Dev', - ]; - - /** - * Optionnal labels definition - */ - private const COLORS = [ - self::support->name => '#c6e0b4', - self::rnd->name => '#b4c6e7', - self::dev->name => '#00b0f0', - self::projects->name => '#ffe699', - self::management->name => '#f4b084', - self::absence->name => '#aeaaaa', - self::leaddev->name => '#ff7979', - ]; - - /** - * Get Color - * - * @return string - */ - public function color(): string - { - return self::COLORS[$this->name]; - } - - /** - * Get enum colors - * - * @return array - */ - public static function toColors(): array - { - return self::COLORS; - } - - /** - * Datas to send with json_encode. - * - * @return mixed - */ - public function jsonSerialize(): mixed - { - return match ($this) { - self::support => [ - 'label' => self::support->label(), - 'name' => self::support->name(), - 'value' => self::support->value(), - 'color' => self::support->color() - ], - self::rnd => [ - 'label' => self::rnd->label(), - 'name' => self::rnd->name(), - 'value' => self::rnd->value(), - 'color' => self::rnd->color() - ], - self::dev => [ - 'label' => self::dev->label(), - 'name' => self::dev->name(), - 'value' => self::dev->value(), - 'color' => self::dev->color() - ], - self::projects => [ - 'label' => self::projects->label(), - 'name' => self::projects->name(), - 'value' => self::projects->value(), - 'color' => self::projects->color() - ], - self::management => [ - 'label' => self::management->label(), - 'name' => self::management->name(), - 'value' => self::management->value(), - 'color' => self::management->color() - ], - self::absence => [ - 'label' => self::absence->label(), - 'name' => self::absence->name(), - 'value' => self::absence->value(), - 'color' => self::absence->color() - ], - self::leaddev => [ - 'label' => self::leaddev->label(), - 'name' => self::leaddev->name(), - 'value' => self::leaddev->value(), - 'color' => self::leaddev->color() - ], - }; //end match - } -} diff --git a/app/Enums/Planning/CellModelEnum.php b/app/Enums/Planning/CellModelEnum.php deleted file mode 100644 index fe9a467..0000000 --- a/app/Enums/Planning/CellModelEnum.php +++ /dev/null @@ -1,82 +0,0 @@ -name => 'Ticket', - self::site->name => 'Site', - self::project->name => 'Projet', - ]; - - /** - * Optionnal tables definition - * - * This is now a const, so we can't do (new Ticket())->getTable() anymore, - * we need to write it as a constant string. - */ - private const TABLES = [ - self::ticket->name => 'tickets', - self::site->name => 'sites', - self::project->name => 'projects', - ]; - - /** - * Get Table - * - * @return string - */ - public function table(): string - { - return self::TABLES[$this->name]; - } - - /** - * Get enum tables - * - * @return array - */ - public static function toTables(): array - { - return self::TABLES; - } - - /** - * Datas to send with json_encode. - * - * @return mixed - */ - public function jsonSerialize(): mixed - { - return match ($this) { - self::ticket => [ - 'label' => self::ticket->label(), - 'name' => self::ticket->name(), - 'value' => self::ticket->value() - ], - self::site => [ - 'label' => self::site->label(), - 'name' => self::site->name(), - 'value' => self::site->value() - ], - self::project => [ - 'label' => self::project->label(), - 'name' => self::project->name(), - 'value' => self::project->value() - ], - }; //end match - } -} diff --git a/app/Enums/Planning/CellTypeEnum.php b/app/Enums/Planning/CellTypeEnum.php deleted file mode 100644 index 4a5bb9f..0000000 --- a/app/Enums/Planning/CellTypeEnum.php +++ /dev/null @@ -1,77 +0,0 @@ -name => '#c6e0b4', - self::rnd->name => '#b4c6e7', - self::dev->name => '#00b0f0', - self::projects->name => '#ffe699', - self::management->name => '#f4b084', - self::absence->name => '#aeaaaa', - self::leaddev->name => '#ff7979', - ]; - - /** - * Optionnal labels definition - */ - private const LABELS = [ - self::support->name => 'Support', - self::rnd->name => 'R&D', - self::dev->name => 'Développement/Facturable', - self::projects->name => 'Projets & Réunions', - self::management->name => 'Organisation management', - self::absence->name => 'Absence', - self::leaddev->name => 'Lead Dev', - ]; - - /** - * Optionnal colors definition - */ - private const COLORS = [ - self::support->name => '#c6e0b4', - self::rnd->name => '#b4c6e7', - self::dev->name => '#00b0f0', - self::projects->name => '#ffe699', - self::management->name => '#f4b084', - self::absence->name => '#aeaaaa', - self::leaddev->name => '#ff7979', - ]; - - /** - * Get Color - * - * @return string - */ - public function color(): string - { - return self::COLORS[$this->name]; - } - - /** - * Get enum colors - * - * @return array - */ - public static function toColors(): array - { - return self::COLORS; - } -} diff --git a/app/Enums/Planning/TableRowEnum.php b/app/Enums/Planning/TableRowEnum.php deleted file mode 100644 index 1616bd3..0000000 --- a/app/Enums/Planning/TableRowEnum.php +++ /dev/null @@ -1,33 +0,0 @@ -name => "Matin 1", - self::matin2->name => "Matin 2", - self::matin3->name => "Matin 3", - self::matin4->name => "Matin 4", - self::apresmidi1->name => "Après-midi 1", - self::apresmidi2->name => "Après-midi 2", - self::apresmidi3->name => "Après-midi 3", - self::apresmidi4->name => "Après-midi 4", - ]; -} diff --git a/app/Http/Controllers/Bo/ScheduleController.php b/app/Http/Controllers/Bo/ScheduleController.php deleted file mode 100644 index 45d6c41..0000000 --- a/app/Http/Controllers/Bo/ScheduleController.php +++ /dev/null @@ -1,256 +0,0 @@ -startOfWeek(); - if ($request->p) { - $date = CarbonImmutable::createFromFormat('d/m/Y', $request->p)->startOfWeek(); - } - return $date; - } - - /** - * Create the users table. - * - * @param \Illuminate\Http\Request $request - * @return array - * @throws \Illuminate\Contracts\Container\BindingResolutionException BindingResolutionException. - */ - private function createUsers(Request $request) - { - $users = []; - if (!is_null($request->cookie('userAuthSchedule'))) { - $dbusers = User::where('id', auth()->user()->id)->get(); - } else { - $dbusers = User::where('role', RoleEnum::developper)->get(); - } - - foreach ($dbusers as $user) { - $users[$user->id] = ['name' => $user->name]; - } - return $users; - } - - /** - * Display schedule. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse - * @throws \Illuminate\Contracts\Container\BindingResolutionException BindingResolutionException. - * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException RouteNotFoundException. - */ - public function index(Request $request) - { - if (!\auth()->user()->role->equals(RoleEnum::developper) && !is_null($request->cookie('userAuthSchedule'))) { - return $this->showAllSchedules(); - } - - $date = $this->dateCreation($request); - $nbweeks = config('schedules.shownWeeks'); - $users = $this->createUsers($request); - - $schedules = Schedule::whereHas('user', function (Builder $query) use ($request) { - $query->where('deleted_at', null); - $query->where('role', RoleEnum::developper); - if (!is_null($request->cookie('userAuthSchedule'))) { - $query->where('id', auth()->user()->id); - } - }) - ->whereDate('date', '>=', $date) - ->whereDate('date', '<=', $date->addDays($nbweeks * 7 - 1)) - ->orderBy('user_id') - ->orderBy('slot') - ->orderBy('date') - ->get(); - - $arSchedules = array(); - $prevUserId = null; - $prevDate = null; - $prevSlot = null; - foreach ($schedules as $schedule) { - $id_lie = ['label' => null, 'name' => null, 'value' => '']; - if (!is_null($schedule->model_lie)) { - if (isset($schedule->relatedModel->name)) { - $id_lie = [ - 'label' => $schedule->relatedModel->name, - 'name' => $schedule->relatedModel->name, - 'value' => $schedule->id_lie - ]; - } else { - $ticket = Ticket::find($schedule->id_lie); - $id_lie = [ - 'label' => 'Ticket ' . $schedule->id_lie, - 'name' => $ticket->formatNameForSchedule($ticket), - 'value' => $schedule->id_lie - ]; - } - $model_lie = $schedule->model_lie; - } else { - $model_lie = ['label' => null, 'value' => null]; - }//end if - - if ($prevUserId != $schedule->user_id) { - // New user. - $arSchedules[$schedule->user_id] = array( - $schedule->slot => array( - $schedule->date->format('d/m/Y') => array( - 'id' => $schedule->id, - 'type' => $schedule->activity, - 'text' => $schedule->description, - 'id_lie' => $id_lie, - 'model_lie' => $model_lie, - ), - ) - ); - } else { - // Same user. - if ($prevSlot != $schedule->slot) { - // New slot. - $arSchedules[$schedule->user_id][$schedule->slot] = array( - $schedule->date->format('d/m/Y') => array( - 'id' => $schedule->id, - 'type' => $schedule->activity, - 'text' => $schedule->description, - 'id_lie' => $id_lie, - 'model_lie' => $model_lie, - ), - ); - } else { - // Same slot. - if ($prevDate != $schedule->date) { - // New date. - $arSchedules[$schedule->user_id][$schedule->slot][$schedule->date->format('d/m/Y')] = array( - 'id' => $schedule->id, - 'type' => $schedule->activity, - 'text' => $schedule->description, - 'id_lie' => $id_lie, - 'model_lie' => $model_lie, - ); - } - } //end if - } //end if - $prevUserId = $schedule->user_id; - $prevDate = $schedule->date; - $prevSlot = $schedule->slot; - } //end foreach - - $weekCells = array(); - for ($i = 0; $i < $nbweeks; $i++) { - $weekCells[] = array( - "num" => $date->addDays($i * 7)->weekOfYear, - "month" => $date->addDays($i * 7)->shortLocaleMonth, - "year" => $date->addDays($i * 7)->format('Y') - ); - } - - return view('bo.pages.schedule.index', compact('users', 'date', 'weekCells', 'arSchedules')); - } - - /** - * Display cell content. - * - * @param \App\Http\Requests\Bo\StoreScheduleRequest $request - * @return \Illuminate\Http\JsonResponse - * @throws \Illuminate\Contracts\Container\BindingResolutionException BindingResolutionException. - */ - public function setCellContent(StoreScheduleRequest $request) - { - $date = CarbonImmutable::createFromFormat('d/m/Y', $request->date); - $fill = $request->all(); - $fill['date'] = $date; - - $schedule = Schedule::updateOrCreate(['id' => $request->id], $fill); - $schedule->saveOrFail(); - - $id_lie = array('label' => null, 'name' => null, 'value' => null); - if (!is_null($schedule->model_lie)) { - if (isset($schedule->relatedModel->name)) { - $id_lie = array( - 'label' => $schedule->relatedModel->name, - 'name' => $schedule->relatedModel->name, - 'value' => $schedule->id_lie - ); - } else { - $id_lie = array( - 'label' => 'Ticket ' . $schedule->id_lie, - 'name' => Ticket::find($schedule->id_lie)->formatNameForSchedule(Ticket::find($schedule->id_lie)), - 'value' => $schedule->id_lie - ); - } - $model_lie = $schedule->model_lie; - } else { - $model_lie = array('label' => null, 'name' => null, 'value' => null); - } - - $arSchd = [ - 'id' => $schedule->id, - 'user_id' => $schedule->user_id, - 'date' => $schedule->date->format('d/m/Y'), - 'activity' => $schedule->activity, - 'description' => $schedule->description, - 'id_lie' => $id_lie, - 'model_lie' => $model_lie, - 'slot' => $schedule->slot, - ]; - - return \response()->json(['status' => true, 'sched' => $arSchd]); - } - - /** - * Delet cell content. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\JsonResponse - * @throws \Illuminate\Contracts\Container\BindingResolutionException BindingResolutionException. - */ - public function eraseCellContent(Request $request) - { - $schedule = Schedule::findOrFail($request->id); - $schedule->delete(); - return \response()->json(['status' => true]); - } - - /** - * Display the auth user schedule. - * - * @return \Illuminate\Http\RedirectResponse - * @throws \Illuminate\Contracts\Container\BindingResolutionException BindingResolutionException. - * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException RouteNotFoundException. - */ - public function showMySchedule() - { - return \redirect()->route('bo.schedule.index')->withCookie(cookie()->forever('userAuthSchedule', 'true')); - } - - /** - * Display all the dev schedule. - * - * @return \Illuminate\Http\RedirectResponse - * @throws \Illuminate\Contracts\Container\BindingResolutionException BindingResolutionException. - * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException RouteNotFoundException. - */ - public function showAllSchedules() - { - return \redirect()->route('bo.schedule.index')->withCookie(cookie()->forget('userAuthSchedule')); - } -} diff --git a/app/Http/Controllers/Bo/TicketController.php b/app/Http/Controllers/Bo/TicketController.php index c270fe6..fd1ae81 100644 --- a/app/Http/Controllers/Bo/TicketController.php +++ b/app/Http/Controllers/Bo/TicketController.php @@ -117,7 +117,7 @@ class TicketController extends Controller { if ($request->ajax()) { return \response()->json([ - 'label' => $ticket->formatNameForSchedule($ticket), + 'label' => $ticket->formatName($ticket), 'value' => $ticket->id ]); } @@ -622,7 +622,7 @@ class TicketController extends Controller return ToolboxHelper::jsonPaginate( $this->customPaginate($tickets, $request->pagination), - 'formatNameForSchedule' + 'formatName' ); }); } diff --git a/app/Http/Controllers/Bo/UserController.php b/app/Http/Controllers/Bo/UserController.php index b5e0cd4..12f2e33 100644 --- a/app/Http/Controllers/Bo/UserController.php +++ b/app/Http/Controllers/Bo/UserController.php @@ -188,34 +188,6 @@ class UserController extends Controller return app(ForgotPasswordController::class)->sendResetLinkEmail($request); } - /** - * Show stats - * - * @return \Illuminate\Contracts\View\View - */ - public function stats(): \Illuminate\Contracts\View\View - { - /** @var \App\Models\User */ - $user = auth()->user(); - $stats = []; - $curYear = date('Y'); - - for ($i = 2021; $i <= $curYear; $i++) { - $start = $i . '-03-01'; - $end = $i + 1 . '-02-' . $this->getLastDayFebruary($i + 1); - - $datas = $user->schedules()->selectRaw('count(id) as nb, activity') - ->whereBetween('date', [$start, $end]) - ->groupBy('activity') - ->orderBy('activity', 'ASC') - ->get(); - - $stats[sprintf("%d/%d", $i, $i + 1)] = $datas; - } - - return view('bo.pages.users.stats', ['stats' => array_reverse($stats)]); - } - /** * Get february last day date of the year * diff --git a/app/Http/Requests/Bo/StoreScheduleRequest.php b/app/Http/Requests/Bo/StoreScheduleRequest.php deleted file mode 100644 index cee9334..0000000 --- a/app/Http/Requests/Bo/StoreScheduleRequest.php +++ /dev/null @@ -1,80 +0,0 @@ -check() and $this->ajax(); - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'user_id' => 'required|exists:users,id', - 'date' => 'date_format:d/m/Y', - 'activity' => [ - 'required', - new Enum(ActivityTypeEnum::class), - function ($attribute, $value, $fail) { - if ( - \in_array($value, [ - ActivityTypeEnum::dev->name(), - ActivityTypeEnum::projects->name(), - ]) and - is_null($this->id_lie) - ) { - $fail(trans("$attribute : Il est obligatoire d'assigner un type d'élement lié au ticket")); - } - } - ], - 'slot' => [ - 'required', - new Enum(TableRowEnum::class) - ], - 'model_lie' => [ - 'nullable', - new Enum(CellModelEnum::class), - ], - 'id_lie' => [ - 'required_with:model_lie', - 'nullable', - 'numeric', - ], - 'description' => 'required|string|min:3|max:90' - ]; - } - - /** - * Get custom attributes for validator errors. - * - * @return array - */ - public function attributes(): array - { - return [ - 'user_id' => \trans('utilisateur'), - 'activity' => \trans('type d\'activitée'), - 'model_lie' => \trans('type d\'élément lié'), - 'id_lie' => \trans('élément lié'), - 'slot' => \trans('ligne de la journée'), - ]; - } -} diff --git a/app/Models/Schedule.php b/app/Models/Schedule.php deleted file mode 100644 index fd1b4a6..0000000 --- a/app/Models/Schedule.php +++ /dev/null @@ -1,80 +0,0 @@ - 'date', - 'activity' => ActivityTypeEnum::class, - 'model_lie' => CellModelEnum::class - ]; - - // * RELATIONSHIPS - - /** - * BelongsTo User relation - * - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo - */ - public function user() - { - return $this->belongsTo(User::class); - } - - /** - * Relationship to linked objet - * - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo - */ - public function relatedModel() - { - switch ($this->model_lie->value) { - case 'sites': - return $this->belongsTo(Site::class, 'id_lie'); - case 'projects': - return $this->belongsTo(Project::class, 'id_lie'); - case 'tickets': - return $this->belongsTo(Ticket::class, 'id_lie'); - default: - return new BelongsTo($this->newQuery(), $this, '', '', ''); - } - } -} diff --git a/app/Models/Ticket.php b/app/Models/Ticket.php index 899e558..dda89c0 100644 --- a/app/Models/Ticket.php +++ b/app/Models/Ticket.php @@ -265,7 +265,7 @@ class Ticket extends Model * @param self $ticket * @return string */ - public static function formatNameForSchedule(self $ticket): string + public static function formatName(self $ticket): string { return sprintf( 'Ticket %d (%s): %s', diff --git a/app/Models/User.php b/app/Models/User.php index 0c44a05..09263ef 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -191,14 +191,4 @@ class User extends Authenticatable { return $this->belongsToMany(Site::class); } - - /** - * HasMany Schedule relation - * - * @return \Illuminate\Database\Eloquent\Relations\HasMany - */ - public function schedules() - { - return $this->hasMany(Schedule::class); - } } diff --git a/database/migrations/2023_08_14_100506_add_status_invoices_table.php b/database/migrations/2023_08_14_100506_add_status_invoices_table.php index 4b8d827..025fe31 100644 --- a/database/migrations/2023_08_14_100506_add_status_invoices_table.php +++ b/database/migrations/2023_08_14_100506_add_status_invoices_table.php @@ -1,7 +1,6 @@ id(); + $table->foreignId('user_id')->unique(); + $table->foreign('user_id')->on('sites')->references('id'); + $table->date('date')->unique(); + $table->tinyInteger('slot')->unique(); + $table->string('activity')->nullable(); + $table->text('description'); + $table->bigInteger('id_lie'); + $table->string('model_lie'); + + $table->timestamps(); + }); + } +} diff --git a/resources/lang/fr/crud.php b/resources/lang/fr/crud.php index f5216b3..ddb1331 100644 --- a/resources/lang/fr/crud.php +++ b/resources/lang/fr/crud.php @@ -14,7 +14,6 @@ return [ 'download' => 'Télécharger', 'historic' => 'Historique', 'credit' => 'Créditer', - 'stats' => 'Statistiques', ], 'helpers' => [ diff --git a/resources/ts/bo/components/ScheduleComponent.vue b/resources/ts/bo/components/ScheduleComponent.vue deleted file mode 100644 index 99c4062..0000000 --- a/resources/ts/bo/components/ScheduleComponent.vue +++ /dev/null @@ -1,1067 +0,0 @@ -