locale('id')->translatedFormat('d F Y') : null; return $tanggalparse; } public function getDataProfile(){ $guru_id = auth()->user()->Guru->id; $data = Guru::where('id', $guru_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, '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 saveDataProfile(Request $request) { $guru = auth()->user()->Guru; $validated = $request->validate([ 'nama' => 'required|string|max:255', ], [ 'nama.required' => 'Nama anak wajib diisi', 'nama.max' => 'Nama anak terlalu panjang', ]); // Ambil semua field opsional $fields = [ 'no_hp', 'tempat_lahir', 'tanggal_lahir', 'jenis_kelamin', 'email', 'alamat', 'pendidikan_terakhir', 'instansi_pendidikan', 'jurusan', 'divisi', 'jabatan', 'start_join', 'pekerja', 'status', 'no_rekening', 'bank_keterangan' ]; foreach ($fields as $field) { if ($request->filled($field)) { // khusus no_hp -> hilangkan 0 di depan $validated[$field] = $field === 'no_hp' ? ltrim($request->no_hp, '0') : $request->$field; } } // default jenis kelamin $validated['jenis_kelamin'] = $validated['jenis_kelamin'] ?? 'L'; // Upload file if ($request->hasFile('talent_mapping')) { if ($guru->talent_mapping && file_exists(storage_path('app/public/' . $guru->talent_mapping))) { unlink(storage_path('app/public/' . $guru->talent_mapping)); } $validated['talent_mapping'] = $request->file('talent_mapping') ->storeAs('talent-mapping', md5(time() . $request->file('talent_mapping')->getClientOriginalName()) . '.' . $request->file('talent_mapping')->getClientOriginalExtension(), 'public'); } if ($request->hasFile('foto')) { if ($guru->foto && file_exists(storage_path('app/public/' . $guru->foto))) { unlink(storage_path('app/public/' . $guru->foto)); } $validated['foto'] = $request->file('foto') ->storeAs('guru', md5(time() . $request->file('foto')->getClientOriginalName()) . '.' . $request->file('foto')->getClientOriginalExtension(), 'public'); } try { $guru->update($validated); $firstWord = strtolower(strtok($guru->nama, ' ')); $user = User::find($guru->user_id); if (!$user) { $user = User::create([ 'name' => $guru->nama, 'username' => $firstWord, 'email' => $guru->email, 'no_hp_orangtua' => $guru->no_hp, 'password' => bcrypt('12345'), 'role' => 'guru', ]); $guru->update(['user_id' => $user->id]); } else { $user->update([ 'name' => $guru->nama, 'username' => $firstWord, 'email' => $guru->email, 'no_hp_orangtua' => $guru->no_hp, 'role' => 'guru', ]); } return response()->json([ 'status' => 'success', 'message' => 'Data diri berhasil diperbarui', ]); } catch (QueryException $e) { return response()->json([ 'status' => 'fail', 'message' => $e->getMessage(), ]); } } public function updatePassword(Request $request){ $request->validate( [ 'old_password' => ['required'], 'new_password' => ['required', 'min:6', 'confirmed'], ], [ 'old_password.required' => 'Password lama harus diisi', 'new_password.required' => 'Password baru harus diisi', 'new_password.min' => 'Password baru minimal 6 karakter', 'new_password.confirmed' => 'Konfirmasi password baru harus sama' ] ); $id = auth()->user()->id; $user = User::findOrFail($id); // cek password lama if (!Hash::check($request->old_password, $user->password)) { throw ValidationException::withMessages([ 'old_password' => ['Password lama tidak sesuai.'], ]); } // update password baru $user->password = Hash::make($request->new_password); $user->save(); return response()->json([ 'status' => 'success', 'message' => 'Password berhasil diperbarui', 'data' => null ]); } public function ketersediaan() { $guru = auth()->user()->Guru; if (!$guru) { return redirect()->back()->with('error', 'Data guru tidak ditemukan'); } $isLocked = \App\Models\KetersediaanSetting::getRecord()->lock_edit; $sesiList = \App\Models\Sesi::orderBy('id', 'asc')->get(); // Fetch ketersediaan $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('guru.pages.ketersediaan', compact('guru', 'sesiList', 'ketersediaanData', 'isLocked')); } public function updateKetersediaan(Request $request) { $isLocked = \App\Models\KetersediaanSetting::getRecord()->lock_edit; if ($isLocked) { return redirect()->back()->with('error', 'Pengubahan ketersediaan mengajar dikunci oleh Admin.'); } $guru = auth()->user()->Guru; if (!$guru) { return redirect()->back()->with('error', 'Data guru tidak ditemukan'); } $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', $guru->id) ->where('hari', $day) ->delete(); foreach ($daySesiIds as $sesiId) { \App\Models\KetersediaanMengajar::create([ 'guru_id' => $guru->id, 'hari' => $day, 'sesi_id' => $sesiId, ]); } } return redirect()->route('guru.ketersediaan') ->with('success', 'Ketersediaan mengajar berhasil diperbarui'); } }