# Integração de presença automática no Moodle

**Descrição:**

A integração de presença com o Moodle permite que o status de participação (presente ou ausente) dos usuários em uma sessão do ConferênciaWeb seja automaticamente registrado na primeira atividade de "Presença" (`mod_attendance`) encontrada no curso Moodle correspondente.

Quando uma conferência termina, um evento (webhook) é enviado para a aplicação LTI. Um job em background é então acionado para:

1. Identificar a reunião agendada e a configuração do Moodle associada.
2. Buscar ou criar uma instância da atividade "Presença" no curso Moodle.
3. Criar uma nova "Sessão de Presença" dentro desta atividade, correspondente à conferência realizada.
4. Marcar como "Presente" todos os usuários que participaram da conferência.
5. Marcar como "Ausente" todos os demais usuários inscritos no curso Moodle que não participaram da conferência.

**Público-alvo:**

Usuários finais (alunos e professores)

<figure><img src="https://4071737184-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M7hXYp2PZ9COGqQOKpE%2Fuploads%2Ftssq7BHJ5tGQuMruu8Ai%2Fimage%20(8).png?alt=media&#x26;token=3d4f2b3b-33fe-4dc8-b67c-ee8e37b3e905" alt=""><figcaption></figcaption></figure>

<figure><img src="https://4071737184-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M7hXYp2PZ9COGqQOKpE%2Fuploads%2F10moCKMxqt2mHIQvYtUN%2Fimage%20(9).png?alt=media&#x26;token=5ac3ff89-0b46-456c-bd31-a130202e0e4b" alt=""><figcaption></figcaption></figure>

<figure><img src="https://4071737184-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M7hXYp2PZ9COGqQOKpE%2Fuploads%2FC6crFO8MNQlFnjsrs4qu%2Fimage%20(10).png?alt=media&#x26;token=d6a72bd6-ab81-4696-8272-59c11b6a70da" alt=""><figcaption></figcaption></figure>

**Pré-requisitos para ativação:**

* Moodle com Web Services habilitado;
* Acesso administrativo ao Moodle

Como ativar a integração:

### No Moodle (admin)

#### **1. Instalação do Plugin `mod_attendance`**:

* O plugin "Presença" (`mod_attendance`) deve estar instalado e habilitado na sua instância do Moodle. Este plugin é padrão em muitas instalações do Moodle, mas verifique se ele está disponível.

{% embed url="<https://moodle.org/plugins/mod_attendance>" %}

Criação de um Token de Serviço Web:

{% hint style="danger" %}
Caso o seu Moodle já esteja configurado para alguma outra integração do LTI ConferênciaWeb (como suporte para grupos do Moodle ou integração com o calendário do Moodle) você já deve ter um serviço e o seu respectivo token criados. Nesse caso, execute apenas o passo 2.3 dessa seção
{% endhint %}

Criar um novo serviço externo (Administração do site → Servidor → Serviços externos (na linha de Web services) conforme abaixo:

<figure><img src="https://4071737184-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M7hXYp2PZ9COGqQOKpE%2Fuploads%2FRjoHinamXNUHvqJs34FG%2FUntitled%20(13).png?alt=media&#x26;token=7fdefe55-c56a-4de2-af5c-124fbaf76b3d" alt=""><figcaption></figcaption></figure>

Na tela seguinte, clique em Adicionar funções.

<figure><img src="https://4071737184-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M7hXYp2PZ9COGqQOKpE%2Fuploads%2FzDPgSzB9dFiTVJr2eTlR%2FUntitled%20(14).png?alt=media&#x26;token=5a823544-195d-4653-9099-2ea5670b742e" alt=""><figcaption></figcaption></figure>

Adicione as 7 seguinte funções no serviço:

* `core_webservice_get_site_info`
* `core_course_get_contents`
* `core_enrol_get_enrolled_users`
* `mod_attendance_add_attendance`
* `mod_attendance_add_session`
* `mod_attendance_get_session`
* `mod_attendance_update_user_status`

<figure><img src="https://4071737184-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M7hXYp2PZ9COGqQOKpE%2Fuploads%2FGCvrjHioGY0gmwVVRJAH%2Fimage%20(11).png?alt=media&#x26;token=483ae17a-10a6-4508-8828-8567c5ed7efa" alt=""><figcaption></figcaption></figure>

Criar um novo token (Administração do site → Servidor → Gerenciar tokens (na linha de Web services) conforme abaixo:

<figure><img src="https://4071737184-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M7hXYp2PZ9COGqQOKpE%2Fuploads%2FJFTCUVUZrgV1ktaayKcD%2FUntitled%20(15).png?alt=media&#x26;token=3234c371-0e5b-4783-a80c-88144557f888" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}

É importante notar que:

* O nome do usuário é o nome de quem está criando o token;
* O serviço precisa ser o recém-criado (mconf-external-service);
* O checkbox do Válido até está DESMARCADO. Caso queira posteriormente invalidar o token, o mesmo pode ser excluído na página Gerenciar tokens.
  {% endhint %}

Ao criar o token, a seguinte página mostrará o token uma única vez, então anote em algum lugar seguro.

<figure><img src="https://4071737184-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M7hXYp2PZ9COGqQOKpE%2Fuploads%2F7qatTDZazZHo1Cfqe8Dl%2FUntitled%20(16).png?alt=media&#x26;token=84c0a02d-d11c-428a-beff-62dc36e1a875" alt=""><figcaption></figcaption></figure>

### No Dash do ConferenciaWeb

**2.6** Criar uma ou editar uma `ConsumerConfig`

* Preencher o campo `MoodleToken` com os dados abaixo:

| **Campo**            | **Valor**                                                                                                                                  |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `token`              | O token gerado no Moodle                                                                                                                   |
| `url`                | URL da API do Moodle (ex.: [`https://moodle.h.elos.dev/webservice/rest/server.php`](https://moodle.h.elos.dev/webservice/rest/server.php)) |
| `consumer_config_id` | ID da `ConsumerConfig` do cliente/instituição                                                                                              |

#### Validação visual

* Ao configurar corretamente ao `token` e a `URL`, no formulário de **Agendamentos** apresentará a opção de atribuir presença automaticamente. Note que, ao marcar essa opção, a opção de `Aguardar moderador para entrar` é ativada automaticamente, já que a presença de um moderador na sessão é essencial para a atribuição de presença.

<figure><img src="https://4071737184-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M7hXYp2PZ9COGqQOKpE%2Fuploads%2FGM2Lolt2VyT10XceaZp5%2Fimage%20(12).png?alt=media&#x26;token=ecf042dc-75bf-4db9-aa2a-2c579b6552f3" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}

### Testes recomendados

Antes de liberar as credencias e a integração, recomendamos:

* Criar um agendamento com a opção `Atribuir presença automaticamente` ligada e iniciar uma reunião nesse agendamento.
* Alguns minutos depois da finalização da reunião, uma atividade de presença e uma sessão correspondente ao agendamento devem ser criadas na lista de atividades do curso no Moodle.
  {% endhint %}

### Observações

* **Suporte para grupos:** Caso a integração do LTI ConferênciaWeb com o sistema de grupos do Moodle esteja ativa, as sessões de um grupo serão corretamente cadastradas na atividade de presença.
* **Lista de usuários na sessão:** Note que administradores/professores do curso não aparecerão na lista de alunos presentes na sessão da atividade de presença.
* **Caderno de notas:** Os status marcados nas sessões da atividade de presença valem pontos de nota no caderno de notas no curso, então lembre de deletar sessões de teste.
* **Tentativas de API**: As chamadas para a API do Moodle são configuradas para tentar novamente até **3 vezes** em caso de falhas de comunicação ou timeouts.
* **Indisponibilidade do Moodle**: Se, no momento em que o job de marcação de presença for executado, a instância do Moodle estiver offline ou inacessível (mesmo após as tentativas), a sessão de presença **não será criada** no Moodle para aquela conferência, e a presença não será registrada. Não há um mecanismo de re-enfileiramento automático do job para tentativas posteriores em caso de falha total após os retries.
  * Nesse caso, o professor pode criar uma sessão manualmente na atividade de presença e atribuir os status de presença e ausência com base na lista de participantes (arquivo que pode ser baixado a partir do histórico de sessões na interface do LTI ConferênciaWeb).

{% hint style="danger" %}
Todos os alunos devem ter pelo menos 1 status de presença ou ausência marcada na sessão da atividade de presença! Caso o status seja vazio, a nota do aluno não aparecerá no caderno de notas do curso.
{% endhint %}

### Solução de Problemas

* Caso o curso esteja configurado para usar grupos mas o `MoodleToken` não esteja com `group_select_enabled` marcado, a criação de sessão na atividade de presença vai falhar com o erro `Valor inválido de parâmetro detectado`.
* Verifique os logs da aplicação ConferênciaWeb (especialmente os logs do `MoodleAttendanceJob`) para detalhes sobre erros durante o processo.
* Confirme se todas as funções de serviço web listadas estão habilitadas para o token no Moodle.
* Assegure que o usuário Moodle associado ao token tem permissão para gerenciar atividades de presença e visualizar usuários nos cursos relevantes.
* **Todos** os alunos precisam ter pelo menos 1 status preenchido em **todas** as sessões de uma atividade de presença. Caso contrário, os alunos não terão suas notas preenchidas para a atividade de presença no quadro de notas.
  * Esse cenário pode acontecer caso o papel de um usuário mude, ou se o usuário entrar/sair depois no curso.
  * Lembre que administradores não aparecem na lista de usuários da sessão, o que pode dificultar o descobrimento da sessão incompleta. Nesse caso, o recomendável é editar a presença via CSV.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ajuda.rnp.br/conferenciaweb/manuais-de-uso-do-servico/manual-do-administrador/integracao-de-presenca-automatica-no-moodle.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
