diff --git a/app/Eloquent/Models/Vacation.php b/app/Eloquent/Models/Vacation.php new file mode 100644 index 0000000..e359926 --- /dev/null +++ b/app/Eloquent/Models/Vacation.php @@ -0,0 +1,37 @@ + "date", + ]; + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function vacationRequest(): BelongsTo + { + return $this->belongsTo(VacationRequest::class); + } +} diff --git a/app/Eloquent/Models/VacationRequest.php b/app/Eloquent/Models/VacationRequest.php index 0a81620..7b84a07 100644 --- a/app/Eloquent/Models/VacationRequest.php +++ b/app/Eloquent/Models/VacationRequest.php @@ -26,6 +26,7 @@ use Toby\Domain\Enums\VacationType; * @property User $user * @property YearPeriod $yearPeriod * @property Collection $activities + * @property Collection $vacations * @property Carbon $created_at * @property Carbon $updated_at */ @@ -57,6 +58,11 @@ class VacationRequest extends Model return $this->hasMany(VacationRequestActivity::class); } + public function vacations(): HasMany + { + return $this->hasMany(Vacation::class); + } + public function changeStateTo(VacationRequestState $state): void { $this->state = $state; diff --git a/app/Infrastructure/Http/Controllers/HolidayController.php b/app/Infrastructure/Http/Controllers/HolidayController.php index ff07005..e69a8ff 100644 --- a/app/Infrastructure/Http/Controllers/HolidayController.php +++ b/app/Infrastructure/Http/Controllers/HolidayController.php @@ -7,11 +7,9 @@ namespace Toby\Infrastructure\Http\Controllers; use Illuminate\Http\RedirectResponse; use Inertia\Response; use Toby\Eloquent\Models\Holiday; -use Toby\Eloquent\Models\User; use Toby\Infrastructure\Http\Requests\HolidayRequest; use Toby\Infrastructure\Http\Resources\HolidayFormDataResource; use Toby\Infrastructure\Http\Resources\HolidayResource; -use Toby\Infrastructure\Http\Resources\UserResource; class HolidayController extends Controller { diff --git a/app/Infrastructure/Http/Controllers/VacationRequestController.php b/app/Infrastructure/Http/Controllers/VacationRequestController.php index f864bc0..77411da 100644 --- a/app/Infrastructure/Http/Controllers/VacationRequestController.php +++ b/app/Infrastructure/Http/Controllers/VacationRequestController.php @@ -28,6 +28,7 @@ class VacationRequestController extends Controller $vacationRequests = $request->user() ->vacationRequests() + ->with("vacations") ->where("year_period_id", $yearPeriodRetriever->selected()->id) ->latest() ->states(VacationRequestState::filterByStatus($status)) @@ -73,15 +74,11 @@ class VacationRequestController extends Controller ): RedirectResponse { /** @var VacationRequest $vacationRequest */ $vacationRequest = $request->user()->vacationRequests()->make($request->data()); - $vacationRequest->estimated_days = $vacationDaysCalculator->calculateDays( - $vacationRequest->yearPeriod, - $vacationRequest->from, - $vacationRequest->to, - )->count(); $vacationRequestValidator->validate($vacationRequest); $vacationRequest->save(); + $stateManager->markAsCreated($vacationRequest); return redirect() diff --git a/app/Infrastructure/Http/Resources/VacationRequestResource.php b/app/Infrastructure/Http/Resources/VacationRequestResource.php index 009eeb6..6aa3111 100644 --- a/app/Infrastructure/Http/Resources/VacationRequestResource.php +++ b/app/Infrastructure/Http/Resources/VacationRequestResource.php @@ -20,8 +20,8 @@ class VacationRequestResource extends JsonResource "state" => $this->state->label(), "from" => $this->from->toDisplayString(), "to" => $this->to->toDisplayString(), - "estimatedDays" => $this->estimated_days, "comment" => $this->comment, + "days" => VacationResource::collection($this->vacations), ]; } } diff --git a/app/Infrastructure/Http/Resources/VacationResource.php b/app/Infrastructure/Http/Resources/VacationResource.php new file mode 100644 index 0000000..e9590e3 --- /dev/null +++ b/app/Infrastructure/Http/Resources/VacationResource.php @@ -0,0 +1,21 @@ + $this->id, + "displayDate" => $this->date->toDisplayString(), + "date" => $this->date->toDateString(), + ]; + } +} diff --git a/database/factories/VacationFactory.php b/database/factories/VacationFactory.php new file mode 100644 index 0000000..e28cc70 --- /dev/null +++ b/database/factories/VacationFactory.php @@ -0,0 +1,20 @@ + $this->faker->randomElement(VacationRequestState::cases()), "from" => $from, "to" => $from->addDays($days), - "estimated_days" => fn(array $attributes) => $this->estimateDays($attributes), "comment" => $this->faker->boolean ? $this->faker->paragraph() : null, ]; } @@ -43,11 +41,4 @@ class VacationRequestFactory extends Factory return "{$number}/{$year}"; } - - protected function estimateDays(array $attributes): int - { - $period = CarbonPeriod::create($attributes["from"], $attributes["to"]); - - return $period->count(); - } } diff --git a/database/migrations/2022_01_26_100039_create_vacation_requests_table.php b/database/migrations/2022_01_26_100039_create_vacation_requests_table.php index b3f4e48..f5270da 100644 --- a/database/migrations/2022_01_26_100039_create_vacation_requests_table.php +++ b/database/migrations/2022_01_26_100039_create_vacation_requests_table.php @@ -18,7 +18,6 @@ return new class() extends Migration { $table->foreignIdFor(YearPeriod::class)->constrained()->cascadeOnDelete(); $table->string("type"); $table->string("state")->nullable(); - $table->integer("estimated_days"); $table->date("from"); $table->date("to"); $table->text("comment")->nullable(); diff --git a/database/migrations/2022_02_07_133018_create_vacations_table.php b/database/migrations/2022_02_07_133018_create_vacations_table.php new file mode 100644 index 0000000..1d806d5 --- /dev/null +++ b/database/migrations/2022_02_07_133018_create_vacations_table.php @@ -0,0 +1,26 @@ +id(); + $table->foreignIdFor(User::class)->constrained()->cascadeOnDelete(); + $table->foreignIdFor(VacationRequest::class)->constrained()->cascadeOnDelete(); + $table->date("date"); + }); + } + + public function down(): void + { + Schema::dropIfExists("vacations"); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 205246a..439a50f 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -8,6 +8,7 @@ use Illuminate\Database\Seeder; use Illuminate\Support\Carbon; use Illuminate\Support\Collection; use Toby\Domain\PolishHolidaysRetriever; +use Toby\Domain\VacationDaysCalculator; use Toby\Eloquent\Helpers\UserAvatarGenerator; use Toby\Eloquent\Models\User; use Toby\Eloquent\Models\VacationLimit; @@ -79,6 +80,20 @@ class DatabaseSeeder extends Seeder ->sequence(fn() => [ "year_period_id" => $yearPeriods->random()->id, ]) + ->afterCreating(function (VacationRequest $vacationRequest) { + $days = app(VacationDaysCalculator::class)->calculateDays( + $vacationRequest->yearPeriod, + $vacationRequest->from, + $vacationRequest->to + ); + + foreach ($days as $day) { + $vacationRequest->vacations()->create([ + "date" => $day, + "user_id" => $vacationRequest->user->id + ]); + } + }) ->create(); } } diff --git a/resources/js/Pages/Calendar.vue b/resources/js/Pages/Calendar.vue index 7db5f67..bf80d3f 100644 --- a/resources/js/Pages/Calendar.vue +++ b/resources/js/Pages/Calendar.vue @@ -1,6 +1,6 @@