Files
2026-06-10 21:46:56 +07:00

162 lines
6.6 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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']]);
}
}