'dashboard', 'pos.php' => 'pos', 'orders.php' => 'orders', 'lab.php' => 'lab', 'customers.php' => 'customers', 'customer_statement.php' => 'customer_statement', 'reports.php' => 'reports', 'items.php' => 'items', 'branches.php' => 'branches', 'users.php' => 'users', 'profile.php' => 'user_profile', 'company_profile.php' => 'company_profile', 'order_details.php' => 'order_details', 'receipt.php' => 'receipt', 'ratings.php' => 'ratings' ]; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { if ($_POST['action'] === 'add_user' && has_permission('add', 'users.php')) { $username = $_POST['username']; $password = password_hash($_POST['password'], PASSWORD_DEFAULT); $full_name_en = $_POST['full_name_en']; $full_name_ar = $_POST['full_name_ar']; $role = $_POST['role']; $branch_ids = $_POST['branch_ids'] ?? []; $company_id = 1; // Default for now $primary_branch_id = !empty($branch_ids) ? $branch_ids[0] : null; $stmt = db()->prepare("INSERT INTO users (username, password_hash, full_name_en, full_name_ar, role, branch_id, company_id) VALUES (?, ?, ?, ?, ?, ?, ?)"); $stmt->execute([$username, $password, $full_name_en, $full_name_ar, $role, $primary_branch_id, $company_id]); $new_user_id = db()->lastInsertId(); // Sync branches foreach ($branch_ids as $bid) { $stmt = db()->prepare("INSERT INTO user_branches (user_id, branch_id) VALUES (?, ?)"); $stmt->execute([$new_user_id, $bid]); } // Seed default permissions based on role for the new user $default_pages = [ 'super_admin' => array_keys($manageable_pages), 'branch_manager' => ['admin.php', 'pos.php', 'orders.php', 'lab.php', 'customers.php', 'customer_statement.php', 'reports.php', 'items.php', 'branches.php', 'profile.php', 'order_details.php', 'receipt.php'], 'cashier' => ['admin.php', 'pos.php', 'orders.php', 'lab.php', 'customers.php', 'customer_statement.php', 'profile.php', 'order_details.php', 'receipt.php'], 'limited_viewer' => ['admin.php', 'profile.php'] ]; $pages = $default_pages[$role] ?? []; foreach ($pages as $p) { $can_add_edit_del = ($role !== 'limited_viewer' ? 1 : 0); $stmt = db()->prepare("INSERT INTO user_permissions (user_id, page, can_view, can_add, can_edit, can_delete) VALUES (?, ?, 1, ?, ?, ?)"); $stmt->execute([$new_user_id, $p, $can_add_edit_del, $can_add_edit_del, $can_add_edit_del]); } header('Location: users.php'); exit; } if ($_POST['action'] === 'edit_user' && has_permission('edit', 'users.php')) { $id = $_POST['id']; $username = $_POST['username']; $full_name_en = $_POST['full_name_en']; $full_name_ar = $_POST['full_name_ar']; $role = $_POST['role']; $branch_ids = $_POST['branch_ids'] ?? []; $primary_branch_id = !empty($branch_ids) ? $branch_ids[0] : null; if (!empty($_POST['password'])) { $password = password_hash($_POST['password'], PASSWORD_DEFAULT); $stmt = db()->prepare("UPDATE users SET username = ?, password_hash = ?, full_name_en = ?, full_name_ar = ?, role = ?, branch_id = ? WHERE id = ?"); $stmt->execute([$username, $password, $full_name_en, $full_name_ar, $role, $primary_branch_id, $id]); } else { $stmt = db()->prepare("UPDATE users SET username = ?, full_name_en = ?, full_name_ar = ?, role = ?, branch_id = ? WHERE id = ?"); $stmt->execute([$username, $full_name_en, $full_name_ar, $role, $primary_branch_id, $id]); } // Sync branches $stmt = db()->prepare("DELETE FROM user_branches WHERE user_id = ?"); $stmt->execute([$id]); foreach ($branch_ids as $bid) { $stmt = db()->prepare("INSERT INTO user_branches (user_id, branch_id) VALUES (?, ?)"); $stmt->execute([$id, $bid]); } header('Location: users.php?msg=user_updated'); exit; } if ($_POST['action'] === 'delete_user' && has_permission('delete', 'users.php')) { $id = $_POST['id']; // Prevent self-deletion if ($id == $_SESSION['user_id']) { header('Location: users.php?error=cannot_delete_self'); exit; } $stmt = db()->prepare("DELETE FROM users WHERE id = ?"); $stmt->execute([$id]); header('Location: users.php?msg=user_deleted'); exit; } if ($_POST['action'] === 'update_permissions' && has_permission('edit', 'users.php')) { $target_user_id = $_POST['user_id']; $permissions = $_POST['perms'] ?? []; // format: [page][action] = 1 // Clear existing permissions for this user $stmt = db()->prepare("DELETE FROM user_permissions WHERE user_id = ?"); $stmt->execute([$target_user_id]); $all_pages_to_save = array_keys($manageable_pages); foreach ($all_pages_to_save as $page) { $can_view = isset($permissions[$page]['view']) ? 1 : 0; $can_add = isset($permissions[$page]['add']) ? 1 : 0; $can_edit = isset($permissions[$page]['edit']) ? 1 : 0; $can_delete = isset($permissions[$page]['delete']) ? 1 : 0; if ($can_view || $can_add || $can_edit || $can_delete) { $stmt = db()->prepare("INSERT INTO user_permissions (user_id, page, can_view, can_add, can_edit, can_delete) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$target_user_id, $page, $can_view, $can_add, $can_edit, $can_delete]); } } header('Location: users.php?msg=permissions_updated'); exit; } } // NOW Include header $title = 'users'; require_once __DIR__ . '/includes/header.php'; $users = db()->query("SELECT u.* FROM users u")->fetchAll(); $branches = db()->query("SELECT * FROM branches")->fetchAll(); // Fetch branches for all users in one go for efficiency $user_branches_mapping = []; $ub_stmt = db()->query("SELECT ub.user_id, b.name_en, b.name_ar FROM user_branches ub JOIN branches b ON ub.branch_id = b.id"); while ($row = $ub_stmt->fetch()) { $user_branches_mapping[$row['user_id']][] = $lang === 'ar' ? $row['name_ar'] : $row['name_en']; } // Also need branch IDs for edit modal $user_branch_ids_mapping = []; $ub_id_stmt = db()->query("SELECT user_id, branch_id FROM user_branches"); while ($row = $ub_id_stmt->fetch()) { $user_branch_ids_mapping[$row['user_id']][] = (int)$row['branch_id']; } ?>