prepare("SELECT * FROM users WHERE id = ? LIMIT 1"); $stmt->execute([$id]); return $stmt->fetch(PDO::FETCH_ASSOC) ?: null; } // Fetch a single user row by email (canonical SSO key). function db_get_user_by_email(PDO $pdo, string $email): ?array { $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ? LIMIT 1"); $stmt->execute([strtolower(trim($email))]); return $stmt->fetch(PDO::FETCH_ASSOC) ?: null; } // All backoffice users (sysadmin + admin + staff) for management lists. function db_get_all_staff(PDO $pdo): array { return $pdo->query( "SELECT * FROM users WHERE role IN ('sysadmin','admin','staff') ORDER BY FIELD(role,'sysadmin','admin','staff'), name" )->fetchAll(PDO::FETCH_ASSOC); } // Active admins (sysadmin + admin) — e.g. assignment dropdowns. function db_get_active_admins(PDO $pdo): array { return $pdo->query( "SELECT * FROM users WHERE role IN ('sysadmin','admin') AND is_active = 1 ORDER BY name" )->fetchAll(PDO::FETCH_ASSOC); } // Every user, in role order — the listing at views/user/index.php. function db_users_list(PDO $pdo): array { return $pdo->query( "SELECT id, name, email, phone, role, is_active, password_hash, last_login_at, last_login_ua FROM users ORDER BY FIELD(role,'sysadmin','admin','staff','client'), name" )->fetchAll(PDO::FETCH_ASSOC); } // Dashboard widget counts (views/admin/dashboard.php). function db_users_count_clients(PDO $pdo): int { return (int) $pdo->query("SELECT COUNT(*) FROM users WHERE role = 'client'")->fetchColumn(); } function db_users_count_team(PDO $pdo): int { return (int) $pdo->query("SELECT COUNT(*) FROM users WHERE role IN ('admin','staff')")->fetchColumn(); } // Profile self-edit (views/user/profile.php) — the contact-details half of // the form; the password half already goes through auth_set_password(). function db_user_update_profile(PDO $pdo, int $userId, array $data): void { $pdo->prepare( "UPDATE users SET phone=?, address=?, city=?, postal_code=?, email_opt_out=?, sms_opt_out=?, marketing_consent=? WHERE id=?" )->execute([ $data['phone'], $data['address'], $data['city'], $data['postal_code'], $data['email_opt_out'], $data['sms_opt_out'], $data['marketing_consent'], $userId, ]); } // PT-PT label for the role ladder. function role_label(string $role): string { return [ 'sysadmin' => 'Administrador de sistema', 'admin' => 'Administrador', 'staff' => 'Equipa', 'client' => 'Cliente', ][$role] ?? ucfirst($role); }