Fix: Perbaikan error statistik pada halaman Data Pokok Pendidikan dan Ketenagakerjaan - #1263
Merged
Conversation
|
🔄 AI PR Review sedang antri di server...
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
issue # #1260
penyesuaian di API Gabungan https://github.com/OpenSID/API-Database-Gabungan/pull/458
🎯 Deskripsi
Pull request ini memperbaiki bug pada halaman Data Pokok Pendidikan (
/data-pokok/pendidikan) dan Data Pokok Ketenagakerjaan (/data-pokok/ketenagakerjaan) di mana grafik statistik gagal dimuat dan memunculkan pop-up errorError! Gagal mengambil data dari API(respons HTTP 500 dari API Proxy).Penyebab utamanya adalah kesalahan arah endpoint pada pemanggilan
apiProxyGet()di view:pendidikan/statistikdanketenagakerjaan/statistik, padahal route yang terdaftar di API Database Gabungan berada di bawah prefixdata-presisi, yaitudata-presisi/pendidikan/statistikdandata-presisi/ketenagakerjaan/statistik. Akibatnya upstream mengembalikan404 Resource not found, exception ditangkap olehApiProxyService::callApi(), dan proxy membalas{"error": "Gagal mengambil data dari API"}dengan status 500.pendidikan_dalam_kk,pendidikan_sedang_ditempuh,keikutsertaan_kip,jenis_pendidikan_kesetaraan_yg_diikuti), sedangkan halaman pendidikan membutuhkan kategoripartisipasi_sekolah(Statistik Partisipasi Sekolah) danijazah_tertinggi(Statistik Ijazah Tertinggi) yang bersumber dari data DTKS anggota (dtks_anggota).Dengan menambahkan dukungan kedua kategori DTKS tersebut pada repository statistik pendidikan di sisi upstream, kedua grafik kini menampilkan data yang benar dan konsisten dengan kolom-kolom pada tabel Data Pendidikan.
🛠️ Perubahan yang Dilakukan
1.
resources/views/data_pokok/pendidikan/chart.blade.php(OpenKab)Fix — Koreksi endpoint statistik pada grafik Pendidikan:
apiProxyGet('pendidikan/statistik', ...)menjadiapiProxyGet('data-presisi/pendidikan/statistik', ...)agar sesuai dengan route yang terdaftar di API Database Gabungan.2.
resources/views/data_pokok/ketenagakerjaan/chart.blade.php(OpenKab)Fix — Koreksi endpoint statistik pada grafik Ketenagakerjaan:
apiProxyGet('ketenagakerjaan/statistik', ...)menjadiapiProxyGet('data-presisi/ketenagakerjaan/statistik', ...)agar sesuai dengan route yang terdaftar di API Database Gabungan.3.
app/Repositories/DataPresisiPendidikanRepository.php(API-Database-Gabungan)Add — Dukungan kategori statistik DTKS
partisipasi_sekolahdanijazah_tertinggi:pendidikan_dalam_kk,pendidikan_sedang_ditempuh,keikutsertaan_kip,jenis_pendidikan_kesetaraan_yg_diikuti) tanpa perubahan perilaku.listStatistikDtks()yang menghitung statistik dari tabeldtks_anggotamenggunakanleftJointerhadap tabel referensi:partisipasi_sekolah→tweb_penduduk_pendidikan(dtks_anggota.kd_partisipasi_sekolah)ijazah_tertinggi→tweb_penduduk_pendidikan_kk(dtks_anggota.kd_ijazah_tertinggi)filterWilayah('dtks_anggota')agar filter wilayah (kode_kabupaten,kode_kecamatan,config_desa) tetap berlaku, dan memetakan nilainull/kosong menjadiBELUM MENGISIsesuai konvensi statistik yang sudah ada.JUMLAH/TOTALdan sorting padaDataPresisiPendidikanController::statistik()tetap berjalan tanpa perubahan.tahundiabaikan untuk kategori DTKS karena data DTKS tidak terikat pada tahun data presisi.public function listStatistik(string $kategori, int|string $tahun): Collection { + if (in_array($kategori, ['partisipasi_sekolah', 'ijazah_tertinggi'], true)) { + return $this->listStatistikDtks($kategori); + } + $allowedColumns = [ 'pendidikan_dalam_kk', 'pendidikan_sedang_ditempuh', 'keikutsertaan_kip', 'jenis_pendidikan_kesetaraan_yg_diikuti', ]; if (! in_array($kategori, $allowedColumns, true)) { return collect(); } $tahun = (int) $tahun; return DataPresisiPendidikan::whereRelation('tahun', static fn ($q) => $q->whereTahun($tahun))->selectRaw($kategori.' as nilai, count(*) as jumlah')->filterWilayah()->groupBy($kategori)->get()->groupBy( static function ($item) { return ($item->nilai === null || $item->nilai === '') ? 'BELUM MENGISI' : $item->nilai; } ); } + +/** + * Statistik kategori pendidikan dari data DTKS anggota. + * Kategori ini tidak terkait tahun data presisi, sehingga parameter tahun diabaikan. + */ +private function listStatistikDtks(string $kategori): Collection +{ + $references = [ + 'partisipasi_sekolah' => ['tweb_penduduk_pendidikan', 'kd_partisipasi_sekolah'], + 'ijazah_tertinggi' => ['tweb_penduduk_pendidikan_kk', 'kd_ijazah_tertinggi'], + ]; + + [$referenceTable, $foreignKey] = $references[$kategori]; + + return DtksAnggota::leftJoin($referenceTable, $referenceTable.'.id', '=', 'dtks_anggota.'.$foreignKey) + ->selectRaw($referenceTable.'.nama as nilai, count(*) as jumlah') + ->filterWilayah('dtks_anggota') + ->groupBy($referenceTable.'.nama') + ->get() + ->groupBy( + static function ($item) { + return ($item->nilai === null || $item->nilai === '') ? 'BELUM MENGISI' : $item->nilai; + } + ); +}4.
tests/Feature/DataPresisiPendidikanControllerApiTest.php(API-Database-Gabungan)Test — Penambahan test untuk kategori statistik baru:
test_get_statistik_partisipasi_sekolah()yang memverifikasi endpoint/api/v1/data-presisi/pendidikan/statistik?kategori=partisipasi_sekolah&kode_kabupaten=5102mengembalikan status200dengan strukturdata.*.attributes.{nilai, jumlah}.test_get_statistik_ijazah_tertinggi()dengan verifikasi yang sama untuk kategoriijazah_tertinggi.markTestSkippedbila dataDtksAnggotatidak tersedia, mengikuti konvensi test statistik yang sudah ada.✅ Test Cases yang Diimplementasikan
/data-pokok/pendidikantermuat tanpa pop-up error dan menampilkan data./data-pokok/ketenagakerjaantermuat normal.api-proxy/get?endpoint=data-presisi/pendidikan/statistik&kategori=partisipasi_sekolah&kode_kabupaten=5102mengembalikan status200dengan data (nilai,jumlah) yang valid.api-proxy/get?endpoint=data-presisi/pendidikan/statistik&kategori=ijazah_tertinggi&kode_kabupaten=5102mengembalikan status200dengan data (nilai,jumlah) yang valid.pendidikan_dalam_kk,pendidikan_sedang_ditempuh,keikutsertaan_kip,jenis_pendidikan_kesetaraan_yg_diikuti) tetap berperilaku sama (tanpa regresi).DataPresisiPendidikanControllerApiTestlulus (18 passed) termasuk 2 test baru.📸 Cara Menjalankan Uji Coba Manual
database_gabungan_api_key) sudah terisi./data-pokok/pendidikan.Error! Gagal mengambil data dari API./data-pokok/ketenagakerjaan.http://127.0.0.1:8000/api-proxy/get?endpoint=data-presisi/pendidikan/statistik&kategori=partisipasi_sekolah&kode_kabupaten=5102http://127.0.0.1:8000/api-proxy/get?endpoint=data-presisi/pendidikan/statistik&kategori=ijazah_tertinggi&kode_kabupaten=5102200berisidatadengan atributnilaidanjumlah.🤖 Cara Menjalankan Uji Coba Otomatis (Automated Test)
Jalankan test pada repository API-Database-Gabungan (provider):
php artisan test tests/Feature/DataPresisiPendidikanControllerApiTest.phpDan test pada repository OpenKab (consumer) untuk memastikan API Proxy tidak terpengaruh:
php artisan test tests/Feature/Http/Controllers/ApiProxyControllerTest.php📸 Screenshot atau Video