MIF_E31222307/app/Http/Controllers/ValidasiRekomendasiControll...

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
};
}
}