MIF_E31231754/database/seeders/DataWargaSeeder.php

234 lines
10 KiB
PHP

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use App\Models\Warga;
use App\Models\PenilaianWarga;
use App\Models\Kriteria;
use App\Models\PeriodeSeleksi;
use Carbon\Carbon;
class DataWargaSeeder extends Seeder
{
public function run(): void
{
// Nonaktifkan foreign key checks untuk bersihkan tabel
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
DB::table('detail_normalisasi')->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!");
}
}