162 lines
6.6 KiB
PHP
162 lines
6.6 KiB
PHP
<?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']]);
|
||
}
|
||
}
|