Repository navigation
Feat: Import dan Pengelolaan Data Lokasi (Tipe Lokasi) Multi-Desa via API Database Gabungan - #1302
Open
pandigresik wants to merge 1 commit into
Open
pandigresik wants to merge 1 commit into
pandigresik wants to merge 1 commit into
Conversation
Contributor
|
🔄 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.
Pull Request: Feat: Import dan Pengelolaan Data Lokasi (Tipe Lokasi) Multi-Desa via API Database Gabungan
Description
Menambahkan fitur impor massal dan pengelolaan Data Lokasi (
plan) di OpenKab yang disimpan ke API database gabungan (bukan database lokal), sehingga OpenSID dapat memakai Jenis/Kategori yang seragam. Template Excel kini memuatNama Desasebagai kolom per-baris (dropdown ke sheet "Daftar Desa") sehingga satu file dapat memuat banyak desa, dilengkapi CRUD manual, filter wilayah berjenjang, dan hapus massal.Changes made:
app/Exports/LokasiTemplateExport.phpmenghasilkan.xlsxdengan kolomNama Desa | Nama Lokasi | Latitude | Longitude | Keterangan, sheet referensi "Daftar Desa", dan dropdown (data validation) pada kolomNama Desa.app/Imports/LokasiImport.phpmendeteksi baris header, memvalidasi per baris (Nama Desawajib,Nama Lokasiwajib/max 50, koordinat), dan menolak baris kosong/tidak valid tanpa menggagalkan seluruh file.app/Http/Controllers/PlanController.php— import batch, unduh template, detail (untuk modal edit), store/update/hapus manual, dan hapus massal; memetakanNama Desa→config_idper baris, tolak nama tidak dikenal/ganda, dan pre-check duplikat per desa (insert-only).app/Http/Requests/Peta/*(ImportLokasiRequest,DownloadTemplateLokasiRequest,StoreLokasiRequest,UpdateLokasiRequest,BulkDestroyLokasiRequest) danapp/Rules/ValidKodeDesa.php.app/Services/BaseApiService.phpmenambahapiCall/apiGet/apiPost/apiPut/apiDelete;app/Services/PemetaanService.phpmenambahplanImport,planBulkDelete, serta memperbaiki endpointplanUpdate.resources/views/peta/lokasi/filter.blade.php(pola seperti/penduduk: Kabupaten→Kecamatan→Desa + Status + Jenis/Kategori, tombol Tampilkan/Reset),table.blade.php(kolom Desa + checkbox), danjs/app.blade.php(DataTable, aksi hapus massal satu request).app/Support/Coordinate.php(lat −11..6, lng 95..141) dipakai diStoreLokasiRequest,UpdateLokasiRequest, danLokasiImport.routes/web.phpmenambahGET /plan/import/template,POST /plan/import,GET /plan/detail/{id},POST /plan/store,PUT /plan/update/{id},DELETE /plan/hapus(massal),DELETE /plan/hapus/{id}.tests/Feature/Peta/LokasiImportTest.php(21 tes) dan smoke test browser (tests/Browser/SmokeLokasiTest.php,SmokeLokasiImportTest.php).Reason for change:
Impact of change:
✅ Efisiensi: Import massal multi-desa dalam satu file dan satu panggilan batch ke API.
✅ Konsistensi data: Jenis/Kategori mengikuti master terpusat; duplikat dicegah per desa (insert-only).
✅ Keamanan: Semua operasi tulis (termasuk hapus massal) melalui server-side proxy dengan bearer token; API key tidak terekspos ke browser.
✅ Usability: Filter wilayah berjenjang (pola
/penduduk), kolom Desa, dan hapus massal memudahkan pengelolaan.Related Issue
#1295
Steps to Reproduce
Before (problem):
/plan).POST /plan/update/{id}tidak cocok dengan request_method=PUT; endpoint update API keliru).After (solution):
/plan) → klik Import..xlsx.DELETE /api/v1/plan/?ids[]=....Testing on related features:
Checklist
tests/Feature/Peta/LokasiImportTest.php)Technical Details
Technical Explanation
Alur import:
GET /plan/import/template?jenis&kategori→LokasiTemplateExportmenulis xlsx: sheetData Lokasi(baris konteks Jenis/Kategori + header kolom) dan sheetDaftar Desa; dropdownNama Desadisuntikkan ke XML xlsx (rentang kolom A).POST /plan/import(multipart) →LokasiImportmemvalidasi per baris →PlanController::processImport():nama_desa→config_idper baris (tolak kosong/tidak dikenal/ganda),config_id+ref_point+nama, insert-only),POST /api/v1/plan/import.Payload import (batch):
{ "data": [ { "config_id": 1, "nama": "Kantor Desa", "desk": "pusat", "lat": "-6.2", "lng": "106.8", "ref_point": 10 }, { "config_id": 2, "nama": "Posyandu", "desk": "", "lat": "-6.3", "lng": "106.7", "ref_point": 10 } ] }CRUD manual & hapus massal (server-side proxy via
BaseApiServicebearer token):POST /api/v1/plan/store→ item plan{ config_id, nama, desk, lat, lng, ref_point }PUT /api/v1/plan/update/{id}→ payload yang samaDELETE /api/v1/plan/hapus/{id}→ hapus satuDELETE /api/v1/plan/?ids[]=1&ids[]=2→ hapus massal (satu request)Filter tabel dikirim ke
GET /api/v1/plansebagaifilter[status],filter[point],filter[subpoint],filter[kode_kabupaten],filter[kode_kecamatan],filter[kode_desa].Batas koordinat Indonesia (
App\Support\Coordinate): lintang −11..6, bujur 95..141 (dipakai pada validasi FormRequest dan import per baris).Configuration changes
Tidak ada perubahan konfigurasi baru. Menggunakan konfigurasi API database gabungan yang sudah ada (
databaseGabunganUrl+ bearer API key pada tabelsettings).Dependencies
https://github.com/OpenSID/API-Database-Gabungan/pull/471
Testing
Manual Testing
Nama Desaper baris dengan dropdown dari sheet "Daftar Desa"Nama Desakosong / tidak dikenal / ganda ditolak dengan pesan jelasDELETE /api/v1/plan/?ids[]=...Automated Testing
SmokeLokasiTest,SmokeLokasiImportTestScreenshots / Video
simplescreenrecorder-2026-10-12_10.10.58.mp4
Breaking Changes
Perubahan kontrak API database gabungan (perlu koordinasi dengan pemilik API):
POST /api/v1/plan/importmenerima payload batch{ data: [ { config_id, nama, desk, lat, lng, ref_point } ] }(config_id/ref_pointinteger;desk= keterangan). Tidak lagi memakaikode_desa/nama_desa/jenis/kategori/sumberdi level batch.DELETE /api/v1/plan/(bulk) menerima query string arrayids[].PUT /api/v1/plan/update/{id}memakai item plan{ config_id, nama, desk, lat, lng, ref_point }.GET /api/v1/plandisarankan mengembalikannama_desaper baris untuk kolom "Desa".Migration Guide
Tidak diperlukan migrasi database lokal (data lokasi disimpan di API database gabungan). Perlu pembaruan/peluncuran endpoint API di sisi database gabungan sebelum fitur dipakai di produksi.
Additional notes: Fitur bergantung pada kesiapan endpoint API database gabungan (
plan/import,plan/store,plan/update,plan/bulk delete, dannama_desapadaGET /plan). Mohon konfirmasi kontrak API sebelum merge/rilis.