exec("ALTER TABLE history ADD COLUMN is_read TINYINT(1) DEFAULT 0, ADD COLUMN is_starred TINYINT(1) DEFAULT 0, ADD COLUMN is_deleted TINYINT(1) DEFAULT 0, ADD COLUMN occupant_name VARCHAR(255) DEFAULT NULL, ADD COLUMN deleted_at DATETIME DEFAULT NULL"); } catch (PDOException $e) { // Abaikan jika kolom sudah ada } try { // Create trigger for occupant deletion $pdo->exec("DROP TRIGGER IF EXISTS trg_history_occupant_delete"); $pdo->exec(" CREATE TRIGGER trg_history_occupant_delete BEFORE DELETE ON occupant FOR EACH ROW BEGIN UPDATE history SET occupant_name = OLD.name, is_deleted = 1, is_starred = 0, is_read = 1, deleted_at = IFNULL(deleted_at, NOW()) WHERE occupant_id = OLD.id_occupant; END "); // Auto-delete history placed in trash older than 30 days $oldHistories = $pdo->query("SELECT id_history, schedule_id FROM history WHERE is_deleted = 1 AND deleted_at < DATE_SUB(NOW(), INTERVAL 30 DAY)")->fetchAll(PDO::FETCH_ASSOC); if (!empty($oldHistories)) { $delHistIds = array_column($oldHistories, 'id_history'); if (!empty($delHistIds)) { $inQueryHist = implode(',', array_fill(0, count($delHistIds), '?')); $pdo->prepare("DELETE FROM history WHERE id_history IN ($inQueryHist)")->execute($delHistIds); } $delSchedIds = array_column($oldHistories, 'schedule_id'); if (!empty($delSchedIds)) { $inQuerySched = implode(',', array_fill(0, count($delSchedIds), '?')); $pdo->prepare("DELETE FROM schedule WHERE id_schedule IN ($inQuerySched)")->execute($delSchedIds); } } } catch (PDOException $e) { // Abaikan jika ada error trigger } // Konfigurasi Folder & Pagination $limit = 12; // Grid view limit $page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1; if ($page < 1) $page = 1; $offset = ($page - 1) * $limit; // Pencarian $search = isset($_GET['search']) ? trim($_GET['search']) : ''; $searchQuery = ""; $searchParams = []; // Only show non-deleted $folderCondition = "h.is_deleted = 0"; if (!empty($search)) { $searchQuery .= " AND (COALESCE(o.name, h.occupant_name) LIKE ? OR o.nik_nip LIKE ? OR o.no_hp LIKE ? OR s.kegiatan LIKE ?)"; $searchParamValue = "%$search%"; $searchParams = array_merge($searchParams, [$searchParamValue, $searchParamValue, $searchParamValue, $searchParamValue]); } $searchUrl = "&search=" . urlencode($search); $totalData = 0; $totalPages = 1; try { $stmtTotal = $pdo->prepare(" SELECT COUNT(*) FROM history h LEFT JOIN occupant o ON h.occupant_id = o.id_occupant JOIN schedule s ON h.schedule_id = s.id_schedule WHERE $folderCondition $searchQuery "); $stmtTotal->execute($searchParams); $totalData = $stmtTotal->fetchColumn(); $totalPages = ceil($totalData / $limit); } catch (PDOException $e) { $errorMsg = $e->getMessage(); } // Ambil data $query = " SELECT h.id_history, h.foto AS history_foto, h.is_read, h.is_starred, h.is_deleted, h.occupant_name, o.name, o.nik_nip, o.no_hp, o.foto AS occupant_foto, s.date AS schedule_date, s.kegiatan FROM history h LEFT JOIN occupant o ON h.occupant_id = o.id_occupant JOIN schedule s ON h.schedule_id = s.id_schedule WHERE $folderCondition $searchQuery ORDER BY s.date DESC LIMIT $limit OFFSET $offset "; $histories = []; try { $stmt = $pdo->prepare($query); $stmt->execute($searchParams); $histories = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { $errorMsg = $e->getMessage(); } include 'header.php'; ?>

Activity Feed

List of occupant activities reported, Review them below!

All Reported Activities

No activities found

When someone submits an activity report, it will appear here.

Error:
$h): $timestamp = strtotime($h['schedule_date']); $timeDate = date('M d, Y • h:i A', $timestamp); $dispName = !empty($h['name']) ? $h['name'] : (!empty($h['occupant_name']) ? $h['occupant_name'] : 'Deleted Occupant'); $dispFoto = !empty($h['occupant_foto']) ? $h['occupant_foto'] : 'images/admin.png'; $dispNik = !empty($h['nik_nip']) ? $h['nik_nip'] : '-'; $dispHp = !empty($h['no_hp']) ? $h['no_hp'] : '-'; $mainImg = !empty($h['history_foto']) ? $h['history_foto'] : 'images/placeholder.jpg'; $jsonData = htmlspecialchars(json_encode([ 'id' => $h['id_history'], 'name' => $dispName, 'nik' => $dispNik, 'hp' => $dispHp, 'kegiatan' => $h['kegiatan'], 'time' => $timeDate, 'img' => $mainImg, 'avatar' => $dispFoto, 'is_read' => $h['is_read'] ]), ENT_QUOTES, 'UTF-8'); ?>
Activity Photo
Avatar

NIK:

Showing to of entries
1): ?> Previous Next