105 lines
4.6 KiB
PHP
105 lines
4.6 KiB
PHP
<?php
|
|
require_once __DIR__ . '/_helpers.php';
|
|
api_require_login();
|
|
|
|
$method = $_SERVER['REQUEST_METHOD'];
|
|
$user = current_user();
|
|
$role = current_role();
|
|
|
|
function allowed_value($value, array $allowed, string $default): string
|
|
{
|
|
$v = clean_string($value);
|
|
return in_array($v, $allowed, true) ? $v : $default;
|
|
}
|
|
|
|
if ($method === 'GET') {
|
|
$where = [];
|
|
$params = [];
|
|
|
|
if ($role === 'masyarakat') {
|
|
$where[] = 'lm.pelapor_id = ?';
|
|
$params[] = $user['id'];
|
|
} elseif ($role === 'rumah_ibadah' && !empty($user['rumah_ibadah_id'])) {
|
|
$where[] = '(k.rumah_ibadah_id = ? OR lm.pelapor_id = ?)';
|
|
$params[] = (int)$user['rumah_ibadah_id'];
|
|
$params[] = $user['id'];
|
|
}
|
|
|
|
$sql = 'SELECT lm.*, k.nama_kk, k.status_bantuan, r.nama AS nama_rumah_ibadah, u.nama AS nama_pelapor
|
|
FROM laporan_musibah lm
|
|
LEFT JOIN keluarga k ON k.id = lm.keluarga_id
|
|
LEFT JOIN rumah_ibadah r ON r.id = k.rumah_ibadah_id
|
|
LEFT JOIN users u ON u.id = lm.pelapor_id';
|
|
if ($where) $sql .= ' WHERE ' . implode(' AND ', $where);
|
|
$sql .= ' ORDER BY FIELD(lm.tingkat_urgensi, "Darurat", "Tinggi", "Sedang", "Rendah"), lm.created_at DESC';
|
|
$stmt = $pdo->prepare($sql);
|
|
$stmt->execute($params);
|
|
json_response(['success' => true, 'data' => $stmt->fetchAll()]);
|
|
}
|
|
|
|
if ($method === 'POST') {
|
|
$data = get_json_input();
|
|
required_fields($data, ['jenis_musibah','tingkat_urgensi','tanggal_kejadian','deskripsi']);
|
|
|
|
$keluargaId = clean_int($data['keluarga_id'] ?? 0);
|
|
$alamat = clean_string($data['alamat'] ?? '');
|
|
$lat = $data['lat'] ?? '';
|
|
$lng = $data['lng'] ?? '';
|
|
|
|
if ($keluargaId > 0) {
|
|
$stmtKel = $pdo->prepare('SELECT id, alamat, lat, lng FROM keluarga WHERE id = ? LIMIT 1');
|
|
$stmtKel->execute([$keluargaId]);
|
|
$kel = $stmtKel->fetch();
|
|
if (!$kel) json_response(['success' => false, 'message' => 'Data keluarga tidak ditemukan.'], 404);
|
|
if ($alamat === '') $alamat = $kel['alamat'];
|
|
if ($lat === '' || $lng === '') {
|
|
$lat = $kel['lat'];
|
|
$lng = $kel['lng'];
|
|
}
|
|
}
|
|
|
|
if ($alamat === '' || $lat === '' || $lng === '') {
|
|
json_response(['success' => false, 'message' => 'Pilih keluarga terdata atau tentukan lokasi kejadian pada peta.'], 422);
|
|
}
|
|
|
|
$stmt = $pdo->prepare('INSERT INTO laporan_musibah
|
|
(keluarga_id, pelapor_id, jenis_musibah, tingkat_urgensi, tanggal_kejadian, alamat, lat, lng, deskripsi, kebutuhan_mendesak, status)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "Baru")');
|
|
$stmt->execute([
|
|
$keluargaId > 0 ? $keluargaId : null,
|
|
$user['id'],
|
|
allowed_value($data['jenis_musibah'], ['Kebakaran','Banjir','Sakit Mendesak','Kehilangan Pekerjaan','Kematian Tulang Punggung Keluarga','Rumah Rusak','Lainnya'], 'Lainnya'),
|
|
allowed_value($data['tingkat_urgensi'], ['Rendah','Sedang','Tinggi','Darurat'], 'Sedang'),
|
|
clean_string($data['tanggal_kejadian']),
|
|
$alamat,
|
|
clean_float($lat),
|
|
clean_float($lng),
|
|
clean_string($data['deskripsi']),
|
|
clean_string($data['kebutuhan_mendesak'] ?? '')
|
|
]);
|
|
|
|
json_response(['success' => true, 'message' => 'Laporan musibah berhasil dikirim dan masuk antrian tindak lanjut.', 'id' => $pdo->lastInsertId()], 201);
|
|
}
|
|
|
|
if ($method === 'PUT') {
|
|
api_require_role(['admin','dinas','relawan','rumah_ibadah']);
|
|
$data = get_json_input();
|
|
required_fields($data, ['id','status']);
|
|
$id = clean_int($data['id']);
|
|
$status = allowed_value($data['status'], ['Baru','Diverifikasi','Diproses','Ditindaklanjuti','Selesai','Ditolak'], 'Baru');
|
|
$tindak = clean_string($data['tindak_lanjut'] ?? '');
|
|
|
|
if ($role === 'rumah_ibadah') {
|
|
$stmtCheck = $pdo->prepare('SELECT lm.id FROM laporan_musibah lm LEFT JOIN keluarga k ON k.id = lm.keluarga_id WHERE lm.id = ? AND (k.rumah_ibadah_id = ? OR lm.pelapor_id = ?)');
|
|
$stmtCheck->execute([$id, (int)($user['rumah_ibadah_id'] ?? 0), (int)$user['id']]);
|
|
if (!$stmtCheck->fetch()) json_response(['success' => false, 'message' => 'Akses laporan musibah ditolak.'], 403);
|
|
}
|
|
|
|
$stmt = $pdo->prepare('UPDATE laporan_musibah SET status = ?, tindak_lanjut = CONCAT(COALESCE(tindak_lanjut, ""), ?), handled_by = ?, updated_at = NOW() WHERE id = ?');
|
|
$tambahan = $tindak !== '' ? "\n[" . date('Y-m-d H:i') . "] " . $tindak : '';
|
|
$stmt->execute([$status, $tambahan, $user['id'], $id]);
|
|
json_response(['success' => true, 'message' => 'Status laporan musibah berhasil diperbarui.']);
|
|
}
|
|
|
|
json_response(['success' => false, 'message' => 'Method tidak didukung.'], 405);
|