sista_mif_ta/sista_mif/app/Http/Controllers/KemendikDataController.php

111 lines
4.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\KemendikRawData;
use Illuminate\Support\Facades\DB;
class KemendikDataController extends Controller
{
public function index()
{
$stats = [
'total_kemendik' => KemendikRawData::count(),
];
$keterangan = [];
$csvText = app(\App\Services\FastApiWorkerService::class)->getKemendikKeteranganCsv();
if ($csvText) {
$lines = explode("\n", trim($csvText));
if (count($lines) > 0) {
$rawHeaders = str_getcsv(trim($lines[0]), ';');
$headers = array_map('trim', $rawHeaders);
for ($i = 1; $i < count($lines); $i++) {
$rowStr = trim($lines[$i]);
if ($rowStr === '') continue;
$row = str_getcsv($rowStr, ';');
foreach ($headers as $index => $header) {
$val = trim($row[$index] ?? '');
if ($val !== '') {
if (preg_match('/^(\d+)\s*-\s*(.*)/', $val, $matches)) {
$keterangan[$header][$matches[1]] = $val;
} else {
$keterangan[$header][$val] = $val;
}
}
}
}
}
}
// Optimasi OOM: Gunakan cursor() alih-alih all()
$statusCounts = [];
$instansiCounts = [];
$kesesuaianCounts = [];
$levelCounts = [];
$pendapatanRaw = [];
$mapLokasi = [];
foreach (KemendikRawData::cursor() as $r) {
$raw = $r->raw_data;
if (!$raw) continue;
$this->incrementCount($statusCounts, $raw, 'F8 (Jelaskan status Anda saat ini?)', $keterangan);
$this->incrementCount($instansiCounts, $raw, 'F1101 (Apa jenis perusahaan/instansi/institusi tempat anda bekerja sekarang?)', $keterangan);
$this->incrementCount($kesesuaianCounts, $raw, 'F14 (Seberapa erat hubungan bidang studi dengan pekerjaan Anda?)', $keterangan);
$this->incrementCount($levelCounts, $raw, 'F5d (Apa tingkatan tempat kerja Anda?)', $keterangan);
$pendapatanVal = floatval($raw['F505 (Berapa rata-rata pendapatan Anda per bulan?)'] ?? 0);
if ($pendapatanVal > 0) {
$pendapatanRaw[] = $pendapatanVal;
}
$lokasi = trim($raw['F5a2 (Dimana lokasi kabupaten/kota tempat Anda bekerja?)'] ?? '');
if ($lokasi) {
$mapLokasi[$lokasi] = ($mapLokasi[$lokasi] ?? 0) + 1;
}
}
$chartPendapatan = collect($pendapatanRaw)->reduce(function($carry, $v) {
if ($v < 2000000) $carry['< 2 Juta']++;
elseif ($v <= 4000000) $carry['2 - 4 Juta']++;
elseif ($v <= 6000000) $carry['4 - 6 Juta']++;
else $carry['> 6 Juta']++;
return $carry;
}, ['< 2 Juta' => 0, '2 - 4 Juta' => 0, '4 - 6 Juta' => 0, '> 6 Juta' => 0]);
$chartPendapatan = array_filter($chartPendapatan);
$kabupatenCoords = app(\App\Services\FastApiWorkerService::class)->getKabupatenCoords() ?? [];
$charts = [
'status' => collect($statusCounts),
'instansi' => collect($instansiCounts),
'kesesuaian' => collect($kesesuaianCounts),
'pendapatan' => $chartPendapatan,
'level' => collect($levelCounts),
'map_lokasi' => collect($mapLokasi),
'coords' => $kabupatenCoords
];
return view('kemendik', [
'stats' => $stats,
'charts' => $charts,
'kemendik_data' => KemendikRawData::orderBy('imported_at', 'desc')->paginate(10),
'keterangan' => $keterangan
]);
}
private function incrementCount(&$countsArray, $raw, $key, $keterangan)
{
$val = trim($raw[$key] ?? '');
if ($val !== '') {
$mapped = $keterangan[$key][$val] ?? $val;
$countsArray[$mapped] = ($countsArray[$mapped] ?? 0) + 1;
}
}
}