« Back to History
user_functional_roles.php
|
20260721_154033.php
Initial Bulk Import
Copy Code
<?php require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('user_functional_roles'); $u = $ctx['user'] ?? null; $company_id = (int)($ctx['company_id'] ?? 0); $pdo = $ctx['pdo'] ?? null; if (!$pdo) { require_once __DIR__ . '/core/db.php'; } function h($v){ return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); } /* ========================= USERS ========================= */ $users = []; $stmt = $pdo->prepare(" SELECT id, name FROM users WHERE company_id = ? AND is_active = 1 ORDER BY name ASC "); $stmt->execute([$company_id]); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); /* ========================= FUNCTIONAL ROLES ========================= */ $roles = []; $stmt = $pdo->prepare(" SELECT id, role_name FROM functional_roles WHERE company_id = ? AND is_active = 1 ORDER BY role_name ASC "); $stmt->execute([$company_id]); $roles = $stmt->fetchAll(PDO::FETCH_ASSOC); /* ========================= MENU ITEMS ========================= */ $menu_items = []; $stmt = $pdo->prepare(" SELECT nms.name AS section_name, nmi.id, nmi.title, nmi.url FROM nav_menu_items nmi INNER JOIN nav_menu_sections nms ON nms.id = nmi.section_id WHERE nmi.is_enabled = 1 AND (nmi.company_id = 0 OR nmi.company_id = ?) ORDER BY nms.sort_order, nmi.sort_order, nmi.title "); $stmt->execute([$company_id]); $menu_items = $stmt->fetchAll(PDO::FETCH_ASSOC); /* ========================= SELECTED USER ========================= */ $selected_user = (int)($_GET['user_id'] ?? $_POST['user_id'] ?? 0); $success = ''; $error = ''; /* ========================= SAVE ========================= */ if ($_SERVER['REQUEST_METHOD'] === 'POST' && $selected_user > 0) { $selected_roles = $_POST['roles'] ?? []; /* ========================= REMOVE DUPLICATE SLUGS ========================= */ $blocked_perms = array_unique( array_filter( array_map('trim', $_POST['blocked_permissions'] ?? []) ) ); try { $pdo->beginTransaction(); /* ========================= DELETE OLD ROLES ========================= */ $stmt = $pdo->prepare(" DELETE FROM user_functional_roles WHERE company_id = ? AND user_id = ? "); $stmt->execute([ $company_id, $selected_user ]); /* ========================= INSERT NEW ROLES ========================= */ if (!empty($selected_roles)) { $stmt = $pdo->prepare(" INSERT INTO user_functional_roles ( company_id, user_id, functional_role_id, assigned_by ) VALUES ( :cid, :uid, :rid, :by ) "); foreach ($selected_roles as $rid) { $stmt->execute([ ':cid' => $company_id, ':uid' => $selected_user, ':rid' => (int)$rid, ':by' => (int)($u['id'] ?? 0), ]); } } /* ========================= DELETE OLD BLOCKS ========================= */ $stmt = $pdo->prepare(" DELETE FROM user_permission_blocks WHERE company_id = ? AND user_id = ? "); $stmt->execute([ $company_id, $selected_user ]); /* ========================= INSERT NEW BLOCKS ========================= */ if (!empty($blocked_perms)) { $stmt = $pdo->prepare(" INSERT INTO user_permission_blocks ( company_id, user_id, permission_key, blocked_by ) VALUES ( :cid, :uid, :perm, :by ) "); foreach ($blocked_perms as $perm) { if ($perm === '') { continue; } $stmt->execute([ ':cid' => $company_id, ':uid' => $selected_user, ':perm' => $perm, ':by' => (int)($u['id'] ?? 0), ]); } } $pdo->commit(); header("Location: ?user_id=".$selected_user."&success=1"); exit; } catch (Throwable $e) { $pdo->rollBack(); $error = $e->getMessage(); } } if (isset($_GET['success'])) { $success = 'User settings updated successfully.'; } /* ========================= USER CURRENT ROLES ========================= */ $user_roles = []; $user_blocks = []; if ($selected_user > 0) { $stmt = $pdo->prepare(" SELECT functional_role_id FROM user_functional_roles WHERE company_id = ? AND user_id = ? "); $stmt->execute([ $company_id, $selected_user ]); $user_roles = $stmt->fetchAll(PDO::FETCH_COLUMN); $stmt = $pdo->prepare(" SELECT permission_key FROM user_permission_blocks WHERE company_id = ? AND user_id = ? "); $stmt->execute([ $company_id, $selected_user ]); $user_blocks = $stmt->fetchAll(PDO::FETCH_COLUMN); } require_once __DIR__ . '/partials/header.php'; ?> <div class="container py-4"> <div class="card shadow-sm border-0 rounded-4"> <div class="card-header bg-primary text-white"> <h4 class="mb-0"> User Functional Role Assignment </h4> </div> <div class="card-body"> <?php if ($success): ?> <div class="alert alert-success"> <?= h($success) ?> </div> <?php endif; ?> <?php if ($error): ?> <div class="alert alert-danger"> <?= h($error) ?> </div> <?php endif; ?> <form method="get" class="mb-4"> <div class="row"> <div class="col-md-4"> <label class="form-label"> Select User </label> <select name="user_id" class="form-select" onchange="this.form.submit()" > <option value=""> Select User </option> <?php foreach ($users as $usr): ?> <option value="<?= (int)$usr['id'] ?>" <?= $selected_user == $usr['id'] ? 'selected' : '' ?> > <?= h($usr['name']) ?> </option> <?php endforeach; ?> </select> </div> </div> </form> <?php if ($selected_user > 0): ?> <form method="post"> <input type="hidden" name="user_id" value="<?= $selected_user ?>" > <div class="row"> <!-- FUNCTIONAL ROLES --> <div class="col-md-4"> <div class="card border h-100"> <div class="card-header bg-light"> <strong> Functional Roles </strong> </div> <div class="card-body"> <?php if ($roles): ?> <?php foreach ($roles as $r): ?> <div class="form-check mb-2"> <input class="form-check-input" type="checkbox" name="roles[]" value="<?= (int)$r['id'] ?>" id="role_<?= (int)$r['id'] ?>" <?= in_array($r['id'], $user_roles) ? 'checked' : '' ?> > <label class="form-check-label" for="role_<?= (int)$r['id'] ?>" > <?= h($r['role_name']) ?> </label> </div> <?php endforeach; ?> <?php else: ?> <div class="text-muted"> No functional roles found. </div> <?php endif; ?> </div> </div> </div> <!-- BLOCK MENU ACCESS --> <div class="col-md-8"> <div class="card border"> <div class="card-header bg-light"> <strong> Block Menu Access </strong> </div> <div class="card-body"> <div class="row"> <?php $current_section = ''; $shown_slugs = []; ?> <?php foreach ($menu_items as $item): ?> <?php $url = trim((string)$item['url']); if ($url === '' || $url === '#') { continue; } $slug = basename($url, '.php'); if ($slug === '') { continue; } /* ========================= SKIP DUPLICATE SLUGS ========================= */ if (in_array($slug, $shown_slugs, true)) { continue; } $shown_slugs[] = $slug; $section = trim((string)$item['section_name']); ?> <?php if ($current_section !== $section): ?> <?php $current_section = $section; ?> <div class="col-12 mt-3"> <h6 class="border-bottom pb-1 text-primary"> <?= h($section) ?> </h6> </div> <?php endif; ?> <div class="col-md-6"> <div class="form-check mb-2"> <input class="form-check-input" type="checkbox" name="blocked_permissions[]" value="<?= h($slug) ?>" id="perm_<?= md5($slug) ?>" <?= in_array($slug, $user_blocks) ? 'checked' : '' ?> > <label class="form-check-label" for="perm_<?= md5($slug) ?>" > <?= h($item['title']) ?> </label> </div> </div> <?php endforeach; ?> </div> </div> </div> </div> </div> <div class="mt-4"> <button type="submit" class="btn btn-primary" > Save Settings </button> </div> </form> <?php endif; ?> </div> </div> </div> <?php require_once __DIR__ . '/partials/footer.php'; ?>