UAS SIG Proyek WebGis

This commit is contained in:
L4zyL4mb
2026-06-10 21:46:56 +07:00
commit df18a7a99a
35 changed files with 8977 additions and 0 deletions
+161
View File
@@ -0,0 +1,161 @@
<?php
// api/notifikasi.php v2.0
// ============================================================
// API Sistem Notifikasi + Generate Otomatis
// ============================================================
require_once __DIR__ . '/../includes/config.php';
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') exit;
$method = $_SERVER['REQUEST_METHOD'];
$db = getDB();
switch ($method) {
// ════════════════════════════════════════════════════════
// GET Ambil notifikasi (dengan auto-generate)
// ════════════════════════════════════════════════════════
case 'GET':
$userId = $_GET['user_id'] ?? null;
$generate = isset($_GET['generate']); // ?generate → trigger auto-create
if ($generate) generateNotifikasi($db);
$sql = "SELECT n.*, pm.nama_kk FROM notifikasi n LEFT JOIN penduduk_miskin pm ON pm.id = n.penduduk_id WHERE 1=1";
$params = [];
if ($userId) {
$sql .= " AND (n.user_id = ? OR n.user_id IS NULL)";
$params[] = $userId;
}
// Filter belum dibaca
if (isset($_GET['unread'])) {
$sql .= " AND n.sudah_dibaca = 0";
}
$sql .= " ORDER BY n.created_at DESC LIMIT 50";
$stmt = $db->prepare($sql);
$stmt->execute($params);
$rows = $stmt->fetchAll();
// Hitung unread
$unreadStmt = $db->prepare("SELECT COUNT(*) FROM notifikasi WHERE sudah_dibaca = 0 AND (user_id = ? OR user_id IS NULL)");
$unreadStmt->execute([$userId ?? 0]);
$unreadCount = (int)$unreadStmt->fetchColumn();
jsonResponse(['success' => true, 'data' => $rows, 'unread_count' => $unreadCount]);
break;
// ════════════════════════════════════════════════════════
// PUT Tandai sudah dibaca
// ════════════════════════════════════════════════════════
case 'PUT':
$in = getInput();
$id = $in['id'] ?? 'all';
if ($id === 'all') {
$userId = (int)($in['user_id'] ?? 0);
$db->prepare("UPDATE notifikasi SET sudah_dibaca = 1 WHERE user_id = ? OR user_id IS NULL")
->execute([$userId]);
jsonResponse(['success' => true, 'message' => 'Semua notifikasi ditandai dibaca']);
} else {
$db->prepare("UPDATE notifikasi SET sudah_dibaca = 1 WHERE id = ?")
->execute([(int)$id]);
jsonResponse(['success' => true, 'message' => 'Notifikasi ditandai dibaca']);
}
break;
// ════════════════════════════════════════════════════════
// POST Buat notifikasi manual
// ════════════════════════════════════════════════════════
case 'POST':
$in = getInput();
if (empty($in['judul']) || empty($in['pesan'])) {
jsonResponse(['success' => false, 'error' => 'Judul dan pesan wajib diisi'], 400);
}
$db->prepare("
INSERT INTO notifikasi (user_id, jenis, judul, pesan, penduduk_id)
VALUES (?,?,?,?,?)
")->execute([
$in['user_id'] ?? null,
$in['jenis'] ?? 'info',
$in['judul'],
$in['pesan'],
$in['penduduk_id'] ?? null,
]);
jsonResponse(['success' => true, 'id' => $db->lastInsertId(), 'message' => 'Notifikasi dibuat']);
break;
default:
jsonResponse(['success' => false, 'error' => 'Method tidak diizinkan'], 405);
}
// ============================================================
// FUNGSI: Generate notifikasi otomatis
// ============================================================
function generateNotifikasi(PDO $db): void {
// 1. KK belum terverifikasi
$belumVerif = $db->query("
SELECT id, nama_kk FROM penduduk_miskin
WHERE status_verifikasi = 'belum_diverifikasi'
AND id NOT IN (
SELECT DISTINCT penduduk_id FROM notifikasi
WHERE jenis = 'belum_verifikasi' AND sudah_dibaca = 0
)
LIMIT 20
")->fetchAll();
foreach ($belumVerif as $p) {
$db->prepare("
INSERT INTO notifikasi (jenis, judul, pesan, penduduk_id)
VALUES ('belum_verifikasi','Data Menunggu Verifikasi',?,?)
")->execute(["KK {$p['nama_kk']} belum diverifikasi.", $p['id']]);
}
// 2. KK belum menerima bantuan apapun (sangat miskin)
$belumBantuan = $db->query("
SELECT id, nama_kk FROM penduduk_miskin
WHERE kategori_kemiskinan = 'sangat_miskin'
AND id NOT IN (
SELECT penduduk_id FROM bantuan_penduduk WHERE status = 'aktif'
)
AND id NOT IN (
SELECT DISTINCT penduduk_id FROM notifikasi
WHERE jenis = 'belum_bantuan' AND sudah_dibaca = 0
)
LIMIT 20
")->fetchAll();
foreach ($belumBantuan as $p) {
$db->prepare("
INSERT INTO notifikasi (jenis, judul, pesan, penduduk_id)
VALUES ('belum_bantuan','KK Sangat Miskin Tanpa Bantuan',?,?)
")->execute(["KK {$p['nama_kk']} berkategori sangat miskin namun belum menerima bantuan apapun.", $p['id']]);
}
// 3. Data usang (tidak diupdate > DATA_USANG_HARI hari)
$usang = $db->prepare("
SELECT id, nama_kk, DATEDIFF(NOW(), updated_at) AS hari_usang
FROM penduduk_miskin
WHERE updated_at < DATE_SUB(NOW(), INTERVAL ? DAY)
AND id NOT IN (
SELECT DISTINCT penduduk_id FROM notifikasi
WHERE jenis = 'data_usang' AND sudah_dibaca = 0
)
LIMIT 10
");
$usang->execute([DATA_USANG_HARI]);
foreach ($usang->fetchAll() as $p) {
$db->prepare("
INSERT INTO notifikasi (jenis, judul, pesan, penduduk_id)
VALUES ('data_usang','Data Tidak Diperbarui',?,?)
")->execute(["Data KK {$p['nama_kk']} belum diperbarui selama {$p['hari_usang']} hari.", $p['id']]);
}
}