toby/app/Domain/CalendarGenerator.php
Adrian Hopek 3d9726039c
#43 - vacation summary for employee (#66)
* wip

* wip

* wip

* wip

* wip

* wip

* wip

* #5 - bump dependencies

* #43 - wip

* #43 - add composer script

* #43 - fix

* #43 - fix

* #43 - wip

* #43 - ecs fix

* #43 - cr fix

* #43 - cr fix

* #43 - fix

Co-authored-by: EwelinaLasowy <ewelina.lasowy@blumilk.pl>
2022-03-03 09:03:17 +01:00

62 lines
2.0 KiB
PHP

<?php
declare(strict_types=1);
namespace Toby\Domain;
use Carbon\CarbonPeriod;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
use Toby\Eloquent\Helpers\YearPeriodRetriever;
use Toby\Eloquent\Models\Vacation;
use Toby\Eloquent\Models\YearPeriod;
class CalendarGenerator
{
public function __construct(
protected YearPeriodRetriever $yearPeriodRetriever,
) {}
public function generate(Carbon $month): array
{
$period = CarbonPeriod::create($month->copy()->startOfMonth(), $month->copy()->endOfMonth());
$yearPeriod = YearPeriod::findByYear($month->year);
$holidays = $yearPeriod->holidays()->pluck("date");
return $this->generateCalendar($period, $holidays);
}
protected function generateCalendar(CarbonPeriod $period, Collection $holidays): array
{
$calendar = [];
$vacations = $this->getVacationsForPeriod($period);
foreach ($period as $day) {
$vacationsForDay = $vacations[$day->toDateString()] ?? new Collection();
$calendar[] = [
"date" => $day->toDateString(),
"dayOfMonth" => $day->translatedFormat("j"),
"dayOfWeek" => $day->translatedFormat("D"),
"isToday" => $day->isToday(),
"isWeekend" => $day->isWeekend(),
"isHoliday" => $holidays->contains($day),
"vacations" => $vacationsForDay->pluck("user_id"),
];
}
return $calendar;
}
protected function getVacationsForPeriod(CarbonPeriod $period): Collection
{
return Vacation::query()
->whereBetween("date", [$period->start, $period->end])
->whereRelation("vacationRequest", fn(Builder $query) => $query->states(VacationRequestStatesRetriever::successStates()))
->get()
->groupBy(fn(Vacation $vacation) => $vacation->date->toDateString());
}
}