179 lines
12 KiB
PHP
179 lines
12 KiB
PHP
<?php
|
|
|
|
namespace Database\Seeders;
|
|
|
|
use App\Models\User;
|
|
use App\Models\Recommendation;
|
|
use App\Models\ChatHistory;
|
|
use App\Models\PolijeMajor;
|
|
use Illuminate\Database\Seeder;
|
|
use Illuminate\Support\Str;
|
|
|
|
class Generate30StudentsSeeder extends Seeder
|
|
{
|
|
/**
|
|
* Generate 30 students dengan data, recommendations, dan chat history
|
|
* Run: php artisan db:seed --class=Generate30StudentsSeeder
|
|
*/
|
|
|
|
public function run(): void
|
|
{
|
|
$studentsData = [
|
|
// KELOMPOK IPA - 15 siswa
|
|
['name' => 'Akmal Fiqri', 'email' => 'akmal.fiqri@school.id', 'kelompok' => 'IPA', 'mtk' => 85, 'fisika' => 82, 'kimia' => 75, 'biologi' => 70, 'minat' => 'Teknologi & Programming'],
|
|
['name' => 'Sasha Putri Aulia', 'email' => 'sasha.putri@school.id', 'kelompok' => 'IPA', 'mtk' => 78, 'fisika' => 80, 'kimia' => 85, 'biologi' => 82, 'minat' => 'Kesehatan & Biologi'],
|
|
['name' => 'Budi Kusuma', 'email' => 'budi.kusuma@school.id', 'kelompok' => 'IPA', 'mtk' => 82, 'fisika' => 88, 'kimia' => 76, 'biologi' => 68, 'minat' => 'Teknik & Mesin'],
|
|
['name' => 'Dina Hartini', 'email' => 'dina.hartini@school.id', 'kelompok' => 'IPA', 'mtk' => 75, 'fisika' => 72, 'kimia' => 88, 'biologi' => 90, 'minat' => 'Farmasi & Kimia'],
|
|
['name' => 'Eka Prasetyo', 'email' => 'eka.prasetyo@school.id', 'kelompok' => 'IPA', 'mtk' => 88, 'fisika' => 85, 'kimia' => 72, 'biologi' => 75, 'minat' => 'Pemrograman & Coding'],
|
|
['name' => 'Fitra Handoko', 'email' => 'fitra.handoko@school.id', 'kelompok' => 'IPA', 'mtk' => 92, 'fisika' => 90, 'kimia' => 88, 'biologi' => 80, 'minat' => 'Sains & Penelitian'],
|
|
['name' => 'Gita Pramesti', 'email' => 'gita.pramesti@school.id', 'kelompok' => 'IPA', 'mtk' => 80, 'fisika' => 78, 'kimia' => 82, 'biologi' => 85, 'minat' => 'Bioteknologi'],
|
|
['name' => 'Hendra Wijaya', 'email' => 'hendra.wijaya@school.id', 'kelompok' => 'IPA', 'mtk' => 86, 'fisika' => 84, 'kimia' => 80, 'biologi' => 72, 'minat' => 'Fisika & Teknologi'],
|
|
['name' => 'Intan Sari', 'email' => 'intan.sari@school.id', 'kelompok' => 'IPA', 'mtk' => 79, 'fisika' => 81, 'kimia' => 83, 'biologi' => 88, 'minat' => 'Kesehatan'],
|
|
['name' => 'Jaka Surya', 'email' => 'jaka.surya@school.id', 'kelompok' => 'IPA', 'mtk' => 83, 'fisika' => 86, 'kimia' => 78, 'biologi' => 70, 'minat' => 'Teknik Elektro'],
|
|
['name' => 'Kurniawan Adi', 'email' => 'kurniawan.adi@school.id', 'kelompok' => 'IPA', 'mtk' => 87, 'fisika' => 88, 'kimia' => 85, 'biologi' => 76, 'minat' => 'Teknik Sipil'],
|
|
['name' => 'Latifa Zahra', 'email' => 'latifa.zahra@school.id', 'kelompok' => 'IPA', 'mtk' => 81, 'fisika' => 80, 'kimia' => 87, 'biologi' => 84, 'minat' => 'Kedokteran'],
|
|
['name' => 'Maulana Rizki', 'email' => 'maulana.rizki@school.id', 'kelompok' => 'IPA', 'mtk' => 84, 'fisika' => 83, 'kimia' => 81, 'biologi' => 73, 'minat' => 'Teknologi Informasi'],
|
|
['name' => 'Nisa Rahmawati', 'email' => 'nisa.rahmawati@school.id', 'kelompok' => 'IPA', 'mtk' => 77, 'fisika' => 79, 'kimia' => 84, 'biologi' => 89, 'minat' => 'Perawatan Kesehatan'],
|
|
['name' => 'Oki Pratama', 'email' => 'oki.pratama@school.id', 'kelompok' => 'IPA', 'mtk' => 89, 'fisika' => 87, 'kimia' => 84, 'biologi' => 71, 'minat' => 'Energi Terbarukan'],
|
|
|
|
// KELOMPOK IPS - 15 siswa
|
|
['name' => 'Fahmi Rizki', 'email' => 'fahmi.rizki@school.id', 'kelompok' => 'IPS', 'ekonomi' => 88, 'geografi' => 80, 'sosiologi' => 78, 'sejarah' => 75, 'minat' => 'Bisnis & Keuangan'],
|
|
['name' => 'Gina Melani', 'email' => 'gina.melani@school.id', 'kelompok' => 'IPS', 'ekonomi' => 85, 'geografi' => 88, 'sosiologi' => 82, 'sejarah' => 80, 'minat' => 'Pariwisata & Budaya'],
|
|
['name' => 'Hasan Wijaya', 'email' => 'hasan.wijaya@school.id', 'kelompok' => 'IPS', 'ekonomi' => 82, 'geografi' => 85, 'sosiologi' => 80, 'sejarah' => 78, 'minat' => 'Manajemen & Administrasi'],
|
|
['name' => 'Irma Santika', 'email' => 'irma.santika@school.id', 'kelompok' => 'IPS', 'ekonomi' => 75, 'geografi' => 92, 'sosiologi' => 85, 'sejarah' => 88, 'minat' => 'Budaya & Komunikasi'],
|
|
['name' => 'Joko Supriyanto', 'email' => 'joko.supriyanto@school.id', 'kelompok' => 'IPS', 'ekonomi' => 80, 'geografi' => 75, 'sosiologi' => 88, 'sejarah' => 82, 'minat' => 'Sosial & Masyarakat'],
|
|
['name' => 'Kartika Dewi', 'email' => 'kartika.dewi@school.id', 'kelompok' => 'IPS', 'ekonomi' => 87, 'geografi' => 84, 'sosiologi' => 80, 'sejarah' => 82, 'minat' => 'Akuntansi & Keuangan'],
|
|
['name' => 'Lucia Pratiwi', 'email' => 'lucia.pratiwi@school.id', 'kelompok' => 'IPS', 'ekonomi' => 83, 'geografi' => 86, 'sosiologi' => 84, 'sejarah' => 85, 'minat' => 'Ilmu Komunikasi'],
|
|
['name' => 'Mahmud Ali', 'email' => 'mahmud.ali@school.id', 'kelompok' => 'IPS', 'ekonomi' => 81, 'geografi' => 78, 'sosiologi' => 85, 'sejarah' => 80, 'minat' => 'Hukum & Keadilan'],
|
|
['name' => 'Nadya Salsabila', 'email' => 'nadya.salsabila@school.id', 'kelompok' => 'IPS', 'ekonomi' => 84, 'geografi' => 88, 'sosiologi' => 81, 'sejarah' => 79, 'minat' => 'Perhotelan'],
|
|
['name' => 'Oman Sutrisno', 'email' => 'oman.sutrisno@school.id', 'kelompok' => 'IPS', 'ekonomi' => 86, 'geografi' => 82, 'sosiologi' => 79, 'sejarah' => 81, 'minat' => 'Bisnis Internasional'],
|
|
['name' => 'Putri Handini', 'email' => 'putri.handini@school.id', 'kelompok' => 'IPS', 'ekonomi' => 80, 'geografi' => 87, 'sosiologi' => 83, 'sejarah' => 84, 'minat' => 'Pendidikan & Pengajaran'],
|
|
['name' => 'Qohaf Ramadhan', 'email' => 'qohaf.ramadhan@school.id', 'kelompok' => 'IPS', 'ekonomi' => 82, 'geografi' => 79, 'sosiologi' => 86, 'sejarah' => 83, 'minat' => 'Pemerintahan'],
|
|
['name' => 'Rita Kusuma', 'email' => 'rita.kusuma@school.id', 'kelompok' => 'IPS', 'ekonomi' => 85, 'geografi' => 86, 'sosiologi' => 82, 'sejarah' => 81, 'minat' => 'Diplomasi & Hubungan Internasional'],
|
|
['name' => 'Satrio Budi', 'email' => 'satrio.budi@school.id', 'kelompok' => 'IPS', 'ekonomi' => 79, 'geografi' => 83, 'sosiologi' => 88, 'sejarah' => 85, 'minat' => 'Jurnalisme'],
|
|
['name' => 'Tyas Merika', 'email' => 'tyas.merika@school.id', 'kelompok' => 'IPS', 'ekonomi' => 88, 'geografi' => 85, 'sosiologi' => 80, 'sejarah' => 78, 'minat' => 'Asuransi & Perbankan'],
|
|
];
|
|
|
|
$chatMessages = [
|
|
'Halo, apa yang harus saya lakukan untuk memilih jurusan yang tepat?',
|
|
'Saya bingung antara dua pilihan jurusan yang berbeda.',
|
|
'Bagaimana prospek kerja dari jurusan yang Anda rekomendasikan?',
|
|
'Apakah ada beasiswa untuk jurusan ini?',
|
|
'Apa saja persyaratan untuk masuk ke jurusan tersebut?',
|
|
'Berapa lama program studi ini?',
|
|
'Apa saja mata kuliah yang akan saya pelajari?',
|
|
'Saya tertarik dengan teknologi, jurusan apa yang cocok?',
|
|
'Bagaimana dengan kesempatan magang?',
|
|
'Saya ingin bekerja di luar negeri, jurusan apa yang sesuai?',
|
|
];
|
|
|
|
$majoritasNames = PolijeMajor::pluck('nama_jurusan')->toArray();
|
|
|
|
if (empty($majoritasNames)) {
|
|
$this->command->error('❌ Tidak ada jurusan di database. Jalankan seeder jurusan terlebih dahulu!');
|
|
return;
|
|
}
|
|
|
|
foreach ($studentsData as $index => $data) {
|
|
// Cek email unik
|
|
if (User::where('email', $data['email'])->exists()) {
|
|
$this->command->warn("⚠️ Email {$data['email']} sudah ada, skip...");
|
|
continue;
|
|
}
|
|
|
|
// Create Student User
|
|
$user = User::create([
|
|
'name' => $data['name'],
|
|
'email' => $data['email'],
|
|
'password' => bcrypt('student123'),
|
|
'role' => 'siswa',
|
|
'nis' => '20240' . str_pad($index + 1, 3, '0', STR_PAD_LEFT),
|
|
'kelompok_asal' => $data['kelompok'],
|
|
'email_verified_at' => now(),
|
|
]);
|
|
|
|
$this->command->line("✅ Created student: {$data['name']} ({$data['email']})");
|
|
|
|
// Create Recommendation
|
|
if ($data['kelompok'] === 'IPA') {
|
|
$matematika = $data['mtk'];
|
|
$fisika = $data['fisika'];
|
|
$kimia = $data['kimia'];
|
|
$biologi = $data['biologi'];
|
|
} else {
|
|
$ekonomi = $data['ekonomi'];
|
|
$geografi = $data['geografi'];
|
|
$sosiologi = $data['sosiologi'];
|
|
$sejarah = $data['sejarah'];
|
|
}
|
|
|
|
$hasRecommendation = Recommendation::where('user_id', $user->id)->exists();
|
|
|
|
if (!$hasRecommendation) {
|
|
// Simulate recommendation algorithm scores
|
|
$scores = array_fill(0, count($majoritasNames), 0);
|
|
|
|
// Random weighted scoring
|
|
foreach ($scores as $key => $score) {
|
|
$scores[$key] = rand(55, 95);
|
|
}
|
|
|
|
// Top 9 recommendations
|
|
arsort($scores);
|
|
$topScores = array_slice($scores, 0, 9, true);
|
|
|
|
$hasilRekomendasi = [];
|
|
$rank = 1;
|
|
foreach ($topScores as $majorIndex => $score) {
|
|
$hasilRekomendasi[] = [
|
|
'ranking' => $rank,
|
|
'jurusan' => $majoritasNames[$majorIndex] ?? 'Teknologi Informasi',
|
|
'skor' => round($score),
|
|
];
|
|
$rank++;
|
|
}
|
|
|
|
$recommendation = Recommendation::create([
|
|
'user_id' => $user->id,
|
|
'mtk' => $data['mtk'] ?? null,
|
|
'fisika' => $data['fisika'] ?? null,
|
|
'kimia' => $data['kimia'] ?? null,
|
|
'biologi' => $data['biologi'] ?? null,
|
|
'ekonomi' => $data['ekonomi'] ?? null,
|
|
'geografi' => $data['geografi'] ?? null,
|
|
'sosiologi' => $data['sosiologi'] ?? null,
|
|
'sejarah' => $data['sejarah'] ?? null,
|
|
'minat' => $data['minat'] ?? null,
|
|
'preferensi_studi' => $data['pref_studi'] ?? ($data['kelompok'] === 'IPA' ? 'Sains & Teknologi' : 'Sosial & Humaniora'),
|
|
'cita_cita' => $data['cita_cita'] ?? ($data['minat'] ?? null),
|
|
'prestasi' => $data['prestasi'] ?? 'Aktif',
|
|
'hasil_rekomendasi' => json_encode($hasilRekomendasi),
|
|
]);
|
|
|
|
$this->command->info(" 📊 Recommendation created (id: {$recommendation->id})");
|
|
}
|
|
|
|
// Create Chat Histories
|
|
$existingChats = ChatHistory::where('user_id', $user->id)->count();
|
|
|
|
if ($existingChats === 0) {
|
|
for ($i = 0; $i < rand(2, 5); $i++) {
|
|
$randomMessage = $chatMessages[array_rand($chatMessages)];
|
|
|
|
ChatHistory::create([
|
|
'user_id' => $user->id,
|
|
'id_sesi' => null,
|
|
'id_rekomendasi' => $recommendation->id ?? null,
|
|
'pertanyaan' => $randomMessage,
|
|
'jawaban' => 'Terima kasih atas pertanyaannya. Berdasarkan profil akademik dan minat Anda, saya merekomendasikan jurusan yang sesuai dengan kemampuan dan tujuan karir Anda.',
|
|
]);
|
|
}
|
|
|
|
$this->command->info(" 💬 Chat histories created (2-5 chats)");
|
|
}
|
|
}
|
|
|
|
$this->command->info("\n✨ Seeder selesai! 30 students + recommendations + chat histories berhasil dibuat.\n");
|
|
}
|
|
}
|