diff --git a/app/Domain/CalendarGenerator.php b/app/Domain/CalendarGenerator.php index cd97443..052e10c 100644 --- a/app/Domain/CalendarGenerator.php +++ b/app/Domain/CalendarGenerator.php @@ -4,9 +4,8 @@ declare(strict_types=1); namespace Toby\Domain; -use Carbon\CarbonImmutable; -use Carbon\CarbonInterface; use Carbon\CarbonPeriod; +use Illuminate\Support\Carbon; use Illuminate\Support\Collection; use Toby\Domain\Enums\VacationRequestState; use Toby\Eloquent\Helpers\YearPeriodRetriever; @@ -20,33 +19,16 @@ class CalendarGenerator ) { } - public function generate(YearPeriod $yearPeriod, string $month): array + public function generate(Carbon $month): array { - $date = CarbonImmutable::create($yearPeriod->year, $this->monthNameToNumber($month)); - $period = CarbonPeriod::create($date->startOfMonth(), $date->endOfMonth()); + $period = CarbonPeriod::create($month->copy()->startOfMonth(), $month->copy()->endOfMonth()); + $yearPeriod = YearPeriod::findByYear($month->year); + $holidays = $yearPeriod->holidays()->pluck("date"); return $this->generateCalendar($period, $holidays); } - protected function monthNameToNumber(string $name): int - { - return match ($name) { - default => CarbonInterface::JANUARY, - "february" => CarbonInterface::FEBRUARY, - "march" => CarbonInterface::MARCH, - "april" => CarbonInterface::APRIL, - "may" => CarbonInterface::MAY, - "june" => CarbonInterface::JUNE, - "july" => CarbonInterface::JULY, - "august" => CarbonInterface::AUGUST, - "september" => CarbonInterface::SEPTEMBER, - "october" => CarbonInterface::OCTOBER, - "november" => CarbonInterface::NOVEMBER, - "december" => CarbonInterface::DECEMBER, - }; - } - protected function generateCalendar(CarbonPeriod $period, Collection $holidays): array { $calendar = []; diff --git a/app/Domain/Enums/Month.php b/app/Domain/Enums/Month.php new file mode 100644 index 0000000..29f9f2a --- /dev/null +++ b/app/Domain/Enums/Month.php @@ -0,0 +1,59 @@ + CarbonInterface::JANUARY, + self::February => CarbonInterface::FEBRUARY, + self::March => CarbonInterface::MARCH, + self::April => CarbonInterface::APRIL, + self::May => CarbonInterface::MAY, + self::June => CarbonInterface::JUNE, + self::July => CarbonInterface::JULY, + self::August => CarbonInterface::AUGUST, + self::September => CarbonInterface::SEPTEMBER, + self::October => CarbonInterface::OCTOBER, + self::November => CarbonInterface::NOVEMBER, + self::December => CarbonInterface::DECEMBER, + }; + } + + public static function current(): Month + { + return Month::from(Str::lower(Carbon::now()->englishMonth)); + } + + public static function fromNameOrCurrent(string $name): Month + { + $month = Month::tryFrom($name); + + if ($month === null) { + return Month::current(); + } + + return $month; + } +} diff --git a/app/Infrastructure/Http/Controllers/TimesheetController.php b/app/Infrastructure/Http/Controllers/TimesheetController.php index 11d0636..9f7fcd7 100644 --- a/app/Infrastructure/Http/Controllers/TimesheetController.php +++ b/app/Infrastructure/Http/Controllers/TimesheetController.php @@ -4,54 +4,32 @@ declare(strict_types=1); namespace Toby\Infrastructure\Http\Controllers; -use Carbon\CarbonInterface; -use Illuminate\Http\Request; use Illuminate\Support\Carbon; -use Illuminate\Support\Str; use Maatwebsite\Excel\Facades\Excel; use Symfony\Component\HttpFoundation\BinaryFileResponse; +use Toby\Domain\Enums\Month; use Toby\Domain\TimesheetExport; use Toby\Eloquent\Helpers\YearPeriodRetriever; use Toby\Eloquent\Models\User; class TimesheetController extends Controller { - public function __invoke(Request $request, YearPeriodRetriever $yearPeriodRetriever): BinaryFileResponse + public function __invoke(Month $month, YearPeriodRetriever $yearPeriodRetriever): BinaryFileResponse { $yearPeriod = $yearPeriodRetriever->selected(); - $month = Str::lower($request->query("month", Carbon::now()->englishMonth)); - - $month = Carbon::create($yearPeriod->year, $this->monthNameToNumber($month)); + $carbonMonth = Carbon::create($yearPeriod->year, $month->toCarbonNumber()); $users = User::query() ->orderBy("last_name") ->orderBy("first_name") ->get(); - $filename = "{$month->translatedFormat("F Y")}.xlsx"; + $filename = "{$carbonMonth->translatedFormat("F Y")}.xlsx"; $timesheet = (new TimesheetExport()) - ->forMonth($month) + ->forMonth($carbonMonth) ->forUsers($users); return Excel::download($timesheet, $filename); } - - protected function monthNameToNumber(string $name): int - { - return match ($name) { - default => CarbonInterface::JANUARY, - "february" => CarbonInterface::FEBRUARY, - "march" => CarbonInterface::MARCH, - "april" => CarbonInterface::APRIL, - "may" => CarbonInterface::MAY, - "june" => CarbonInterface::JUNE, - "july" => CarbonInterface::JULY, - "august" => CarbonInterface::AUGUST, - "september" => CarbonInterface::SEPTEMBER, - "october" => CarbonInterface::OCTOBER, - "november" => CarbonInterface::NOVEMBER, - "december" => CarbonInterface::DECEMBER, - }; - } } diff --git a/app/Infrastructure/Http/Controllers/VacationCalendarController.php b/app/Infrastructure/Http/Controllers/VacationCalendarController.php index d37cce6..ec7a33a 100644 --- a/app/Infrastructure/Http/Controllers/VacationCalendarController.php +++ b/app/Infrastructure/Http/Controllers/VacationCalendarController.php @@ -4,11 +4,10 @@ declare(strict_types=1); namespace Toby\Infrastructure\Http\Controllers; -use Illuminate\Http\Request; use Illuminate\Support\Carbon; -use Illuminate\Support\Str; use Inertia\Response; use Toby\Domain\CalendarGenerator; +use Toby\Domain\Enums\Month; use Toby\Eloquent\Helpers\YearPeriodRetriever; use Toby\Eloquent\Models\User; use Toby\Infrastructure\Http\Resources\UserResource; @@ -16,22 +15,25 @@ use Toby\Infrastructure\Http\Resources\UserResource; class VacationCalendarController extends Controller { public function index( - Request $request, YearPeriodRetriever $yearPeriodRetriever, CalendarGenerator $calendarGenerator, + ?string $month = null, ): Response { - $month = Str::lower($request->query("month", Carbon::now()->englishMonth)); + $month = Month::fromNameOrCurrent((string)$month); + $yearPeriod = $yearPeriodRetriever->selected(); + $carbonMonth = Carbon::create($yearPeriod->year, $month->toCarbonNumber()); + $users = User::query() ->orderBy("last_name") ->orderBy("first_name") ->get(); - $calendar = $calendarGenerator->generate($yearPeriod, $month); + $calendar = $calendarGenerator->generate($carbonMonth); return inertia("Calendar", [ "calendar" => $calendar, - "currentMonth" => $month, + "currentMonth" => $month->value, "users" => UserResource::collection($users), ]); } diff --git a/resources/js/Pages/Calendar.vue b/resources/js/Pages/Calendar.vue index e77f1ee..ef8faac 100644 --- a/resources/js/Pages/Calendar.vue +++ b/resources/js/Pages/Calendar.vue @@ -9,7 +9,7 @@
Pobierz plik excel @@ -52,8 +52,7 @@ v-slot="{ active }" > {{ month.name }} diff --git a/routes/web.php b/routes/web.php index e1228f3..a94d8aa 100644 --- a/routes/web.php +++ b/routes/web.php @@ -25,9 +25,9 @@ Route::middleware("auth")->group(function (): void { Route::get("/vacation-limits", [VacationLimitController::class, "edit"]) ->name("vacation.limits"); - Route::get("/vacation-calendar", [VacationCalendarController::class, "index"]) + Route::get("/vacation-calendar/{month?}", [VacationCalendarController::class, "index"]) ->name("vacation.calendar"); - Route::get("/timesheet", TimesheetController::class) + Route::get("/timesheet/{month}", TimesheetController::class) ->name("timesheet"); Route::get("/vacation-limits", [VacationLimitController::class, "edit"])->name("vacation.limits");