klasifikasi_kredit/app/Http/Controllers/AdminController.php

463 lines
15 KiB
PHP

<?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',
'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.');
}
}