#71 - annual summary (#113)

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* fix

* lint fix

* cr fix

* fix
This commit is contained in:
Adrian Hopek
2022-04-07 14:33:15 +02:00
committed by GitHub
parent 84403a762a
commit ff8d6aade6
20 changed files with 1073 additions and 1206 deletions

View File

@@ -187,7 +187,7 @@ class TimesheetPerUserSheet implements WithTitle, WithHeadings, WithEvents, With
{
return $user->vacations()
->with("vacationRequest")
->whereRelation("vacationRequest", fn(Builder $query) => $query->whereIn("type", $this->types))
->whereRelation("vacationRequest", fn(Builder $query): Builder => $query->whereIn("type", $this->types))
->whereBetween("date", [$period->start, $period->end])
->approved()
->get()

View File

@@ -21,10 +21,10 @@ class UserVacationStatsRetriever
{
return $user
->vacations()
->where("year_period_id", $yearPeriod->id)
->whereBelongsTo($yearPeriod)
->whereRelation(
"vacationRequest",
fn(Builder $query) => $query
fn(Builder $query): Builder => $query
->whereIn("type", $this->getLimitableVacationTypes())
->states(VacationRequestStatesRetriever::successStates()),
)
@@ -36,8 +36,8 @@ class UserVacationStatsRetriever
return $user->vacations()
->whereRelation(
"vacationRequest",
fn(Builder $query) => $query
->where("year_period_id", $yearPeriod->id)
fn(Builder $query): Builder => $query
->whereBelongsTo($yearPeriod)
->whereIn("type", $this->getLimitableVacationTypes())
->states(VacationRequestStatesRetriever::successStates()),
)
@@ -50,10 +50,10 @@ class UserVacationStatsRetriever
{
return $user
->vacations()
->where("year_period_id", $yearPeriod->id)
->whereBelongsTo($yearPeriod)
->whereRelation(
"vacationRequest",
fn(Builder $query) => $query
fn(Builder $query): Builder => $query
->whereIn("type", $this->getLimitableVacationTypes())
->states(VacationRequestStatesRetriever::pendingStates()),
)
@@ -64,10 +64,10 @@ class UserVacationStatsRetriever
{
return $user
->vacations()
->where("year_period_id", $yearPeriod->id)
->whereBelongsTo($yearPeriod)
->whereRelation(
"vacationRequest",
fn(Builder $query) => $query
fn(Builder $query): Builder => $query
->whereIn("type", $this->getNotLimitableVacationTypes())
->states(VacationRequestStatesRetriever::successStates()),
)
@@ -86,7 +86,7 @@ class UserVacationStatsRetriever
public function getVacationDaysLimit(User $user, YearPeriod $yearPeriod): int
{
$limit = $user->vacationLimits()
->where("year_period_id", $yearPeriod->id)
->whereBelongsTo($yearPeriod)
->first()
?->days;

View File

@@ -41,16 +41,19 @@ class DoesNotExceedLimitRule implements VacationRequestRule
protected function getUserVacationLimit(User $user, YearPeriod $yearPeriod): int
{
return $user->vacationLimits()->where("year_period_id", $yearPeriod->id)->first()->days ?? 0;
return $user->vacationLimits()
->whereBelongsTo($yearPeriod)
->first()
?->days ?? 0;
}
protected function getVacationDaysWithLimit(User $user, YearPeriod $yearPeriod): int
{
return $user->vacations()
->where("year_period_id", $yearPeriod->id)
->whereBelongsTo($yearPeriod)
->whereRelation(
"vacationRequest",
fn(Builder $query) => $query
fn(Builder $query): Builder => $query
->whereIn("type", $this->getLimitableVacationTypes())
->noStates(VacationRequestStatesRetriever::failedStates()),
)

View File

@@ -91,7 +91,7 @@ class User extends Authenticatable
public function hasVacationLimit(YearPeriod $yearPeriod): bool
{
return $this->vacationLimits()
->where("year_period_id", $yearPeriod->id)
->whereBelongsTo($yearPeriod)
->whereNotNull("days")
->exists();
}
@@ -112,8 +112,8 @@ class User extends Authenticatable
{
return $query->whereRelation(
"vacationlimits",
fn(Builder $query) => $query
->where("year_period_id", $yearPeriod->id)
fn(Builder $query): Builder => $query
->whereBelongsTo($yearPeriod)
->whereNotNull("days"),
);
}

View File

@@ -47,7 +47,15 @@ class Vacation extends Model
{
return $query->whereRelation(
"vacationRequest",
fn(Builder $query) => $query->states(VacationRequestStatesRetriever::successStates()),
fn(Builder $query): Builder => $query->states(VacationRequestStatesRetriever::successStates()),
);
}
public function scopePending(Builder $query): Builder
{
return $query->whereRelation(
"vacationRequest",
fn(Builder $query): Builder => $query->states(VacationRequestStatesRetriever::pendingStates()),
);
}
}

View File

@@ -0,0 +1,53 @@
<?php
declare(strict_types=1);
namespace Toby\Infrastructure\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Response;
use Toby\Eloquent\Helpers\YearPeriodRetriever;
use Toby\Eloquent\Models\Holiday;
use Toby\Eloquent\Models\Vacation;
use Toby\Infrastructure\Http\Resources\SimpleVacationRequestResource;
class AnnualSummaryController extends Controller
{
public function __invoke(Request $request, YearPeriodRetriever $yearPeriodRetriever): Response
{
$yearPeriod = $yearPeriodRetriever->selected();
$holidays = $yearPeriod->holidays()
->get();
$vacations = $request->user()
->vacations()
->with("vacationRequest.vacations")
->whereBelongsTo($yearPeriod)
->approved()
->get();
$pendingVacations = $request->user()
->vacations()
->with("vacationRequest.vacations")
->whereBelongsTo($yearPeriod)
->pending()
->get();
return inertia("AnnualSummary", [
"holidays" => $holidays->mapWithKeys(
fn(Holiday $holiday): array => [$holiday->date->toDateString() => $holiday->name],
),
"vacations" => $vacations->mapWithKeys(
fn(Vacation $vacation): array => [
$vacation->date->toDateString() => new SimpleVacationRequestResource($vacation->vacationRequest),
],
),
"pendingVacations" => $pendingVacations->mapWithKeys(
fn(Vacation $vacation): array => [
$vacation->date->toDateString() => new SimpleVacationRequestResource($vacation->vacationRequest),
],
),
]);
}
}

View File

@@ -27,16 +27,16 @@ class CalculateUserUnavailableDaysController extends Controller
$holidays = $yearPeriod->holidays()->pluck("date");
$vacationDays = $user->vacations()
->where("year_period_id", $yearPeriod->id)
->whereBelongsTo($yearPeriod)
->whereRelation(
"vacationRequest",
fn(Builder $query) => $query->noStates(VacationRequestStatesRetriever::failedStates()),
fn(Builder $query): Builder => $query->noStates(VacationRequestStatesRetriever::failedStates()),
)
->pluck("date");
return new JsonResponse([
...$holidays->map(fn(Carbon $date) => $date->toDateString()),
...$vacationDays->map(fn(Carbon $date) => $date->toDateString()),
...$holidays->map(fn(Carbon $date): string => $date->toDateString()),
...$vacationDays->map(fn(Carbon $date): string => $date->toDateString()),
]);
}
}

View File

@@ -40,26 +40,26 @@ class VacationRequestController extends Controller
$vacationRequests = $request->user()
->vacationRequests()
->with("vacations")
->where("year_period_id", $yearPeriodRetriever->selected()->id)
->whereBelongsTo($yearPeriodRetriever->selected())
->latest()
->states(VacationRequestStatesRetriever::filterByStatusGroup($status, $request->user()))
->paginate();
$pending = $request->user()
->vacationRequests()
->where("year_period_id", $yearPeriodRetriever->selected()->id)
->whereBelongsTo($yearPeriodRetriever->selected())
->states(VacationRequestStatesRetriever::pendingStates())
->count();
$success = $request->user()
->vacationRequests()
->where("year_period_id", $yearPeriodRetriever->selected()->id)
->whereBelongsTo($yearPeriodRetriever->selected())
->states(VacationRequestStatesRetriever::successStates())
->count();
$failed = $request->user()
->vacationRequests()
->where("year_period_id", $yearPeriodRetriever->selected()->id)
->whereBelongsTo($yearPeriodRetriever->selected())
->states(VacationRequestStatesRetriever::failedStates())
->count();
@@ -91,11 +91,11 @@ class VacationRequestController extends Controller
$vacationRequests = VacationRequest::query()
->with(["user", "vacations"])
->where("year_period_id", $yearPeriod->id)
->when($user !== null, fn(Builder $query) => $query->where("user_id", $user))
->whereBelongsTo($yearPeriod)
->when($user !== null, fn(Builder $query): Builder => $query->where("user_id", $user))
->when(
$status !== null,
fn(Builder $query) => $query->states(
fn(Builder $query): Builder => $query->states(
VacationRequestStatesRetriever::filterByStatusGroup($status, $request->user()),
),
)
@@ -156,7 +156,7 @@ class VacationRequestController extends Controller
return $pdf->stream();
}
public function create(Request $request, YearPeriodRetriever $yearPeriodRetriever): Response
public function create(Request $request): Response
{
$users = User::query()
->orderBy("last_name")

View File

@@ -0,0 +1,25 @@
<?php
declare(strict_types=1);
namespace Toby\Infrastructure\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class SimpleVacationRequestResource extends JsonResource
{
public static $wrap = null;
public function toArray($request): array
{
return [
"id" => $this->id,
"name" => $this->name,
"type" => $this->type,
"state" => $this->state,
"from" => $this->from->toDisplayString(),
"to" => $this->to->toDisplayString(),
"days" => $this->vacations->count(),
];
}
}