PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); } catch (PDOException $e) { die("Database Connection Error: " . $e->getMessage()); } } return $pdo; } function check_permission($page = null, $user_id = null) { // Safely access session if (!$user_id) { if (isset($_SESSION) && isset($_SESSION['user_id'])) { $user_id = $_SESSION['user_id']; } else { $user_id = null; } } if (!$page) $page = basename($_SERVER['PHP_SELF']); if (!$user_id) return ['view' => 0, 'add' => 0, 'edit' => 0, 'delete' => 0]; static $permissions_cache = []; $cache_key = $user_id . '_' . $page; if (isset($permissions_cache[$cache_key])) return $permissions_cache[$cache_key]; try { // First check if user is super_admin $role = null; if (isset($_SESSION) && isset($_SESSION['user_id']) && $_SESSION['user_id'] == $user_id && isset($_SESSION['role'])) { $role = $_SESSION['role']; } else { $stmt = db()->prepare("SELECT role FROM users WHERE id = ?"); $stmt->execute([$user_id]); $role = $stmt->fetchColumn(); } if ($role === 'super_admin') { $result = ['view' => 1, 'add' => 1, 'edit' => 1, 'delete' => 1]; $permissions_cache[$cache_key] = $result; return $result; } $stmt = db()->prepare("SELECT can_view as view, can_add as `add`, can_edit as edit, can_delete as `delete` FROM user_permissions WHERE user_id = ? AND page = ?"); $stmt->execute([$user_id, $page]); $perms = $stmt->fetch(); if (!$perms) { return ['view' => 0, 'add' => 0, 'edit' => 0, 'delete' => 0]; } $result = [ 'view' => (int)$perms['view'], 'add' => (int)$perms['add'], 'edit' => (int)$perms['edit'], 'delete' => (int)$perms['delete'] ]; $permissions_cache[$cache_key] = $result; return $result; } catch (Exception $e) { return ['view' => 0, 'add' => 0, 'edit' => 0, 'delete' => 0]; } } function get_setting($key, $default = null) { try { $stmt = db()->prepare('SELECT setting_value FROM settings WHERE setting_key = ?'); $stmt->execute([$key]); $val = $stmt->fetchColumn(); return ($val !== false) ? $val : $default; } catch (Exception $e) { return $default; } } function set_setting($key, $value) { $stmt = db()->prepare('INSERT INTO settings (setting_key, setting_value) VALUES (?, ?) ON DUPLICATE KEY UPDATE setting_value = ?, updated_at = CURRENT_TIMESTAMP'); $stmt->execute([$key, $value, $value]); } function has_permission($action, $page = null, $user_id = null) { $perms = check_permission($page, $user_id); return !empty($perms[$action]); } if (!function_exists('getStatusColor')) { function getStatusColor($status) { return [ 'received' => 'secondary', 'processing' => 'primary', 'ready' => 'success', 'delivered' => 'dark', 'cancelled' => 'danger', ][$status] ?? 'info'; } } if (!function_exists('getPaymentStatusColor')) { function getPaymentStatusColor($status) { return [ 'unpaid' => 'danger', 'partially_paid' => 'warning', 'paid' => 'success', ][$status] ?? 'info'; } }