segunda-feira, 29 de novembro de 2010

Desmistificando Período de Inscrição do Curso no Moodle com Comando SQL

    Caso você esteja programando para Moodle e estiver roendo a unha tentando entender como funciona o período de validade de inscrição no curso do  Moodle, dê uma relaxada e leia esse post. Aqui será explicado as regras de funcionamento a nível da camada de aplicação e o armazenamento no banco de dados. 
   
    Regras de Funcionamento
    Período da validade de inscrição define o tempo da validade da matrícula do aluno ou tutor. É definido em quantidade de dias. A data da validade da inscrição, ou seja, data em que expira a matrícula é computada de seguinte forma: data da inscrição (data do dia que a inscrição foi feita) + quantidades de dias da validade. Por exemplo, caso o período da validade for definida em 20 dias e um aluno for inscrito no dia 1 de dezembro, a data final da validade da inscrição será dia 21 de dezembro. 
   
No Moodle 2.0 a data de inscrição pode ser personalizada. Até versão 1.9 essa data era definida automaticamente, ou seja, a data do dia em que a inscrição foi feita no curso.

    Quando o período da inscrição expirar o aluno não perde o acesso ao curso automaticamente. A inscrição continua ativa.  O cancelamento ocorre quando o cron for executado. Pois, uma das ações do cron é apagar todos as inscrições em que a data da validade já tenha expirada. Isso aconteceu em alguns teste que fiz. Certamente há alguma configuração que ativa isso. Se você ouvir alguém reclamando que os alunos inscritos sumiram do curso de uma hora para outro ou perderam acesso não tenha dúvida, a culpa é do cron que sai apagando tudo que está fora do prazo.

    A boa notícia é que ao excluir a inscrição do aluno, os dados de log de acesso, nota e participação nas atividades não serão apagados em efeito cascata. Continuam na base de dados. Se o aluno for reescrito, tudo volta ao normal como que se nada tivesse acontecido.
   
    Quando o período da validade de inscrição não for definido  significa que é ilimitado. Isto é, a inscrição nunca será apagada pelo cron.

Armazenamento de Dados nas Tabelas

    Agora que você já entendeu como funciona o período da validade de inscrição, vamos ver como  é estruturada no banco de dados. 
   
As informações são registradas em duas tabelas:
  • mdl_course – Tabela do curso
  • mdl_role_assignments – Tabela da matrícula, ou seja, inscrição nos cursos

Na tabela  mdl_course são registradas as configurações gerais do curso. A coluna enrolperiod dessa tabela registra o período da validade em quantidade de dias. Se o período for ilimitado, o valor dessa coluna será zero. Se a validade  for de um dia será registrado o seguinte valor: 86400 e se for de 20 dias o valar será 1728000.  Nesse momento você deve estar achando tudo muito estranho e até  questionando  por que esse número esquisito.

Bem vamos lá, é muito simples. Todo o campo da tabela do banco de dados do Moodle registra a data em quantidade de segundos.   Pois, o campo enrolperiod armazena dias em quantidade de segundo. Para decifrar a quantidade de dias basta dividir o valor da coluna por 60 segundos e por 60 minutos e,  por último, por 24 horas. Então 86400/60/60/24=1 ou 1728000/60/60/24=20.

A tabela mdl_role_assignments armazena os dados das inscrições. O período de validade da inscrição de cada usuário fica nas seguintes colunas:
•    timestart – data inicial da inscrição
•    timeend – data final da inscrição

A data inicial é a data em que a inscrição foi feita. A data final é a data da inscrição atualizada com os dias da validade da inscrição. Essa data é calculada a partir da data inicial adicionada os dias da validade de inscrição definida no formulário de inscrição que é acessado a  partir do link designar funções no ambiente do curso. Nesse formulário há um campo período de validade de inscrição para selecionar os dias. Esse campo traz como opção padrão o período da validade da inscrição definida em nível do curso.

Relatórios com SQL
Se até aqui ficou bem claro, vamos agora extrair os relatórios sobre o período da validade de inscrição com comando SQL.

Período de validade de inscrição por curso
SELECT id,fullname,startdate,enrolperiod FROM mdl_course

Essa consulta retorna uma lista de curso com as seguintes informações:
  • id – id  do curso
  • fullname- Nome do curso
  • startdate – Data de início do curso
  • enrolperiod – Período de validade do curso em quantidade de dias (convertido em segundos)

Período de validade de inscrição por participante de um determinado curso

SELECT u.firstname,u.lastname,rs.timestart,rs.timeend FROM mdl_role_assignments rs INNER JOIN mdl_user u ON u.id=rs.userid INNER JOIN mdl_context e ON rs.contextid=e.id WHERE e.contextlevel=50 AND e.instanceid=?

Passe id do  curso no  parâmetro e.instanceid=?

Essa consulta retorna uma lista de curso com as seguintes informações:
  • u.firstname – Nome do participante
  • u.lastname – Sobrenome do participante
  •  rs.timestart – Data inicial da inscrição
  • rs.timeend – Data final da inscrição (data em que a inscrição expira)

Período de validade de inscrição de um determinado  participante


SELECT c.id,c.fullname, rs.timestart,rs.timeend FROM mdl_course c INNER JOIN mdl_context e ON c.id=e.instanceid INNER JOIN  mdl_role_assignments rs ON e.id=rs.contextid WHERE e.contextlevel=50 AND rs.userid=?
Passe id do  usuário  no  parâmetro  rs.userid=?

Essa consulta retorna uma lista de curso que um determinado aluno ou tutor está matriculado acompanhado da data inicial e final da validade de inscrição.
A consulta retorna:

  • c.id - id  do curso
  • c.fullname - Nome do curso
  • rs.timestart - Data inicial da inscrição
  • rs.timeend - Data final da inscrição (data em que a inscrição expira)

Bem, finalmente desvendamos mais um segredo do Moodle. Agora só falta você fazer um relatório customizado bonito e entregar à equipe pedagógica ou ao seu chefe que via regra não entende nada da parte técnica para variar. Este quando faz uma demanda quer que a resposta seja para ontem  e ficam no seu cangote achando que tudo é muito simples como que se fosse uma padaria.

Veja Também:

Relatório da Configuração do Período da Validade da Inscrição no Curso do Moodle com Programação PHP

Relatório do Período da Validade da Inscrição dos Participantes no Curso do Moodle com Programação PHP

Data de inscrição do aluno no curso do Moodle

10 comentários:

  1. Esse post simplesmente me salvou. Obrigado por divulgar essa informação tão preciosa!

    ResponderExcluir
  2. Amigo, o banco do meu moodle simplesmente NAO TEM estas colunas...
    e agora? Não há uma forma de executar estes comandos via Administrador?

    ResponderExcluir
  3. Mateador,
    Se o seu banco não tem essas colunas, certamente você está usando a versão 2.0 ou superior. Na versão 2.0 houve uma grande mudança. Esse post descreve a estrutura das tabelas de inscrição da versão 1.7 a 1.9.

    ResponderExcluir
  4. exato!
    eu uso a versão 2.1.2
    nesta versão não tem como fazer este controle?

    ResponderExcluir
  5. Mateador,
    É possível sim. Ainda não publiquei um post sobre a inscrição no Moodle 2.0. Dê uma olhada nos comentários do post: Matricular Usuário no Curso do Moodle com Comando SQL

    Aí eu explico como inscrever o aluno no curso na versão 2.0 no comentário feito no dia 30 de setembro. Os campos referente ao período da validade de inscrição ficam na tabela mdl_user_enrolments.

    ResponderExcluir
  6. Badiu,

    Como descobrir os usuários que estavam inscritos no curso, e por ter expirado o tempo de inscrição eles foram excluídos.
    Seria possível fazer uma consulta retornando aqueles que estão inscritos e os que foram retirados?

    ResponderExcluir