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; }