label('Generate Sesi') ->visible(fn () => auth()->user()->can('Create:ClassSession')) ->color(Color::Orange) ->requiresConfirmation() ->modalHeading('Generate Sesi Pembelajaran') ->modalDescription('Sistem akan men-generate atau memperbarui sesi secara otomatis berdasarkan jadwal mata kuliah ini.') ->schema(function ($livewire) { $lastSession = $livewire->course->classSessions()->latest('session_number')->first(); $lastNumber = $lastSession?->session_number ?? 0; $nextNumber = $lastNumber + 1; $lastDate = $lastSession?->date ? Carbon::parse($lastSession->date) : now(); return [ TextInput::make('total_sessions') ->label('Jumlah Sesi Baru') ->numeric() ->default(function () use ($lastNumber) { return $lastNumber === 0 ? 16 : 1; }) ->minValue(1) ->maxValue(32) ->required() ->placeholder('Contoh: 14') ->helperText($lastNumber > 0 ? "Sesi terakhir adalah No. {$lastNumber}. Sesi baru akan dimulai dari No. {$nextNumber}." : 'Belum ada sesi. Sesi akan dibuat mulai dari No. 1.'), DatePicker::make('start_date') ->label($lastNumber > 0 ? "Tanggal Sesi Ke-{$nextNumber}" : 'Tanggal Pertemuan Ke-1') ->default(function () use ($lastNumber, $lastDate) { // Default to next week if sessions already exist return $lastNumber > 0 ? $lastDate->addWeek()->toDateString() : now()->toDateString(); }) ->required() ->native(false) ->displayFormat('l, d F Y'), ]; }) ->action(function (array $data, $livewire) { $course = $livewire->course; $schedule = $course->courseSchedules()->first(); $totalNewSessions = (int) ($data['total_sessions'] ?? 1); if (! $schedule) { SystemNotification::danger( 'Oops! Gagal Generate 🚫', 'Jadwal belum ditentukan untuk mata kuliah ini, jadi sistem bingung mau buat sesi kapan. 😟', 'Eksekusi Dibatalkan', 'Penjadwalan resmi belum dikonfigurasi untuk mata kuliah ini. Proses pembuatan sesi otomatis tidak dapat dilanjutkan.' )->send(); return; } $lastSession = $course->classSessions()->latest('session_number')->first(); $lastNumber = $lastSession?->session_number ?? 0; $nextNumber = $lastNumber + 1; $maxNumber = $lastNumber + $totalNewSessions; $startDate = Carbon::parse($data['start_date']); for ($i = $nextNumber; $i <= $maxNumber; $i++) { ClassSession::updateOrCreate( [ 'course_id' => $course->id, 'session_number' => $i, ], [ 'date' => $startDate->copy()->addWeeks($i - $nextNumber)->toDateString(), 'start_time' => $schedule->start_time, 'end_time' => $schedule->end_time, ] ); } SystemNotification::success( 'Hore! Sesi Siap ✨🚀', $totalNewSessions.' Sesi baru (No. '.$nextNumber.' sampai '.$maxNumber.') berhasil digenerate. 🎉', 'Verifikasi Sesi Berhasil', 'Seluruh '.$totalNewSessions.' sesi pembelajaran tambahan telah berhasil dikonfigurasi secara otomatis.' )->send(); }); } }