From b745ab990cf2737234231842ac5d9be0f491d478 Mon Sep 17 00:00:00 2001 From: Adrian Hopek Date: Fri, 18 Feb 2022 14:22:01 +0100 Subject: [PATCH] #38 - wip --- .../HandleCreatedVacationRequest.php | 6 + app/Eloquent/Models/User.php | 5 + app/Eloquent/Models/VacationRequest.php | 12 ++ .../Controllers/VacationRequestController.php | 5 +- .../Http/Requests/VacationRequestRequest.php | 4 + ..._100039_create_vacation_requests_table.php | 2 + database/seeders/DatabaseSeeder.php | 1 + resources/js/Composables/yearPeriodInfo.js | 12 ++ resources/js/Pages/Holidays/Create.vue | 12 +- resources/js/Pages/VacationRequest/Create.vue | 111 +++++++++++++++++- 10 files changed, 162 insertions(+), 8 deletions(-) create mode 100644 resources/js/Composables/yearPeriodInfo.js diff --git a/app/Domain/Listeners/HandleCreatedVacationRequest.php b/app/Domain/Listeners/HandleCreatedVacationRequest.php index 998f82a..ee7b691 100644 --- a/app/Domain/Listeners/HandleCreatedVacationRequest.php +++ b/app/Domain/Listeners/HandleCreatedVacationRequest.php @@ -20,6 +20,12 @@ class HandleCreatedVacationRequest { $vacationRequest = $event->vacationRequest; + if ($vacationRequest->shouldSkipFlow()) { + $this->stateManager->approve($vacationRequest); + + return; + } + if ($this->configRetriever->needsTechnicalApproval($vacationRequest->type)) { $this->stateManager->waitForTechnical($vacationRequest); diff --git a/app/Eloquent/Models/User.php b/app/Eloquent/Models/User.php index 1f8c6e3..eafa9aa 100644 --- a/app/Eloquent/Models/User.php +++ b/app/Eloquent/Models/User.php @@ -58,6 +58,11 @@ class User extends Authenticatable return $this->hasMany(VacationRequest::class); } + public function createdVacationRequests(): HasMany + { + return $this->hasMany(VacationRequest::class, "creator_id"); + } + public function vacations(): HasMany { return $this->hasMany(Vacation::class); diff --git a/app/Eloquent/Models/VacationRequest.php b/app/Eloquent/Models/VacationRequest.php index f8d29b9..f373894 100644 --- a/app/Eloquent/Models/VacationRequest.php +++ b/app/Eloquent/Models/VacationRequest.php @@ -22,7 +22,9 @@ use Toby\Domain\Enums\VacationType; * @property Carbon $from * @property Carbon $to * @property string $comment + * @property boolean $skip_flow * @property User $user + * @property User $creator * @property YearPeriod $yearPeriod * @property Collection $activities * @property Collection $vacations @@ -47,6 +49,11 @@ class VacationRequest extends Model return $this->belongsTo(User::class); } + public function creator(): BelongsTo + { + return $this->belongsTo(User::class, "creator_id"); + } + public function yearPeriod(): BelongsTo { return $this->belongsTo(YearPeriod::class); @@ -69,6 +76,11 @@ class VacationRequest extends Model $this->save(); } + public function shouldSkipFlow(): bool + { + return $this->skip_flow; + } + public function scopeStates(Builder $query, array $states): Builder { return $query->whereIn("state", $states); diff --git a/app/Infrastructure/Http/Controllers/VacationRequestController.php b/app/Infrastructure/Http/Controllers/VacationRequestController.php index c24cbe2..2d4092b 100644 --- a/app/Infrastructure/Http/Controllers/VacationRequestController.php +++ b/app/Infrastructure/Http/Controllers/VacationRequestController.php @@ -15,8 +15,10 @@ use Toby\Domain\VacationDaysCalculator; use Toby\Domain\VacationRequestStateManager; use Toby\Domain\Validation\VacationRequestValidator; use Toby\Eloquent\Helpers\YearPeriodRetriever; +use Toby\Eloquent\Models\User; use Toby\Eloquent\Models\VacationRequest; use Toby\Infrastructure\Http\Requests\VacationRequestRequest; +use Toby\Infrastructure\Http\Resources\UserResource; use Toby\Infrastructure\Http\Resources\VacationRequestActivityResource; use Toby\Infrastructure\Http\Resources\VacationRequestResource; @@ -63,6 +65,7 @@ class VacationRequestController extends Controller { return inertia("VacationRequest/Create", [ "vacationTypes" => VacationType::casesToSelect(), + "users" => UserResource::collection(User::all()), ]); } @@ -73,7 +76,7 @@ class VacationRequestController extends Controller VacationDaysCalculator $vacationDaysCalculator, ): RedirectResponse { /** @var VacationRequest $vacationRequest */ - $vacationRequest = $request->user()->vacationRequests()->make($request->data()); + $vacationRequest = $request->user()->createdVacationRequests()->make($request->data()); $vacationRequestValidator->validate($vacationRequest); $vacationRequest->save(); diff --git a/app/Infrastructure/Http/Requests/VacationRequestRequest.php b/app/Infrastructure/Http/Requests/VacationRequestRequest.php index 3fd9e9f..28d03de 100644 --- a/app/Infrastructure/Http/Requests/VacationRequestRequest.php +++ b/app/Infrastructure/Http/Requests/VacationRequestRequest.php @@ -16,9 +16,11 @@ class VacationRequestRequest extends FormRequest public function rules(): array { return [ + "user" => ["required", "exists:users,id"], "type" => ["required", new Enum(VacationType::class)], "from" => ["required", "date_format:Y-m-d", new YearPeriodExists()], "to" => ["required", "date_format:Y-m-d", new YearPeriodExists()], + "skipFlow" => ["required", "boolean"], "comment" => ["nullable"], ]; } @@ -28,11 +30,13 @@ class VacationRequestRequest extends FormRequest $from = $this->get("from"); return [ + "user_id" => $this->get("user"), "type" => $this->get("type"), "from" => $from, "to" => $this->get("to"), "year_period_id" => YearPeriod::findByYear(Carbon::create($from)->year)->id, "comment" => $this->get("comment"), + "skip_flow" => $this->boolean("skipFlow"), ]; } } 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 f5270da..367df76 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 @@ -14,6 +14,7 @@ return new class() extends Migration { Schema::create("vacation_requests", function (Blueprint $table): void { $table->id(); $table->string("name"); + $table->foreignIdFor(User::class, "creator_id")->constrained("users")->cascadeOnDelete(); $table->foreignIdFor(User::class)->constrained()->cascadeOnDelete(); $table->foreignIdFor(YearPeriod::class)->constrained()->cascadeOnDelete(); $table->string("type"); @@ -21,6 +22,7 @@ return new class() extends Migration { $table->date("from"); $table->date("to"); $table->text("comment")->nullable(); + $table->boolean("skip_flow")->default(false); $table->timestamps(); }); } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 614d712..12390fa 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -77,6 +77,7 @@ class DatabaseSeeder extends Seeder VacationRequest::factory() ->count(10) ->for($user) + ->for($user, "creator") ->sequence(fn() => [ "year_period_id" => $yearPeriods->random()->id, ]) diff --git a/resources/js/Composables/yearPeriodInfo.js b/resources/js/Composables/yearPeriodInfo.js new file mode 100644 index 0000000..98ca027 --- /dev/null +++ b/resources/js/Composables/yearPeriodInfo.js @@ -0,0 +1,12 @@ +import {computed} from 'vue' +import {usePage} from '@inertiajs/inertia-vue3' + +export default function useCurrentYearPeriodInfo() { + const minDate = computed(() => new Date(usePage().props.value.years.current, 0, 1)) + const maxDate = computed(() => new Date(usePage().props.value.years.current, 11, 31)) + + return { + minDate, + maxDate, + } +} \ No newline at end of file diff --git a/resources/js/Pages/Holidays/Create.vue b/resources/js/Pages/Holidays/Create.vue index b906242..48a7850 100644 --- a/resources/js/Pages/Holidays/Create.vue +++ b/resources/js/Pages/Holidays/Create.vue @@ -48,6 +48,7 @@ id="date" v-model="form.date" placeholder="Wybierz datę" + :config="{minDate, maxDate}" class="block w-full max-w-lg shadow-sm rounded-md sm:text-sm" :class="{ 'border-red-300 text-red-900 focus:outline-none focus:ring-red-500 focus:border-red-500': form.errors.date, 'focus:ring-blumilk-500 focus:border-blumilk-500 sm:text-sm border-gray-300': !form.errors.date }" /> @@ -81,8 +82,9 @@