klasifikasi_kredit/app/Http/Controllers/AdminControllerBackup.txt

687 lines
23 KiB
Plaintext

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class AdminController extends Controller
{
public function dashboard()
{
// Ambil data total peminjaman berdasarkan jangka waktu
$data_peminjaman = DB::table('nasabah')
->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.');
}
}