class-wes-roles.php

   

<?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]);
    }
}