wip
This commit is contained in:
@@ -7,8 +7,8 @@ namespace Toby\Domain;
|
||||
use Carbon\CarbonImmutable;
|
||||
use Carbon\CarbonInterface;
|
||||
use Carbon\CarbonPeriod;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Collection;
|
||||
use Toby\Domain\Enums\VacationRequestState;
|
||||
use Toby\Eloquent\Helpers\YearPeriodRetriever;
|
||||
use Toby\Eloquent\Models\Vacation;
|
||||
use Toby\Eloquent\Models\YearPeriod;
|
||||
@@ -73,7 +73,7 @@ class CalendarGenerator
|
||||
{
|
||||
return Vacation::query()
|
||||
->whereBetween("date", [$period->start, $period->end])
|
||||
->whereRelation("vacationRequest", "state", VacationRequestState::Approved->value)
|
||||
->whereRelation("vacationRequest", fn(Builder $query) => $query->states(VacationRequestStatesRetriever::successStates()))
|
||||
->get()
|
||||
->groupBy(fn(Vacation $vacation) => $vacation->date->toDateString());
|
||||
}
|
||||
|
@@ -1,56 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\Enums;
|
||||
|
||||
enum VacationRequestState: string
|
||||
{
|
||||
case Created = "created";
|
||||
case Cancelled = "cancelled";
|
||||
case Rejected = "rejected";
|
||||
case Approved = "approved";
|
||||
case WaitingForTechnical = "waiting_for_technical";
|
||||
case WaitingForAdministrative = "waiting_for_administrative";
|
||||
case AcceptedByTechnical = "accepted_by_technical";
|
||||
case AcceptedByAdministrative = "accepted_by_administrative";
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return __($this->value);
|
||||
}
|
||||
|
||||
public static function pendingStates(): array
|
||||
{
|
||||
return [
|
||||
self::Created,
|
||||
self::WaitingForTechnical,
|
||||
self::WaitingForAdministrative,
|
||||
self::AcceptedByTechnical,
|
||||
self::AcceptedByAdministrative,
|
||||
];
|
||||
}
|
||||
|
||||
public static function successStates(): array
|
||||
{
|
||||
return [self::Approved];
|
||||
}
|
||||
|
||||
public static function failedStates(): array
|
||||
{
|
||||
return [
|
||||
self::Rejected,
|
||||
self::Cancelled,
|
||||
];
|
||||
}
|
||||
|
||||
public static function filterByStatus(string $filter): array
|
||||
{
|
||||
return match ($filter) {
|
||||
"pending" => VacationRequestState::pendingStates(),
|
||||
"success" => VacationRequestState::successStates(),
|
||||
"failed" => VacationRequestState::failedStates(),
|
||||
default => VacationRequestState::cases(),
|
||||
};
|
||||
}
|
||||
}
|
@@ -6,7 +6,7 @@ namespace Toby\Domain\Events;
|
||||
|
||||
use Illuminate\Foundation\Events\Dispatchable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Toby\Domain\Enums\VacationRequestState;
|
||||
use Toby\Domain\States\VacationRequest\VacationRequestState;
|
||||
use Toby\Eloquent\Models\User;
|
||||
use Toby\Eloquent\Models\VacationRequest;
|
||||
|
||||
|
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\States\VacationRequest;
|
||||
|
||||
class AcceptedByAdministrative extends VacationRequestState
|
||||
{
|
||||
public static string $name = "accepted_by_administrative";
|
||||
}
|
10
app/Domain/States/VacationRequest/AcceptedByTechnical.php
Normal file
10
app/Domain/States/VacationRequest/AcceptedByTechnical.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\States\VacationRequest;
|
||||
|
||||
class AcceptedByTechnical extends VacationRequestState
|
||||
{
|
||||
public static string $name = "accepted_by_technical";
|
||||
}
|
10
app/Domain/States/VacationRequest/Approved.php
Normal file
10
app/Domain/States/VacationRequest/Approved.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\States\VacationRequest;
|
||||
|
||||
class Approved extends VacationRequestState
|
||||
{
|
||||
public static string $name = "approved";
|
||||
}
|
10
app/Domain/States/VacationRequest/Cancelled.php
Normal file
10
app/Domain/States/VacationRequest/Cancelled.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\States\VacationRequest;
|
||||
|
||||
class Cancelled extends VacationRequestState
|
||||
{
|
||||
public static string $name = "cancelled";
|
||||
}
|
10
app/Domain/States/VacationRequest/Created.php
Normal file
10
app/Domain/States/VacationRequest/Created.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\States\VacationRequest;
|
||||
|
||||
class Created extends VacationRequestState
|
||||
{
|
||||
public static string $name = "created";
|
||||
}
|
10
app/Domain/States/VacationRequest/Rejected.php
Normal file
10
app/Domain/States/VacationRequest/Rejected.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\States\VacationRequest;
|
||||
|
||||
class Rejected extends VacationRequestState
|
||||
{
|
||||
public static string $name = "rejected";
|
||||
}
|
39
app/Domain/States/VacationRequest/VacationRequestState.php
Normal file
39
app/Domain/States/VacationRequest/VacationRequestState.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\States\VacationRequest;
|
||||
|
||||
use Spatie\ModelStates\Exceptions\InvalidConfig;
|
||||
use Spatie\ModelStates\State;
|
||||
use Spatie\ModelStates\StateConfig;
|
||||
|
||||
abstract class VacationRequestState extends State
|
||||
{
|
||||
/**
|
||||
* @throws InvalidConfig
|
||||
*/
|
||||
public static function config(): StateConfig
|
||||
{
|
||||
return parent::config()
|
||||
->default(Created::class)
|
||||
->allowTransition(Created::class, Approved::class)
|
||||
->allowTransition(Created::class, WaitingForTechnical::class)
|
||||
->allowTransition(Created::class, WaitingForAdministrative::class)
|
||||
->allowTransition(WaitingForTechnical::class, Rejected::class)
|
||||
->allowTransition(WaitingForTechnical::class, AcceptedByTechnical::class)
|
||||
->allowTransition(WaitingForAdministrative::class, Rejected::class)
|
||||
->allowTransition(WaitingForAdministrative::class, AcceptedByAdministrative::class)
|
||||
->allowTransition(AcceptedByTechnical::class, WaitingForAdministrative::class)
|
||||
->allowTransition(AcceptedByTechnical::class, Approved::class)
|
||||
->allowTransition(AcceptedByAdministrative::class, Approved::class)
|
||||
->allowTransition([
|
||||
Created::class,
|
||||
WaitingForTechnical::class,
|
||||
WaitingForAdministrative::class,
|
||||
AcceptedByTechnical::class,
|
||||
AcceptedByAdministrative::class,
|
||||
Approved::class,
|
||||
], Cancelled::class);
|
||||
}
|
||||
}
|
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\States\VacationRequest;
|
||||
|
||||
class WaitingForAdministrative extends VacationRequestState
|
||||
{
|
||||
public static string $name = "waiting_for_administrative";
|
||||
}
|
10
app/Domain/States/VacationRequest/WaitingForTechnical.php
Normal file
10
app/Domain/States/VacationRequest/WaitingForTechnical.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\States\VacationRequest;
|
||||
|
||||
class WaitingForTechnical extends VacationRequestState
|
||||
{
|
||||
public static string $name = "waiting_for_technical";
|
||||
}
|
@@ -6,12 +6,21 @@ namespace Toby\Domain;
|
||||
|
||||
use Illuminate\Contracts\Auth\Factory as Auth;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
use Toby\Domain\Enums\VacationRequestState;
|
||||
use Toby\Domain\Events\VacationRequestAcceptedByAdministrative;
|
||||
use Toby\Domain\Events\VacationRequestAcceptedByTechnical;
|
||||
use Toby\Domain\Events\VacationRequestApproved;
|
||||
use Toby\Domain\Events\VacationRequestCancelled;
|
||||
use Toby\Domain\Events\VacationRequestCreated;
|
||||
use Toby\Domain\Events\VacationRequestStateChanged;
|
||||
use Toby\Domain\States\VacationRequest\AcceptedByAdministrative;
|
||||
use Toby\Domain\States\VacationRequest\AcceptedByTechnical;
|
||||
use Toby\Domain\States\VacationRequest\Approved;
|
||||
use Toby\Domain\States\VacationRequest\Cancelled;
|
||||
use Toby\Domain\States\VacationRequest\Rejected;
|
||||
use Toby\Domain\States\VacationRequest\VacationRequestState;
|
||||
use Toby\Domain\States\VacationRequest\WaitingForAdministrative;
|
||||
use Toby\Domain\States\VacationRequest\WaitingForTechnical;
|
||||
use Toby\Eloquent\Models\User;
|
||||
use Toby\Eloquent\Models\VacationRequest;
|
||||
|
||||
class VacationRequestStateManager
|
||||
@@ -22,58 +31,72 @@ class VacationRequestStateManager
|
||||
) {
|
||||
}
|
||||
|
||||
public function markAsCreated(VacationRequest $vacationRequest): void
|
||||
public function markAsCreated(VacationRequest $vacationRequest, ?User $user = null): void
|
||||
{
|
||||
$this->changeState($vacationRequest, VacationRequestState::Created);
|
||||
$this->fireStateChangedEvent($vacationRequest, null, $vacationRequest->state, $user);
|
||||
|
||||
$this->dispatcher->dispatch(new VacationRequestCreated($vacationRequest));
|
||||
}
|
||||
|
||||
public function approve(VacationRequest $vacationRequest): void
|
||||
public function approve(VacationRequest $vacationRequest, ?User $user = null): void
|
||||
{
|
||||
$this->changeState($vacationRequest, VacationRequestState::Approved);
|
||||
$this->changeState($vacationRequest, Approved::class, $user);
|
||||
|
||||
$this->dispatcher->dispatch(new VacationRequestApproved($vacationRequest));
|
||||
}
|
||||
|
||||
public function reject(VacationRequest $vacationRequest): void
|
||||
public function reject(VacationRequest $vacationRequest, ?User $user = null): void
|
||||
{
|
||||
$this->changeState($vacationRequest, VacationRequestState::Rejected);
|
||||
$this->changeState($vacationRequest, Rejected::class, $user);
|
||||
}
|
||||
|
||||
public function cancel(VacationRequest $vacationRequest): void
|
||||
public function cancel(VacationRequest $vacationRequest, ?User $user = null): void
|
||||
{
|
||||
$this->changeState($vacationRequest, VacationRequestState::Cancelled);
|
||||
$this->changeState($vacationRequest, Cancelled::class, $user);
|
||||
|
||||
$this->dispatcher->dispatch(new VacationRequestCancelled($vacationRequest));
|
||||
}
|
||||
|
||||
public function acceptAsTechnical(VacationRequest $vacationRequest): void
|
||||
public function acceptAsTechnical(VacationRequest $vacationRequest, ?User $user = null): void
|
||||
{
|
||||
$this->changeState($vacationRequest, VacationRequestState::AcceptedByTechnical);
|
||||
$this->changeState($vacationRequest, AcceptedByTechnical::class, $user);
|
||||
|
||||
$this->dispatcher->dispatch(new VacationRequestAcceptedByTechnical($vacationRequest));
|
||||
}
|
||||
|
||||
public function acceptAsAdministrative(VacationRequest $vacationRequest): void
|
||||
public function acceptAsAdministrative(VacationRequest $vacationRequest, ?User $user = null): void
|
||||
{
|
||||
$this->changeState($vacationRequest, VacationRequestState::AcceptedByAdministrative);
|
||||
$this->changeState($vacationRequest, AcceptedByAdministrative::class, $user);
|
||||
|
||||
$this->dispatcher->dispatch(new VacationRequestAcceptedByAdministrative($vacationRequest));
|
||||
}
|
||||
|
||||
public function waitForTechnical(VacationRequest $vacationRequest): void
|
||||
public function waitForTechnical(VacationRequest $vacationRequest, ?User $user = null): void
|
||||
{
|
||||
$this->changeState($vacationRequest, VacationRequestState::WaitingForTechnical);
|
||||
$this->changeState($vacationRequest, WaitingForTechnical::class, $user);
|
||||
}
|
||||
|
||||
public function waitForAdministrative(VacationRequest $vacationRequest): void
|
||||
public function waitForAdministrative(VacationRequest $vacationRequest, ?User $user = null): void
|
||||
{
|
||||
$this->changeState($vacationRequest, VacationRequestState::WaitingForAdministrative);
|
||||
$this->changeState($vacationRequest, WaitingForAdministrative::class, $user);
|
||||
}
|
||||
|
||||
protected function changeState(VacationRequest $vacationRequest, VacationRequestState $state): void
|
||||
protected function changeState(VacationRequest $vacationRequest, string $state, ?User $user = null): void
|
||||
{
|
||||
$vacationRequest->changeStateTo($state);
|
||||
$previousState = $vacationRequest->state;
|
||||
$vacationRequest->state->transitionTo($state);
|
||||
$vacationRequest->save();
|
||||
|
||||
$this->fireStateChangedEvent($vacationRequest, $previousState, $vacationRequest->state, $user);
|
||||
}
|
||||
|
||||
protected function fireStateChangedEvent(
|
||||
VacationRequest $vacationRequest,
|
||||
?VacationRequestState $from,
|
||||
VacationRequestState $to,
|
||||
?User $user = null,
|
||||
): void {
|
||||
$event = new VacationRequestStateChanged($vacationRequest, $from, $to, $user);
|
||||
$this->dispatcher->dispatch($event);
|
||||
}
|
||||
}
|
||||
|
60
app/Domain/VacationRequestStatesRetriever.php
Normal file
60
app/Domain/VacationRequestStatesRetriever.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain;
|
||||
|
||||
use Toby\Domain\States\VacationRequest\AcceptedByAdministrative;
|
||||
use Toby\Domain\States\VacationRequest\AcceptedByTechnical;
|
||||
use Toby\Domain\States\VacationRequest\Approved;
|
||||
use Toby\Domain\States\VacationRequest\Cancelled;
|
||||
use Toby\Domain\States\VacationRequest\Created;
|
||||
use Toby\Domain\States\VacationRequest\Rejected;
|
||||
use Toby\Domain\States\VacationRequest\WaitingForAdministrative;
|
||||
use Toby\Domain\States\VacationRequest\WaitingForTechnical;
|
||||
|
||||
class VacationRequestStatesRetriever
|
||||
{
|
||||
public static function pendingStates(): array
|
||||
{
|
||||
return [
|
||||
Created::class,
|
||||
WaitingForTechnical::class,
|
||||
WaitingForAdministrative::class,
|
||||
AcceptedByTechnical::class,
|
||||
AcceptedByAdministrative::class,
|
||||
];
|
||||
}
|
||||
|
||||
public static function successStates(): array
|
||||
{
|
||||
return [Approved::class];
|
||||
}
|
||||
|
||||
public static function failedStates(): array
|
||||
{
|
||||
return [
|
||||
Rejected::class,
|
||||
Cancelled::class,
|
||||
];
|
||||
}
|
||||
|
||||
public static function all(): array
|
||||
{
|
||||
return [
|
||||
...self::pendingStates(),
|
||||
...self::successStates(),
|
||||
...self::failedStates(),
|
||||
];
|
||||
}
|
||||
|
||||
public static function filterByStatus(string $filter): array
|
||||
{
|
||||
return match ($filter) {
|
||||
"pending" => self::pendingStates(),
|
||||
"success" => self::successStates(),
|
||||
"failed" => self::failedStates(),
|
||||
default => self::all(),
|
||||
};
|
||||
}
|
||||
}
|
@@ -6,9 +6,9 @@ namespace Toby\Domain\Validation\Rules;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Toby\Domain\Enums\VacationRequestState;
|
||||
use Toby\Domain\Enums\VacationType;
|
||||
use Toby\Domain\VacationDaysCalculator;
|
||||
use Toby\Domain\VacationRequestStatesRetriever;
|
||||
use Toby\Domain\VacationTypeConfigRetriever;
|
||||
use Toby\Eloquent\Models\User;
|
||||
use Toby\Eloquent\Models\VacationRequest;
|
||||
@@ -53,7 +53,7 @@ class DoesNotExceedLimitRule implements VacationRequestRule
|
||||
"vacationRequest",
|
||||
fn(Builder $query) => $query
|
||||
->whereIn("type", $this->getLimitableVacationTypes())
|
||||
->noStates(VacationRequestState::failedStates()),
|
||||
->noStates(VacationRequestStatesRetriever::failedStates()),
|
||||
)
|
||||
->count();
|
||||
}
|
||||
|
@@ -4,7 +4,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\Validation\Rules;
|
||||
|
||||
use Toby\Domain\Enums\VacationRequestState;
|
||||
use Toby\Domain\VacationRequestStatesRetriever;
|
||||
use Toby\Eloquent\Models\VacationRequest;
|
||||
|
||||
class NoApprovedVacationRequestsInRange implements VacationRequestRule
|
||||
@@ -15,7 +15,7 @@ class NoApprovedVacationRequestsInRange implements VacationRequestRule
|
||||
->user
|
||||
->vacationRequests()
|
||||
->overlapsWith($vacationRequest)
|
||||
->states(VacationRequestState::successStates())
|
||||
->states(VacationRequestStatesRetriever::successStates())
|
||||
->exists();
|
||||
}
|
||||
|
||||
|
@@ -4,7 +4,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\Validation\Rules;
|
||||
|
||||
use Toby\Domain\Enums\VacationRequestState;
|
||||
use Toby\Domain\VacationRequestStatesRetriever;
|
||||
use Toby\Eloquent\Models\VacationRequest;
|
||||
|
||||
class NoPendingVacationRequestInRange implements VacationRequestRule
|
||||
@@ -15,7 +15,7 @@ class NoPendingVacationRequestInRange implements VacationRequestRule
|
||||
->user
|
||||
->vacationRequests()
|
||||
->overlapsWith($vacationRequest)
|
||||
->states(VacationRequestState::pendingStates())
|
||||
->states(VacationRequestStatesRetriever::pendingStates())
|
||||
->exists();
|
||||
}
|
||||
|
||||
|
@@ -12,8 +12,9 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Collection;
|
||||
use Toby\Domain\Enums\VacationRequestState;
|
||||
use Spatie\ModelStates\HasStates;
|
||||
use Toby\Domain\Enums\VacationType;
|
||||
use Toby\Domain\States\VacationRequest\VacationRequestState;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
@@ -32,6 +33,7 @@ use Toby\Domain\Enums\VacationType;
|
||||
class VacationRequest extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
use HasStates;
|
||||
|
||||
protected $guarded = [];
|
||||
|
||||
@@ -62,21 +64,14 @@ class VacationRequest extends Model
|
||||
return $this->hasMany(Vacation::class);
|
||||
}
|
||||
|
||||
public function changeStateTo(VacationRequestState $state): void
|
||||
public function scopeStates(Builder $query, VacationRequestState|array $states): Builder
|
||||
{
|
||||
$this->state = $state;
|
||||
|
||||
$this->save();
|
||||
return $query->whereState("state", $states);
|
||||
}
|
||||
|
||||
public function scopeStates(Builder $query, array $states): Builder
|
||||
public function scopeNoStates(Builder $query, VacationRequestState|array $states): Builder
|
||||
{
|
||||
return $query->whereIn("state", $states);
|
||||
}
|
||||
|
||||
public function scopeNoStates(Builder $query, array $states): Builder
|
||||
{
|
||||
return $query->whereNotIn("state", $states);
|
||||
return $query->whereNotState("state", $states);
|
||||
}
|
||||
|
||||
public function scopeOverlapsWith(Builder $query, self $vacationRequest): Builder
|
||||
|
@@ -6,7 +6,7 @@ namespace Toby\Eloquent\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Toby\Domain\Enums\VacationRequestState;
|
||||
use Toby\Domain\States\VacationRequest\VacationRequestState;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
|
@@ -6,9 +6,6 @@ namespace Toby\Eloquent\Observers;
|
||||
|
||||
use Illuminate\Contracts\Auth\Factory as Auth;
|
||||
use Illuminate\Events\Dispatcher;
|
||||
use Toby\Domain\Enums\VacationRequestState;
|
||||
use Toby\Domain\Events\VacationRequestStateChanged;
|
||||
use Toby\Eloquent\Models\User;
|
||||
use Toby\Eloquent\Models\VacationRequest;
|
||||
|
||||
class VacationRequestObserver
|
||||
@@ -29,31 +26,4 @@ class VacationRequestObserver
|
||||
|
||||
$vacationRequest->name = "{$vacationRequestNumber}/${year}";
|
||||
}
|
||||
|
||||
public function saved(VacationRequest $vacationRequest): void
|
||||
{
|
||||
if ($vacationRequest->isDirty("state")) {
|
||||
$previousState = $vacationRequest->getOriginal("state");
|
||||
|
||||
$this->fireStateChangedEvent($vacationRequest, $previousState, $vacationRequest->state);
|
||||
}
|
||||
}
|
||||
|
||||
protected function fireStateChangedEvent(
|
||||
VacationRequest $vacationRequest,
|
||||
?VacationRequestState $from,
|
||||
VacationRequestState $to,
|
||||
): void {
|
||||
$event = new VacationRequestStateChanged($vacationRequest, $from, $to, $this->getAuthUser());
|
||||
|
||||
$this->dispatcher->dispatch($event);
|
||||
}
|
||||
|
||||
protected function getAuthUser(): ?User
|
||||
{
|
||||
/** @var User $user */
|
||||
$user = $this->auth->guard()->user();
|
||||
|
||||
return $user;
|
||||
}
|
||||
}
|
||||
|
@@ -8,11 +8,17 @@ use Barryvdh\DomPDF\Facade\Pdf;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response as LaravelResponse;
|
||||
use Illuminate\Support\Arr;
|
||||
use Inertia\Response;
|
||||
use Toby\Domain\Enums\VacationRequestState;
|
||||
use Toby\Domain\Enums\Role;
|
||||
use Toby\Domain\Enums\VacationType;
|
||||
use Toby\Domain\States\VacationRequest\AcceptedByAdministrative;
|
||||
use Toby\Domain\States\VacationRequest\AcceptedByTechnical;
|
||||
use Toby\Domain\States\VacationRequest\Cancelled;
|
||||
use Toby\Domain\States\VacationRequest\Rejected;
|
||||
use Toby\Domain\VacationDaysCalculator;
|
||||
use Toby\Domain\VacationRequestStateManager;
|
||||
use Toby\Domain\VacationRequestStatesRetriever;
|
||||
use Toby\Domain\Validation\VacationRequestValidator;
|
||||
use Toby\Eloquent\Helpers\YearPeriodRetriever;
|
||||
use Toby\Eloquent\Models\VacationRequest;
|
||||
@@ -31,7 +37,7 @@ class VacationRequestController extends Controller
|
||||
->with("vacations")
|
||||
->where("year_period_id", $yearPeriodRetriever->selected()->id)
|
||||
->latest()
|
||||
->states(VacationRequestState::filterByStatus($status))
|
||||
->states(VacationRequestStatesRetriever::filterByStatus($status))
|
||||
->paginate();
|
||||
|
||||
return inertia("VacationRequest/Index", [
|
||||
@@ -42,11 +48,23 @@ class VacationRequestController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(VacationRequest $vacationRequest): Response
|
||||
public function show(Request $request, VacationRequest $vacationRequest): Response
|
||||
{
|
||||
$user = $request->user();
|
||||
|
||||
return inertia("VacationRequest/Show", [
|
||||
"request" => new VacationRequestResource($vacationRequest),
|
||||
"activities" => VacationRequestActivityResource::collection($vacationRequest->activities),
|
||||
"can" => [
|
||||
"acceptAsTechnical" => $vacationRequest->state->canTransitionTo(AcceptedByTechnical::class)
|
||||
&& $user === Role::TechnicalApprover,
|
||||
"acceptAsAdministrative" => $vacationRequest->state->canTransitionTo(AcceptedByAdministrative::class)
|
||||
&& $user === Role::AdministrativeApprover,
|
||||
"reject" => $vacationRequest->state->canTransitionTo(Rejected::class)
|
||||
&& in_array($user->role, [Role::TechnicalApprover, Role::AdministrativeApprover]),
|
||||
"cancel" => $vacationRequest->state->canTransitionTo(Cancelled::class)
|
||||
&& $user === Role::TechnicalApprover,
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -92,7 +110,7 @@ class VacationRequestController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
$stateManager->markAsCreated($vacationRequest);
|
||||
$stateManager->markAsCreated($vacationRequest, $request->user());
|
||||
|
||||
return redirect()
|
||||
->route("vacation.requests.show", $vacationRequest)
|
||||
@@ -100,40 +118,44 @@ class VacationRequestController extends Controller
|
||||
}
|
||||
|
||||
public function reject(
|
||||
Request $request,
|
||||
VacationRequest $vacationRequest,
|
||||
VacationRequestStateManager $stateManager,
|
||||
): RedirectResponse {
|
||||
$stateManager->reject($vacationRequest);
|
||||
$stateManager->reject($vacationRequest, $request->user());
|
||||
|
||||
return redirect()->back()
|
||||
->with("success", __("Vacation request has been rejected."));
|
||||
}
|
||||
|
||||
public function cancel(
|
||||
Request $request,
|
||||
VacationRequest $vacationRequest,
|
||||
VacationRequestStateManager $stateManager,
|
||||
): RedirectResponse {
|
||||
$stateManager->cancel($vacationRequest);
|
||||
$stateManager->cancel($vacationRequest, $request->user());
|
||||
|
||||
return redirect()->back()
|
||||
->with("success", __("Vacation request has been cancelled."));
|
||||
}
|
||||
|
||||
public function acceptAsTechnical(
|
||||
Request $request,
|
||||
VacationRequest $vacationRequest,
|
||||
VacationRequestStateManager $stateManager,
|
||||
): RedirectResponse {
|
||||
$stateManager->acceptAsTechnical($vacationRequest);
|
||||
$stateManager->acceptAsTechnical($vacationRequest, $request->user());
|
||||
|
||||
return redirect()->back()
|
||||
->with("success", __("Vacation request has been accepted."));
|
||||
}
|
||||
|
||||
public function acceptAsAdministrative(
|
||||
Request $request,
|
||||
VacationRequest $vacationRequest,
|
||||
VacationRequestStateManager $stateManager,
|
||||
): RedirectResponse {
|
||||
$stateManager->acceptAsAdministrative($vacationRequest);
|
||||
$stateManager->acceptAsAdministrative($vacationRequest, $request->user());
|
||||
|
||||
return redirect()->back()
|
||||
->with("success", __("Vacation request has been accepted."));
|
||||
|
@@ -17,7 +17,6 @@ class VacationRequestActivityResource extends JsonResource
|
||||
"time" => $this->created_at->format("H:i"),
|
||||
"user" => $this->user ? $this->user->fullName : __("System"),
|
||||
"state" => $this->to,
|
||||
"text" => $this->to->label(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user