<?php
/**
* Clase para gestión de roles y permisos del Working English System
*/
if (!defined('ABSPATH')) {
exit;
}
class WES_Roles {
/**
* Definición de roles del sistema
*/
private static $roles = array(
'wes_admin' => array(
'display_name' => 'WES Administrator',
'capabilities' => array(
'manage_wes_system',
'manage_wes_students',
'manage_wes_teachers',
'manage_wes_groups',
'manage_wes_finance',
'view_wes_reports',
'manage_wes_settings',
'delete_wes_data',
'export_wes_data'
)
),
'wes_coordinator' => array(
'display_name' => 'Academic Coordinator',
'capabilities' => array(
'manage_wes_students',
'manage_wes_teachers',
'manage_wes_groups',
'view_wes_finance',
'view_wes_reports'
)
),
'wes_teacher' => array(
'display_name' => 'Teacher',
'capabilities' => array(
'view_wes_students',
'view_own_groups',
'manage_own_students',
'view_own_reports'
)
),
'wes_receptionist' => array(
'display_name' => 'Receptionist',
'capabilities' => array(
'manage_wes_students',
'view_wes_groups',
'manage_wes_finance',
'process_payments',
'print_receipts'
)
),
'wes_finance' => array(
'display_name' => 'Finance Officer',
'capabilities' => array(
'view_wes_students',
'manage_wes_finance',
'view_wes_reports',
'export_finance_data',
'manage_charges',
'process_payments'
)
)
);
/**
* Módulos del sistema y sus permisos requeridos
*/
private static $modules = array(
'students' => array(
'view' => 'view_wes_students',
'manage' => 'manage_wes_students',
'delete' => 'delete_wes_data'
),
'teachers' => array(
'view' => 'view_wes_teachers',
'manage' => 'manage_wes_teachers',
'delete' => 'delete_wes_data'
),
'groups' => array(
'view' => 'view_wes_groups',
'manage' => 'manage_wes_groups',
'delete' => 'delete_wes_data'
),
'finance' => array(
'view' => 'view_wes_finance',
'manage' => 'manage_wes_finance',
'process' => 'process_payments'
),
'reports' => array(
'view' => 'view_wes_reports',
'export' => 'export_wes_data'
),
'settings' => array(
'manage' => 'manage_wes_settings'
)
);
/**
* Crear roles personalizados
*/
public static function create_roles() {
foreach (self::$roles as $role => $config) {
// Eliminar rol si existe para recrearlo
remove_role($role);
// Crear nuevo rol
add_role(
$role,
__($config['display_name'], 'working-english-system'),
array_fill_keys($config['capabilities'], true)
);
}
// Agregar capacidades al administrador de WordPress
$admin_role = get_role('administrator');
if ($admin_role) {
foreach (self::$roles['wes_admin']['capabilities'] as $cap) {
$admin_role->add_cap($cap);
}
}
}
/**
* Eliminar roles personalizados
*/
public static function remove_roles() {
// Remover capacidades del administrador
$admin_role = get_role('administrator');
if ($admin_role) {
foreach (self::$roles['wes_admin']['capabilities'] as $cap) {
$admin_role->remove_cap($cap);
}
}
// Eliminar roles personalizados
foreach (array_keys(self::$roles) as $role) {
remove_role($role);
}
}
/**
* Verificar si el usuario puede acceder a un módulo
*/
public static function user_can_access_module($module, $action = 'view') {
if (!isset(self::$modules[$module])) {
return false;
}
if (!isset(self::$modules[$module][$action])) {
return false;
}
$required_capability = self::$modules[$module][$action];
return current_user_can($required_capability);
}
/**
* Obtener módulos accesibles para el usuario actual
*/
public static function get_user_accessible_modules() {
$accessible = array();
foreach (self::$modules as $module => $actions) {
foreach ($actions as $action => $capability) {
if (current_user_can($capability)) {
if (!isset($accessible[$module])) {
$accessible[$module] = array();
}
$accessible[$module][] = $action;
}
}
}
return $accessible;
}
/**
* Verificar si el usuario es maestro
*/
public static function is_teacher($user_id = null) {
if (!$user_id) {
$user_id = get_current_user_id();
}
$user = get_userdata($user_id);
return $user && in_array('wes_teacher', $user->roles);
}
/**
* Obtener ID del maestro asociado al usuario
*/
public static function get_teacher_id($user_id = null) {
if (!$user_id) {
$user_id = get_current_user_id();
}
global $wpdb;
return $wpdb->get_var($wpdb->prepare(
"SELECT id FROM {$wpdb->prefix}wes_teachers WHERE user_id = %d",
$user_id
));
}
/**
* Verificar si el usuario puede ver datos de un estudiante específico
*/
public static function can_view_student($student_id, $user_id = null) {
if (!$user_id) {
$user_id = get_current_user_id();
}
// Admin y coordinadores pueden ver todo
if (current_user_can('manage_wes_students')) {
return true;
}
// Maestros solo pueden ver sus estudiantes
if (self::is_teacher($user_id)) {
$teacher_id = self::get_teacher_id($user_id);
if (!$teacher_id) {
return false;
}
global $wpdb;
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->prefix}wes_enrollments e
JOIN {$wpdb->prefix}wes_groups g ON e.group_id = g.id
WHERE e.student_id = %d AND g.teacher_id = %d AND e.status = 'active'",
$student_id,
$teacher_id
));
return $count > 0;
}
return false;
}
/**
* Verificar si el usuario puede ver datos de un grupo específico
*/
public static function can_view_group($group_id, $user_id = null) {
if (!$user_id) {
$user_id = get_current_user_id();
}
// Admin y coordinadores pueden ver todo
if (current_user_can('manage_wes_groups')) {
return true;
}
// Maestros solo pueden ver sus grupos
if (self::is_teacher($user_id)) {
$teacher_id = self::get_teacher_id($user_id);
if (!$teacher_id) {
return false;
}
global $wpdb;
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->prefix}wes_groups WHERE id = %d AND teacher_id = %d",
$group_id,
$teacher_id
));
return $count > 0;
}
return false;
}
/**
* Obtener nombre del rol actual del usuario
*/
public static function get_user_role_name($user_id = null) {
if (!$user_id) {
$user_id = get_current_user_id();
}
$user = get_userdata($user_id);
if (!$user || empty($user->roles)) {
return '';
}
$role = $user->roles[0];
// Si es un rol de WES, devolver el nombre personalizado
if (isset(self::$roles[$role])) {
return __(self::$roles[$role]['display_name'], 'working-english-system');
}
// Para otros roles de WordPress
$wp_roles = wp_roles();
return isset($wp_roles->roles[$role]) ?
translate_user_role($wp_roles->roles[$role]['name']) :
$role;
}
/**
* Generar menú de navegación según permisos del usuario
*/
public static function get_navigation_menu() {
$menu = array();
// Dashboard siempre visible
$menu['dashboard'] = array(
'title' => __('Dashboard', 'working-english-system'),
'url' => admin_url('admin.php?page=wes-dashboard'),
'icon' => 'dashicons-dashboard',
'capability' => 'manage_wes_system'
);
// Estudiantes
if (current_user_can('view_wes_students') || current_user_can('manage_wes_students')) {
$menu['students'] = array(
'title' => __('Students', 'working-english-system'),
'url' => admin_url('admin.php?page=wes-students'),
'icon' => 'dashicons-groups',
'capability' => 'view_wes_students'
);
}
// Maestros
if (current_user_can('view_wes_teachers') || current_user_can('manage_wes_teachers')) {
$menu['teachers'] = array(
'title' => __('Teachers', 'working-english-system'),
'url' => admin_url('admin.php?page=wes-teachers'),
'icon' => 'dashicons-businessman',
'capability' => 'view_wes_teachers'
);
}
// Grupos
if (current_user_can('view_wes_groups') || current_user_can('manage_wes_groups')) {
$menu['groups'] = array(
'title' => __('Groups', 'working-english-system'),
'url' => admin_url('admin.php?page=wes-groups'),
'icon' => 'dashicons-schedule',
'capability' => 'view_wes_groups'
);
}
// Finanzas
if (current_user_can('view_wes_finance') || current_user_can('manage_wes_finance')) {
$menu['finance'] = array(
'title' => __('Finance', 'working-english-system'),
'url' => admin_url('admin.php?page=wes-finance'),
'icon' => 'dashicons-money-alt',
'capability' => 'view_wes_finance'
);
}
// Reportes
if (current_user_can('view_wes_reports')) {
$menu['reports'] = array(
'title' => __('Reports', 'working-english-system'),
'url' => admin_url('admin.php?page=wes-reports'),
'icon' => 'dashicons-chart-bar',
'capability' => 'view_wes_reports'
);
}
// Configuraciones
if (current_user_can('manage_wes_settings')) {
$menu['settings'] = array(
'title' => __('Settings', 'working-english-system'),
'url' => admin_url('admin.php?page=wes-settings'),
'icon' => 'dashicons-admin-settings',
'capability' => 'manage_wes_settings'
);
}
return $menu;
}
/**
* Verificar acceso a página de administración
*/
public static function check_admin_access($page) {
$page_capabilities = array(
'wes-dashboard' => 'manage_wes_system',
'wes-students' => 'view_wes_students',
'wes-teachers' => 'view_wes_teachers',
'wes-groups' => 'view_wes_groups',
'wes-finance' => 'view_wes_finance',
'wes-reports' => 'view_wes_reports',
'wes-settings' => 'manage_wes_settings'
);
if (!isset($page_capabilities[$page])) {
return false;
}
return current_user_can($page_capabilities[$page]);
}
}