select($kolom, DB::raw('COUNT(*) as total')) ->whereNotNull($kolom) ->where($kolom, '!=', '') ->groupBy($kolom) ->orderBy('total', 'DESC') ->first(); return $modus ? $modus->$kolom : $defaultFallback; } catch (\Exception $e) { return $defaultFallback; } } public function kategoriNilai($nilai) { if (is_string($nilai) && !is_numeric(trim($nilai))) { return trim($nilai); } $nilai = (float) $nilai; if ($nilai >= 90) return 'Tinggi'; if ($nilai >= 75) return 'Sedang'; return 'Rendah'; } /** * Penanganan dan Pengelompokan / Normalisasi Mata Pelajaran Favorit */ public function kategoriMapelFavorit($mapel) { if (empty($mapel)) { return $this->getKelasMayoritas('mapel_favorit', 'Matematika'); } $mapelClean = trim($mapel); $kategoriStandar = [ 'Matematika', 'Bahasa Inggris', 'Biologi', 'Fisika', 'Ekonomi', 'Sejarah' ]; foreach ($kategoriStandar as $kat) { if (strcasecmp($mapelClean, $kat) === 0) { return $kat; } } $mapelRaw = strtolower($mapelClean); if ( str_contains($mapelRaw, 'mat') || str_contains($mapelRaw, 'hitung') || str_contains($mapelRaw, 'kalkulus') || str_contains($mapelRaw, 'angka') ) { return 'Matematika'; } if ( str_contains($mapelRaw, 'inggris') || str_contains($mapelRaw, 'english') || str_contains($mapelRaw, 'bing') || str_contains($mapelRaw, 'bahasa asing') ) { return 'Bahasa Inggris'; } if ( str_contains($mapelRaw, 'bio') || str_contains($mapelRaw, 'tumbuhan') || str_contains($mapelRaw, 'hewan') || str_contains($mapelRaw, 'anatomi') ) { return 'Biologi'; } if ( str_contains($mapelRaw, 'fis') || str_contains($mapelRaw, 'mekanika') || str_contains($mapelRaw, 'listrik') ) { return 'Fisika'; } if ( str_contains($mapelRaw, 'eko') || str_contains($mapelRaw, 'akuntansi') || str_contains($mapelRaw, 'keuangan') || str_contains($mapelRaw, 'bisnis') ) { return 'Ekonomi'; } if ( str_contains($mapelRaw, 'sej') || str_contains($mapelRaw, 'sosio') || str_contains($mapelRaw, 'sejarah') || str_contains($mapelRaw, 'ips') ) { return 'Sejarah'; } return $this->getKelasMayoritas('mapel_favorit', 'Matematika'); } public function kategoriMinat($minat) { if (empty($minat)) { return $this->getKelasMayoritas('minat', 'Teknologi Info & Pemrograman'); } $minatClean = trim($minat); $kategoriStandar = [ 'Budidaya Tanaman', 'Kimia Pangan', 'Budidaya Ternak', 'Teknologi Info & Pemrograman', 'Energi & Tek Mesin', 'Bahasa & Komunikasi', 'Bisnis', 'Kesehatan' ]; foreach ($kategoriStandar as $kat) { if (strcasecmp($minatClean, $kat) === 0) { return $kat; } } $minatRaw = strtolower($minatClean); // 1. Teknologi Informasi & Pemrograman (JTI Polije) if ( str_contains($minatRaw, 'coding') || str_contains($minatRaw, 'jaringan') || str_contains($minatRaw, 'rekayasa perangkat lunak') || str_contains($minatRaw, 'rpl') || str_contains($minatRaw, 'pemrograman') || str_contains($minatRaw, 'cyber') || str_contains($minatRaw, 'komputer') || str_contains($minatRaw, 'informatika') || str_contains($minatRaw, 'info & pemrog') || str_contains($minatRaw, 'olah data') || str_contains($minatRaw, 'data') || str_contains($minatRaw, 'game') || str_contains($minatRaw, 'web') || str_contains($minatRaw, 'aplikasi') || str_contains($minatRaw, 'software') || str_contains($minatRaw, 'developer') ) { return 'Teknologi Info & Pemrograman'; } // 2. Bahasa, Media & Komunikasi if ( str_contains($minatRaw, 'masyarakat') || str_contains($minatRaw, 'bahasa') || str_contains($minatRaw, 'wisata') || str_contains($minatRaw, 'media') || str_contains($minatRaw, 'komunikasi') || str_contains($minatRaw, 'konten') || str_contains($minatRaw, 'content') || str_contains($minatRaw, 'kreator') || str_contains($minatRaw, 'creator') || str_contains($minatRaw, 'youtube') || str_contains($minatRaw, 'desain') || str_contains($minatRaw, 'nulis') || str_contains($minatRaw, 'editing') || str_contains($minatRaw, 'video') || str_contains($minatRaw, 'foto') ) { return 'Bahasa & Komunikasi'; } // 3. Bisnis & Manajemen Agribisnis if ( str_contains($minatRaw, 'akuntansi') || str_contains($minatRaw, 'admin') || str_contains($minatRaw, 'manajemen') || str_contains($minatRaw, 'industri') || str_contains($minatRaw, 'keuangan') || str_contains($minatRaw, 'investasi') || str_contains($minatRaw, 'bisnis') || str_contains($minatRaw, 'dagang') || str_contains($minatRaw, 'jual') || str_contains($minatRaw, 'pemasaran') || str_contains($minatRaw, 'marketing') || str_contains($minatRaw, 'wirausaha') ) { return 'Bisnis'; } // 4. Budidaya Tanaman / Pertanian if ( str_contains($minatRaw, 'tani') || str_contains($minatRaw, 'kebun') || str_contains($minatRaw, 'agronomi') || str_contains($minatRaw, 'benih') || str_contains($minatRaw, 'tanaman') || str_contains($minatRaw, 'budidaya tanaman') || str_contains($minatRaw, 'hortikultura') || str_contains($minatRaw, 'lahan') ) { return 'Budidaya Tanaman'; } // 5. Kimia Pangan & Teknologi Pertanian if ( str_contains($minatRaw, 'kimia') || str_contains($minatRaw, 'pangan') || str_contains($minatRaw, 'proses') || str_contains($minatRaw, 'olah makanan') || str_contains($minatRaw, 'kuliner') || str_contains($minatRaw, 'gizi pangan') ) { return 'Kimia Pangan'; } // 6. Budidaya Ternak / Peternakan if ( str_contains($minatRaw, 'ternak') || str_contains($minatRaw, 'hewan') || str_contains($minatRaw, 'pakan') || str_contains($minatRaw, 'unggas') || str_contains($minatRaw, 'budidaya ternak') || str_contains($minatRaw, 'pelihara') ) { return 'Budidaya Ternak'; } // 7. Energi & Teknik Mesin if ( str_contains($minatRaw, 'mesin') || str_contains($minatRaw, 'otomotif') || str_contains($minatRaw, 'listrik') || str_contains($minatRaw, 'energi') || str_contains($minatRaw, 'tek mesin') || str_contains($minatRaw, 'robot') ) { return 'Energi & Tek Mesin'; } // 8. Kesehatan if ( str_contains($minatRaw, 'medis') || str_contains($minatRaw, 'gizi') || str_contains($minatRaw, 'sehat') || str_contains($minatRaw, 'klinik') || str_contains($minatRaw, 'obat') || str_contains($minatRaw, 'rawat') || str_contains($minatRaw, 'rekam medis') ) { return 'Kesehatan'; } return $this->getKelasMayoritas('minat', 'Teknologi Info & Pemrograman'); } public function kategoriCitaCita($cita) { if (empty($cita)) { return $this->getKelasMayoritas('cita_cita', 'IT'); } $citaClean = trim($cita); $kategoriStandar = [ 'Ahli Agronomi', 'Peternak', 'Pengusaha', 'Ahli Gizi', 'Manager Rantai Pasok', 'Manajer', 'Quality Control', 'Petani Modern', 'Teknisi', 'Bahasa & Pariwisata', 'IT' ]; foreach ($kategoriStandar as $kat) { if (strcasecmp($citaClean, $kat) === 0) { return $kat; } } $citaRaw = strtolower($citaClean); if (str_contains($citaRaw, 'agronomi') || str_contains($citaRaw, 'ahli agronomi')) return 'Ahli Agronomi'; if (str_contains($citaRaw, 'farm') || str_contains($citaRaw, 'ternak') || str_contains($citaRaw, 'peternak')) return 'Peternak'; if (str_contains($citaRaw, 'akuntan') || str_contains($citaRaw, 'pajak') || str_contains($citaRaw, 'bisnis') || str_contains($citaRaw, 'pengusaha') || str_contains($citaRaw, 'wirausaha') || str_contains($citaRaw, 'ceo') || str_contains($citaRaw, 'founder') || str_contains($citaRaw, 'pembisnis')) return 'Pengusaha'; if (str_contains($citaRaw, 'gizi') || str_contains($citaRaw, 'medis') || str_contains($citaRaw, 'rumah sakit') || str_contains($citaRaw, 'kesehatan') || str_contains($citaRaw, 'dokter') || str_contains($citaRaw, 'perawat')) return 'Ahli Gizi'; if (str_contains($citaRaw, 'rantai pasok') || str_contains($citaRaw, 'supply chain') || str_contains($citaRaw, 'manager rantai pasok') || str_contains($citaRaw, 'logistik')) return 'Manager Rantai Pasok'; if (str_contains($citaRaw, 'manajer') || str_contains($citaRaw, 'manager') || str_contains($citaRaw, 'pimpinan') || str_contains($citaRaw, 'bos')) return 'Manajer'; if (str_contains($citaRaw, 'quality control') || str_contains($citaRaw, 'qc') || str_contains($citaRaw, 'tester')) return 'Quality Control'; if (str_contains($citaRaw, 'petani modern') || str_contains($citaRaw, 'tani') || str_contains($citaRaw, 'kebun')) return 'Petani Modern'; if ( str_contains($citaRaw, 'software') || str_contains($citaRaw, 'data engineer') || str_contains($citaRaw, 'network engineer') || str_contains($citaRaw, 'programmer') || preg_match('/\bit\b/i', $citaRaw) || str_contains($citaRaw, 'developer') || str_contains($citaRaw, 'teknisi informatika') || str_contains($citaRaw, 'analis') || str_contains($citaRaw, 'analyst') || str_contains($citaRaw, 'data') || str_contains($citaRaw, 'gamer') || str_contains($citaRaw, 'hacker') ) return 'IT'; if ( str_contains($citaRaw, 'translator') || str_contains($citaRaw, 'penerjemah') || str_contains($citaRaw, 'tour') || str_contains($citaRaw, 'tour guide') || str_contains($citaRaw, 'pemandu') || str_contains($citaRaw, 'wisata') || str_contains($citaRaw, 'bahasa') || str_contains($citaRaw, 'diplomat') || str_contains($citaRaw, 'content') || str_contains($citaRaw, 'creator') || str_contains($citaRaw, 'kreator') || str_contains($citaRaw, 'youtuber') || str_contains($citaRaw, 'guru') || str_contains($citaRaw, 'dosen') || str_contains($citaRaw, 'pengajar') || str_contains($citaRaw, 'pendidik') || str_contains($citaRaw, 'penyanyi') ) return 'Bahasa & Pariwisata'; if ( str_contains($citaRaw, 'mekanik') || str_contains($citaRaw, 'mesin') || str_contains($citaRaw, 'teknisi') || str_contains($citaRaw, 'engineer') || str_contains($citaRaw, 'rekayasa') || str_contains($citaRaw, 'otomotif') ) return 'Teknisi'; return $this->getKelasMayoritas('cita_cita', 'IT'); } public function kategoriPreferensi($preferensi) { if (empty($preferensi)) { return $this->getKelasMayoritas('preferensi_studi', 'Komputer & Informatika'); } $preferensiClean = trim($preferensi); $kategoriStandar = [ 'Pertanian & Hortikultura', 'Komputer & Informatika', 'Ekonomi & Agribisnis', 'Bahasa & Komunikasi', 'Kesehatan & Gizi', 'Bisnis & Manajemen', 'Ilmu Peternakan', 'Rekayasa Otomotif', 'Sains & Teknologi' ]; foreach ($kategoriStandar as $kat) { if (strcasecmp($preferensiClean, $kat) === 0) { return $kat; } } $preferensiRaw = strtolower($preferensiClean); if ( str_contains($preferensiRaw, 'komputer') || str_contains($preferensiRaw, 'informatika') || str_contains($preferensiRaw, 'sistem informasi') || str_contains($preferensiRaw, 'software') || str_contains($preferensiRaw, 'data') || str_contains($preferensiRaw, 'mining') || str_contains($preferensiRaw, 'it') || str_contains($preferensiRaw, 'digital') || str_contains($preferensiRaw, 'aplikasi') || str_contains($preferensiRaw, 'pemrograman') || str_contains($preferensiRaw, 'matematika') ) return 'Komputer & Informatika'; if ( str_contains($preferensiRaw, 'bahasa') || str_contains($preferensiRaw, 'komunikasi') || str_contains($preferensiRaw, 'pariwisata') || str_contains($preferensiRaw, 'hubungan internasional') || str_contains($preferensiRaw, 'media') || str_contains($preferensiRaw, 'desain') || str_contains($preferensiRaw, 'konten') || str_contains($preferensiRaw, 'content') || str_contains($preferensiRaw, 'kesenian') ) return 'Bahasa & Komunikasi'; if (str_contains($preferensiRaw, 'pertanian') || str_contains($preferensiRaw, 'hortikultura') || str_contains($preferensiRaw, 'tanaman') || str_contains($preferensiRaw, 'agronomi')) return 'Pertanian & Hortikultura'; if (str_contains($preferensiRaw, 'peternakan') || str_contains($preferensiRaw, 'ternak') || str_contains($preferensiRaw, 'hewan')) return 'Ilmu Peternakan'; if (str_contains($preferensiRaw, 'ekonomi') || str_contains($preferensiRaw, 'agribisnis') || str_contains($preferensiRaw, 'perbankan')) return 'Ekonomi & Agribisnis'; if (str_contains($preferensiRaw, 'kesehatan') || str_contains($preferensiRaw, 'gizi') || str_contains($preferensiRaw, 'keperawatan') || str_contains($preferensiRaw, 'kedokteran') || str_contains($preferensiRaw, 'biologi') || str_contains($preferensiRaw, 'farmasi')) return 'Kesehatan & Gizi'; if (str_contains($preferensiRaw, 'rekayasa') || str_contains($preferensiRaw, 'otomotif') || str_contains($preferensiRaw, 'mesin') || str_contains($preferensiRaw, 'elektro')) return 'Rekayasa Otomotif'; if (str_contains($preferensiRaw, 'bisnis') || str_contains($preferensiRaw, 'manajemen') || str_contains($preferensiRaw, 'pemasaran') || str_contains($preferensiRaw, 'penjualan') || str_contains($preferensiRaw, 'jual') || str_contains($preferensiRaw, 'akuntansi') || str_contains($preferensiRaw, 'ilmu manajemen')) return 'Bisnis & Manajemen'; if (str_contains($preferensiRaw, 'sains') || str_contains($preferensiRaw, 'teknologi') || str_contains($preferensiRaw, 'ilmu fisika') || str_contains($preferensiRaw, 'fisika') || str_contains($preferensiRaw, 'ilmu kimia') || str_contains($preferensiRaw, 'kimia')) return 'Sains & Teknologi'; return $this->getKelasMayoritas('preferensi_studi', 'Komputer & Informatika'); } public function preprocess($row) { $isObject = is_object($row); $nilai = $isObject ? ($row->nilai_raw ?? $row->nilai ?? 0) : ($row['nilai_raw'] ?? $row['nilai'] ?? 0); $mapelFavorit = $isObject ? ($row->mapel_favorit_raw ?? $row->mapel_favorit ?? '') : ($row['mapel_favorit_raw'] ?? $row['mapel_favorit'] ?? ''); $minat = $isObject ? ($row->minat_raw ?? $row->minat ?? '') : ($row['minat_raw'] ?? $row['minat'] ?? ''); $citaCita = $isObject ? ($row->cita_cita_raw ?? $row->cita_cita ?? '') : ($row['cita_cita_raw'] ?? $row['cita_cita'] ?? ''); $preferensiStudi = $isObject ? ($row->preferensi_studi_raw ?? $row->preferensi_studi ?? '') : ($row['preferensi_studi_raw'] ?? $row['preferensi_studi'] ?? ''); $jurusan = $isObject ? ($row->jurusan ?? 'Tidak Diketahui') : ($row['jurusan'] ?? 'Tidak Diketahui'); return [ 'nilai' => $this->kategoriNilai($nilai), 'mapel_favorit' => $this->kategoriMapelFavorit($mapelFavorit), 'minat' => $this->kategoriMinat($minat), 'cita_cita' => $this->kategoriCitaCita($citaCita), 'preferensi_studi' => $this->kategoriPreferensi($preferensiStudi), 'jurusan' => trim($jurusan) ]; } }