#20 - wip
This commit is contained in:
		
							
								
								
									
										36
									
								
								app/Enums/VacationType.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								app/Enums/VacationType.php
									
									
									
									
									
										Normal 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(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										16
									
								
								app/Helpers/Rules/MinimumOneVacationDayRule.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/Helpers/Rules/MinimumOneVacationDayRule.php
									
									
									
									
									
										Normal 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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										16
									
								
								app/Helpers/Rules/PendingVacationRequestInSameRange.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/Helpers/Rules/PendingVacationRequestInSameRange.php
									
									
									
									
									
										Normal 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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										16
									
								
								app/Helpers/Rules/UsedVacationDaysInSameRange.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/Helpers/Rules/UsedVacationDaysInSameRange.php
									
									
									
									
									
										Normal 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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										28
									
								
								app/Helpers/VacationRequestValidator.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/Helpers/VacationRequestValidator.php
									
									
									
									
									
										Normal 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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										31
									
								
								app/Http/Controllers/VacationRequestController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								app/Http/Controllers/VacationRequestController.php
									
									
									
									
									
										Normal 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(), | ||||
|         ]); | ||||
|     } | ||||
| } | ||||
| @@ -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, | ||||
|         ], | ||||
|   | ||||
							
								
								
									
										33
									
								
								app/Http/Requests/VacationRequestRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								app/Http/Requests/VacationRequestRequest.php
									
									
									
									
									
										Normal 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"), | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
| @@ -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, | ||||
|         ]; | ||||
|   | ||||
| @@ -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(), | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										24
									
								
								app/Http/Resources/VacationRequestResource.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								app/Http/Resources/VacationRequestResource.php
									
									
									
									
									
										Normal 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, | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
| @@ -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) { | ||||
|   | ||||
							
								
								
									
										33
									
								
								app/Models/VacationRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								app/Models/VacationRequest.php
									
									
									
									
									
										Normal 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); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user