This commit is contained in:
Adrian Hopek
2022-01-26 10:56:25 +01:00
parent 026bfe485f
commit f3559930c2
28 changed files with 1015 additions and 31 deletions

View File

@@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
namespace Toby\Enums;
enum VacationType: string
{
case VACATION = "vacation";
case VACATION_ON_REQUEST = "vacation_on_request";
case SPECIAL_VACATION = "special_vacation";
case CHILDCARE_VACATION = "childcare_vacation";
case TRAINING_VACATION = "training_vacation";
case UNPAID_VACATION = "unpaid_vacation";
case VOLUNTEERING_VACATION = "volunteering_vacation";
case LOOK_FOR_WORK_VACATION = "look_for_work_vacation";
case TIME_IN_LIEU = "time_in_lieu";
case SICK_VACATION = "sick_vacation";
public function label(): string
{
return __($this->value);
}
public static function casesToSelect(): array
{
$cases = collect(VacationType::cases());
return $cases->map(
fn(VacationType $enum) => [
"label" => $enum->label(),
"value" => $enum->value,
],
)->toArray();
}
}

View File

@@ -0,0 +1,16 @@
<?php
declare(strict_types=1);
namespace Toby\Helpers\Rules;
use Closure;
use Toby\Models\VacationRequest;
class MinimumOneVacationDayRule
{
public function check(VacationRequest $vacationRequest, Closure $next)
{
return $next($vacationRequest);
}
}

View File

@@ -0,0 +1,16 @@
<?php
declare(strict_types=1);
namespace Toby\Helpers\Rules;
use Closure;
use Toby\Models\VacationRequest;
class PendingVacationRequestInSameRange
{
public function check(VacationRequest $vacationRequest, Closure $next)
{
return $next($vacationRequest);
}
}

View File

@@ -0,0 +1,16 @@
<?php
declare(strict_types=1);
namespace Toby\Helpers\Rules;
use Closure;
use Toby\Models\VacationRequest;
class UsedVacationDaysInSameRange
{
public function check(VacationRequest $vacationRequest, Closure $next)
{
return $next($vacationRequest);
}
}

View File

@@ -0,0 +1,28 @@
<?php
declare(strict_types=1);
namespace Toby\Helpers;
use Illuminate\Contracts\Pipeline\Pipeline;
use Toby\Models\VacationRequest;
class VacationRequestValidator
{
protected array $rules = [
];
public function __construct(protected Pipeline $pipeline)
{
}
public function validate(VacationRequest $vacationRequest): void
{
$this->pipeline
->send($vacationRequest)
->through($this->rules)
->via("check")
->then(fn(VacationRequest $vacationRequest) => $vacationRequest);
}
}

View File

@@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Toby\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Response;
use Toby\Enums\VacationType;
use Toby\Http\Resources\VacationRequestResource;
class VacationRequestController extends Controller
{
public function index(Request $request): Response
{
$requests = $request->user()
->vacationRequests()
->paginate();
return inertia("VacationRequest/Index", [
"requests" => VacationRequestResource::collection($requests),
]);
}
public function create(): Response
{
return inertia("VacationRequest/Create", [
"vacationTypes" => VacationType::casesToSelect(),
]);
}
}

View File

@@ -23,6 +23,7 @@ use Illuminate\Routing\Middleware\ValidateSignature;
use Illuminate\Session\Middleware\AuthenticateSession;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\View\Middleware\ShareErrorsFromSession;
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
use Toby\Http\Middleware\Authenticate;
use Toby\Http\Middleware\HandleInertiaRequests;
use Toby\Http\Middleware\RedirectIfAuthenticated;
@@ -52,6 +53,7 @@ class Kernel extends HttpKernel
HandleInertiaRequests::class,
],
"api" => [
EnsureFrontendRequestsAreStateful::class,
"throttle:api",
SubstituteBindings::class,
],

View File

@@ -0,0 +1,33 @@
<?php
declare(strict_types=1);
namespace Toby\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\Enum;
use Toby\Enums\VacationType;
use Toby\Rules\YearPeriodExists;
class VacationRequestRequest extends FormRequest
{
public function rules(): array
{
return [
"type" => ["required", new Enum(VacationType::class)],
"from" => ["required", "date_format:Y-m-d", new YearPeriodExists()],
"to" => ["required", "date_format:Y-m-d", new YearPeriodExists()],
"comment" => ["nullable"],
];
}
public function data(): array
{
return [
"type" => $this->get("type"),
"from" => $this->get("from"),
"to" => $this->get("to"),
"comment" => $this->get("comment"),
];
}
}

View File

@@ -15,6 +15,7 @@ class HolidayResource extends JsonResource
return [
"id" => $this->id,
"name" => $this->name,
"date" => $this->date->toDateString(),
"displayDate" => $this->date->toDisplayString(),
"dayOfWeek" => $this->date->dayName,
];

View File

@@ -18,7 +18,7 @@ class UserFormDataResource extends JsonResource
"lastName" => $this->last_name,
"email" => $this->email,
"employmentForm" => $this->employment_form,
"employmentDate" => $this->employment_date,
"employmentDate" => $this->employment_date->toDateString(),
];
}
}

View File

@@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
namespace Toby\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class VacationRequestResource extends JsonResource
{
public static $wrap = null;
public function toArray($request): array
{
return [
"id" => $this->id,
"user" => new UserResource($this->user),
"type" => $this->type->label(),
"from" => $this->from->toDisplayString(),
"to" => $this->to->toDisplayString(),
"commment" => $this->comment,
];
}
}

View File

@@ -23,6 +23,7 @@ use Toby\Enums\EmploymentForm;
* @property EmploymentForm $employment_form
* @property Carbon $employment_date
* @property Collection $vacationLimits
* @property Collection $vacationRequests
*/
class User extends Authenticatable
{
@@ -46,6 +47,11 @@ class User extends Authenticatable
return $this->hasMany(VacationLimit::class);
}
public function vacationRequests(): HasMany
{
return $this->hasMany(VacationRequest::class);
}
public function scopeSearch(Builder $query, ?string $text): Builder
{
if ($text === null) {

View File

@@ -0,0 +1,33 @@
<?php
namespace Toby\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Carbon;
use Toby\Enums\VacationType;
/**
* @property int $id
* @property VacationType $type
* @property Carbon $from
* @property Carbon $to
* @property string $comment
* @property User $user
*/
class VacationRequest extends Model
{
use HasFactory;
protected $casts = [
"type" => VacationType::class,
"from" => "date",
"to" => "date",
];
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}