84 lines
3.3 KiB
PHP
84 lines
3.3 KiB
PHP
<?php
|
|
header("Content-Type: application/json; charset=UTF-8");
|
|
require_once '../auth_helper.php';
|
|
requireAdminOrPengelola();
|
|
include_once '../db_connect.php';
|
|
|
|
// Ambil info ibadah pengelola jika role pengelola
|
|
$currentUser = getCurrentUser();
|
|
$ibadahFilter = null; // null = admin (tidak dibatasi)
|
|
if ($currentUser && $currentUser['role'] === 'pengelola') {
|
|
$ibadah_id = $currentUser['ibadah_id'];
|
|
if (!$ibadah_id) {
|
|
echo json_encode(['status' => 'error', 'message' => 'Akun pengelola tidak terhubung ke rumah ibadah manapun.']);
|
|
exit;
|
|
}
|
|
$res = $conn->query("SELECT lat, lng, radius FROM rumah_ibadah WHERE id=$ibadah_id");
|
|
if (!$res || $res->num_rows === 0) {
|
|
echo json_encode(['status' => 'error', 'message' => 'Rumah ibadah yang dikelola tidak ditemukan.']);
|
|
exit;
|
|
}
|
|
$ibadahFilter = $res->fetch_assoc();
|
|
}
|
|
|
|
$data = json_decode(file_get_contents("php://input"));
|
|
|
|
if (is_array($data)) {
|
|
$conn->begin_transaction();
|
|
$inserted = 0;
|
|
$skipped = 0;
|
|
$errors = [];
|
|
foreach ($data as $item) {
|
|
if (isset($item->lat) && isset($item->lng) && $item->lat !== '' && $item->lng !== '') {
|
|
$nama = $conn->real_escape_string($item->nama ?? '');
|
|
$kategori = $conn->real_escape_string($item->kategori_bantuan ?? 'Makan');
|
|
$jumlah_jiwa = (int)($item->jumlah_jiwa ?? 1);
|
|
$lat = (float)$item->lat;
|
|
$lng = (float)$item->lng;
|
|
|
|
// Jika pengelola, cek apakah item berada dalam radius ibadahnya
|
|
if ($ibadahFilter !== null) {
|
|
$R = 6371000;
|
|
$lat1 = deg2rad((float)$ibadahFilter['lat']);
|
|
$lat2 = deg2rad($lat);
|
|
$dLat = $lat2 - $lat1;
|
|
$dLng = deg2rad($lng - (float)$ibadahFilter['lng']);
|
|
$a = sin($dLat/2)*sin($dLat/2) + cos($lat1)*cos($lat2)*sin($dLng/2)*sin($dLng/2);
|
|
$dist = $R * 2 * atan2(sqrt($a), sqrt(1-$a));
|
|
if ($dist > (float)$ibadahFilter['radius']) {
|
|
$skipped++;
|
|
continue; // Lewati item di luar radius
|
|
}
|
|
}
|
|
|
|
$query = "INSERT INTO penduduk_miskin (nama, kategori_bantuan, jumlah_jiwa, lat, lng)
|
|
VALUES ('$nama', '$kategori', $jumlah_jiwa, $lat, $lng)";
|
|
|
|
if (!$conn->query($query)) {
|
|
$errors[] = $conn->error;
|
|
} else {
|
|
$inserted++;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (empty($errors) && $inserted > 0) {
|
|
$conn->commit();
|
|
$msg = "Berhasil mengimpor $inserted data penduduk miskin.";
|
|
if ($skipped > 0) $msg .= " ($skipped data di luar radius diabaikan.)";
|
|
echo json_encode(["status" => "success", "message" => $msg]);
|
|
} else if ($inserted === 0) {
|
|
$conn->rollback();
|
|
$msg = $skipped > 0
|
|
? "Semua $skipped data berada di luar radius rumah ibadah Anda, tidak ada yang diimpor."
|
|
: "Tidak ada data valid yang diimpor.";
|
|
echo json_encode(["status" => "error", "message" => $msg]);
|
|
} else {
|
|
$conn->rollback();
|
|
echo json_encode(["status" => "error", "message" => "Gagal mengimpor beberapa data. Transaksi dibatalkan.", "errors" => $errors]);
|
|
}
|
|
} else {
|
|
echo json_encode(["status" => "error", "message" => "Format data salah."]);
|
|
}
|
|
?>
|