219 lines
8.7 KiB
PHP
219 lines
8.7 KiB
PHP
<?php
|
|
// ============================================================
|
|
// API LAPORAN MASYARAKAT
|
|
// File: api_lapor.php
|
|
// Fields: nama_pelapor, nik, no_wa, deskripsi, latitude, longitude, status
|
|
// Status: Pending | Diproses | Diverifikasi | Ditolak | Selesai
|
|
// ============================================================
|
|
|
|
require_once 'config.php';
|
|
|
|
$method = $_SERVER['REQUEST_METHOD'];
|
|
$id = isset($_GET['id']) ? (int)$_GET['id'] : null;
|
|
|
|
// ---- GET: Ambil laporan ----
|
|
if ($method === 'GET') {
|
|
$db = getDB();
|
|
|
|
if ($id) {
|
|
$stmt = $db->prepare("SELECT id, nama_pelapor, nik, no_wa, deskripsi, latitude, longitude, status, alasan_tolak, created_at, tanggal_lahir, pendidikan, riwayat_penyakit, skor_penghasilan, skor_rumah, skor_makan, jumlah_kk FROM laporan_masyarakat WHERE id = ?");
|
|
$stmt->bind_param('i', $id);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result()->fetch_assoc();
|
|
if ($result) {
|
|
$result['latitude'] = (float)$result['latitude'];
|
|
$result['longitude'] = (float)$result['longitude'];
|
|
echo json_encode($result);
|
|
} else {
|
|
http_response_code(404);
|
|
echo json_encode(['error' => 'Laporan tidak ditemukan']);
|
|
}
|
|
} else {
|
|
$result = $db->query("SELECT id, nama_pelapor, nik, no_wa, deskripsi, latitude, longitude, status, alasan_tolak, created_at, tanggal_lahir, pendidikan, riwayat_penyakit, skor_penghasilan, skor_rumah, skor_makan, jumlah_kk FROM laporan_masyarakat ORDER BY id DESC");
|
|
$rows = [];
|
|
while ($row = $result->fetch_assoc()) {
|
|
$row['latitude'] = (float)$row['latitude'];
|
|
$row['longitude'] = (float)$row['longitude'];
|
|
$rows[] = $row;
|
|
}
|
|
echo json_encode($rows);
|
|
}
|
|
$db->close();
|
|
exit();
|
|
}
|
|
|
|
// ---- POST: Tambah laporan baru ----
|
|
if ($method === 'POST') {
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|
|
|
if (empty($input['nama_pelapor']) || empty($input['deskripsi']) || !isset($input['latitude']) || !isset($input['longitude'])) {
|
|
http_response_code(400);
|
|
echo json_encode(['error' => 'Data tidak lengkap. Field wajib: nama_pelapor, deskripsi, latitude, longitude']);
|
|
exit();
|
|
}
|
|
|
|
$nama = trim($input['nama_pelapor']);
|
|
$nik = isset($input['nik']) && $input['nik'] ? trim($input['nik']) : null;
|
|
$no_wa = isset($input['no_wa']) && $input['no_wa'] ? trim($input['no_wa']) : null;
|
|
$desk = trim($input['deskripsi']);
|
|
$lat = (float)$input['latitude'];
|
|
$lng = (float)$input['longitude'];
|
|
|
|
// New Fields
|
|
$tgl_lahir = isset($input['tanggal_lahir']) && $input['tanggal_lahir'] ? $input['tanggal_lahir'] : null;
|
|
$pdd = isset($input['pendidikan']) && $input['pendidikan'] ? $input['pendidikan'] : null;
|
|
$pny = isset($input['riwayat_penyakit']) && $input['riwayat_penyakit'] ? $input['riwayat_penyakit'] : null;
|
|
$sp = isset($input['skor_penghasilan']) ? (int)$input['skor_penghasilan'] : null;
|
|
$sr = isset($input['skor_rumah']) ? (int)$input['skor_rumah'] : null;
|
|
$sm = isset($input['skor_makan']) ? (int)$input['skor_makan'] : null;
|
|
$jml = isset($input['jumlah_kk']) ? (int)$input['jumlah_kk'] : 1;
|
|
|
|
// Validasi NIK 16 digit jika diisi
|
|
if ($nik && strlen($nik) !== 16) {
|
|
http_response_code(400);
|
|
echo json_encode(['error' => 'NIK harus 16 digit']);
|
|
exit();
|
|
}
|
|
|
|
$db = getDB();
|
|
$stmt = $db->prepare("INSERT INTO laporan_masyarakat (nama_pelapor, nik, no_wa, deskripsi, latitude, longitude, tanggal_lahir, pendidikan, riwayat_penyakit, skor_penghasilan, skor_rumah, skor_makan, jumlah_kk) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
$stmt->bind_param('ssssddsssiiii', $nama, $nik, $no_wa, $desk, $lat, $lng, $tgl_lahir, $pdd, $pny, $sp, $sr, $sm, $jml);
|
|
|
|
if ($stmt->execute()) {
|
|
$new_id = $db->insert_id;
|
|
http_response_code(201);
|
|
echo json_encode([
|
|
'message' => 'Laporan berhasil dikirim',
|
|
'id' => $new_id,
|
|
'status' => 'Pending'
|
|
]);
|
|
} else {
|
|
http_response_code(500);
|
|
echo json_encode(['error' => 'Gagal menyimpan laporan: ' . $stmt->error]);
|
|
}
|
|
$db->close();
|
|
exit();
|
|
}
|
|
|
|
// ---- PUT: Update status laporan ----
|
|
if ($method === 'PUT') {
|
|
if (!$id) {
|
|
http_response_code(400);
|
|
echo json_encode(['error' => 'ID wajib disertakan untuk update']);
|
|
exit();
|
|
}
|
|
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|
if (empty($input['status'])) {
|
|
http_response_code(400);
|
|
echo json_encode(['error' => 'Status wajib diisi (Pending/Diproses/Diverifikasi/Ditolak/Selesai)']);
|
|
exit();
|
|
}
|
|
|
|
$status = $input['status'];
|
|
$action = isset($input['action']) ? $input['action'] : null;
|
|
$alasan_tolak = isset($input['alasan_tolak']) ? trim($input['alasan_tolak']) : null;
|
|
|
|
$db = getDB();
|
|
|
|
// === VERIFIKASI: Konversi laporan menjadi data kemiskinan resmi ===
|
|
if ($action === 'verify' && $status === 'Diverifikasi') {
|
|
// Ambil data laporan dulu
|
|
$stmtGet = $db->prepare("SELECT * FROM laporan_masyarakat WHERE id = ?");
|
|
$stmtGet->bind_param('i', $id);
|
|
$stmtGet->execute();
|
|
$laporan = $stmtGet->get_result()->fetch_assoc();
|
|
|
|
if (!$laporan) {
|
|
http_response_code(404);
|
|
echo json_encode(['error' => 'Laporan tidak ditemukan']);
|
|
$db->close();
|
|
exit();
|
|
}
|
|
|
|
$db->begin_transaction();
|
|
try {
|
|
// Hitung kategori dari skor (sama dengan logika frontend)
|
|
$sp = (int)$laporan['skor_penghasilan'];
|
|
$sr = (int)$laporan['skor_rumah'];
|
|
$sm = (int)$laporan['skor_makan'];
|
|
$total_skor = $sp + $sr + $sm;
|
|
|
|
$kategori = 'Miskin';
|
|
if ($total_skor >= 7) {
|
|
$kategori = 'Sangat Miskin';
|
|
} else if ($total_skor >= 4) {
|
|
$kategori = 'Miskin';
|
|
} else {
|
|
$kategori = 'Hampir Miskin';
|
|
}
|
|
|
|
// 1. Masukkan ke data_kemiskinan sebagai data resmi
|
|
$stmtInsert = $db->prepare(
|
|
"INSERT INTO data_kemiskinan (nama_kk, nik, alamat, latitude, longitude, kategori, status_bantuan, tanggal_lahir, pendidikan, riwayat_penyakit, skor_penghasilan, skor_rumah, skor_makan, jumlah_kk)
|
|
VALUES (?, ?, ?, ?, ?, ?, 'Belum', ?, ?, ?, ?, ?, ?, ?)"
|
|
);
|
|
$alamat = $laporan['deskripsi']; // Use deskripsi directly as address/notes
|
|
$stmtInsert->bind_param('sssddssssiiii',
|
|
$laporan['nama_pelapor'],
|
|
$laporan['nik'],
|
|
$alamat,
|
|
$laporan['latitude'],
|
|
$laporan['longitude'],
|
|
$kategori,
|
|
$laporan['tanggal_lahir'],
|
|
$laporan['pendidikan'],
|
|
$laporan['riwayat_penyakit'],
|
|
$laporan['skor_penghasilan'],
|
|
$laporan['skor_rumah'],
|
|
$laporan['skor_makan'],
|
|
$laporan['jumlah_kk']
|
|
);
|
|
$stmtInsert->execute();
|
|
$new_kemiskinan_id = $db->insert_id;
|
|
|
|
// 2. Update status laporan menjadi Diverifikasi
|
|
$stmtUpdate = $db->prepare("UPDATE laporan_masyarakat SET status = 'Diverifikasi' WHERE id = ?");
|
|
$stmtUpdate->bind_param('i', $id);
|
|
$stmtUpdate->execute();
|
|
|
|
$db->commit();
|
|
echo json_encode([
|
|
'message' => 'Laporan diverifikasi dan data kemiskinan resmi telah dibuat',
|
|
'id_kemiskinan' => $new_kemiskinan_id
|
|
]);
|
|
} catch (Exception $e) {
|
|
$db->rollback();
|
|
http_response_code(500);
|
|
echo json_encode(['error' => 'Gagal memverifikasi: ' . $e->getMessage()]);
|
|
}
|
|
$db->close();
|
|
exit();
|
|
}
|
|
|
|
// === TOLAK: Update status + alasan ===
|
|
if ($status === 'Ditolak') {
|
|
$stmt = $db->prepare("UPDATE laporan_masyarakat SET status = ?, alasan_tolak = ? WHERE id = ?");
|
|
$stmt->bind_param('ssi', $status, $alasan_tolak, $id);
|
|
} else {
|
|
// === Update status biasa ===
|
|
$stmt = $db->prepare("UPDATE laporan_masyarakat SET status = ? WHERE id = ?");
|
|
$stmt->bind_param('si', $status, $id);
|
|
}
|
|
|
|
if ($stmt->execute()) {
|
|
if ($stmt->affected_rows > 0) {
|
|
echo json_encode(['message' => 'Status laporan berhasil diupdate']);
|
|
} else {
|
|
http_response_code(404);
|
|
echo json_encode(['error' => 'Laporan tidak ditemukan atau tidak ada perubahan']);
|
|
}
|
|
} else {
|
|
http_response_code(500);
|
|
echo json_encode(['error' => 'Gagal mengupdate laporan']);
|
|
}
|
|
$db->close();
|
|
exit();
|
|
}
|
|
?>
|