MIF_E31230745/database/seeders/StudentRecommendationSeeder...

287 lines
12 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\User;
use App\Models\Recommendation;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class StudentRecommendationSeeder extends Seeder
{
/**
* Run the database seeds.
* Data siswa dan rekomendasi dengan logika yang akurat
*/
public function run(): void
{
// Majors data mapping untuk rekomendasi
$majorsWeights = [
'teknologi_informasi' => ['mtk' => 0.30, 'fisika' => 0.25, 'kimia' => 0.15, 'biologi' => 0.05],
'teknik' => ['mtk' => 0.25, 'fisika' => 0.35, 'kimia' => 0.20, 'biologi' => 0.05],
'produksi_pertanian' => ['mtk' => 0.15, 'biologi' => 0.35, 'kimia' => 0.25, 'fisika' => 0.10],
'peternakan' => ['biologi' => 0.40, 'kimia' => 0.20, 'mtk' => 0.15, 'fisika' => 0.05],
'manajemen_agribisnis' => ['ekonomi' => 0.35, 'geografi' => 0.25, 'mtk' => 0.20, 'sosiologi' => 0.15],
'akuntansi' => ['ekonomi' => 0.40, 'mtk' => 0.25, 'sejarah' => 0.15, 'sosiologi' => 0.10],
'bahasa_komunikasi' => ['sosiologi' => 0.30, 'sejarah' => 0.25, 'ekonomi' => 0.20, 'geografi' => 0.15],
];
$studentData = [
// IPA Students
[
'name' => 'Adi Pratama',
'nis' => '001',
'kelompok_asal' => 'IPA',
'values' => ['mtk' => 92, 'fisika' => 88, 'kimia' => 85, 'biologi' => 78],
'minat' => 'Logika Komputer',
'preferensi_studi' => 'Sains & Teknologi',
'cita_cita' => 'Software Engineer',
'prestasi' => 'Juara 2 Olimpiade Informatika',
'expected_major' => 'Teknologi Informasi',
],
[
'name' => 'Bella Maharani',
'nis' => '002',
'kelompok_asal' => 'IPA',
'values' => ['mtk' => 85, 'fisika' => 90, 'kimia' => 88, 'biologi' => 80],
'minat' => 'Mesin & Otomasi',
'preferensi_studi' => 'Sains & Teknologi',
'cita_cita' => 'Insinyur Mesin',
'prestasi' => 'Juara Lomba Robotika Regional',
'expected_major' => 'Teknik',
],
[
'name' => 'Citra Dewi',
'nis' => '003',
'kelompok_asal' => 'IPA',
'values' => ['mtk' => 78, 'fisika' => 75, 'kimia' => 88, 'biologi' => 92],
'minat' => 'Alam Tanaman',
'preferensi_studi' => 'Pertanian & Lingkungan',
'cita_cita' => 'Agronomis',
'prestasi' => 'Juara Pameran Tanaman Hidroponik',
'expected_major' => 'Produksi Pertanian',
],
[
'name' => 'Doni Kusuma',
'nis' => '004',
'kelompok_asal' => 'IPA',
'values' => ['mtk' => 82, 'fisika' => 80, 'kimia' => 92, 'biologi' => 88],
'minat' => 'Kimia & Biologi',
'preferensi_studi' => 'Kesehatan & Ilmu Hayat',
'cita_cita' => 'Peneliti Biologi',
'prestasi' => 'Penulis Jurnal Ilmiah Tingkat Sekolah',
'expected_major' => 'Peternakan',
],
// IPS Students
[
'name' => 'Eka Prasetyo',
'nis' => '005',
'kelompok_asal' => 'IPS',
'values' => ['ekonomi' => 90, 'geografi' => 87, 'sosiologi' => 85, 'sejarah' => 80],
'minat' => 'Bisnis',
'preferensi_studi' => 'Bisnis & Manajemen',
'cita_cita' => 'Entrepreneur Muda',
'prestasi' => 'Juara Kompetisi Bisnis Plan Nasional',
'expected_major' => 'Manajemen Agribisnis',
],
[
'name' => 'Fitri Handayani',
'nis' => '006',
'kelompok_asal' => 'IPS',
'values' => ['ekonomi' => 88, 'mtk' => 85, 'sejarah' => 82, 'sosiologi' => 80],
'minat' => 'Akuntansi',
'preferensi_studi' => 'Bisnis & Manajemen',
'cita_cita' => 'Akuntan Profesional',
'prestasi' => 'Finalis Kompetisi Akuntansi Wilayah',
'expected_major' => 'Akuntansi',
],
[
'name' => 'Gita Salsabila',
'nis' => '007',
'kelompok_asal' => 'IPS',
'values' => ['sosiologi' => 92, 'sejarah' => 88, 'ekonomi' => 80, 'geografi' => 85],
'minat' => 'Komunikasi Sosial',
'preferensi_studi' => 'Seni & Komunikasi',
'cita_cita' => 'Presenter Berita',
'prestasi' => 'Juara Debat Tingkat Propinsi',
'expected_major' => 'Bahasa Komunikasi',
],
[
'name' => 'Hendra Wijaya',
'nis' => '008',
'kelompok_asal' => 'IPS',
'values' => ['ekonomi' => 85, 'geografi' => 88, 'mtk' => 80, 'sosiologi' => 82],
'minat' => 'Bisnis',
'preferensi_studi' => 'Bisnis & Manajemen',
'cita_cita' => 'Manajer Bisnis',
'prestasi' => 'Pengusaha Kuliner Muda',
'expected_major' => 'Manajemen Agribisnis',
],
// More diverse students
[
'name' => 'Ibu Musim',
'nis' => '009',
'kelompok_asal' => 'IPA',
'values' => ['mtk' => 88, 'fisika' => 85, 'kimia' => 86, 'biologi' => 84],
'minat' => 'Teknologi & Inovasi',
'preferensi_studi' => 'Sains & Teknologi',
'cita_cita' => 'Product Manager Tech',
'prestasi' => 'Top 10 Innovation Challenge',
'expected_major' => 'Teknologi Informasi',
],
[
'name' => 'Joko Santoso',
'nis' => '010',
'kelompok_asal' => 'IPA',
'values' => ['fisika' => 92, 'mtk' => 90, 'kimia' => 84, 'biologi' => 76],
'minat' => 'Listrik & Energi',
'preferensi_studi' => 'Sains & Teknologi',
'cita_cita' => 'Insinyur Elektro',
'prestasi' => 'Juara Kompetisi Energi Terbarukan',
'expected_major' => 'Teknik',
],
];
foreach ($studentData as $data) {
// Create student user
$user = User::create([
'name' => $data['name'],
'email' => strtolower(str_replace(' ', '.', $data['name'])) . '@student.polije.ac.id',
'password' => Hash::make('password123'),
'role' => 'siswa',
'nis' => $data['nis'],
'kelompok_asal' => $data['kelompok_asal'],
'foto' => null,
]);
// Create recommendation with logical scoring
$rekomendasiHasil = $this->generateRecommendationResult(
$data['values'],
$data['preferensi_studi'],
$data['expected_major'],
$majorsWeights
);
$recommendation = Recommendation::create([
'user_id' => $user->id,
'mtk' => $data['values']['mtk'] ?? null,
'fisika' => $data['values']['fisika'] ?? null,
'kimia' => $data['values']['kimia'] ?? null,
'biologi' => $data['values']['biologi'] ?? null,
'ekonomi' => $data['values']['ekonomi'] ?? null,
'geografi' => $data['values']['geografi'] ?? null,
'sosiologi' => $data['values']['sosiologi'] ?? null,
'sejarah' => $data['values']['sejarah'] ?? null,
'minat' => $data['minat'],
'preferensi_studi' => $data['preferensi_studi'],
'cita_cita' => $data['cita_cita'],
'prestasi' => $data['prestasi'],
'hasil_rekomendasi' => $rekomendasiHasil,
]);
// Create sample chat history
$sessionId = Str::uuid()->toString();
$this->createSampleChatHistory($user->id, $recommendation->id, $sessionId, $data);
}
$this->command->info('Student dan Recommendation data berhasil diisi dengan ' . count($studentData) . ' siswa!');
}
/**
* Generate logical recommendation result based on values
*/
private function generateRecommendationResult($values, $preferensi, $expectedMajor, $majorsWeights)
{
$majors = [
[
'jurusan' => 'Teknologi Informasi',
'skor' => $this->calculateScore($values, ['mtk' => 0.30, 'fisika' => 0.25, 'kimia' => 0.15, 'biologi' => 0.05]),
'detail' => 'Cocok untuk minat teknologi dan programming.'
],
[
'jurusan' => 'Teknik',
'skor' => $this->calculateScore($values, ['mtk' => 0.25, 'fisika' => 0.35, 'kimia' => 0.20, 'biologi' => 0.05]),
'detail' => 'Sesuai dengan kemampuan fisika dan matematika tinggi.'
],
[
'jurusan' => 'Produksi Pertanian',
'skor' => $this->calculateScore($values, ['mtk' => 0.15, 'biologi' => 0.35, 'kimia' => 0.25, 'fisika' => 0.10]),
'detail' => 'Cocok untuk minat di bidang pertanian dan lingkungan.'
],
[
'jurusan' => 'Peternakan',
'skor' => $this->calculateScore($values, ['biologi' => 0.40, 'kimia' => 0.20, 'mtk' => 0.15, 'fisika' => 0.05]),
'detail' => 'Bidang peternakan dan manajemen hewan ternak.'
],
[
'jurusan' => 'Manajemen Agribisnis',
'skor' => $this->calculateScore($values, ['ekonomi' => 0.35, 'geografi' => 0.25, 'mtk' => 0.20, 'sosiologi' => 0.15]),
'detail' => 'Kombinasi bisnis dan pertanian yang sempurna.'
],
[
'jurusan' => 'Akuntansi',
'skor' => $this->calculateScore($values, ['ekonomi' => 0.40, 'mtk' => 0.25, 'sejarah' => 0.15, 'sosiologi' => 0.10]),
'detail' => 'Untuk yang tertarik dengan keuangan dan akuntansi.'
],
[
'jurusan' => 'Bahasa Komunikasi',
'skor' => $this->calculateScore($values, ['sosiologi' => 0.30, 'sejarah' => 0.25, 'ekonomi' => 0.20, 'geografi' => 0.15]),
'detail' => 'Bidang komunikasi dan seni untuk yang ekspresif.'
],
];
// Sort by score descending
usort($majors, fn($a, $b) => $b['skor'] <=> $a['skor']);
return array_slice($majors, 0, 3);
}
/**
* Calculate score based on weighted values
*/
private function calculateScore($values, $weights)
{
$score = 0;
$totalWeight = 0;
foreach ($weights as $subject => $weight) {
if (isset($values[$subject])) {
$score += ($values[$subject] / 100) * $weight;
$totalWeight += $weight;
}
}
return $totalWeight > 0 ? round(($score / $totalWeight) * 100, 1) : 0;
}
/**
* Create sample chat history for a student
*/
private function createSampleChatHistory($userId, $recommendationId, $sessionId, $studentData)
{
$chatSamples = [
[
'pertanyaan' => 'Jurusan apa yang cocok untuk saya?',
'jawaban' => 'Berdasarkan nilai dan minat Anda, ' . $studentData['expected_major'] . ' adalah pilihan terbaik. Dengan prestasi di bidang ' . strtolower($studentData['prestasi']) . ', Anda memiliki potensi besar untuk sukses.'
],
[
'pertanyaan' => 'Mengapa jurusan tersebut cocok untuk saya?',
'jawaban' => 'Karena nilai ' . implode(', ', array_keys($studentData['values'])) . ' Anda menunjukkan keunggulan di area yang relevan dengan jurusan tersebut.'
],
];
foreach ($chatSamples as $index => $chat) {
\App\Models\ChatHistory::create([
'user_id' => $userId,
'id_sesi' => $sessionId,
'id_rekomendasi' => $recommendationId,
'pertanyaan' => $chat['pertanyaan'],
'jawaban' => $chat['jawaban'],
]);
}
}
}