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"
/>
- Brak danych -
-+ {{ day.user.name }} +
++ {{ day.user.email }} +
+