diff --git a/povertymap/api/ibadah.php b/povertymap/api/ibadah.php
index 405b249..dd96362 100644
--- a/povertymap/api/ibadah.php
+++ b/povertymap/api/ibadah.php
@@ -108,12 +108,12 @@ if ($method === 'PUT') {
$oldData = $old->fetch();
if (!$oldData) jsonResponse(['success'=>false,'error'=>'Tidak ditemukan'], 404);
- // Surveyor hanya bisa edit milik sendiri yang masih pending
+ // Surveyor hanya bisa edit milik sendiri yang masih pending atau rejected
if ($user['role'] === 'surveyor') {
if ((int)$oldData['surveyor_id'] !== $user['id']) {
jsonResponse(['success'=>false,'error'=>'Anda hanya bisa edit data milik Anda'], 403);
}
- if ($oldData['status'] !== 'pending') {
+ if ($oldData['status'] !== 'pending' && $oldData['status'] !== 'rejected') {
jsonResponse(['success'=>false,'error'=>'Data yang sudah diverifikasi tidak bisa diedit'], 403);
}
}
@@ -131,6 +131,14 @@ if ($method === 'PUT') {
$vals[] = in_array($f,['lat','lng']) ? (float)$body[$f] : ($f==='radius' ? (int)$body[$f] : $body[$f]);
}
}
+
+ if ($user['role'] === 'surveyor') {
+ $fields[] = "status = ?";
+ $vals[] = 'pending';
+ $fields[] = "alasan_penolakan = ?";
+ $vals[] = null;
+ }
+
if (empty($fields)) jsonResponse(['success'=>false,'error'=>'Tidak ada data diubah'], 422);
$vals[] = $id;
$db->prepare("UPDATE rumah_ibadah SET ".implode(',',$fields)." WHERE id = ?")->execute($vals);
diff --git a/povertymap/api/warga.php b/povertymap/api/warga.php
index 6b7b067..ae5176a 100644
--- a/povertymap/api/warga.php
+++ b/povertymap/api/warga.php
@@ -142,12 +142,12 @@ if ($method === 'PUT') {
$oldData = $old->fetch();
if (!$oldData) jsonResponse(['success'=>false,'error'=>'Tidak ditemukan'], 404);
- // Surveyor hanya bisa edit milik sendiri yang masih pending
+ // Surveyor hanya bisa edit milik sendiri yang masih pending atau rejected
if ($user['role'] === 'surveyor') {
if ((int)$oldData['surveyor_id'] !== $user['id']) {
jsonResponse(['success'=>false,'error'=>'Anda hanya bisa edit data milik Anda'], 403);
}
- if ($oldData['status'] !== 'pending') {
+ if ($oldData['status'] !== 'pending' && $oldData['status'] !== 'rejected') {
jsonResponse(['success'=>false,'error'=>'Data yang sudah diverifikasi tidak bisa diedit'], 403);
}
}
@@ -184,6 +184,14 @@ if ($method === 'PUT') {
}
}
}
+
+ if ($user['role'] === 'surveyor') {
+ $fields[] = "status = ?";
+ $vals[] = 'pending';
+ $fields[] = "alasan_penolakan = ?";
+ $vals[] = null;
+ }
+
if (empty($fields)) jsonResponse(['success'=>false,'error'=>'Tidak ada data diubah'], 422);
// jika koordinat berubah dan data verified, cari ulang ibadah terdekat
diff --git a/povertymap/index.html b/povertymap/index.html
index 7917cfd..cc03437 100644
--- a/povertymap/index.html
+++ b/povertymap/index.html
@@ -3135,6 +3135,16 @@
if (!data) return;
const editable = canEdit(type, data);
footer.style.display = editable ? 'flex' : 'none';
+
+ const saveBtn = document.getElementById('ep-save');
+ if (saveBtn) {
+ if (data.status === 'rejected') {
+ saveBtn.innerHTML = ' Ajukan Ulang';
+ } else {
+ saveBtn.innerHTML = ' Simpan';
+ }
+ }
+
document.getElementById('ep-title').innerHTML = type === 'ibadah' ? ` Edit Ibadah` : ' Edit Warga';
if (type === 'ibadah') {
const ib = data;
@@ -3200,12 +3210,19 @@
async function saveEdit() {
const { type, id } = editState;
if (!type || !id) return;
+ const data = type === 'ibadah'
+ ? (ibadahLayer[id]?.data || cachedIbadah.find(x => x.id == id))
+ : (wargaLayer[id]?.data || cachedWarga.find(x => x.id == id));
+ const isRejected = data?.status === 'rejected';
const btn = document.getElementById('ep-save');
- btn.disabled = true; btn.innerHTML = ' Menyimpan...';
+ btn.disabled = true;
+ btn.innerHTML = isRejected
+ ? ' Mengajukan...'
+ : ' Menyimpan...';
try {
let res;
if (type === 'ibadah') {
- const ib = ibadahLayer[id]?.data || cachedIbadah.find(x => x.id == id);
+ const ib = data;
res = await fetch(API.ibadah + '?id=' + id, {
method: 'PUT', headers: { 'Content-Type': 'application/json' }, credentials: 'include',
body: JSON.stringify({
@@ -3221,7 +3238,7 @@
})
}).then(r => r.json());
} else {
- const w = wargaLayer[id]?.data || cachedWarga.find(x => x.id == id);
+ const w = data;
res = await fetch(API.warga + '?id=' + id, {
method: 'PUT', headers: { 'Content-Type': 'application/json' }, credentials: 'include',
body: JSON.stringify({
@@ -3239,14 +3256,20 @@
}
if (res && !res.success) {
showToast('Gagal menyimpan: ' + (res.error || 'Terjadi kesalahan'), 'error');
- btn.disabled = false; btn.innerHTML = ' Simpan';
+ btn.disabled = false;
+ btn.innerHTML = isRejected
+ ? ' Ajukan Ulang'
+ : ' Simpan';
return;
}
- showToast('Perubahan disimpan!', 'success');
+ showToast(isRejected ? 'Data berhasil diajukan ulang!' : 'Perubahan disimpan!', 'success');
closeEditPanel(); await loadAll();
if (currentPage === 'daftar' || currentPage === 'dashboard') renderPage(currentPage);
} catch (e) { showToast('Error: ' + e.message, 'error'); }
- btn.disabled = false; btn.innerHTML = ' Simpan';
+ btn.disabled = false;
+ btn.innerHTML = isRejected
+ ? ' Ajukan Ulang'
+ : ' Simpan';
}
async function deleteFromEdit() {
const { type, id } = editState;
@@ -3637,7 +3660,7 @@
// -- HELPERS
function canEdit(type, data) {
if (currentUser.role === 'admin') return true;
- if (currentUser.role === 'surveyor' && data.surveyor_id == currentUser.id && data.status === 'pending') return true;
+ if (currentUser.role === 'surveyor' && data.surveyor_id == currentUser.id && (data.status === 'pending' || data.status === 'rejected')) return true;
return false;
}
function statusLabel(s) {