Files
2026-06-09 19:02:22 +07:00

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();
}
?>