MIF_E31222629/database/seeders/NilaiAlternatifSeeder.php

135 lines
5.5 KiB
PHP

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\MobilModels as Mobil;
use App\Models\SubKriteriaModels as SubKriteria;
use App\Models\NilaiAlternatifModels as NilaiAlternatif;
class NilaiAlternatifSeeder extends Seeder
{
public function run()
{
$mobils = Mobil::all();
// ===============================
// 1. KELENGKAPAN MOBIL
// ===============================
$kelengkapanItems = ['ban cadangan', 'dongkrak', 'kunci roda', 'segitiga pengaman', 'apar'];
$subKelengkapan = [];
foreach ($kelengkapanItems as $item) {
$sub = SubKriteria::whereRaw('LOWER(nama_subkriteria) LIKE ?', ["%$item%"])->first();
if ($sub) {
$subKelengkapan[strtolower($item)] = $sub->id;
}
}
// ===============================
// 2. SUB-KRITERIA HARGA
// ===============================
$subHarga = SubKriteria::whereHas('kriteria', function ($q) {
$q->where('nama_kriteria', 'Harga Sewa');
})->get()->keyBy(function ($item) {
return strtolower($item->nama_subkriteria);
});
$hargaMap = [
['label' => '≤ rp 300.000', 'check' => fn($v) => $v <= 300000, 'score' => 5],
['label' => 'rp 301.000 - rp 400.000', 'check' => fn($v) => $v > 300000 && $v <= 400000, 'score' => 4],
['label' => 'rp 401.000 - rp 600.000', 'check' => fn($v) => $v > 400000 && $v <= 600000, 'score' => 3],
['label' => 'rp 601.000 - rp 1.000.000', 'check' => fn($v) => $v > 600000 && $v <= 1000000, 'score' => 2],
['label' => '≥ rp 1.000.000', 'check' => fn($v) => $v > 1000000, 'score' => 1],
];
// ===============================
// 3. SUB-KRITERIA BBM
// ===============================
$subBBM = SubKriteria::whereHas('kriteria', function ($q) {
$q->where('nama_kriteria', 'Konsumsi BBM');
})->get()->keyBy(function ($item) {
return strtolower($item->nama_subkriteria);
});
$bbmMap = [
['label' => 'sangat Hemat (≥16 km/l)', 'check' => fn($v) => $v >= 16, 'score' => 5],
['label' => 'hemat (14 - 15 km/l)', 'check' => fn($v) => $v >= 14 && $v < 16, 'score' => 4],
['label' => 'sedang (12 - 13 km/l)', 'check' => fn($v) => $v >= 12 && $v < 14, 'score' => 3],
['label' => 'boros (10 - 11 km/l)', 'check' => fn($v) => $v >= 10 && $v < 12, 'score' => 2],
['label' => 'sangat Boros (≤ 10 km/l)', 'check' => fn($v) => $v < 10, 'score' => 1],
];
// ===============================
// 4. SUB-KRITERIA TAHUN
// ===============================
$subTahun = SubKriteria::whereHas('kriteria', function ($q) {
$q->where('nama_kriteria', 'Tahun Mobil');
})->get()->keyBy(function ($item) {
return strtolower($item->nama_subkriteria);
});
$tahunMap = [
['label' => 'terbaru (2022 - 2024)', 'check' => fn($v) => $v >= 2022, 'score' => 5],
['label' => 'menengah (2020 - 2021)', 'check' => fn($v) => $v >= 2020 && $v < 2022, 'score' => 3],
['label' => 'lama (2018 - 2019)', 'check' => fn($v) => $v >= 2018 && $v < 2020, 'score' => 1],
];
// ===============================
// MASUKKAN NILAI
// ===============================
foreach ($mobils as $mobil) {
$kelengkapanList = array_map('trim', explode(',', strtolower($mobil->kelengkapan_mobil)));
foreach ($kelengkapanItems as $item) {
$key = strtolower($item);
$nilai = in_array($key, $kelengkapanList) ? 1 : 0;
if (isset($subKelengkapan[$key])) {
NilaiAlternatif::updateOrCreate([
'mobil_id' => $mobil->id,
'sub_kriteria_id' => $subKelengkapan[$key],
], ['nilai' => $nilai]);
}
}
$harga = (int) preg_replace('/[^\d]/', '', $mobil->harga_sewa_per_hari);
foreach ($hargaMap as $item) {
$key = strtolower($item['label']);
if ($item['check']($harga) && isset($subHarga[$key])) {
NilaiAlternatif::updateOrCreate([
'mobil_id' => $mobil->id,
'sub_kriteria_id' => $subHarga[$key]->id,
], ['nilai' => $item['score']]);
break; // cukup satu yang cocok
}
}
$bbm = (float) $mobil->konsumsi_bbm;
foreach ($bbmMap as $item) {
$key = strtolower($item['label']);
if ($item['check']($bbm) && isset($subBBM[$key])) {
NilaiAlternatif::updateOrCreate([
'mobil_id' => $mobil->id,
'sub_kriteria_id' => $subBBM[$key]->id,
], ['nilai' => $item['score']]);
break;
}
}
$tahun = (int) $mobil->tahun;
foreach ($tahunMap as $item) {
$key = strtolower($item['label']);
if ($item['check']($tahun) && isset($subTahun[$key])) {
NilaiAlternatif::updateOrCreate([
'mobil_id' => $mobil->id,
'sub_kriteria_id' => $subTahun[$key]->id,
], ['nilai' => $item['score']]);
break;
}
}
}
echo "Seeder lengkap selesai.\n";
}
}