234 lines
10 KiB
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!");
|
|
}
|
|
}
|