wip
This commit is contained in:
parent
597d6f0ddb
commit
2ccdfed2ec
@ -7,8 +7,8 @@ namespace Toby\Domain;
|
|||||||
use Carbon\CarbonImmutable;
|
use Carbon\CarbonImmutable;
|
||||||
use Carbon\CarbonInterface;
|
use Carbon\CarbonInterface;
|
||||||
use Carbon\CarbonPeriod;
|
use Carbon\CarbonPeriod;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
|
||||||
use Toby\Eloquent\Helpers\YearPeriodRetriever;
|
use Toby\Eloquent\Helpers\YearPeriodRetriever;
|
||||||
use Toby\Eloquent\Models\Vacation;
|
use Toby\Eloquent\Models\Vacation;
|
||||||
use Toby\Eloquent\Models\YearPeriod;
|
use Toby\Eloquent\Models\YearPeriod;
|
||||||
@ -73,7 +73,7 @@ class CalendarGenerator
|
|||||||
{
|
{
|
||||||
return Vacation::query()
|
return Vacation::query()
|
||||||
->whereBetween("date", [$period->start, $period->end])
|
->whereBetween("date", [$period->start, $period->end])
|
||||||
->whereRelation("vacationRequest", "state", VacationRequestState::Approved->value)
|
->whereRelation("vacationRequest", fn(Builder $query) => $query->states(VacationRequestStatesRetriever::successStates()))
|
||||||
->get()
|
->get()
|
||||||
->groupBy(fn(Vacation $vacation) => $vacation->date->toDateString());
|
->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\Foundation\Events\Dispatchable;
|
||||||
use Illuminate\Queue\SerializesModels;
|
use Illuminate\Queue\SerializesModels;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
use Toby\Domain\States\VacationRequest\VacationRequestState;
|
||||||
use Toby\Eloquent\Models\User;
|
use Toby\Eloquent\Models\User;
|
||||||
use Toby\Eloquent\Models\VacationRequest;
|
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\Auth\Factory as Auth;
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
use Illuminate\Contracts\Events\Dispatcher;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
|
||||||
use Toby\Domain\Events\VacationRequestAcceptedByAdministrative;
|
use Toby\Domain\Events\VacationRequestAcceptedByAdministrative;
|
||||||
use Toby\Domain\Events\VacationRequestAcceptedByTechnical;
|
use Toby\Domain\Events\VacationRequestAcceptedByTechnical;
|
||||||
use Toby\Domain\Events\VacationRequestApproved;
|
use Toby\Domain\Events\VacationRequestApproved;
|
||||||
use Toby\Domain\Events\VacationRequestCancelled;
|
use Toby\Domain\Events\VacationRequestCancelled;
|
||||||
use Toby\Domain\Events\VacationRequestCreated;
|
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;
|
use Toby\Eloquent\Models\VacationRequest;
|
||||||
|
|
||||||
class VacationRequestStateManager
|
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));
|
$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));
|
$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));
|
$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));
|
$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));
|
$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\Builder;
|
||||||
use Illuminate\Database\Eloquent\Collection;
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
|
||||||
use Toby\Domain\Enums\VacationType;
|
use Toby\Domain\Enums\VacationType;
|
||||||
use Toby\Domain\VacationDaysCalculator;
|
use Toby\Domain\VacationDaysCalculator;
|
||||||
|
use Toby\Domain\VacationRequestStatesRetriever;
|
||||||
use Toby\Domain\VacationTypeConfigRetriever;
|
use Toby\Domain\VacationTypeConfigRetriever;
|
||||||
use Toby\Eloquent\Models\User;
|
use Toby\Eloquent\Models\User;
|
||||||
use Toby\Eloquent\Models\VacationRequest;
|
use Toby\Eloquent\Models\VacationRequest;
|
||||||
@ -53,7 +53,7 @@ class DoesNotExceedLimitRule implements VacationRequestRule
|
|||||||
"vacationRequest",
|
"vacationRequest",
|
||||||
fn(Builder $query) => $query
|
fn(Builder $query) => $query
|
||||||
->whereIn("type", $this->getLimitableVacationTypes())
|
->whereIn("type", $this->getLimitableVacationTypes())
|
||||||
->noStates(VacationRequestState::failedStates()),
|
->noStates(VacationRequestStatesRetriever::failedStates()),
|
||||||
)
|
)
|
||||||
->count();
|
->count();
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Toby\Domain\Validation\Rules;
|
namespace Toby\Domain\Validation\Rules;
|
||||||
|
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
use Toby\Domain\VacationRequestStatesRetriever;
|
||||||
use Toby\Eloquent\Models\VacationRequest;
|
use Toby\Eloquent\Models\VacationRequest;
|
||||||
|
|
||||||
class NoApprovedVacationRequestsInRange implements VacationRequestRule
|
class NoApprovedVacationRequestsInRange implements VacationRequestRule
|
||||||
@ -15,7 +15,7 @@ class NoApprovedVacationRequestsInRange implements VacationRequestRule
|
|||||||
->user
|
->user
|
||||||
->vacationRequests()
|
->vacationRequests()
|
||||||
->overlapsWith($vacationRequest)
|
->overlapsWith($vacationRequest)
|
||||||
->states(VacationRequestState::successStates())
|
->states(VacationRequestStatesRetriever::successStates())
|
||||||
->exists();
|
->exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Toby\Domain\Validation\Rules;
|
namespace Toby\Domain\Validation\Rules;
|
||||||
|
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
use Toby\Domain\VacationRequestStatesRetriever;
|
||||||
use Toby\Eloquent\Models\VacationRequest;
|
use Toby\Eloquent\Models\VacationRequest;
|
||||||
|
|
||||||
class NoPendingVacationRequestInRange implements VacationRequestRule
|
class NoPendingVacationRequestInRange implements VacationRequestRule
|
||||||
@ -15,7 +15,7 @@ class NoPendingVacationRequestInRange implements VacationRequestRule
|
|||||||
->user
|
->user
|
||||||
->vacationRequests()
|
->vacationRequests()
|
||||||
->overlapsWith($vacationRequest)
|
->overlapsWith($vacationRequest)
|
||||||
->states(VacationRequestState::pendingStates())
|
->states(VacationRequestStatesRetriever::pendingStates())
|
||||||
->exists();
|
->exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,8 +12,9 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|||||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
use Spatie\ModelStates\HasStates;
|
||||||
use Toby\Domain\Enums\VacationType;
|
use Toby\Domain\Enums\VacationType;
|
||||||
|
use Toby\Domain\States\VacationRequest\VacationRequestState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property int $id
|
* @property int $id
|
||||||
@ -32,6 +33,7 @@ use Toby\Domain\Enums\VacationType;
|
|||||||
class VacationRequest extends Model
|
class VacationRequest extends Model
|
||||||
{
|
{
|
||||||
use HasFactory;
|
use HasFactory;
|
||||||
|
use HasStates;
|
||||||
|
|
||||||
protected $guarded = [];
|
protected $guarded = [];
|
||||||
|
|
||||||
@ -62,21 +64,14 @@ class VacationRequest extends Model
|
|||||||
return $this->hasMany(Vacation::class);
|
return $this->hasMany(Vacation::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function changeStateTo(VacationRequestState $state): void
|
public function scopeStates(Builder $query, VacationRequestState|array $states): Builder
|
||||||
{
|
{
|
||||||
$this->state = $state;
|
return $query->whereState("state", $states);
|
||||||
|
|
||||||
$this->save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeStates(Builder $query, array $states): Builder
|
public function scopeNoStates(Builder $query, VacationRequestState|array $states): Builder
|
||||||
{
|
{
|
||||||
return $query->whereIn("state", $states);
|
return $query->whereNotState("state", $states);
|
||||||
}
|
|
||||||
|
|
||||||
public function scopeNoStates(Builder $query, array $states): Builder
|
|
||||||
{
|
|
||||||
return $query->whereNotIn("state", $states);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeOverlapsWith(Builder $query, self $vacationRequest): Builder
|
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\Model;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
use Toby\Domain\States\VacationRequest\VacationRequestState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property int $id
|
* @property int $id
|
||||||
|
@ -6,9 +6,6 @@ namespace Toby\Eloquent\Observers;
|
|||||||
|
|
||||||
use Illuminate\Contracts\Auth\Factory as Auth;
|
use Illuminate\Contracts\Auth\Factory as Auth;
|
||||||
use Illuminate\Events\Dispatcher;
|
use Illuminate\Events\Dispatcher;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
|
||||||
use Toby\Domain\Events\VacationRequestStateChanged;
|
|
||||||
use Toby\Eloquent\Models\User;
|
|
||||||
use Toby\Eloquent\Models\VacationRequest;
|
use Toby\Eloquent\Models\VacationRequest;
|
||||||
|
|
||||||
class VacationRequestObserver
|
class VacationRequestObserver
|
||||||
@ -29,31 +26,4 @@ class VacationRequestObserver
|
|||||||
|
|
||||||
$vacationRequest->name = "{$vacationRequestNumber}/${year}";
|
$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\RedirectResponse;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Http\Response as LaravelResponse;
|
use Illuminate\Http\Response as LaravelResponse;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
use Inertia\Response;
|
use Inertia\Response;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
use Toby\Domain\Enums\Role;
|
||||||
use Toby\Domain\Enums\VacationType;
|
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\VacationDaysCalculator;
|
||||||
use Toby\Domain\VacationRequestStateManager;
|
use Toby\Domain\VacationRequestStateManager;
|
||||||
|
use Toby\Domain\VacationRequestStatesRetriever;
|
||||||
use Toby\Domain\Validation\VacationRequestValidator;
|
use Toby\Domain\Validation\VacationRequestValidator;
|
||||||
use Toby\Eloquent\Helpers\YearPeriodRetriever;
|
use Toby\Eloquent\Helpers\YearPeriodRetriever;
|
||||||
use Toby\Eloquent\Models\VacationRequest;
|
use Toby\Eloquent\Models\VacationRequest;
|
||||||
@ -31,7 +37,7 @@ class VacationRequestController extends Controller
|
|||||||
->with("vacations")
|
->with("vacations")
|
||||||
->where("year_period_id", $yearPeriodRetriever->selected()->id)
|
->where("year_period_id", $yearPeriodRetriever->selected()->id)
|
||||||
->latest()
|
->latest()
|
||||||
->states(VacationRequestState::filterByStatus($status))
|
->states(VacationRequestStatesRetriever::filterByStatus($status))
|
||||||
->paginate();
|
->paginate();
|
||||||
|
|
||||||
return inertia("VacationRequest/Index", [
|
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", [
|
return inertia("VacationRequest/Show", [
|
||||||
"request" => new VacationRequestResource($vacationRequest),
|
"request" => new VacationRequestResource($vacationRequest),
|
||||||
"activities" => VacationRequestActivityResource::collection($vacationRequest->activities),
|
"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()
|
return redirect()
|
||||||
->route("vacation.requests.show", $vacationRequest)
|
->route("vacation.requests.show", $vacationRequest)
|
||||||
@ -100,40 +118,44 @@ class VacationRequestController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function reject(
|
public function reject(
|
||||||
|
Request $request,
|
||||||
VacationRequest $vacationRequest,
|
VacationRequest $vacationRequest,
|
||||||
VacationRequestStateManager $stateManager,
|
VacationRequestStateManager $stateManager,
|
||||||
): RedirectResponse {
|
): RedirectResponse {
|
||||||
$stateManager->reject($vacationRequest);
|
$stateManager->reject($vacationRequest, $request->user());
|
||||||
|
|
||||||
return redirect()->back()
|
return redirect()->back()
|
||||||
->with("success", __("Vacation request has been rejected."));
|
->with("success", __("Vacation request has been rejected."));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function cancel(
|
public function cancel(
|
||||||
|
Request $request,
|
||||||
VacationRequest $vacationRequest,
|
VacationRequest $vacationRequest,
|
||||||
VacationRequestStateManager $stateManager,
|
VacationRequestStateManager $stateManager,
|
||||||
): RedirectResponse {
|
): RedirectResponse {
|
||||||
$stateManager->cancel($vacationRequest);
|
$stateManager->cancel($vacationRequest, $request->user());
|
||||||
|
|
||||||
return redirect()->back()
|
return redirect()->back()
|
||||||
->with("success", __("Vacation request has been cancelled."));
|
->with("success", __("Vacation request has been cancelled."));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function acceptAsTechnical(
|
public function acceptAsTechnical(
|
||||||
|
Request $request,
|
||||||
VacationRequest $vacationRequest,
|
VacationRequest $vacationRequest,
|
||||||
VacationRequestStateManager $stateManager,
|
VacationRequestStateManager $stateManager,
|
||||||
): RedirectResponse {
|
): RedirectResponse {
|
||||||
$stateManager->acceptAsTechnical($vacationRequest);
|
$stateManager->acceptAsTechnical($vacationRequest, $request->user());
|
||||||
|
|
||||||
return redirect()->back()
|
return redirect()->back()
|
||||||
->with("success", __("Vacation request has been accepted."));
|
->with("success", __("Vacation request has been accepted."));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function acceptAsAdministrative(
|
public function acceptAsAdministrative(
|
||||||
|
Request $request,
|
||||||
VacationRequest $vacationRequest,
|
VacationRequest $vacationRequest,
|
||||||
VacationRequestStateManager $stateManager,
|
VacationRequestStateManager $stateManager,
|
||||||
): RedirectResponse {
|
): RedirectResponse {
|
||||||
$stateManager->acceptAsAdministrative($vacationRequest);
|
$stateManager->acceptAsAdministrative($vacationRequest, $request->user());
|
||||||
|
|
||||||
return redirect()->back()
|
return redirect()->back()
|
||||||
->with("success", __("Vacation request has been accepted."));
|
->with("success", __("Vacation request has been accepted."));
|
||||||
|
@ -17,7 +17,6 @@ class VacationRequestActivityResource extends JsonResource
|
|||||||
"time" => $this->created_at->format("H:i"),
|
"time" => $this->created_at->format("H:i"),
|
||||||
"user" => $this->user ? $this->user->fullName : __("System"),
|
"user" => $this->user ? $this->user->fullName : __("System"),
|
||||||
"state" => $this->to,
|
"state" => $this->to,
|
||||||
"text" => $this->to->label(),
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,8 @@
|
|||||||
"laravel/telescope": "^4.6",
|
"laravel/telescope": "^4.6",
|
||||||
"laravel/tinker": "^2.5",
|
"laravel/tinker": "^2.5",
|
||||||
"lasserafn/php-initial-avatar-generator": "^4.2",
|
"lasserafn/php-initial-avatar-generator": "^4.2",
|
||||||
"spatie/laravel-google-calendar": "^3.5"
|
"spatie/laravel-google-calendar": "^3.5",
|
||||||
|
"spatie/laravel-model-states": "^2.1"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"blumilksoftware/codestyle": "^0.9.0",
|
"blumilksoftware/codestyle": "^0.9.0",
|
||||||
|
243
composer.lock
generated
243
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "c0f36b87659921d0b7db0464b5d79ed5",
|
"content-hash": "3fdff95b32e84ce3b115bc3bc7289cf4",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "asm89/stack-cors",
|
"name": "asm89/stack-cors",
|
||||||
@ -709,6 +709,59 @@
|
|||||||
],
|
],
|
||||||
"time": "2021-10-11T09:18:27+00:00"
|
"time": "2021-10-11T09:18:27+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "facade/ignition-contracts",
|
||||||
|
"version": "1.0.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/facade/ignition-contracts.git",
|
||||||
|
"reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
|
||||||
|
"reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^7.3|^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"friendsofphp/php-cs-fixer": "^v2.15.8",
|
||||||
|
"phpunit/phpunit": "^9.3.11",
|
||||||
|
"vimeo/psalm": "^3.17.1"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Facade\\IgnitionContracts\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Freek Van der Herten",
|
||||||
|
"email": "freek@spatie.be",
|
||||||
|
"homepage": "https://flareapp.io",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Solution contracts for Ignition",
|
||||||
|
"homepage": "https://github.com/facade/ignition-contracts",
|
||||||
|
"keywords": [
|
||||||
|
"contracts",
|
||||||
|
"flare",
|
||||||
|
"ignition"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/facade/ignition-contracts/issues",
|
||||||
|
"source": "https://github.com/facade/ignition-contracts/tree/1.0.2"
|
||||||
|
},
|
||||||
|
"time": "2020-10-16T08:27:54+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "firebase/php-jwt",
|
"name": "firebase/php-jwt",
|
||||||
"version": "v5.5.1",
|
"version": "v5.5.1",
|
||||||
@ -4379,6 +4432,139 @@
|
|||||||
],
|
],
|
||||||
"time": "2022-01-13T09:43:27+00:00"
|
"time": "2022-01-13T09:43:27+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "spatie/laravel-model-states",
|
||||||
|
"version": "2.1.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/spatie/laravel-model-states.git",
|
||||||
|
"reference": "c9c4865abd2b5ec534214aede784631366bed7d4"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/spatie/laravel-model-states/zipball/c9c4865abd2b5ec534214aede784631366bed7d4",
|
||||||
|
"reference": "c9c4865abd2b5ec534214aede784631366bed7d4",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-json": "*",
|
||||||
|
"facade/ignition-contracts": "^1.0",
|
||||||
|
"illuminate/contracts": "^8.73 | ^9.0",
|
||||||
|
"illuminate/database": "^8.73 | ^9.0",
|
||||||
|
"illuminate/support": "^8.73 | ^9.0",
|
||||||
|
"php": "^7.4|^8.0",
|
||||||
|
"spatie/laravel-package-tools": "^1.9"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"orchestra/testbench": "^6.23 | ^7.0",
|
||||||
|
"phpunit/phpunit": "^9.4",
|
||||||
|
"symfony/var-dumper": "^5.3 | ^6.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"laravel": {
|
||||||
|
"providers": [
|
||||||
|
"Spatie\\ModelStates\\ModelStatesServiceProvider"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Spatie\\ModelStates\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Brent Roose",
|
||||||
|
"email": "brent@spatie.be",
|
||||||
|
"homepage": "https://spatie.be",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "State support for Eloquent models",
|
||||||
|
"homepage": "https://github.com/spatie/laravel-model-states",
|
||||||
|
"keywords": [
|
||||||
|
"spatie",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/spatie/laravel-model-states/tree/2.1.4"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://spatie.be/open-source/support-us",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/spatie",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2022-01-19T19:57:35+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spatie/laravel-package-tools",
|
||||||
|
"version": "1.11.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/spatie/laravel-package-tools.git",
|
||||||
|
"reference": "e933f14dae0b31b1f6a45aa769dbd97ce781031a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/e933f14dae0b31b1f6a45aa769dbd97ce781031a",
|
||||||
|
"reference": "e933f14dae0b31b1f6a45aa769dbd97ce781031a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"illuminate/contracts": "^7.0|^8.0|^9.0",
|
||||||
|
"php": "^7.4|^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"mockery/mockery": "^1.4",
|
||||||
|
"orchestra/testbench": "^5.0|^6.23|^7.0",
|
||||||
|
"phpunit/phpunit": "^9.4",
|
||||||
|
"spatie/test-time": "^1.2"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Spatie\\LaravelPackageTools\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Freek Van der Herten",
|
||||||
|
"email": "freek@spatie.be",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Tools for creating Laravel packages",
|
||||||
|
"homepage": "https://github.com/spatie/laravel-package-tools",
|
||||||
|
"keywords": [
|
||||||
|
"laravel-package-tools",
|
||||||
|
"spatie"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/spatie/laravel-package-tools/issues",
|
||||||
|
"source": "https://github.com/spatie/laravel-package-tools/tree/1.11.1"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://github.com/spatie",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2022-02-16T11:14:09+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/console",
|
"name": "symfony/console",
|
||||||
"version": "v6.0.3",
|
"version": "v6.0.3",
|
||||||
@ -6851,59 +7037,6 @@
|
|||||||
],
|
],
|
||||||
"time": "2020-11-10T18:47:58+00:00"
|
"time": "2020-11-10T18:47:58+00:00"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "facade/ignition-contracts",
|
|
||||||
"version": "1.0.2",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/facade/ignition-contracts.git",
|
|
||||||
"reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
|
|
||||||
"reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": "^7.3|^8.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"friendsofphp/php-cs-fixer": "^v2.15.8",
|
|
||||||
"phpunit/phpunit": "^9.3.11",
|
|
||||||
"vimeo/psalm": "^3.17.1"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"Facade\\IgnitionContracts\\": "src"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Freek Van der Herten",
|
|
||||||
"email": "freek@spatie.be",
|
|
||||||
"homepage": "https://flareapp.io",
|
|
||||||
"role": "Developer"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Solution contracts for Ignition",
|
|
||||||
"homepage": "https://github.com/facade/ignition-contracts",
|
|
||||||
"keywords": [
|
|
||||||
"contracts",
|
|
||||||
"flare",
|
|
||||||
"ignition"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/facade/ignition-contracts/issues",
|
|
||||||
"source": "https://github.com/facade/ignition-contracts/tree/1.0.2"
|
|
||||||
},
|
|
||||||
"time": "2020-10-16T08:27:54+00:00"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "fakerphp/faker",
|
"name": "fakerphp/faker",
|
||||||
"version": "v1.19.0",
|
"version": "v1.19.0",
|
||||||
@ -9571,5 +9704,5 @@
|
|||||||
"ext-pdo": "*"
|
"ext-pdo": "*"
|
||||||
},
|
},
|
||||||
"platform-dev": [],
|
"platform-dev": [],
|
||||||
"plugin-api-version": "2.1.0"
|
"plugin-api-version": "2.2.0"
|
||||||
}
|
}
|
||||||
|
7
config/model-states.php
Normal file
7
config/model-states.php
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
return [
|
||||||
|
"default_transition" => Spatie\ModelStates\DefaultTransition::class,
|
||||||
|
];
|
@ -6,8 +6,8 @@ namespace Database\Factories;
|
|||||||
|
|
||||||
use Carbon\CarbonImmutable;
|
use Carbon\CarbonImmutable;
|
||||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
|
||||||
use Toby\Domain\Enums\VacationType;
|
use Toby\Domain\Enums\VacationType;
|
||||||
|
use Toby\Domain\VacationRequestStatesRetriever;
|
||||||
use Toby\Eloquent\Models\User;
|
use Toby\Eloquent\Models\User;
|
||||||
use Toby\Eloquent\Models\VacationRequest;
|
use Toby\Eloquent\Models\VacationRequest;
|
||||||
use Toby\Eloquent\Models\YearPeriod;
|
use Toby\Eloquent\Models\YearPeriod;
|
||||||
@ -27,7 +27,7 @@ class VacationRequestFactory extends Factory
|
|||||||
"year_period_id" => YearPeriod::factory(),
|
"year_period_id" => YearPeriod::factory(),
|
||||||
"name" => fn(array $attributes) => $this->generateName($attributes),
|
"name" => fn(array $attributes) => $this->generateName($attributes),
|
||||||
"type" => $this->faker->randomElement(VacationType::cases()),
|
"type" => $this->faker->randomElement(VacationType::cases()),
|
||||||
"state" => $this->faker->randomElement(VacationRequestState::cases()),
|
"state" => $this->faker->randomElement(VacationRequestStatesRetriever::all()),
|
||||||
"from" => $from,
|
"from" => $from,
|
||||||
"to" => $from->addDays($days),
|
"to" => $from->addDays($days),
|
||||||
"comment" => $this->faker->boolean ? $this->faker->paragraph() : null,
|
"comment" => $this->faker->boolean ? $this->faker->paragraph() : null,
|
||||||
|
@ -1 +0,0 @@
|
|||||||
/application/storage/app/avatars
|
|
@ -110,7 +110,10 @@
|
|||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white shadow">
|
<div
|
||||||
|
v-if="can.acceptAsTechnical"
|
||||||
|
class="bg-white shadow"
|
||||||
|
>
|
||||||
<div class="px-4 py-5 sm:p-6">
|
<div class="px-4 py-5 sm:p-6">
|
||||||
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
Zaakceptuj wniosek jako osoba techniczna
|
Zaakceptuj wniosek jako osoba techniczna
|
||||||
@ -134,7 +137,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white shadow">
|
<div
|
||||||
|
v-if="can.acceptAsAdministrative"
|
||||||
|
class="bg-white shadow"
|
||||||
|
>
|
||||||
<div class="px-4 py-5 sm:p-6">
|
<div class="px-4 py-5 sm:p-6">
|
||||||
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
Zaakceptuj wniosek jako osoba administracyjna
|
Zaakceptuj wniosek jako osoba administracyjna
|
||||||
@ -157,7 +163,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white shadow">
|
<div
|
||||||
|
v-if="can.reject"
|
||||||
|
class="bg-white shadow"
|
||||||
|
>
|
||||||
<div class="px-4 py-5 sm:p-6">
|
<div class="px-4 py-5 sm:p-6">
|
||||||
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
Odrzuć wniosek
|
Odrzuć wniosek
|
||||||
@ -180,7 +189,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white shadow border border-red-500">
|
<div
|
||||||
|
v-if="can.cancel"
|
||||||
|
class="bg-white shadow border border-red-500"
|
||||||
|
>
|
||||||
<div class="px-4 py-5 sm:p-6">
|
<div class="px-4 py-5 sm:p-6">
|
||||||
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
Anuluj wniosek
|
Anuluj wniosek
|
||||||
@ -246,6 +258,10 @@ export default {
|
|||||||
type: Object,
|
type: Object,
|
||||||
default: () => null,
|
default: () => null,
|
||||||
},
|
},
|
||||||
|
can: {
|
||||||
|
type: Object,
|
||||||
|
default: () => null,
|
||||||
|
},
|
||||||
activities: {
|
activities: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => null,
|
default: () => null,
|
||||||
|
@ -9,9 +9,12 @@ use Illuminate\Support\Carbon;
|
|||||||
use Illuminate\Support\Facades\Bus;
|
use Illuminate\Support\Facades\Bus;
|
||||||
use Inertia\Testing\AssertableInertia as Assert;
|
use Inertia\Testing\AssertableInertia as Assert;
|
||||||
use Tests\FeatureTestCase;
|
use Tests\FeatureTestCase;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
|
||||||
use Toby\Domain\Enums\VacationType;
|
use Toby\Domain\Enums\VacationType;
|
||||||
use Toby\Domain\PolishHolidaysRetriever;
|
use Toby\Domain\PolishHolidaysRetriever;
|
||||||
|
use Toby\Domain\States\VacationRequest\Approved;
|
||||||
|
use Toby\Domain\States\VacationRequest\Rejected;
|
||||||
|
use Toby\Domain\States\VacationRequest\WaitingForAdministrative;
|
||||||
|
use Toby\Domain\States\VacationRequest\WaitingForTechnical;
|
||||||
use Toby\Eloquent\Models\User;
|
use Toby\Eloquent\Models\User;
|
||||||
use Toby\Eloquent\Models\VacationLimit;
|
use Toby\Eloquent\Models\VacationLimit;
|
||||||
use Toby\Eloquent\Models\VacationRequest;
|
use Toby\Eloquent\Models\VacationRequest;
|
||||||
@ -81,7 +84,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
"year_period_id" => $currentYearPeriod->id,
|
"year_period_id" => $currentYearPeriod->id,
|
||||||
"name" => "1/" . $currentYearPeriod->year,
|
"name" => "1/" . $currentYearPeriod->year,
|
||||||
"type" => VacationType::Vacation->value,
|
"type" => VacationType::Vacation->value,
|
||||||
"state" => VacationRequestState::WaitingForTechnical,
|
"state" => WaitingForTechnical::$name,
|
||||||
"from" => Carbon::create($currentYearPeriod->year, 2, 7)->toDateString(),
|
"from" => Carbon::create($currentYearPeriod->year, 2, 7)->toDateString(),
|
||||||
"to" => Carbon::create($currentYearPeriod->year, 2, 11)->toDateString(),
|
"to" => Carbon::create($currentYearPeriod->year, 2, 11)->toDateString(),
|
||||||
"comment" => "Comment for the vacation request.",
|
"comment" => "Comment for the vacation request.",
|
||||||
@ -95,7 +98,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
$currentYearPeriod = YearPeriod::current();
|
$currentYearPeriod = YearPeriod::current();
|
||||||
|
|
||||||
$vacationRequest = VacationRequest::factory([
|
$vacationRequest = VacationRequest::factory([
|
||||||
"state" => VacationRequestState::WaitingForTechnical,
|
"state" => WaitingForTechnical::class,
|
||||||
"type" => VacationType::Vacation,
|
"type" => VacationType::Vacation,
|
||||||
])
|
])
|
||||||
->for($user)
|
->for($user)
|
||||||
@ -107,7 +110,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
->assertSessionHasNoErrors();
|
->assertSessionHasNoErrors();
|
||||||
|
|
||||||
$this->assertDatabaseHas("vacation_requests", [
|
$this->assertDatabaseHas("vacation_requests", [
|
||||||
"state" => VacationRequestState::WaitingForAdministrative,
|
"state" => WaitingForAdministrative::$name,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,7 +122,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
$currentYearPeriod = YearPeriod::current();
|
$currentYearPeriod = YearPeriod::current();
|
||||||
|
|
||||||
$vacationRequest = VacationRequest::factory([
|
$vacationRequest = VacationRequest::factory([
|
||||||
"state" => VacationRequestState::WaitingForAdministrative,
|
"state" => WaitingForAdministrative::class,
|
||||||
])
|
])
|
||||||
->for($user)
|
->for($user)
|
||||||
->for($currentYearPeriod)
|
->for($currentYearPeriod)
|
||||||
@ -130,7 +133,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
->assertSessionHasNoErrors();
|
->assertSessionHasNoErrors();
|
||||||
|
|
||||||
$this->assertDatabaseHas("vacation_requests", [
|
$this->assertDatabaseHas("vacation_requests", [
|
||||||
"state" => VacationRequestState::Approved,
|
"state" => Approved::$name,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Bus::assertDispatched(SendVacationRequestDaysToGoogleCalendar::class);
|
Bus::assertDispatched(SendVacationRequestDaysToGoogleCalendar::class);
|
||||||
@ -142,7 +145,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
$technicalApprover = User::factory()->createQuietly();
|
$technicalApprover = User::factory()->createQuietly();
|
||||||
$currentYearPeriod = YearPeriod::current();
|
$currentYearPeriod = YearPeriod::current();
|
||||||
|
|
||||||
$vacationLimit = VacationLimit::factory([
|
VacationLimit::factory([
|
||||||
"days" => 20,
|
"days" => 20,
|
||||||
])
|
])
|
||||||
->for($user)
|
->for($user)
|
||||||
@ -150,7 +153,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
->create();
|
->create();
|
||||||
|
|
||||||
$vacationRequest = VacationRequest::factory([
|
$vacationRequest = VacationRequest::factory([
|
||||||
"state" => VacationRequestState::WaitingForTechnical,
|
"state" => WaitingForTechnical::class,
|
||||||
"type" => VacationType::Vacation,
|
"type" => VacationType::Vacation,
|
||||||
])
|
])
|
||||||
->for($user)
|
->for($user)
|
||||||
@ -162,7 +165,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
->assertSessionHasNoErrors();
|
->assertSessionHasNoErrors();
|
||||||
|
|
||||||
$this->assertDatabaseHas("vacation_requests", [
|
$this->assertDatabaseHas("vacation_requests", [
|
||||||
"state" => VacationRequestState::Rejected,
|
"state" => Rejected::$name,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,7 +262,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
|
|
||||||
VacationRequest::factory([
|
VacationRequest::factory([
|
||||||
"type" => VacationType::Vacation->value,
|
"type" => VacationType::Vacation->value,
|
||||||
"state" => VacationRequestState::WaitingForTechnical,
|
"state" => WaitingForTechnical::class,
|
||||||
"from" => Carbon::create($currentYearPeriod->year, 2, 1)->toDateString(),
|
"from" => Carbon::create($currentYearPeriod->year, 2, 1)->toDateString(),
|
||||||
"to" => Carbon::create($currentYearPeriod->year, 2, 4)->toDateString(),
|
"to" => Carbon::create($currentYearPeriod->year, 2, 4)->toDateString(),
|
||||||
"comment" => "Comment for the vacation request.",
|
"comment" => "Comment for the vacation request.",
|
||||||
@ -286,7 +289,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
$user = User::factory()->createQuietly();
|
$user = User::factory()->createQuietly();
|
||||||
$currentYearPeriod = YearPeriod::current();
|
$currentYearPeriod = YearPeriod::current();
|
||||||
|
|
||||||
$vacationLimit = VacationLimit::factory([
|
VacationLimit::factory([
|
||||||
"days" => 20,
|
"days" => 20,
|
||||||
])
|
])
|
||||||
->for($user)
|
->for($user)
|
||||||
@ -295,7 +298,7 @@ class VacationRequestTest extends FeatureTestCase
|
|||||||
|
|
||||||
VacationRequest::factory([
|
VacationRequest::factory([
|
||||||
"type" => VacationType::Vacation->value,
|
"type" => VacationType::Vacation->value,
|
||||||
"state" => VacationRequestState::Approved,
|
"state" => Approved::class,
|
||||||
"from" => Carbon::create($currentYearPeriod->year, 2, 2)->toDateString(),
|
"from" => Carbon::create($currentYearPeriod->year, 2, 2)->toDateString(),
|
||||||
"to" => Carbon::create($currentYearPeriod->year, 2, 4)->toDateString(),
|
"to" => Carbon::create($currentYearPeriod->year, 2, 4)->toDateString(),
|
||||||
"comment" => "Comment for the vacation request.",
|
"comment" => "Comment for the vacation request.",
|
||||||
|
@ -8,8 +8,10 @@ use Illuminate\Foundation\Testing\DatabaseMigrations;
|
|||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
use Tests\Traits\InteractsWithYearPeriods;
|
use Tests\Traits\InteractsWithYearPeriods;
|
||||||
use Toby\Domain\Enums\VacationRequestState;
|
|
||||||
use Toby\Domain\Enums\VacationType;
|
use Toby\Domain\Enums\VacationType;
|
||||||
|
use Toby\Domain\States\VacationRequest\Approved;
|
||||||
|
use Toby\Domain\States\VacationRequest\Created;
|
||||||
|
use Toby\Domain\States\VacationRequest\WaitingForTechnical;
|
||||||
use Toby\Domain\VacationRequestStateManager;
|
use Toby\Domain\VacationRequestStateManager;
|
||||||
use Toby\Eloquent\Models\User;
|
use Toby\Eloquent\Models\User;
|
||||||
use Toby\Eloquent\Models\VacationRequest;
|
use Toby\Eloquent\Models\VacationRequest;
|
||||||
@ -40,7 +42,7 @@ class VacationRequestStatesTest extends TestCase
|
|||||||
/** @var VacationRequest $vacationRequest */
|
/** @var VacationRequest $vacationRequest */
|
||||||
$vacationRequest = VacationRequest::factory([
|
$vacationRequest = VacationRequest::factory([
|
||||||
"type" => VacationType::Vacation->value,
|
"type" => VacationType::Vacation->value,
|
||||||
"state" => VacationRequestState::Created,
|
"state" => Created::class,
|
||||||
"from" => Carbon::create($currentYearPeriod->year, 2, 1)->toDateString(),
|
"from" => Carbon::create($currentYearPeriod->year, 2, 1)->toDateString(),
|
||||||
"to" => Carbon::create($currentYearPeriod->year, 2, 4)->toDateString(),
|
"to" => Carbon::create($currentYearPeriod->year, 2, 4)->toDateString(),
|
||||||
"comment" => "Comment for the vacation request.",
|
"comment" => "Comment for the vacation request.",
|
||||||
@ -51,7 +53,7 @@ class VacationRequestStatesTest extends TestCase
|
|||||||
|
|
||||||
$this->stateManager->waitForTechnical($vacationRequest);
|
$this->stateManager->waitForTechnical($vacationRequest);
|
||||||
|
|
||||||
$this->assertEquals(VacationRequestState::WaitingForTechnical, $vacationRequest->state);
|
$this->assertTrue($vacationRequest->state->equals(WaitingForTechnical::class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAfterCreatingVacationRequestOfTypeSickVacationItTransitsToProperState(): void
|
public function testAfterCreatingVacationRequestOfTypeSickVacationItTransitsToProperState(): void
|
||||||
@ -63,7 +65,7 @@ class VacationRequestStatesTest extends TestCase
|
|||||||
/** @var VacationRequest $vacationRequest */
|
/** @var VacationRequest $vacationRequest */
|
||||||
$vacationRequest = VacationRequest::factory([
|
$vacationRequest = VacationRequest::factory([
|
||||||
"type" => VacationType::Sick->value,
|
"type" => VacationType::Sick->value,
|
||||||
"state" => VacationRequestState::Created,
|
"state" => Created::class,
|
||||||
"from" => Carbon::create($currentYearPeriod->year, 2, 1)->toDateString(),
|
"from" => Carbon::create($currentYearPeriod->year, 2, 1)->toDateString(),
|
||||||
"to" => Carbon::create($currentYearPeriod->year, 2, 4)->toDateString(),
|
"to" => Carbon::create($currentYearPeriod->year, 2, 4)->toDateString(),
|
||||||
])
|
])
|
||||||
@ -73,7 +75,7 @@ class VacationRequestStatesTest extends TestCase
|
|||||||
|
|
||||||
$this->stateManager->approve($vacationRequest);
|
$this->stateManager->approve($vacationRequest);
|
||||||
|
|
||||||
$this->assertEquals(VacationRequestState::Approved, $vacationRequest->state);
|
$this->assertTrue($vacationRequest->state->equals(Approved::class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAfterCreatingVacationRequestOfTypeTimeInLieuItTransitsToProperState(): void
|
public function testAfterCreatingVacationRequestOfTypeTimeInLieuItTransitsToProperState(): void
|
||||||
@ -85,7 +87,7 @@ class VacationRequestStatesTest extends TestCase
|
|||||||
/** @var VacationRequest $vacationRequest */
|
/** @var VacationRequest $vacationRequest */
|
||||||
$vacationRequest = VacationRequest::factory([
|
$vacationRequest = VacationRequest::factory([
|
||||||
"type" => VacationType::TimeInLieu->value,
|
"type" => VacationType::TimeInLieu->value,
|
||||||
"state" => VacationRequestState::Created,
|
"state" => Created::class,
|
||||||
"from" => Carbon::create($currentYearPeriod->year, 2, 2)->toDateString(),
|
"from" => Carbon::create($currentYearPeriod->year, 2, 2)->toDateString(),
|
||||||
"to" => Carbon::create($currentYearPeriod->year, 2, 2)->toDateString(),
|
"to" => Carbon::create($currentYearPeriod->year, 2, 2)->toDateString(),
|
||||||
])
|
])
|
||||||
@ -95,6 +97,6 @@ class VacationRequestStatesTest extends TestCase
|
|||||||
|
|
||||||
$this->stateManager->approve($vacationRequest);
|
$this->stateManager->approve($vacationRequest);
|
||||||
|
|
||||||
$this->assertEquals(VacationRequestState::Approved, $vacationRequest->state);
|
$this->assertTrue($vacationRequest->state->equals(Approved::class));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user