113 lines
3.6 KiB
PHP
113 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Services\ValidasiRekomendasiService;
|
|
use App\Models\ValidasiRekomendasi;
|
|
use App\Models\WaktuMakan;
|
|
use App\Models\Makanan;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class ValidasiRekomendasiController extends Controller
|
|
{
|
|
protected $validasiService;
|
|
|
|
public function __construct(ValidasiRekomendasiService $validasiService)
|
|
{
|
|
$this->validasiService = $validasiService;
|
|
$this->middleware('cekrole:admin');
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$query = ValidasiRekomendasi::with(['makananPakar', 'waktuMakan', 'komponen']);
|
|
|
|
// Filter berdasarkan hari
|
|
if ($request->has('hari')) {
|
|
$query->where('hari', $request->hari);
|
|
}
|
|
|
|
// Filter berdasarkan waktu makan
|
|
if ($request->has('waktu_makan_id')) {
|
|
$query->where('waktu_makan_id', $request->waktu_makan_id);
|
|
}
|
|
|
|
$validasi = $query->get();
|
|
$waktuMakans = WaktuMakan::all();
|
|
|
|
// Hitung statistik
|
|
$total = $validasi->count();
|
|
$lebihBaik = $validasi->where('status_kecocokan', 'lebih_baik')->count();
|
|
$setara = $validasi->where('status_kecocokan', 'setara')->count();
|
|
$lebihBuruk = $validasi->where('status_kecocokan', 'lebih_buruk')->count();
|
|
$persentaseCocok = $total > 0
|
|
? (($lebihBaik + $setara) / $total) * 100
|
|
: 0;
|
|
|
|
|
|
return view('admin.validasi.index', compact(
|
|
'validasi',
|
|
'waktuMakans',
|
|
'total',
|
|
'lebihBaik',
|
|
'setara',
|
|
'lebihBuruk',
|
|
'persentaseCocok'
|
|
));
|
|
}
|
|
|
|
public function bandingkan()
|
|
{
|
|
try {
|
|
$hasil = $this->validasiService->bandingkanRekomendasi();
|
|
|
|
return redirect()
|
|
->route('validasi.index')
|
|
->with('success', 'Validasi berhasil dilakukan. Persentase kecocokan: ' .
|
|
number_format($hasil['statistik']['persentase_cocok'], 2) . '%');
|
|
} catch (\Exception $e) {
|
|
return redirect()
|
|
->route('validasi.index')
|
|
->with('error', 'Terjadi kesalahan saat melakukan validasi: ' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
public function exportExcel()
|
|
{
|
|
$validasi = ValidasiRekomendasi::with(['makananPakar', 'waktuMakan', 'komponen'])
|
|
->get()
|
|
->map(function($item) {
|
|
$makananSistemNames = collect($item->makanan_sistem_ids)
|
|
->map(function($id) {
|
|
$makanan = Makanan::find($id);
|
|
return $makanan ? $makanan->nama : 'Makanan tidak ditemukan';
|
|
})
|
|
->implode(', ');
|
|
|
|
return [
|
|
'Hari' => $item->hari,
|
|
'Waktu Makan' => $item->waktuMakan->nama,
|
|
'Komponen' => $item->komponen->nama,
|
|
'Makanan Pakar' => $item->makananPakar->nama,
|
|
'Makanan Sistem' => $makananSistemNames,
|
|
'Status Kecocokan' => $this->formatStatusKecocokan($item->status_kecocokan)
|
|
];
|
|
});
|
|
|
|
// TODO: Implementasi export Excel menggunakan maatwebsite/excel
|
|
// Untuk sementara return view dengan data
|
|
return view('admin.validasi.export', compact('validasi'));
|
|
}
|
|
|
|
private function formatStatusKecocokan($status)
|
|
{
|
|
return match($status) {
|
|
'lebih_baik' => '✅ Lebih Baik',
|
|
'setara' => '⚠️ Setara',
|
|
'lebih_buruk' => '❌ Lebih Buruk',
|
|
default => $status
|
|
};
|
|
}
|
|
|
|
}
|