diff --git a/app/Domain/VacationDaysCalculator.php b/app/Domain/VacationDaysCalculator.php index 865740d..fcbc9e8 100644 --- a/app/Domain/VacationDaysCalculator.php +++ b/app/Domain/VacationDaysCalculator.php @@ -39,4 +39,4 @@ class VacationDaysCalculator return true; } -} \ No newline at end of file +} diff --git a/app/Domain/Validation/Rules/DoesNotExceedLimitRule.php b/app/Domain/Validation/Rules/DoesNotExceedLimitRule.php index f4b3f76..c9c4148 100644 --- a/app/Domain/Validation/Rules/DoesNotExceedLimitRule.php +++ b/app/Domain/Validation/Rules/DoesNotExceedLimitRule.php @@ -7,13 +7,14 @@ namespace Toby\Domain\Validation\Rules; use Toby\Domain\VacationTypeConfigRetriever; use Toby\Eloquent\Models\VacationRequest; -class DoesNotExceedLimitRule extends VacationRequestRule +class DoesNotExceedLimitRule implements VacationRequestRule { - public function __construct(protected VacationTypeConfigRetriever $configRetriever) - { + public function __construct( + protected VacationTypeConfigRetriever $configRetriever, + ) { } - public function passes(VacationRequest $vacationRequest): bool + public function check(VacationRequest $vacationRequest): bool { return true; } diff --git a/app/Domain/Validation/Rules/MinimumOneVacationDayRule.php b/app/Domain/Validation/Rules/MinimumOneVacationDayRule.php index 82a845f..ef33dae 100644 --- a/app/Domain/Validation/Rules/MinimumOneVacationDayRule.php +++ b/app/Domain/Validation/Rules/MinimumOneVacationDayRule.php @@ -7,13 +7,14 @@ namespace Toby\Domain\Validation\Rules; use Toby\Domain\VacationDaysCalculator; use Toby\Eloquent\Models\VacationRequest; -class MinimumOneVacationDayRule extends VacationRequestRule +class MinimumOneVacationDayRule implements VacationRequestRule { - public function __construct(protected VacationDaysCalculator $vacationDaysCalculator) - { + public function __construct( + protected VacationDaysCalculator $vacationDaysCalculator, + ) { } - public function passes(VacationRequest $vacationRequest): bool + public function check(VacationRequest $vacationRequest): bool { return $this->vacationDaysCalculator ->calculateDays($vacationRequest->yearPeriod, $vacationRequest->from, $vacationRequest->to) diff --git a/app/Domain/Validation/Rules/NoApprovedVacationRequestsInRange.php b/app/Domain/Validation/Rules/NoApprovedVacationRequestsInRange.php index df883cc..d06fd95 100644 --- a/app/Domain/Validation/Rules/NoApprovedVacationRequestsInRange.php +++ b/app/Domain/Validation/Rules/NoApprovedVacationRequestsInRange.php @@ -7,11 +7,11 @@ namespace Toby\Domain\Validation\Rules; use Toby\Domain\Enums\VacationRequestState; use Toby\Eloquent\Models\VacationRequest; -class NoApprovedVacationRequestsInRange extends VacationRequestRule +class NoApprovedVacationRequestsInRange implements VacationRequestRule { - public function passes(VacationRequest $vacationRequest): bool + public function check(VacationRequest $vacationRequest): bool { - return $vacationRequest + return !$vacationRequest ->user ->vacationRequests() ->overlapsWith($vacationRequest) diff --git a/app/Domain/Validation/Rules/NoPendingVacationRequestInRange.php b/app/Domain/Validation/Rules/NoPendingVacationRequestInRange.php index 6d988fe..3031b56 100644 --- a/app/Domain/Validation/Rules/NoPendingVacationRequestInRange.php +++ b/app/Domain/Validation/Rules/NoPendingVacationRequestInRange.php @@ -7,11 +7,11 @@ namespace Toby\Domain\Validation\Rules; use Toby\Domain\Enums\VacationRequestState; use Toby\Eloquent\Models\VacationRequest; -class NoPendingVacationRequestInRange extends VacationRequestRule +class NoPendingVacationRequestInRange implements VacationRequestRule { - public function passes(VacationRequest $vacationRequest): bool + public function check(VacationRequest $vacationRequest): bool { - return $vacationRequest + return !$vacationRequest ->user ->vacationRequests() ->overlapsWith($vacationRequest) diff --git a/app/Domain/Validation/Rules/VacationRangeIsInTheSameYearRule.php b/app/Domain/Validation/Rules/VacationRangeIsInTheSameYearRule.php index d945e77..6c2faef 100644 --- a/app/Domain/Validation/Rules/VacationRangeIsInTheSameYearRule.php +++ b/app/Domain/Validation/Rules/VacationRangeIsInTheSameYearRule.php @@ -6,9 +6,9 @@ namespace Toby\Domain\Validation\Rules; use Toby\Eloquent\Models\VacationRequest; -class VacationRangeIsInTheSameYearRule extends VacationRequestRule +class VacationRangeIsInTheSameYearRule implements VacationRequestRule { - public function passes(VacationRequest $vacationRequest): bool + public function check(VacationRequest $vacationRequest): bool { return $vacationRequest->from->isSameYear($vacationRequest->to); } diff --git a/app/Domain/Validation/Rules/VacationRequestRule.php b/app/Domain/Validation/Rules/VacationRequestRule.php index 5d36a66..07af8d2 100644 --- a/app/Domain/Validation/Rules/VacationRequestRule.php +++ b/app/Domain/Validation/Rules/VacationRequestRule.php @@ -4,18 +4,10 @@ declare(strict_types=1); namespace Toby\Domain\Validation\Rules; -use Illuminate\Validation\ValidationException; use Toby\Eloquent\Models\VacationRequest; -abstract class VacationRequestRule +interface VacationRequestRule { - public function check(VacationRequest $vacationRequest): void - { - if (! $this->passes($vacationRequest)) { - throw ValidationException::withMessages(["vacationRequest" => $this->errorMessage()]); - } - } - - public abstract function passes(VacationRequest $vacationRequest): bool; - public abstract function errorMessage(): string; + public function check(VacationRequest $vacationRequest): bool; + public function errorMessage(): string; } diff --git a/app/Domain/Validation/VacationRequestValidator.php b/app/Domain/Validation/VacationRequestValidator.php index 4f5cbdb..2bc39e6 100644 --- a/app/Domain/Validation/VacationRequestValidator.php +++ b/app/Domain/Validation/VacationRequestValidator.php @@ -4,12 +4,14 @@ declare(strict_types=1); namespace Toby\Domain\Validation; -use Illuminate\Pipeline\Pipeline; -use Toby\Domain\Validation\Rules\NoApprovedVacationRequestsInRange; +use Illuminate\Contracts\Container\Container; +use Illuminate\Validation\ValidationException; use Toby\Domain\Validation\Rules\DoesNotExceedLimitRule; use Toby\Domain\Validation\Rules\MinimumOneVacationDayRule; +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\Eloquent\Models\VacationRequest; class VacationRequestValidator @@ -23,14 +25,28 @@ class VacationRequestValidator ]; public function __construct( - protected Pipeline $pipeline, + protected Container $container, ) { } + /** + * @throws ValidationException + */ public function validate(VacationRequest $vacationRequest): void { foreach ($this->rules as $rule) { - app($rule)->check($vacationRequest); + $rule = $this->makeRule($rule); + + if (!$rule->check($vacationRequest)) { + throw ValidationException::withMessages([ + "vacationRequest" => $rule->errorMessage(), + ]); + } } } + + protected function makeRule(string $class): VacationRequestRule + { + return $this->container->make($class); + } } diff --git a/app/Eloquent/Models/VacationRequest.php b/app/Eloquent/Models/VacationRequest.php index bb57d4a..5effa7c 100644 --- a/app/Eloquent/Models/VacationRequest.php +++ b/app/Eloquent/Models/VacationRequest.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace Toby\Eloquent\Models; -use Carbon\CarbonInterface; use Database\Factories\VacationRequestFactory; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -69,10 +68,10 @@ class VacationRequest extends Model return $query->whereIn("state", $states); } - public function scopeOverlapsWith(Builder $query, VacationRequest $vacationRequest): Builder + public function scopeOverlapsWith(Builder $query, self $vacationRequest): Builder { - return $query->where("from", '<=', $vacationRequest->to) - ->where("to", '>=', $vacationRequest->from); + return $query->where("from", "<=", $vacationRequest->to) + ->where("to", ">=", $vacationRequest->from); } protected static function newFactory(): VacationRequestFactory diff --git a/app/Infrastructure/Http/Controllers/VacationRequestController.php b/app/Infrastructure/Http/Controllers/VacationRequestController.php index 359d290..3c2eaf8 100644 --- a/app/Infrastructure/Http/Controllers/VacationRequestController.php +++ b/app/Infrastructure/Http/Controllers/VacationRequestController.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace Toby\Infrastructure\Http\Controllers; use Barryvdh\DomPDF\Facade\Pdf; -use Carbon\Carbon; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Http\Response as LaravelResponse; diff --git a/database/factories/VacationRequestFactory.php b/database/factories/VacationRequestFactory.php index a2b8f31..4816781 100644 --- a/database/factories/VacationRequestFactory.php +++ b/database/factories/VacationRequestFactory.php @@ -15,6 +15,7 @@ use Toby\Eloquent\Models\YearPeriod; class VacationRequestFactory extends Factory { protected $model = VacationRequest::class; + private static int $number = 1; public function definition(): array { @@ -36,13 +37,7 @@ class VacationRequestFactory extends Factory protected function generateName(array $attributes): string { $year = YearPeriod::find($attributes["year_period_id"])->year; - $user = User::find($attributes["user_id"]); - - $number = $user->vacationRequests() - ->whereYear("from", $year) - ->count() + 1; - - dump($user->vacationRequests()->count()); + $number = static::$number++; return "{$number}/{$year}"; } diff --git a/resources/js/Pages/VacationRequest/Index.vue b/resources/js/Pages/VacationRequest/Index.vue index 745f0d3..28daa96 100644 --- a/resources/js/Pages/VacationRequest/Index.vue +++ b/resources/js/Pages/VacationRequest/Index.vue @@ -61,12 +61,6 @@ > Do - - Dni urlopu - @@ -96,9 +90,6 @@ {{ request.to }} - - X -