orderBy('start_join', 'asc')->get(); return view('admin.pages.guru', compact('data', 'divisi_guru')); } public function generateNID($date) { $tahunMasuk = date('Y', strtotime($date)); $lastPegawai = Guru::whereYear('created_at', $tahunMasuk)->latest('id')->first(); if ($lastPegawai) { $lastNumber = (int) substr($lastPegawai->nid, -4); $newNumber = str_pad($lastNumber + 1, 4, '0', STR_PAD_LEFT); } else { $newNumber = '0001'; } return $tahunMasuk . $newNumber; } public function getDataGuru(){ $data = Guru::all(); return response()->json([ 'Semua' => $data->count(), 'Aktif' => $data->where('status', 'Aktif')->count(), 'Non-Aktif' => $data->where('status', 'Non Aktif')->count(), ] ); } public function dateFormat($date){ $tanggalparse = $date ? Carbon::parse($date)->locale('id')->translatedFormat('d F Y') : null; return $tanggalparse; } public function show($id, Request $request){ $divisi_guru = DivisiGuru::all(); $guru = Guru::findOrFail($id); // ====== Alltime Stats ====== // Sesi/Kelas dari JadwalKelas dan Logbook $kelasIdsJadwal = JadwalKelas::where('guru_id', $id)->pluck('kelas_id'); $kelasIdsLogbook = Logbooks::where('guru_id', $id)->pluck('kelas_id'); $kelasIds = $kelasIdsJadwal->concat($kelasIdsLogbook)->unique()->filter(); $kelasPic = Kelas::whereIn('id', $kelasIds)->get(); $sesiPic = Logbooks::whereIn('kelas_id', $kelasIds)->count(); $sesiCompleted = Logbooks::whereIn('kelas_id', $kelasIds)->where('status', 'completed')->count(); $jumlahKelas = $kelasPic->count(); // Sesi sebagai pengajar (via logbook.guru_id) $sesiPengajar = Logbooks::where('guru_id', $id)->count(); // ====== Rekap per Semester ====== $semestersPic = Kelas::whereIn('id', $kelasIds) ->whereNotNull('semester') ->whereNotNull('tahun_ajaran') ->select('semester', 'tahun_ajaran') ->distinct() ->get() ->toBase() ->map(fn($k) => ['semester' => $k->semester, 'tahun_ajaran' => $k->tahun_ajaran]); $semestersPengajar = Logbooks::where('guru_id', $id) ->join('kelas', 'logbook.kelas_id', '=', 'kelas.id') ->whereNotNull('kelas.semester') ->whereNotNull('kelas.tahun_ajaran') ->select('kelas.semester', 'kelas.tahun_ajaran') ->distinct() ->get() ->toBase() ->map(fn($k) => ['semester' => $k->semester, 'tahun_ajaran' => $k->tahun_ajaran]); // Gabungkan dan deduplikasi semester $allSemesters = $semestersPic->concat($semestersPengajar) ->filter(fn($s) => !empty($s['semester']) && !empty($s['tahun_ajaran'])) ->unique(fn($s) => $s['semester'] . '-' . $s['tahun_ajaran']) ->sortByDesc(fn($s) => $s['tahun_ajaran'] . '-' . $s['semester']) ->values(); // Hitung jumlah logbook + kelas per semester $rekap = $allSemesters->map(function ($sem) use ($id, $kelasIds) { $kelas = Kelas::whereIn('id', $kelasIds) ->where('semester', $sem['semester']) ->where('tahun_ajaran', $sem['tahun_ajaran']) ->get(); $semKelasIds = $kelas->pluck('id'); $logbookPengajar = Logbooks::where('guru_id', $id) ->whereIn('kelas_id', Kelas::where('semester', $sem['semester']) ->where('tahun_ajaran', $sem['tahun_ajaran']) ->pluck('id') )->count(); $logbookPic = Logbooks::whereIn('kelas_id', $semKelasIds)->count(); return [ 'semester' => $sem['semester'], 'tahun_ajaran' => $sem['tahun_ajaran'], 'jumlah_kelas' => $kelas->count(), 'sesi_pic' => $logbookPic, 'sesi_pengajar' => $logbookPengajar, 'total_sesi' => max($logbookPic, $logbookPengajar), ]; }); $data = $guru; // ====== Ketersediaan Mengajar ====== $sesiList = \App\Models\Sesi::orderBy('id', 'asc')->get(); $ketersediaan = $guru->ketersediaanMengajar->groupBy('hari'); $days = [1, 2, 3, 4, 5, 6]; $ketersediaanData = []; foreach ($days as $day) { $ketersediaanData[$day] = $ketersediaan->has($day) ? $ketersediaan->get($day)->pluck('sesi_id')->toArray() : []; } return view('admin.pages.guru_detail', compact( 'data', 'sesiPic', 'sesiPengajar', 'sesiCompleted', 'jumlahKelas', 'rekap', 'divisi_guru', 'sesiList', 'ketersediaanData' )); } public function raportDetail($id, $semester, $tahun_ajaran){ $guru = Guru::findOrFail($id); $kelasIdsJadwal = JadwalKelas::where('guru_id', $id)->pluck('kelas_id'); $kelasIdsLogbook = Logbooks::where('guru_id', $id)->pluck('kelas_id'); $allTeacherKelasIds = $kelasIdsJadwal->concat($kelasIdsLogbook)->unique()->filter(); // Kelas sebagai pengajar di semester ini $kelasPic = Kelas::whereIn('id', $allTeacherKelasIds) ->where('semester', $semester) ->where('tahun_ajaran', $tahun_ajaran) ->with('Programs') ->get(); $kelasIdsPic = $kelasPic->pluck('id'); // Logbook di semester ini $logbookPic = Logbooks::whereIn('kelas_id', $kelasIdsPic) ->with('Kelas.Programs', 'FotoLogbook', 'Guru') ->orderBy('tanggal', 'asc') ->get(); // Logbook sebagai pengajar di semester ini $logbookPengajar = Logbooks::where('guru_id', $id) ->whereIn('kelas_id', Kelas::where('semester', $semester) ->where('tahun_ajaran', $tahun_ajaran) ->pluck('id') ) ->with('Kelas.Programs', 'FotoLogbook', 'Guru') ->orderBy('tanggal', 'asc') ->get(); return view('admin.pages.guru_raport_detail', compact( 'guru', 'semester', 'tahun_ajaran', 'kelasPic', 'logbookPic', 'logbookPengajar' )); } public function getData($id){ $data = Guru::where('id', $id)->first(); return response()->json([ 'id' => $data->id, 'nama' => $data->nama ?? null, 'no_hp' => $data->no_hp ?? null, 'tempat_lahir' => $data->tempat_lahir ?? null, 'tanggal_lahir' => $data->tanggal_lahir ?? null, 'tanggal_lahir_parse' => $this->dateFormat($data->tanggal_lahir), 'jenis_kelamin' => $data->jenis_kelamin ?? null, 'email' => $data->email ?? null, 'alamat' => $data->alamat ?? null, 'pendidikan_terakhir' => $data->pendidikan_terakhir ?? null, 'instansi_pendidikan' => $data->instansi_pendidikan ?? null, 'jurusan' => $data->jurusan ?? null, 'divisi' => $data->divisi ?? null, 'jabatan' => $data->jabatan ?? null, 'level_maksimal' => $data->level_maksimal ?? null, 'start_join' => $data->start_join ?? null, 'start_join_parse' => $this->dateFormat($data->start_join), 'pekerja' => $data->pekerja ?? null, 'status' => $data->status ?? null, 'no_rekening' => $data->no_rekening ?? null, 'bank_keterangan' => $data->bank_keterangan ?? null, 'talent_mapping' => $data->talent_mapping ?? null, 'foto' => $data->foto ?? null, ]); } public function store(Request $request){ $validated = $request->validate( [ 'nama' => 'required|string|max:255', ], [ 'nama.required' => 'Nama anak wajib diisi', 'nama.max' => 'Nama anak terlalu panjang', ] ); if ($request->no_hp !== null || $request->no_hp !== ''){ $str = ltrim($request->no_hp, '0'); $validated['no_hp'] = $str; } if ($request->tempat_lahir !== null || $request->tempat_lahir !== ''){ $validated['tempat_lahir'] = $request['tempat_lahir']; } if ($request->tanggal_lahir !== null || $request->tanggal_lahir !== ''){ $validated['tanggal_lahir'] = $request['tanggal_lahir']; } if ($request->jenis_kelamin !== null || $request->jenis_kelamin !== ''){ $validated['jenis_kelamin'] = $request['jenis_kelamin']; }else{ $validated['jenis_kelamin'] = 'L'; } if ($request->email !== null || $request->email !== ''){ $validated['email'] = $request['email']; } if ($request->alamat !== null || $request->alamat !== ''){ $validated['alamat'] = $request['alamat']; } if ($request->pendidikan_terakhir !== null || $request->pendidikan_terakhir !== ''){ $validated['pendidikan_terakhir'] = $request['pendidikan_terakhir']; } if ($request->instansi_pendidikan !== null || $request->instansi_pendidikan !== ''){ $validated['instansi_pendidikan'] = $request['instansi_pendidikan']; } if ($request->jurusan !== null || $request->jurusan !== ''){ $validated['jurusan'] = $request['jurusan']; } if ($request->divisi !== null || $request->divisi !== ''){ $validated['divisi'] = $request['divisi']; } if ($request->jabatan !== null || $request->jabatan !== ''){ $validated['jabatan'] = $request['jabatan']; } if ($request->filled('level_maksimal') || $request->level_maksimal !== null){ $validated['level_maksimal'] = $request['level_maksimal'] ?: null; } if ($request->start_join !== null || $request->start_join !== ''){ $validated['start_join'] = $request['start_join']; $validated['nid'] = $this->generateNID($request->start_join); } if ($request->pekerja !== null || $request->pekerja !== ''){ $validated['pekerja'] = $request['pekerja']; } if ($request->status !== null || $request->status !== ''){ $validated['status'] = $request['status']; } if ($request->no_rekening !== null || $request->no_rekening !== ''){ $validated['no_rekening'] = $request['no_rekening']; } if ($request->bank_keterangan !== null || $request->bank_keterangan !== ''){ $validated['bank_keterangan'] = $request['bank_keterangan']; } if ($request->hasFile('talent_mapping')) { $file = $request->file('talent_mapping'); $hashedName = md5(time() . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension(); $file->storeAs('talent-mapping', $hashedName, 'public'); $validated['talent_mapping'] = 'talent-mapping/' . $hashedName; } if ($request->hasFile('foto')) { $file = $request->file('foto'); $hashedName = md5(time() . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension(); $file->storeAs('anak', $hashedName, 'public'); $validated['foto'] = 'anak/' . $hashedName; } try { $user = User::create([ 'name' => $validated['nama'], 'username' => strtolower($validated['nama']), 'email' => $request->email, 'no_hp_orangtua' => $request->no_hp, 'password' => bcrypt('12345'), 'role' => 'guru', ]); $validated['user_id'] = $user->id; Guru::create($validated); return redirect('/admin/guru')->with('success', 'Data Berhasil Disimpan'); }catch (QueryException $e){ return redirect('/admin/guru')->with('error', 'Data Gagal Disimpan'); } } public function update(Request $request, $id){ $data = Guru::where('id', $id)->first(); $validated = $request->validate( [ 'nama' => 'required|string|max:255', ], [ 'nama.required' => 'Nama anak wajib diisi', 'nama.max' => 'Nama anak terlalu panjang', ] ); if ($request->no_hp !== null || $request->no_hp !== ''){ $str = ltrim($request->no_hp, '0'); $validated['no_hp'] = $str; } if ($request->tempat_lahir !== null || $request->tempat_lahir !== ''){ $validated['tempat_lahir'] = $request['tempat_lahir']; } if ($request->tanggal_lahir !== null || $request->tanggal_lahir !== ''){ $validated['tanggal_lahir'] = $request['tanggal_lahir']; } if ($request->jenis_kelamin !== null || $request->jenis_kelamin !== ''){ $validated['jenis_kelamin'] = $request['jenis_kelamin']; }else{ $validated['jenis_kelamin'] = 'L'; } if ($request->email !== null || $request->email !== ''){ $validated['email'] = $request['email']; } if ($request->alamat !== null || $request->alamat !== ''){ $validated['alamat'] = $request['alamat']; } if ($request->pendidikan_terakhir !== null || $request->pendidikan_terakhir !== ''){ $validated['pendidikan_terakhir'] = $request['pendidikan_terakhir']; } if ($request->instansi_pendidikan !== null || $request->instansi_pendidikan !== ''){ $validated['instansi_pendidikan'] = $request['instansi_pendidikan']; } if ($request->jurusan !== null || $request->jurusan !== ''){ $validated['jurusan'] = $request['jurusan']; } if ($request->divisi !== null || $request->divisi !== ''){ $validated['divisi'] = $request['divisi']; } if ($request->jabatan !== null || $request->jabatan !== ''){ $validated['jabatan'] = $request['jabatan']; } if ($request->has('level_maksimal')){ $validated['level_maksimal'] = $request['level_maksimal'] ?: null; } if ($request->start_join !== null || $request->start_join !== ''){ $validated['start_join'] = $request['start_join']; // $validated['nid'] = $this->generateNID($request->start_join); } if ($request->pekerja !== null || $request->pekerja !== ''){ $validated['pekerja'] = $request['pekerja']; } if ($request->status !== null || $request->status !== ''){ $validated['status'] = $request['status']; } if ($request->no_rekening !== null || $request->no_rekening !== ''){ $validated['no_rekening'] = $request['no_rekening']; } if ($request->bank_keterangan !== null || $request->bank_keterangan !== ''){ $validated['bank_keterangan'] = $request['bank_keterangan']; } if ($request->hasFile('talent_mapping')) { if ($data->talent_mapping) { $imagePath = storage_path('app/public/' . $data->talent_mapping); if (file_exists($imagePath)) { unlink($imagePath); } } $file = $request->file('talent_mapping'); $hashedName = md5(time() . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension(); $file->storeAs('talent-mapping', $hashedName, 'public'); $validated['talent_mapping'] = 'talent-mapping/' . $hashedName; } if ($request->hasFile('foto')) { if ($data->foto) { $imagePath = storage_path('app/public/' . $data->foto); if (file_exists($imagePath)) { unlink($imagePath); } } $file = $request->file('foto'); $hashedName = md5(time() . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension(); $file->storeAs('guru', $hashedName, 'public'); $validated['foto'] = 'guru/' . $hashedName; } try { $data->update($validated); $firstWord = explode(' ', trim($data->nama))[0]; $user = User::where('id', $data->user_id)->first(); if($user === null){ $user = User::create([ 'name' => $data->nama, 'username' => strtolower($firstWord), 'email' => $data->email, 'no_hp_orangtua' => $data->no_hp, 'password' => bcrypt('12345'), 'role' => 'guru', ]); $data->update(['user_id' => $user->id]); }else{ $user->update([ 'name' => $data->nama, 'username' => strtolower($firstWord), 'no_hp_orangtua' => $data->no_hp, 'email' => $data->email, 'role' => 'guru', ]); } return redirect('/admin/guru')->with('success', 'Data Berhasil Diubah'); }catch (QueryException $e){ // dd($e->getMessage()); return redirect('/admin/guru')->with('error', 'Data Gagal Disimpan'); } } public function destroy(string $id) { $data = Guru::findOrFail($id); if ($data->foto) { $imagePath = storage_path('app/public/' . $data->foto); if (file_exists($imagePath)) { unlink($imagePath); } } $user = User::where('id', $data->user_id)->first(); $data->delete(); $user->delete(); return redirect('/admin/guru')->with('success', 'Data Berhasil Dihapus'); } public function updateKetersediaan(Request $request, $id) { $guru = Guru::findOrFail($id); $request->validate([ 'ketersediaan' => 'nullable|array', 'ketersediaan.*' => 'nullable|array', ]); $data = $request->input('ketersediaan', []); foreach ([1, 2, 3, 4, 5, 6] as $day) { $daySesiIds = $data[$day] ?? []; \App\Models\KetersediaanMengajar::where('guru_id', $id) ->where('hari', $day) ->delete(); foreach ($daySesiIds as $sesiId) { \App\Models\KetersediaanMengajar::create([ 'guru_id' => $id, 'hari' => $day, 'sesi_id' => $sesiId, ]); } } return redirect()->route('admin.guru.detail', ['id' => $id, 'tab' => 'ketersediaan']) ->with('success', 'Ketersediaan mengajar guru berhasil diperbarui'); } }