dishplanner/app/Livewire/Schedule/ScheduleGenerator.php

149 lines
4.5 KiB
PHP

<?php
namespace App\Livewire\Schedule;
use App\Models\User;
use Carbon\Carbon;
use DishPlanner\Schedule\Actions\ClearScheduleForMonthAction;
use DishPlanner\Schedule\Actions\GenerateScheduleForMonthAction;
use DishPlanner\Schedule\Actions\RegenerateScheduleForDateForUsersAction;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Log;
use Livewire\Component;
class ScheduleGenerator extends Component
{
private const YEARS_IN_PAST = 1;
private const YEARS_IN_FUTURE = 5;
public $selectedMonth;
public $selectedYear;
public $selectedUsers = [];
public $clearExisting = true;
public $showAdvancedOptions = false;
public $isGenerating = false;
public function mount(): void
{
$this->selectedMonth = now()->month;
$this->selectedYear = now()->year;
$this->selectedUsers = User::where('planner_id', auth()->id())
->pluck('id')
->toArray();
}
public function render(): Factory|View
{
$users = User::where('planner_id', auth()->id())
->orderBy('name')
->get();
$years = range(now()->year - self::YEARS_IN_PAST, now()->year + self::YEARS_IN_FUTURE);
return view('livewire.schedule.schedule-generator', [
'users' => $users,
'months' => $this->getMonthNames(),
'years' => $years,
]);
}
public function generate(): void
{
$this->validate([
'selectedUsers' => 'required|array|min:1',
'selectedMonth' => 'required|integer|min:1|max:12',
'selectedYear' => 'required|integer|min:'.(now()->year - self::YEARS_IN_PAST).'|max:'.(now()->year + self::YEARS_IN_FUTURE),
]);
$this->isGenerating = true;
try {
$action = new GenerateScheduleForMonthAction;
$action->execute(
auth()->user(),
$this->selectedMonth,
$this->selectedYear,
$this->selectedUsers,
$this->clearExisting
);
$this->isGenerating = false;
$this->dispatch('schedule-generated');
session()->flash('success', 'Schedule generated successfully for '.
$this->getSelectedMonthName().' '.$this->selectedYear);
} catch (\Exception $e) {
$this->isGenerating = false;
Log::error('Schedule generation failed', ['exception' => $e]);
session()->flash('error', 'Unable to generate schedule. Please try again.');
}
}
public function regenerateForDate($date): void
{
try {
$action = new RegenerateScheduleForDateForUsersAction;
$action->execute(
auth()->user(),
Carbon::parse($date),
$this->selectedUsers
);
$this->dispatch('schedule-generated');
session()->flash('success', 'Schedule regenerated for '.Carbon::parse($date)->format('M d, Y'));
} catch (\Exception $e) {
Log::error('Schedule regeneration failed', ['exception' => $e, 'date' => $date]);
session()->flash('error', 'Unable to regenerate schedule. Please try again.');
}
}
public function clearMonth(): void
{
try {
$action = new ClearScheduleForMonthAction;
$action->execute(
auth()->user(),
$this->selectedMonth,
$this->selectedYear,
$this->selectedUsers
);
$this->dispatch('schedule-generated');
session()->flash('success', 'Schedule cleared for '.
$this->getSelectedMonthName().' '.$this->selectedYear);
} catch (\Exception $e) {
Log::error('Clear month failed', ['exception' => $e]);
session()->flash('error', 'Unable to clear schedule. Please try again.');
}
}
public function toggleAdvancedOptions()
{
$this->showAdvancedOptions = ! $this->showAdvancedOptions;
}
private function getMonthNames(): array
{
return [
1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April',
5 => 'May', 6 => 'June', 7 => 'July', 8 => 'August',
9 => 'September', 10 => 'October', 11 => 'November', 12 => 'December',
];
}
private function getSelectedMonthName(): string
{
return $this->getMonthNames()[$this->selectedMonth];
}
}