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) {