selectRaw('jangka_waktu, SUM(jumlah_pinjaman) as total_pinjaman') ->groupBy('jangka_waktu') ->orderBy('jangka_waktu') ->get(); // Format data untuk Chart.js $jangka_waktu = $data_peminjaman->pluck('jangka_waktu'); $total_pinjaman = $data_peminjaman->pluck('total_pinjaman'); // Ambil total nasabah $total_nasabah = DB::table('nasabah')->count(); // Ambil data dari tabel nasabah $nasabah = DB::table('nasabah') ->select( 'id_nasabah', 'nama', 'jumlah_pinjaman', 'jangka_waktu', 'jumlah_setoran', 'history_pinjaman', 'setoran_per_bulan', 'bunga', 'setoran_dan_bunga', 'sisa_pinjaman' ) ->orderBy('id_nasabah', 'asc') ->get(); // Konversi data ke array untuk clustering $data = []; foreach ($nasabah as $n) { $data[] = [ $n->history_pinjaman, $n->setoran_per_bulan, $n->bunga, $n->setoran_dan_bunga, $n->sisa_pinjaman ]; } // Lakukan perhitungan K-Means Clustering (3 cluster) $result = $this->kmeans($data, 2); // Hitung jumlah nasabah layak dan tidak layak berdasarkan cluster $layak = 0; $tidak_layak = 0; foreach ($result['clusters'] as $cluster) { if ($cluster == 1) { $layak++; } else { $tidak_layak++; } } return view('admin.dashboard', compact('jangka_waktu', 'total_pinjaman', 'total_nasabah', 'layak', 'tidak_layak')); } public function nasabahdaftar() { $nasabah = DB::table('nasabah')->get(); return view('admin.nasabahdaftar', compact('nasabah')); } public function nasabahtambah() { return view('admin.nasabahtambah'); } public function nasabahsimpan(Request $request) { $request->validate([ 'nama' => 'required|string|max:255|unique:nasabah,nama', 'golongan_pekerjaan' => 'required|string|max:255', 'status_pekerjaan' => 'required|string|max:255', 'jumlah_pinjaman' => 'required|numeric', 'alamat' => 'required|string', // 'history_pinjaman' => 'required|string', 'status' => 'required|string', 'tabungan_simpanan_wajib' => 'required|numeric', 'slip_gaji' => 'nullable|file|mimes:pdf,jpg,png|max:2048', // Maks 2MB ]); $filePath = null; if ($request->hasFile('slip_gaji')) { $file = $request->file('slip_gaji'); $fileName = time() . '_' . $file->getClientOriginalName(); $filePath = 'uploads/' . $fileName; $file->move(public_path('uploads'), $fileName); } DB::table('nasabah')->insert([ 'nama' => $request->nama, 'golongan_pekerjaan' => $request->golongan_pekerjaan, 'status_pekerjaan' => $request->status_pekerjaan, 'jumlah_pinjaman' => $request->jumlah_pinjaman, 'alamat' => $request->alamat, 'history_pinjaman' => $request->history_pinjaman ?? 0, 'tabungan_simpanan_wajib' => $request->tabungan_simpanan_wajib, 'slip_gaji' => $filePath, 'setoran_per_bulan' => $request->setoran_per_bulan, 'bunga' => $request->bunga, 'setoran_dan_bunga' => $request->setoran_dan_bunga, 'sisa_pinjaman' => $request->sisa_pinjaman, 'jumlah_setoran' => $request->jumlah_setoran, 'jangka_waktu' => $request->jangka_waktu, 'status' => $request->status, 'created_at' => date('Y-m-d H:i:s'), ]); return redirect()->route('nasabah.daftar')->with('success', 'Data nasabah berhasil disimpan.'); } public function nasabahedit($id) { $nasabah = DB::table('nasabah')->where('id_nasabah', $id)->first(); return view('admin.nasabahedit', compact('nasabah')); } public function nasabahupdate(Request $request, $id) { $nasabah = DB::table('nasabah')->where('id_nasabah', $id)->first(); $request->validate([ 'nama' => 'required|string|max:255|unique:nasabah,nama,' . $id . ',id_nasabah', 'golongan_pekerjaan' => 'required|string|max:255', 'status_pekerjaan' => 'required|string|max:255', 'jumlah_pinjaman' => 'required|numeric', 'alamat' => 'required|string', 'tabungan_simpanan_wajib' => 'required|numeric', 'slip_gaji' => 'nullable|file|mimes:pdf,jpg,png|max:2048', ]); $filePath = $request->slip_gaji_lama; if ($request->hasFile('slip_gaji')) { $file = $request->file('slip_gaji'); $fileName = time() . '_' . $file->getClientOriginalName(); $filePath = 'uploads/' . $fileName; $file->move(public_path('uploads'), $fileName); } DB::table('nasabah')->where('id_nasabah', $id)->update([ 'nama' => $request->nama, 'golongan_pekerjaan' => $request->golongan_pekerjaan, 'status_pekerjaan' => $request->status_pekerjaan, 'jumlah_pinjaman' => $request->jumlah_pinjaman, 'alamat' => $request->alamat, 'history_pinjaman' => $request->history_pinjaman ?? 0, 'tabungan_simpanan_wajib' => $request->tabungan_simpanan_wajib, 'slip_gaji' => $filePath, 'setoran_per_bulan' => $request->setoran_per_bulan, 'bunga' => $request->bunga, 'setoran_dan_bunga' => $request->setoran_dan_bunga, 'sisa_pinjaman' => $request->sisa_pinjaman, 'jumlah_setoran' => $request->jumlah_setoran, 'status' => $request->status, 'jangka_waktu' => $request->jangka_waktu, 'updated_at' => date('Y-m-d H:i:s'), ]); return redirect()->route('nasabah.daftar')->with('success', 'Data nasabah berhasil diperbarui.'); } public function nasabahhapus($id) { DB::table('nasabah')->where('id_nasabah', $id)->delete(); return redirect()->route('nasabah.daftar')->with('success', 'Data nasabah berhasil dihapus.'); } public function datanilai() { // Ambil data dari tabel nasabah menggunakan DB::table() $nasabah = DB::table('nasabah') ->select( 'id_nasabah', 'nama', 'jumlah_pinjaman', 'jangka_waktu', 'jumlah_setoran', 'history_pinjaman', 'setoran_per_bulan', 'bunga', 'setoran_dan_bunga', 'sisa_pinjaman' ) ->where('status', 'Nasabah Lama') ->orderBy('id_nasabah', 'asc') ->get(); // Jika tidak ada data, return tanpa clustering if ($nasabah->isEmpty()) { return view('admin.datanilai', [ 'nasabah' => $nasabah, 'iterations' => [], 'initial_centroids' => [] ]); } // Konversi data ke array untuk K-Means $data = []; foreach ($nasabah as $n) { $data[] = [ $n->history_pinjaman, $n->setoran_per_bulan, $n->bunga, $n->setoran_dan_bunga, $n->sisa_pinjaman ]; } // Lakukan clustering dengan jumlah cluster = 2 $result = $this->kmeans($data, 2); // Gabungkan hasil cluster ke data nasabah foreach ($nasabah as $index => $n) { $n->cluster = $result['clusters'][$index]; $n->kelayakan = ($n->cluster == 1) ? 'Layak' : 'Tidak Layak'; // Modify based on your classification logic } return view('admin.datanilai', [ 'nasabah' => $nasabah, 'iterations' => $result['iterations'], 'initial_centroids' => $result['initial_centroids'] ]); } private function kmeans($data, $k) { $numData = count($data); if ($numData == 0) { return ['clusters' => [], 'iterations' => [], 'initial_centroids' => []]; } // Pilih centroid awal secara acak // $initial_centroids = []; // $randomKeys = array_rand($data, $k); // foreach ($randomKeys as $key) { // $initial_centroids[] = $data[$key]; // } $initial_centroids = [ $data[0], // gunakan baris data pertama $data[1] // gunakan baris data kedua ]; $clusters = []; $iterations = []; $changed = true; $iterationCount = 1; while ($changed) { $changed = false; $new_clusters = array_fill(0, $k, []); $distances = []; // Assign setiap data ke centroid terdekat foreach ($data as $index => $point) { $distances[$index] = []; foreach ($initial_centroids as $centroid) { $distances[$index][] = $this->euclideanDistance($point, $centroid); } $new_cluster = array_search(min($distances[$index]), $distances[$index]); if (!isset($clusters[$index]) || $clusters[$index] !== $new_cluster) { $changed = true; } $clusters[$index] = $new_cluster; $new_clusters[$new_cluster][] = $point; } // Simpan iterasi untuk tampilan $iterations[] = [ 'iteration' => $iterationCount, 'clusters' => $clusters, 'distances' => $distances, 'centroids' => $initial_centroids ]; $iterationCount++; // Update centroid berdasarkan rata-rata tiap cluster foreach ($new_clusters as $i => $clusterData) { if (!empty($clusterData)) { $centroid = []; for ($j = 0; $j < count($clusterData[0]); $j++) { $sum = array_sum(array_column($clusterData, $j)); $centroid[] = $sum / count($clusterData); } $initial_centroids[$i] = $centroid; } } } return ['clusters' => $clusters, 'iterations' => $iterations, 'initial_centroids' => $initial_centroids]; } private function euclideanDistance($point1, $point2) { $sum = 0; for ($i = 0; $i < count($point1); $i++) { $sum += pow($point1[$i] - $point2[$i], 2); } return sqrt($sum); } public function laporan() { // Ambil data dari tabel nasabah $nasabah = DB::table('nasabah') ->select( 'id_nasabah', 'nama', 'golongan_pekerjaan', 'status_pekerjaan', 'tabungan_simpanan_wajib', 'jumlah_pinjaman', 'jangka_waktu', 'jumlah_setoran', 'history_pinjaman', 'setoran_per_bulan', 'bunga', 'setoran_dan_bunga', 'sisa_pinjaman' ) ->orderBy('id_nasabah', 'asc') ->get(); // Konversi data ke array untuk clustering $data = []; foreach ($nasabah as $n) { $data[] = [ $n->history_pinjaman, $n->setoran_per_bulan, $n->bunga, $n->setoran_dan_bunga, $n->sisa_pinjaman ]; } // Lakukan perhitungan K-Means Clustering (3 cluster) $result = $this->kmeans($data, 2); // Gabungkan hasil cluster ke data nasabah foreach ($nasabah as $index => $n) { $n->cluster = $result['clusters'][$index]; $n->kelayakan = ($n->cluster == 1) ? 'Layak' : 'Tidak Layak'; // Modify based on your classification logic } // Return ke view dengan data dan cluster return view('admin.laporan', compact('nasabah')); } public function laporancetak() { // Ambil data dari tabel nasabah $nasabah = DB::table('nasabah') ->select( 'id_nasabah', 'nama', 'golongan_pekerjaan', 'status_pekerjaan', 'tabungan_simpanan_wajib', 'jumlah_pinjaman', 'jangka_waktu', 'jumlah_setoran', 'history_pinjaman', 'setoran_per_bulan', 'bunga', 'setoran_dan_bunga', 'sisa_pinjaman' ) ->orderBy('id_nasabah', 'asc') ->get(); // Konversi data ke array untuk clustering $data = []; foreach ($nasabah as $n) { $data[] = [ $n->history_pinjaman, $n->setoran_per_bulan, $n->bunga, $n->setoran_dan_bunga, $n->sisa_pinjaman ]; } // Lakukan perhitungan K-Means Clustering (3 cluster) $result = $this->kmeans($data, 2); // Gabungkan hasil cluster ke data nasabah foreach ($nasabah as $index => $n) { $n->cluster = $result['clusters'][$index]; $n->kelayakan = ($n->cluster == 1) ? 'Layak' : 'Tidak Layak'; // Modify based on your classification logic } // Return ke view dengan data untuk cetak return view('admin.laporancetak', compact('nasabah')); } public function pengaturan() { return view('admin.pengaturan', ['user' => Auth::user()]); } public function pengaturansimpan(Request $request) { $user = Auth::user(); // Validasi input $request->validate([ 'username' => 'required|string|max:255', 'email' => 'required|email|unique:users,email,' . $user->id, 'password' => 'nullable|min:6|confirmed', 'foto' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', ]); // Update foto jika ada upload if ($request->hasFile('foto')) { // Simpan foto baru $fotoName = time() . '.' . $request->foto->extension(); $request->foto->move(public_path('foto'), $fotoName); $user->foto = $fotoName; } // Update data user $user->username = $request->username; $user->email = $request->email; // Update password jika diisi if ($request->password) { $user->password = Hash::make($request->password); } $user->save(); return redirect()->to('admin/pengaturan')->with('success', 'Profil berhasil diperbarui.'); } }