MIF_E31230745/database/seeders/BimaAmbulustudentSeeder.php

224 lines
8.8 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\User;
use App\Models\Recommendation;
use App\Models\PolijeMajor;
use Illuminate\Database\Seeder;
class BimaAmbulustudentSeeder extends Seeder
{
/**
* SEEDER UNTUK DATA SISWA SMK BIMA AMBULU
*
* Edit data siswa di bawah sesuai dengan data siswa dari SMK Bima Ambulu
* Format:
* - Kelompok: IPA atau IPS
* - Nilai: 0-100
* - Email: harus unik
*
* Run: php artisan db:seed --class=BimaAmbulustudentSeeder
*/
public function run(): void
{
$studentsData = [
// ========== SISWA SMK BIMA AMBULU - KELOMPOK IPA ==========
[
'name' => 'Akmal Fiqri',
'email' => 'akmal.fiqri@bima.student',
'kelompok_asal' => 'IPA',
'values' => ['mtk' => 85, 'fisika' => 82, 'kimia' => 75, 'biologi' => 70],
'minat' => 'Teknologi & Inovasi',
'pref_studi' => 'Sains & Teknologi',
'cita_cita' => 'Software Engineer',
'prestasi' => 'Aktif di klub robotika',
],
[
'name' => 'Sasha Putri Aulia',
'email' => 'sasha.putri@bima.student',
'kelompok_asal' => 'IPA',
'values' => ['mtk' => 78, 'fisika' => 80, 'kimia' => 85, 'biologi' => 82],
'minat' => 'Kesehatan & Biologi',
'pref_studi' => 'Kesehatan & Ilmu Hayat',
'cita_cita' => 'Dokter Umum',
'prestasi' => 'Juara Olimpiade Biologi',
],
[
'name' => 'Budi Kusuma',
'email' => 'budi.kusuma@bima.student',
'kelompok_asal' => 'IPA',
'values' => ['mtk' => 82, 'fisika' => 88, 'kimia' => 76, 'biologi' => 68],
'minat' => 'Teknik & Mesin',
'pref_studi' => 'Sains & Teknologi',
'cita_cita' => 'Insinyur Mesin',
'prestasi' => 'Peserta Kompetisi Teknik',
],
[
'name' => 'Dina Hartini',
'email' => 'dina.hartini@bima.student',
'kelompok_asal' => 'IPA',
'values' => ['mtk' => 75, 'fisika' => 72, 'kimia' => 88, 'biologi' => 90],
'minat' => 'Farmasi & Kimia',
'pref_studi' => 'Kesehatan & Ilmu Hayat',
'cita_cita' => 'Apoteker',
'prestasi' => 'Ranking 5 Besar',
],
[
'name' => 'Eka Prasetyo',
'email' => 'eka.prasetyo@bima.student',
'kelompok_asal' => 'IPA',
'values' => ['mtk' => 88, 'fisika' => 85, 'kimia' => 72, 'biologi' => 75],
'minat' => 'Pemrograman & Coding',
'pref_studi' => 'Sains & Teknologi',
'cita_cita' => 'Web Developer',
'prestasi' => 'Peserta Hackathon',
],
// ========== SISWA SMK BIMA AMBULU - KELOMPOK IPS ==========
[
'name' => 'Fahmi Rizki',
'email' => 'fahmi.rizki@bima.student',
'kelompok_asal' => 'IPS',
'values' => ['ekonomi' => 88, 'geografi' => 80, 'sosiologi' => 78, 'sejarah' => 75],
'minat' => 'Bisnis & Keuangan',
'pref_studi' => 'Bisnis & Manajemen',
'cita_cita' => 'Akuntan Profesional',
'prestasi' => 'Aktif di organisasi bisnis',
],
[
'name' => 'Gina Melani',
'email' => 'gina.melani@bima.student',
'kelompok_asal' => 'IPS',
'values' => ['ekonomi' => 85, 'geografi' => 88, 'sosiologi' => 82, 'sejarah' => 80],
'minat' => 'Pariwisata & Budaya',
'pref_studi' => 'Sosial & Humaniora',
'cita_cita' => 'Tour Guide Profesional',
'prestasi' => 'Pelatihan Pariwisata',
],
[
'name' => 'Hasan Wijaya',
'email' => 'hasan.wijaya@bima.student',
'kelompok_asal' => 'IPS',
'values' => ['ekonomi' => 82, 'geografi' => 85, 'sosiologi' => 80, 'sejarah' => 78],
'minat' => 'Manajemen & Administrasi',
'pref_studi' => 'Bisnis & Manajemen',
'cita_cita' => 'Manager Perusahaan',
'prestasi' => 'Peserta Case Study',
],
[
'name' => 'Irma Santika',
'email' => 'irma.santika@bima.student',
'kelompok_asal' => 'IPS',
'values' => ['ekonomi' => 75, 'geografi' => 92, 'sosiologi' => 85, 'sejarah' => 88],
'minat' => 'Budaya & Komunikasi',
'pref_studi' => 'Sosial & Humaniora',
'cita_cita' => 'Jurnalis',
'prestasi' => 'Penulis artikel',
],
[
'name' => 'Joko Supriyanto',
'email' => 'joko.supriyanto@bima.student',
'kelompok_asal' => 'IPS',
'values' => ['ekonomi' => 80, 'geografi' => 75, 'sosiologi' => 88, 'sejarah' => 82],
'minat' => 'Sosial & Masyarakat',
'pref_studi' => 'Sosial & Humaniora',
'cita_cita' => 'Pekerja Sosial',
'prestasi' => 'Aktif di kegiatan sosial',
],
];
$majorNames = PolijeMajor::pluck('nama_jurusan')->toArray();
foreach ($studentsData as $data) {
// Cek apakah siswa sudah ada
$existingUser = User::where('email', $data['email'])->first();
if ($existingUser) {
$this->command->warn("⚠ Siswa {$data['name']} ({$data['email']}) sudah ada di sistem, skip...");
continue;
}
// Buat user siswa baru
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt('password'), // Password default
'role' => 'siswa',
'kelompok_asal' => $data['kelompok_asal'],
]);
// Hitung skor rekomendasi berdasarkan bobot mapel
$scores = $this->calculateScores($data, $majorNames);
// Ambil top 3 dengan skor tertinggi
arsort($scores);
$topRecommendations = array_slice($scores, 0, 3, true);
// Buat data rekomendasi dengan ranking
$recommendations = [];
foreach ($topRecommendations as $majorName => $score) {
$recommendations[] = [
'jurusan' => $majorName,
'skor' => round($score, 2),
'detail' => "Rekomendasi berdasarkan nilai, minat, dan preferensi studi siswa.",
];
}
// Simpan rekomendasi ke database
Recommendation::create([
'user_id' => $user->id,
'mtk' => $data['values']['mtk'] ?? 0,
'fisika' => $data['values']['fisika'] ?? 0,
'kimia' => $data['values']['kimia'] ?? 0,
'biologi' => $data['values']['biologi'] ?? 0,
'ekonomi' => $data['values']['ekonomi'] ?? 0,
'sejarah' => $data['values']['sejarah'] ?? 0,
'geografi' => $data['values']['geografi'] ?? 0,
'sosiologi' => $data['values']['sosiologi'] ?? 0,
'minat' => $data['minat'],
'preferensi_studi' => $data['pref_studi'],
'cita_cita' => $data['cita_cita'],
'prestasi' => $data['prestasi'],
'hasil_rekomendasi' => json_encode($recommendations),
]);
$this->command->info("✅ Siswa {$data['name']} ({$data['email']}) ditambahkan dengan rekomendasi jurusan.");
}
$this->command->info("\n✅ Impor data siswa SMK Bima Ambulu selesai!");
}
private function calculateScores(array $studentData, array $majorNames): array
{
$scores = [];
$majors = PolijeMajor::all()->keyBy('nama_jurusan');
foreach ($majorNames as $majorName) {
if (!isset($majors[$majorName])) continue;
$major = $majors[$majorName];
$bobot = $major->bobot_mapel;
$score = 0;
// Hitung skor berdasarkan bobot dan nilai siswa
foreach ($bobot as $subject => $weight) {
$value = $studentData['values'][$subject] ?? 0;
$score += ($value * $weight) / 100;
}
// Bonus untuk preferensi studi yang sesuai
if (in_array($studentData['pref_studi'], $major->preferensi_studi)) {
$score += 5;
}
$scores[$majorName] = $score;
}
return $scores;
}
}