truncate(); DB::table('hasil_saw')->truncate(); DB::table('penilaian_warga')->truncate(); DB::table('warga')->truncate(); DB::statement('SET FOREIGN_KEY_CHECKS=1;'); // Ambil data Periode Aktif atau buat baru jika belum ada $periode = PeriodeSeleksi::where('status', 'aktif')->first(); if (!$periode) { $periode = PeriodeSeleksi::create([ 'nama' => 'Penyaluran BLT-DD Tahap 1', 'tanggal_mulai' => Carbon::now()->startOfMonth(), 'tanggal_selesai' => Carbon::now()->endOfMonth(), 'kuota_penerima' => 50, 'status' => 'aktif', ]); $this->command->info("Membuat Periode Seleksi otomatis..."); } // Ambil ID Kriteria $kriteriaId = [ 'C1' => Kriteria::where('kode', 'C1')->value('id'), 'C2' => Kriteria::where('kode', 'C2')->value('id'), 'C3' => Kriteria::where('kode', 'C3')->value('id'), 'C4' => Kriteria::where('kode', 'C4')->value('id'), 'C5' => Kriteria::where('kode', 'C5')->value('id'), ]; // Ambil semua data wilayah agar bisa diacak $wilayahList = \App\Models\Wilayah::all(); if ($wilayahList->isEmpty()) { $this->command->error("Tabel Wilayah kosong! Jalankan php artisan db:seed --class=WilayahSeeder terlebih dahulu."); return; } // Baca CSV $filename = base_path('Desa Pungging. Pungging Data KPM BLT Dana Desa 2022 dipakai.csv'); if (!file_exists($filename)) { $this->command->error("File CSV tidak ditemukan!"); return; } $file = fopen($filename, 'r'); $rowNum = 0; $inserted = 0; while (($row = fgetcsv($file, 1000, ';')) !== FALSE) { $rowNum++; // Data warga mulai dari baris 16 sampai 116 if ($rowNum < 16) continue; if (empty($row[1]) || empty($row[2])) break; // Berhenti jika kosong atau sampai rekap $nama = trim($row[1]); $nik = trim($row[2]); $pekerjaanCsv = trim(strtoupper($row[3])); // Pilih wilayah secara acak untuk warga ini $wilayahAcak = $wilayahList->random(); $rt_acak = str_pad(rand(1, 5), 2, '0', STR_PAD_LEFT); // Asumsi tiap RW punya RT 01-05 // Tambahkan sedikit pengacakan koordinat (sekitar 10-30 meter) agar marker tidak bertumpuk di peta GIS $lat_jitter = rand(-300, 300) / 1000000; $lng_jitter = rand(-300, 300) / 1000000; // 2. Kalkulasi Nilai Kriteria & Data Mentah // MENGHITUNG USIA DAN JENIS KELAMIN LEBIH DULU // NIK: 35 16 06 71 12 63 0011 -> 71=Tgl, 12=Bln, 63=Thn $tgl = (int) substr($nik, 6, 2); $thn = (int) substr($nik, 10, 2); $is_perempuan = false; // Perempuan tgl > 40 if ($tgl > 40) { $tgl -= 40; $is_perempuan = true; } $thnLahir = $thn > 24 ? 1900 + $thn : 2000 + $thn; $usia = date('Y') - $thnLahir; // C4: Nilai Usia $valC4 = 1; if ($usia >= 20 && $usia <= 30) $valC4 = 1; elseif ($usia >= 31 && $usia <= 40) $valC4 = 2; elseif ($usia >= 41 && $usia <= 50) $valC4 = 3; elseif ($usia >= 51 && $usia <= 60) $valC4 = 4; elseif ($usia > 60) $valC4 = 5; // C1: Pekerjaan (Logika disesuaikan dengan Usia dan Gender) $pekerjaanStr = ucfirst(strtolower($pekerjaanCsv)); $valC1 = 1; if ($usia > 60) { // Lansia di atas 60 tahun $valC1 = 1; if ($is_perempuan) { $variasi = ['Tidak Bekerja', 'Pembantu Rumah Tangga', 'Tidak Bekerja / Lansia']; } else { $variasi = ['Tidak Bekerja', 'Tidak Bekerja / Lansia', 'Serabutan (Jarang)']; } $pekerjaanStr = $variasi[array_rand($variasi)]; } else { // Usia Produktif if (str_contains($pekerjaanCsv, 'BURUH TANI') || str_contains($pekerjaanCsv, 'BURUH NELAYAN')) { $valC1 = 1; if ($is_perempuan) { $variasiBuruh = ['Buruh Tani', 'Buruh Tani', 'Buruh Tani', 'Pembantu Rumah Tangga']; } else { $variasiBuruh = ['Buruh Tani', 'Buruh Tani', 'Buruh Tani', 'Buruh Harian Lepas', 'Kuli Bangunan']; } $pekerjaanStr = $variasiBuruh[array_rand($variasiBuruh)]; } elseif (str_contains($pekerjaanCsv, 'LAIN-LAIN') || str_contains($pekerjaanCsv, 'PEDAGANG')) { $skalaAcak = rand(1, 4); if ($skalaAcak == 1) { $variasi = $is_perempuan ? ['Serabutan', 'Pembantu Rumah Tangga', 'Tidak Bekerja'] : ['Serabutan', 'Tidak Bekerja', 'Kuli Bangunan']; $pekerjaanStr = $variasi[array_rand($variasi)]; $valC1 = 1; } elseif ($skalaAcak == 2) { $variasi = $is_perempuan ? ['Pedagang Keliling', 'Peternak Kecil', 'Buruh Cuci'] : ['Petani Penggarap', 'Pedagang Keliling', 'Peternak Kecil', 'Tukang Becak']; $pekerjaanStr = $variasi[array_rand($variasi)]; $valC1 = 2; } elseif ($skalaAcak == 3) { $variasi = $is_perempuan ? ['Warung Kecil', 'Tukang Jahit', 'Pedagang Kaki Lima'] : ['Pedagang Kaki Lima', 'Warung Kecil', 'Tukang Ojek', 'Tukang Jahit']; $pekerjaanStr = $variasi[array_rand($variasi)]; $valC1 = 3; } else { $variasi = $is_perempuan ? ['Buruh Pabrik', 'Karyawan Toko', 'Guru Honorer'] : ['Buruh Pabrik', 'Karyawan Toko', 'Guru Honorer']; $pekerjaanStr = $variasi[array_rand($variasi)]; $valC1 = 4; } } elseif (str_contains($pekerjaanCsv, 'PETANI') || str_contains($pekerjaanCsv, 'NELAYAN')) { $valC1 = 2; $pekerjaanStr = 'Petani Penggarap'; } elseif (str_contains($pekerjaanCsv, 'PABRIK')) { $valC1 = 4; $pekerjaanStr = 'Buruh Pabrik'; } } // C2: Tanggungan Keluarga (Random 1-5) // C3: Kesehatan (Logika disesuaikan dengan Umur asli) $chanceC3 = rand(1, 100); if ($chanceC3 <= 80) { // Jika umur > 50, maka Lansia. Jika tidak, Produktif. if ($usia > 50) { $valC3 = 2; $kesehatanStr = 'Sehat, lanjut usia'; } else { $valC3 = 1; $kesehatanStr = 'Sehat, usia produktif'; } } else { $valC3 = rand(3, 5); if ($valC3 == 3) { $kesehatanStr = $usia > 50 ? 'Lansia tunggal / Sering sakit' : 'Sering sakit ringan'; } else { $kesehatanStr = $valC3 == 4 ? 'Sakit menahun / Disabilitas ringan' : 'Sakit kronis parah / Disabilitas berat'; } } // C5: Riwayat Bansos (85% belum pernah terima nilai 1, sisanya pernah 2-4) // Karena ini BLT DD, mayoritas penerima seharusnya yang belum terima bansos lain. $chanceC5 = rand(1, 100); if ($chanceC5 <= 85) { $valC5 = 1; $bansosStr = 'Belum pernah menerima bantuan'; } else { $valC5 = rand(2, 4); $bansosStr = $valC5 == 2 ? 'Pernah menerima (> 2 tahun lalu)' : ($valC5 == 3 ? 'Pernah menerima (1 - 2 tahun lalu)' : 'Aktif menerima 1 jenis bantuan'); } // C2: Tanggungan Keluarga (Random 1-5) $valC2 = rand(1, 5); // 1. Simpan Warga beserta Data Mentah $warga = Warga::create([ 'nama' => $nama, 'nik' => $nik, 'alamat' => 'Desa ' . $wilayahAcak->dusun, 'dusun' => $wilayahAcak->dusun, 'rt' => $rt_acak, 'rw' => $wilayahAcak->rw, 'wilayah_id' => $wilayahAcak->id, 'pekerjaan' => $pekerjaanStr, 'jumlah_tanggungan' => $valC2, 'usia' => $usia, 'status_kesehatan' => $kesehatanStr, 'riwayat_bansos' => $bansosStr, 'latitude' => $wilayahAcak->latitude + $lat_jitter, 'longitude' => $wilayahAcak->longitude + $lng_jitter, 'is_aktif' => true, ]); // Insert Penilaian $penilaianData = [ ['warga_id' => $warga->id, 'periode_id' => $periode->id, 'kriteria_id' => $kriteriaId['C1'], 'nilai' => $valC1], ['warga_id' => $warga->id, 'periode_id' => $periode->id, 'kriteria_id' => $kriteriaId['C2'], 'nilai' => $valC2], ['warga_id' => $warga->id, 'periode_id' => $periode->id, 'kriteria_id' => $kriteriaId['C3'], 'nilai' => $valC3], ['warga_id' => $warga->id, 'periode_id' => $periode->id, 'kriteria_id' => $kriteriaId['C4'], 'nilai' => $valC4], ['warga_id' => $warga->id, 'periode_id' => $periode->id, 'kriteria_id' => $kriteriaId['C5'], 'nilai' => $valC5], ]; DB::table('penilaian_warga')->insert($penilaianData); $inserted++; } fclose($file); $this->command->info("Berhasil memproses $inserted data warga beserta penilaiannya!"); } }