Consultar alunos que não acessaram o curso há pelo menos x dias no Moodle

Consultar alunos que não acessaram o curso há pelo menos x dias no Moodle

por Lino Vaz Moniz -
Número de respostas: 0

Para gerar uma lista de alunos que não acessaram o curso em um certo período de tempo, na Plataforma Moodle, o procedimento é o seguinte:

1) Gerar a lista de alunos que acessaram o curso pela data do último acesso.  O comando SQL  a seguir faz isso. 

SELECT u.id,u.username,u.email,u.firstname,u.lastname,ul.timeaccess FROM mdl_role_assignments rs INNER JOIN mdl_context e ON rs.contextid=e.id INNER JOIN mdl_role r ON rs.roleid=r.id INNER JOIN mdl_user u ON rs.userid=u.id INNER JOIN mdl_enrol en ON e.instanceid=en.courseid INNER JOIN mdl_user_enrolments ue ON en.id=ue.enrolid  INNER JOIN mdl_user_lastaccess ul ON (e.instanceid=ul.courseid AND rs.userid=ul.userid)  WHERE e.contextlevel=50 AND rs.userid=ue.userid AND ue.status = 0 AND en.status = 0 AND r.shortname='student' AND en.courseid =?

Passo o parâmetro id do curso em en.courseid =? 
Caso queira que a data venha formatado, substitua a coluna ul.timeaccess para from_unixtime(ul.timeaccess, '%d/%m/%Y %H:%i:%s') AS timeaccess

O resultado dessa consulta lista os alunos que acessaram e a data do último acesso

2) Para mapear a lista de alunos que não acessaram há 7 dia,  por exemplo, precisamos adicionar um filtro de data no comando anterior. Segue o comando com esse filtro.

SELECT u.id,u.username,u.email,u.firstname,u.lastname,ul.timeaccess FROM mdl_role_assignments rs INNER JOIN mdl_context e ON rs.contextid=e.id INNER JOIN mdl_role r ON rs.roleid=r.id INNER JOIN mdl_user u ON rs.userid=u.id INNER JOIN mdl_enrol en ON e.instanceid=en.courseid INNER JOIN mdl_user_enrolments ue ON en.id=ue.enrolid  INNER JOIN mdl_user_lastaccess ul ON (e.instanceid=ul.courseid AND rs.userid=ul.userid)  WHERE e.contextlevel=50 AND rs.userid=ue.userid AND ue.status = 0 AND en.status = 0 AND r.shortname='student' AND en.courseid =? AND ul.timeaccess < ?

Passo o parâmetro id do curso em en.courseid =? 
Passo o parâmetro da data com quantidade de dias já deduzida em formato numérico (timestamp) em   ul.timeaccess < ?

No filtro do comando data, a lógica é a seguinte. Se hoje for dia 10/02/2020 e pretendemos mapear alunos sem acesso ha pelo menos 7 dias, vamos computar a data subtraindo 7 dias. Assim, a data seria 3/02/2020. Essa data deve ser convertida para timestamp e passada como parâmetro. No filtro será retornado todos os alunos do curso que já acessaram o curso, porém não fizeram nenhum acesso da partir do dia 3/02/2020. 

Para implementar o comando SQL especificado no item 2) em uma função PHP usando API do Moodle, veja o código a seguir.

public function get_course_students($courseid,$daywithoutaccess) {
        global $CFG,$DB;
        $curreenttime=time();
        if($daywithoutaccess > 0){
            $daywithoutaccess=$daywithoutaccess*86400;
            $curreenttime=$curreenttime-$daywithoutaccess;
        }
        $sql="SELECT u.id,u.username,u.email,u.firstname,u.lastname,from_unixtime(ul.timeaccess, '%d/%m/%Y %H:%i:%s') AS timelastaccess FROM {$CFG->prefix}role_assignments rs INNER JOIN {$CFG->prefix}context e ON rs.contextid=e.id INNER JOIN {$CFG->prefix}role r ON rs.roleid=r.id INNER JOIN {$CFG->prefix}user u ON rs.userid=u.id INNER JOIN {$CFG->prefix}enrol en ON e.instanceid=en.courseid INNER JOIN {$CFG->prefix}user_enrolments ue ON en.id=ue.enrolid  INNER JOIN {$CFG->prefix}user_lastaccess ul ON (e.instanceid=ul.courseid AND rs.userid=ul.userid)  WHERE e.contextlevel=50 AND rs.userid=ue.userid AND ue.status = 0 AND en.status = 0 AND r.shortname='student' AND en.courseid = :courseid AND ul.timeaccess <= :timeaccess ";
        $param=array('courseid'=>$courseid,'timeaccess'=>$curreenttime);
        $row = $DB->get_records_sql($sql,$param);
        return $row;
    }