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', DB::raw('jumlah_pinjaman / jangka_waktu AS setoran_per_bulan'), DB::raw('(jumlah_pinjaman * 0.1) AS bunga'), DB::raw('(jumlah_pinjaman / jangka_waktu) + (jumlah_pinjaman * 0.1) AS setoran_dan_bunga'), DB::raw('jumlah_pinjaman - jumlah_setoran AS sisa_pinjaman') ) ->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', 'golongan_pekerjaan' => 'required|string|max:255', 'status_pekerjaan' => 'required|string|max:255', 'jumlah_pinjaman' => 'required|numeric', 'alamat' => 'required|string', 'history_pinjaman' => '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, '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, '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) { $request->validate([ 'nama' => 'required|string|max:255', 'golongan_pekerjaan' => 'required|string|max:255', 'status_pekerjaan' => 'required|string|max:255', 'jumlah_pinjaman' => 'required|numeric', 'alamat' => 'required|string', 'history_pinjaman' => '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, '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, '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 $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(); // 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 ]; } // Normalisasi data agar lebih akurat $normalizedData = $this->normalize($data); // Lakukan clustering dengan 2 cluster $result = $this->kmeans($normalizedData, 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'; } return view('admin.datanilai', [ 'nasabah' => $nasabah, 'iterations' => $result['iterations'], 'initial_centroids' => $result['initial_centroids'] ]); } /** * Fungsi untuk normalisasi data menggunakan Min-Max Scaling. */ private function normalize($data) { $normalizedData = []; foreach ($data[0] as $key => $value) { $column = array_column($data, $key); $min = min($column); $max = max($column); foreach ($data as $i => $row) { $normalizedData[$i][$key] = ($max - $min == 0) ? 0 : ($row[$key] - $min) / ($max - $min); } } return $normalizedData; } /** * Fungsi K-Means Clustering */ private function kmeans($data, $k, $maxIterations = 3) { $n = count($data); $dim = count($data[0]); // Inisialisasi centroid menggunakan K-Means++ $centroids = [$data[array_rand($data)]]; while (count($centroids) < $k) { $distances = []; foreach ($data as $point) { $minDist = INF; foreach ($centroids as $centroid) { $dist = $this->euclideanDistance($point, $centroid); $minDist = min($minDist, $dist); } $distances[] = $minDist; } $index = $this->weightedRandomSelection($distances); $centroids[] = $data[$index]; } $clusters = []; $iterations = []; for ($iter = 0; $iter < $maxIterations; $iter++) { $clusters = array_fill(0, $n, 0); $distances = []; // Assign cluster ke data foreach ($data as $i => $point) { $minDist = INF; $bestCluster = 0; $distToCentroids = []; foreach ($centroids as $c => $centroid) { $dist = $this->euclideanDistance($point, $centroid); $distToCentroids[] = $dist; if ($dist < $minDist) { $minDist = $dist; $bestCluster = $c; } } $clusters[$i] = $bestCluster; $distances[$i] = $distToCentroids; } // Simpan iterasi untuk analisis $iterations[] = [ 'iteration' => $iter + 1, // Iterasi dimulai dari 1 'distances' => $distances, 'clusters' => $clusters, 'centroids' => $centroids ]; // Hitung centroid baru $newCentroids = array_fill(0, $k, array_fill(0, $dim, 0)); $counts = array_fill(0, $k, 0); foreach ($data as $i => $point) { $cluster = $clusters[$i]; foreach ($point as $dimIndex => $value) { $newCentroids[$cluster][$dimIndex] += $value; } $counts[$cluster]++; } foreach ($newCentroids as $c => &$centroid) { if ($counts[$c] > 0) { foreach ($centroid as $dimIndex => &$value) { $value /= $counts[$c]; } } else { $centroid = $data[array_rand($data)]; // Jika cluster kosong, pilih titik acak } } // Jika centroid tidak berubah, berhenti iterasi if ($newCentroids === $centroids) break; $centroids = $newCentroids; } return [ 'clusters' => $clusters, 'iterations' => $iterations, 'initial_centroids' => $centroids ]; } /** * Fungsi untuk menghitung jarak Euclidean */ private function euclideanDistance($point1, $point2) { $sum = 0; foreach ($point1 as $i => $value) { $sum += pow($value - $point2[$i], 2); } return sqrt($sum); } /** * Fungsi untuk memilih titik secara acak berdasarkan bobot (K-Means++) */ private function weightedRandomSelection($distances) { $total = array_sum($distances); $rand = mt_rand() / mt_getrandmax() * $total; $sum = 0; foreach ($distances as $index => $distance) { $sum += $distance; if ($sum >= $rand) { return $index; } } return array_key_last($distances); } // public function datanilai() // { // // 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(); // // 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 // $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'; // } // return view('admin.datanilai', [ // 'nasabah' => $nasabah, // 'iterations' => $result['iterations'], // 'initial_centroids' => $result['initial_centroids'] // ]); // } // private function kmeans($data, $k) // { // $maxIterations = 100; // // Inisialisasi centroid dengan K-Means++ // $centroids = $this->initializeCentroids($data, $k); // $clusters = array_fill(0, count($data), 0); // $iterations = []; // $initial_centroids = $centroids; // Simpan centroid awal untuk debugging // for ($iteration = 0; $iteration < $maxIterations; $iteration++) { // $newClusters = []; // $distances = []; // // 1. Hitung jarak setiap data ke centroid, lalu tentukan cluster terdekat // foreach ($data as $i => $point) { // $distances[$i] = []; // foreach ($centroids as $j => $centroid) { // $distances[$i][$j] = $this->euclideanDistance($point, $centroid); // } // $newClusters[$i] = array_search(min($distances[$i]), $distances[$i]); // } // // Jika cluster tidak berubah, berhenti iterasi // if ($newClusters === $clusters) { // break; // } // $clusters = $newClusters; // // 2. Update centroid berdasarkan rata-rata anggota cluster // $sums = array_fill(0, $k, array_fill(0, count($data[0]), 0)); // $counts = array_fill(0, $k, 0); // foreach ($data as $i => $point) { // $clusterIndex = $clusters[$i]; // foreach ($point as $dim => $value) { // $sums[$clusterIndex][$dim] += $value; // } // $counts[$clusterIndex]++; // } // foreach ($centroids as $j => &$centroid) { // if ($counts[$j] > 0) { // foreach ($centroid as $dim => &$value) { // $value = $sums[$j][$dim] / $counts[$j]; // } // } else { // // Jika cluster kosong, ambil titik acak baru // $centroid = $data[array_rand($data)]; // } // } // // Simpan data untuk setiap iterasi // $iterations[] = [ // 'iteration' => $iteration + 1, // 'distances' => $distances, // 'clusters' => $newClusters, // 'centroids' => $centroids // ]; // } // return [ // 'clusters' => $clusters, // 'iterations' => $iterations, // 'initial_centroids' => $initial_centroids // ]; // } // // Fungsi inisialisasi centroid dengan K-Means++ // private function initializeCentroids($data, $k) // { // $centroids = []; // $centroids[] = $data[array_rand($data)]; // Pilih satu titik pertama secara acak // for ($i = 1; $i < $k; $i++) { // $distances = []; // // Hitung jarak data ke centroid terdekat // foreach ($data as $point) { // $minDistance = INF; // foreach ($centroids as $centroid) { // $distance = $this->euclideanDistance($point, $centroid); // if ($distance < $minDistance) { // $minDistance = $distance; // } // } // $distances[] = $minDistance; // } // // Pilih titik dengan probabilitas berdasarkan jarak // $sumDistances = array_sum($distances); // $randomValue = mt_rand() / mt_getrandmax() * $sumDistances; // $cumulativeDistance = 0; // foreach ($data as $index => $point) { // $cumulativeDistance += $distances[$index]; // if ($cumulativeDistance >= $randomValue) { // $centroids[] = $point; // break; // } // } // } // return $centroids; // } // // Fungsi menghitung jarak Euclidean // private function euclideanDistance($point1, $point2) // { // $sum = 0; // foreach ($point1 as $i => $value) { // $sum += pow($value - $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', 'jumlah_pinjaman', 'history_pinjaman', 'tabungan_simpanan_wajib', DB::raw('jumlah_pinjaman / jangka_waktu AS setoran_per_bulan'), DB::raw('(jumlah_pinjaman * 0.1) AS bunga'), DB::raw('(jumlah_pinjaman / jangka_waktu) + (jumlah_pinjaman * 0.1) AS setoran_dan_bunga'), DB::raw('jumlah_pinjaman - jumlah_setoran AS sisa_pinjaman') ) ->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', 'jumlah_pinjaman', 'history_pinjaman', 'tabungan_simpanan_wajib', DB::raw('jumlah_pinjaman / jangka_waktu AS setoran_per_bulan'), DB::raw('(jumlah_pinjaman * 0.1) AS bunga'), DB::raw('(jumlah_pinjaman / jangka_waktu) + (jumlah_pinjaman * 0.1) AS setoran_dan_bunga'), DB::raw('jumlah_pinjaman - jumlah_setoran AS sisa_pinjaman') ) ->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, 3); // 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.'); } }