MIF_E31211900/app/Http/Controllers/PelanggaranController.php

306 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\JenisPelanggaran;
use App\Models\KriteriaPelanggaran;
use App\Models\ListPelanggaran;
use App\Models\Pelanggaran;
use App\Models\Sanksi;
use App\Models\Siswa;
use App\Models\Tindakan;
use Illuminate\Http\Request;
class PelanggaranController extends Controller
{
public function index()
{
$data = Pelanggaran::with('listPelanggaran', 'siswa', 'tindakan', 'sanksi')
->orderBy('updated_at', 'desc') // Menambahkan pengurutan berdasarkan updated_at secara descending
->get();
return view('pages.dashboard.pelanggaran.index', [
'title' => 'Pelanggaran Siswa',
'data' => $data,
]);
}
function parseRange($range)
{
$parts = explode('-', $range);
if (count($parts) === 2) {
return [
'min' => (float) trim($parts[0]),
'max' => (float) trim($parts[1]),
];
}
return null;
}
public function create(Request $request)
{
if ($request->isMethod('POST')) {
$request->validate([
'id_siswa' => 'required|string|max:255',
'id_kriteria' => 'required|array',
'id_kriteria.*' => 'exists:kriteria_pelanggaran,id',
'id_jenis' => 'required|array',
'id_jenis.*' => 'exists:jenis_pelanggaran,id',
]);
try {
$idSiswa = $request->input('id_siswa');
$idKriteria = $request->input('id_kriteria');
$idJenis = $request->input('id_jenis');
$normalisasi = [];
foreach ($idKriteria as $kriteriaId) {
$kriteria = KriteriaPelanggaran::findOrFail($kriteriaId);
$normalisasi[$kriteria->kode][] = $kriteria->bobot / 100;
}
$utility = [];
foreach ($idJenis as $jenisId) {
$jenis = JenisPelanggaran::findOrFail($jenisId);
$utility[$jenis->kode_kriteria][] = intval($jenis->point);
}
$result = [];
foreach ($normalisasi as $kode => $values1) {
if (isset($utility[$kode])) {
$values2 = $utility[$kode];
if (count($values1) === count($values2)) {
$result[$kode] = [];
for ($i = 0; $i < count($values1); $i++) {
$result[$kode][] = $values1[$i] * $values2[$i];
}
} else {
$result[$kode] = null;
}
}
}
$summedResults = [];
foreach ($result as $kode => $values) {
if (is_array($values)) {
$summedResults[$kode] = array_sum($values);
} else {
$summedResults[$kode] = null;
}
}
$overallScore = array_sum($summedResults);
$tindakan = Tindakan::all()->first(function ($tindakan) use ($overallScore) {
$range = $this->parseRange($tindakan->rentang_point);
if (!$range) {
return redirect()->route('pelanggaran')->with('error', 'Rentang point does not exist for Tindakan');
}
return $overallScore >= $range['min'] && $overallScore <= $range['max'];
});
$sanksi = Sanksi::all()->first(function ($sanksi) use ($overallScore) {
$range = $this->parseRange($sanksi->rentang_point);
if (!$range) {
return redirect()->route('pelanggaran')->with('error', 'Rentang point does not exist for Sanksi');
}
return $overallScore >= $range['min'] && $overallScore <= $range['max'];
});
$tingkat = '';
if ($overallScore >= 1 && $overallScore <= 2) {
$tingkat = 'Pelanggaran Ringan';
} elseif ($overallScore >= 2.1 && $overallScore <= 8) {
$tingkat = 'Pelanggaran Sedang';
} elseif ($overallScore >= 8.1 && $overallScore <= 20) {
$tingkat = 'Tindak Pidana Ringan (TIPIRING)';
} elseif ($overallScore >= 20.1 && $overallScore <= 100) {
$tingkat = 'Tindak Pidana Berat (TIPIRAT)';
} else {
return redirect()->route('pelanggaran')->with('error', 'Skor melebihi 100, silahkan kurangi kriteria');
}
$pelanggaran = Pelanggaran::create([
'id_siswa' => $idSiswa,
'id_tindakan' => $tindakan->id,
'id_sanksi' => $sanksi->id,
'tingkat' => $tingkat,
]);
if (!$pelanggaran) {
return redirect()->route('pelanggaran')->with('error', 'gagal membuat pelanggaran');
}
foreach ($idKriteria as $index => $idKriteriaItem) {
ListPelanggaran::create([
'pelanggaran_id' => $pelanggaran->id,
'id_kriteria' => $idKriteriaItem,
'id_jenis' => $idJenis[$index],
]);
}
return redirect()->route('pelanggaran')->with('success', 'Berhasil menambah pelanggaran');
} catch (\Exception $e) {
return redirect()->back()->withInput()->withErrors('error', 'Gagal menambah pelanggaran');
}
}
return view('pages.dashboard.pelanggaran.create', [
'title' => 'Tambah Pelanggaran',
'siswa' => Siswa::all(),
'kriteria_pelanggaran' => KriteriaPelanggaran::with('jenis')->get(),
]);
}
public function update(Request $request, $id)
{
if ($request->isMethod('POST')) {
$request->validate([
'id_siswa' => 'required|string|max:255',
'id_kriteria' => 'required|array',
'id_kriteria.*' => 'exists:kriteria_pelanggaran,id',
'id_jenis' => 'required|array',
'id_jenis.*' => 'exists:jenis_pelanggaran,id',
]);
try {
$idSiswa = $request->input('id_siswa');
$idKriteria = $request->input('id_kriteria');
$idJenis = $request->input('id_jenis');
$normalisasi = [];
foreach ($idKriteria as $kriteriaId) {
$kriteria = KriteriaPelanggaran::findOrFail($kriteriaId);
$normalisasi[$kriteria->kode][] = $kriteria->bobot / 100;
}
$utility = [];
foreach ($idJenis as $jenisId) {
$jenis = JenisPelanggaran::findOrFail($jenisId);
$utility[$jenis->kode_kriteria][] = intval($jenis->point);
}
$result = [];
foreach ($normalisasi as $kode => $values1) {
if (isset($utility[$kode])) {
$values2 = $utility[$kode];
if (count($values1) === count($values2)) {
$result[$kode] = [];
for ($i = 0; $i < count($values1); $i++) {
$result[$kode][] = $values1[$i] * $values2[$i];
}
} else {
$result[$kode] = null;
}
}
}
$summedResults = [];
foreach ($result as $kode => $values) {
if (is_array($values)) {
$summedResults[$kode] = array_sum($values);
} else {
$summedResults[$kode] = null;
}
}
$overallScore = array_sum($summedResults);
$tindakan = Tindakan::all()->first(function ($tindakan) use ($overallScore) {
$range = $this->parseRange($tindakan->rentang_point);
if (!$range) {
return redirect()->route('pelanggaran')->with('error', 'Rentang point does not exist for Tindakan');
}
return $overallScore >= $range['min'] && $overallScore <= $range['max'];
});
$sanksi = Sanksi::all()->first(function ($sanksi) use ($overallScore) {
$range = $this->parseRange($sanksi->rentang_point);
if (!$range) {
return redirect()->route('pelanggaran')->with('error', 'Rentang point does not exist for Sanksi');
}
return $overallScore >= $range['min'] && $overallScore <= $range['max'];
});
$tingkat = '';
if ($overallScore >= 1 && $overallScore <= 2) {
$tingkat = 'Pelanggaran Ringan';
} elseif ($overallScore >= 2.1 && $overallScore <= 8) {
$tingkat = 'Pelanggaran Sedang';
} elseif ($overallScore >= 8.1 && $overallScore <= 20) {
$tingkat = 'Tindak Pidana Ringan (TIPIRING)';
} elseif ($overallScore >= 20.1 && $overallScore <= 100) {
$tingkat = 'Tindak Pidana Berat (TIPIRAT)';
} else {
return redirect()->route('pelanggaran')->with('error', 'Skor melebihi 100, silahkan kurangi kriteria');
}
$pelanggaran = Pelanggaran::findOrFail($id);
$pelanggaran->update([
'id_siswa' => $idSiswa,
'id_tindakan' => $tindakan->id,
'id_sanksi' => $sanksi->id,
'tingkat' => $tingkat,
]);
$pelanggaran->listPelanggaran()->delete();
foreach ($idKriteria as $index => $idKriteriaItem) {
ListPelanggaran::create([
'pelanggaran_id' => $pelanggaran->id,
'id_kriteria' => $idKriteriaItem,
'id_jenis' => $idJenis[$index],
]);
}
return redirect()->route('pelanggaran')->with('success', 'Berhasil memperbarui pelanggaran');
} catch (\Exception $e) {
return redirect()->back()->withInput()->withErrors('error', 'Gagal memperbarui pelanggaran');
}
}
return view('pages.dashboard.pelanggaran.update', [
'title' => 'Edit Pelanggaran',
'siswa' => Siswa::all(),
'kriteria_pelanggaran' => KriteriaPelanggaran::with('jenis')->get(),
'pelanggaran' => Pelanggaran::findOrFail($id),
]);
}
public function detail($id)
{
$pelanggaran = Pelanggaran::with('sanksi', 'tindakan', 'siswa')->where('id', $id)->first();
//dd($pelanggaran);
return view('pages.dashboard.pelanggaran.detail', [
'title' => 'Pelanggaran Siswa',
'data' => $pelanggaran,
'list' => ListPelanggaran::with('kriteria', 'jenis')->where('pelanggaran_id', $pelanggaran->id)->get(),
]);
}
public function delete($id)
{
$data = Pelanggaran::findOrFail($id);
$listPelanggaran = ListPelanggaran::where('pelanggaran_id', $data->id)->get();
foreach($listPelanggaran as $item) {
$pelanggaran = ListPelanggaran::find($item->id);
$pelanggaran->delete();
}
if (!$data->delete()) {
return redirect()->route('pelanggaran')->with(['error' => 'Gagal hapus pelanggaran!']);
}
return redirect()->route('pelanggaran')->with(['success' => 'Berhasil hapus pelanggaran!']);
}
}