diff --git a/app/Domain/Validation/Rules/VacationTypeCanBeSelected.php b/app/Domain/Validation/Rules/VacationTypeCanBeSelected.php new file mode 100644 index 0000000..2a7050f --- /dev/null +++ b/app/Domain/Validation/Rules/VacationTypeCanBeSelected.php @@ -0,0 +1,31 @@ +user->profile->employment_form; + + $availableTypes = VacationType::all() + ->filter(fn(VacationType $type) => $this->configRetriever->isAvailableFor($type, $employmentForm)); + + return $availableTypes->contains($vacationRequest->type); + } + + public function errorMessage(): string + { + return __("You cannot create vacation request of this type."); + } +} diff --git a/app/Domain/Validation/VacationRequestValidator.php b/app/Domain/Validation/VacationRequestValidator.php index 57f8fa8..de87941 100644 --- a/app/Domain/Validation/VacationRequestValidator.php +++ b/app/Domain/Validation/VacationRequestValidator.php @@ -12,6 +12,7 @@ use Toby\Domain\Validation\Rules\NoApprovedVacationRequestsInRange; use Toby\Domain\Validation\Rules\NoPendingVacationRequestInRange; use Toby\Domain\Validation\Rules\VacationRangeIsInTheSameYearRule; use Toby\Domain\Validation\Rules\VacationRequestRule; +use Toby\Domain\Validation\Rules\VacationTypeCanBeSelected; use Toby\Eloquent\Models\VacationRequest; class VacationRequestValidator @@ -19,6 +20,7 @@ class VacationRequestValidator protected array $rules = [ VacationRangeIsInTheSameYearRule::class, MinimumOneVacationDayRule::class, + VacationTypeCanBeSelected::class, DoesNotExceedLimitRule::class, NoPendingVacationRequestInRange::class, NoApprovedVacationRequestsInRange::class, diff --git a/app/Eloquent/Models/Vacation.php b/app/Eloquent/Models/Vacation.php index a602042..9410764 100644 --- a/app/Eloquent/Models/Vacation.php +++ b/app/Eloquent/Models/Vacation.php @@ -9,6 +9,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Support\Carbon; +use Illuminate\Support\Collection; use Toby\Domain\VacationRequestStatesRetriever; /** @@ -58,4 +59,12 @@ class Vacation extends Model fn(Builder $query): Builder => $query->states(VacationRequestStatesRetriever::pendingStates()), ); } + + public function scopeWhereTypes(Builder $query, Collection $types): Builder + { + return $query->whereRelation( + "vacationRequest", + fn(Builder $query): Builder => $query->whereIn("type", $types), + ); + } } diff --git a/app/Infrastructure/Http/Controllers/DashboardController.php b/app/Infrastructure/Http/Controllers/DashboardController.php index 8be109b..33bf1aa 100644 --- a/app/Infrastructure/Http/Controllers/DashboardController.php +++ b/app/Infrastructure/Http/Controllers/DashboardController.php @@ -7,14 +7,16 @@ namespace Toby\Infrastructure\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Carbon; use Inertia\Response; +use Toby\Domain\Enums\VacationType; use Toby\Domain\UserVacationStatsRetriever; use Toby\Domain\VacationRequestStatesRetriever; +use Toby\Domain\VacationTypeConfigRetriever; use Toby\Eloquent\Helpers\YearPeriodRetriever; use Toby\Eloquent\Models\Vacation; use Toby\Eloquent\Models\VacationRequest; -use Toby\Infrastructure\Http\Resources\AbsenceResource; use Toby\Infrastructure\Http\Resources\HolidayResource; use Toby\Infrastructure\Http\Resources\VacationRequestResource; +use Toby\Infrastructure\Http\Resources\VacationResource; class DashboardController extends Controller { @@ -22,6 +24,7 @@ class DashboardController extends Controller Request $request, YearPeriodRetriever $yearPeriodRetriever, UserVacationStatsRetriever $vacationStatsRetriever, + VacationTypeConfigRetriever $configRetriever, ): Response { $user = $request->user(); $now = Carbon::now(); @@ -31,6 +34,14 @@ class DashboardController extends Controller ->with(["user", "vacationRequest"]) ->whereDate("date", $now) ->approved() + ->whereTypes(VacationType::all()->filter(fn(VacationType $type) => $configRetriever->isVacation($type))) + ->get(); + + $remoteDays = Vacation::query() + ->with(["user", "vacationRequest"]) + ->whereDate("date", $now) + ->approved() + ->whereTypes(VacationType::all()->filter(fn(VacationType $type) => !$configRetriever->isVacation($type))) ->get(); if ($user->can("listAll", VacationRequest::class)) { @@ -62,7 +73,8 @@ class DashboardController extends Controller $remaining = $limit - $used - $pending; return inertia("Dashboard", [ - "absences" => AbsenceResource::collection($absences), + "absences" => VacationResource::collection($absences), + "remoteDays" => VacationResource::collection($remoteDays), "vacationRequests" => VacationRequestResource::collection($vacationRequests), "holidays" => HolidayResource::collection($holidays), "stats" => [ diff --git a/app/Infrastructure/Http/Resources/AbsenceResource.php b/app/Infrastructure/Http/Resources/AbsenceResource.php deleted file mode 100644 index e15d2fc..0000000 --- a/app/Infrastructure/Http/Resources/AbsenceResource.php +++ /dev/null @@ -1,21 +0,0 @@ - $this->id, - "user" => new SimpleUserResource($this->user), - "date" => $this->date->toDisplayString(), - ]; - } -} diff --git a/app/Infrastructure/Http/Resources/VacationResource.php b/app/Infrastructure/Http/Resources/VacationResource.php index e9590e3..fed9e76 100644 --- a/app/Infrastructure/Http/Resources/VacationResource.php +++ b/app/Infrastructure/Http/Resources/VacationResource.php @@ -14,6 +14,7 @@ class VacationResource extends JsonResource { return [ "id" => $this->id, + "user" => new SimpleUserResource($this->user), "displayDate" => $this->date->toDisplayString(), "date" => $this->date->toDateString(), ]; diff --git a/resources/js/Pages/Dashboard.vue b/resources/js/Pages/Dashboard.vue index ae4a270..c048343 100644 --- a/resources/js/Pages/Dashboard.vue +++ b/resources/js/Pages/Dashboard.vue @@ -15,9 +15,13 @@ :requests="vacationRequests.data" /> + @@ -195,7 +195,7 @@ diff --git a/resources/js/Pages/Users/Edit.vue b/resources/js/Pages/Users/Edit.vue index 09f82e1..3ede6b9 100644 --- a/resources/js/Pages/Users/Edit.vue +++ b/resources/js/Pages/Users/Edit.vue @@ -144,7 +144,7 @@ @@ -202,7 +202,7 @@ diff --git a/resources/js/Pages/VacationRequest/Create.vue b/resources/js/Pages/VacationRequest/Create.vue index fa6f8fa..fe39c11 100644 --- a/resources/js/Pages/VacationRequest/Create.vue +++ b/resources/js/Pages/VacationRequest/Create.vue @@ -86,7 +86,7 @@ @@ -173,7 +173,7 @@ diff --git a/resources/js/Pages/VacationRequest/Index.vue b/resources/js/Pages/VacationRequest/Index.vue index 0526dd5..38427ff 100644 --- a/resources/js/Pages/VacationRequest/Index.vue +++ b/resources/js/Pages/VacationRequest/Index.vue @@ -76,7 +76,7 @@ diff --git a/resources/js/Pages/VacationRequest/IndexForApprovers.vue b/resources/js/Pages/VacationRequest/IndexForApprovers.vue index 75acd64..d055c3f 100644 --- a/resources/js/Pages/VacationRequest/IndexForApprovers.vue +++ b/resources/js/Pages/VacationRequest/IndexForApprovers.vue @@ -69,7 +69,7 @@ @@ -98,7 +98,7 @@ @@ -149,7 +149,7 @@ diff --git a/resources/js/Shared/Widgets/AbsenceList.vue b/resources/js/Shared/Widgets/AbsenceList.vue index 266955e..65f1b26 100644 --- a/resources/js/Shared/Widgets/AbsenceList.vue +++ b/resources/js/Shared/Widgets/AbsenceList.vue @@ -25,11 +25,6 @@

-
  • -

    - Brak danych -

    -
  • diff --git a/resources/js/Shared/Widgets/HomeOfficeList.vue b/resources/js/Shared/Widgets/HomeOfficeList.vue new file mode 100644 index 0000000..689487d --- /dev/null +++ b/resources/js/Shared/Widgets/HomeOfficeList.vue @@ -0,0 +1,37 @@ + + + diff --git a/tests/Feature/VacationRequestTest.php b/tests/Feature/VacationRequestTest.php index 2d0514f..f8890a2 100644 --- a/tests/Feature/VacationRequestTest.php +++ b/tests/Feature/VacationRequestTest.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Bus; use Illuminate\Support\Facades\Notification; use Inertia\Testing\AssertableInertia as Assert; use Tests\FeatureTestCase; +use Toby\Domain\Enums\EmploymentForm; use Toby\Domain\Enums\VacationType; use Toby\Domain\PolishHolidaysRetriever; use Toby\Domain\States\VacationRequest\Approved; @@ -17,6 +18,7 @@ use Toby\Domain\States\VacationRequest\Cancelled; use Toby\Domain\States\VacationRequest\Rejected; use Toby\Domain\States\VacationRequest\WaitingForAdministrative; use Toby\Domain\States\VacationRequest\WaitingForTechnical; +use Toby\Eloquent\Models\Profile; use Toby\Eloquent\Models\User; use Toby\Eloquent\Models\VacationLimit; use Toby\Eloquent\Models\VacationRequest; @@ -61,7 +63,9 @@ class VacationRequestTest extends FeatureTestCase public function testUserCanCreateVacationRequest(): void { - $user = User::factory()->create(); + $user = User::factory() + ->has(Profile::factory(["employment_form" => EmploymentForm::EmploymentContract])) + ->create(); $currentYearPeriod = YearPeriod::current(); @@ -80,6 +84,7 @@ class VacationRequestTest extends FeatureTestCase "to" => Carbon::create($currentYearPeriod->year, 2, 11)->toDateString(), "comment" => "Comment for the vacation request.", ]) + ->assertSessionHasNoErrors() ->assertRedirect(); $this->assertDatabaseHas("vacation_requests", [ @@ -96,7 +101,9 @@ class VacationRequestTest extends FeatureTestCase public function testUserCanCreateVacationRequestOnEmployeeBehalf(): void { $creator = User::factory()->admin()->create(); - $user = User::factory()->create(); + $user = User::factory() + ->has(Profile::factory(["employment_form" => EmploymentForm::EmploymentContract])) + ->create(); $currentYearPeriod = YearPeriod::current(); @@ -132,7 +139,9 @@ class VacationRequestTest extends FeatureTestCase public function testUserCanCreateVacationRequestOnEmployeeBehalfAndSkipAcceptanceFlow(): void { $creator = User::factory()->admin()->create(); - $user = User::factory()->create(); + $user = User::factory() + ->has(Profile::factory(["employment_form" => EmploymentForm::EmploymentContract])) + ->create(); $currentYearPeriod = YearPeriod::current(); @@ -245,7 +254,9 @@ class VacationRequestTest extends FeatureTestCase public function testUserCannotCreateVacationRequestIfHeExceedsHisVacationLimit(): void { - $user = User::factory()->create(); + $user = User::factory() + ->has(Profile::factory(["employment_form" => EmploymentForm::EmploymentContract])) + ->create(); $currentYearPeriod = YearPeriod::current(); VacationLimit::factory([ @@ -327,7 +338,9 @@ class VacationRequestTest extends FeatureTestCase public function testUserCannotCreateVacationRequestIfHeHasPendingVacationRequestInThisRange(): void { - $user = User::factory()->create(); + $user = User::factory() + ->has(Profile::factory(["employment_form" => EmploymentForm::EmploymentContract])) + ->create(); $currentYearPeriod = YearPeriod::current(); VacationLimit::factory([ @@ -363,7 +376,9 @@ class VacationRequestTest extends FeatureTestCase public function testUserCannotCreateVacationRequestIfHeHasApprovedVacationRequestInThisRange(): void { - $user = User::factory()->create(); + $user = User::factory() + ->has(Profile::factory(["employment_form" => EmploymentForm::EmploymentContract])) + ->create(); $currentYearPeriod = YearPeriod::current(); VacationLimit::factory([