From 847d929c77ec82a65be66444cd26922fc4de5cc2 Mon Sep 17 00:00:00 2001
From: Adrian Hopek
Date: Wed, 20 Apr 2022 13:24:56 +0200
Subject: [PATCH] #120 - fix
---
.../Rules/VacationTypeCanBeSelected.php | 31 ++++++++++++++++
.../Validation/VacationRequestValidator.php | 2 +
app/Eloquent/Models/Vacation.php | 9 +++++
.../Http/Controllers/DashboardController.php | 16 +++++++-
.../Http/Resources/AbsenceResource.php | 21 -----------
.../Http/Resources/VacationResource.php | 1 +
resources/js/Pages/Dashboard.vue | 8 +++-
resources/js/Pages/Users/Create.vue | 4 +-
resources/js/Pages/Users/Edit.vue | 4 +-
resources/js/Pages/VacationRequest/Create.vue | 4 +-
resources/js/Pages/VacationRequest/Index.vue | 2 +-
.../VacationRequest/IndexForApprovers.vue | 6 +--
resources/js/Shared/Widgets/AbsenceList.vue | 5 ---
.../js/Shared/Widgets/HomeOfficeList.vue | 37 +++++++++++++++++++
tests/Feature/VacationRequestTest.php | 27 +++++++++++---
15 files changed, 132 insertions(+), 45 deletions(-)
create mode 100644 app/Domain/Validation/Rules/VacationTypeCanBeSelected.php
delete mode 100644 app/Infrastructure/Http/Resources/AbsenceResource.php
create mode 100644 resources/js/Shared/Widgets/HomeOfficeList.vue
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 @@
+
+
+
+
+ Dzisiejsza praca zdalna
+
+
+
+
+ -
+
+
+
+ {{ day.user.name }}
+
+
+ {{ day.user.email }}
+
+
+
+
+
+
+
+
+
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([