141 lines
4.5 KiB
PHP
141 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\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(): \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\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];
|
|
}
|
|
}
|