Sincronização SUAP → Moodle¶
Este guia explica o que acontece “por trás dos bastidores” no Moodle quando o serviço sync_up_enrolments
(veja API e serviços) recebe uma estrutura de curso/turma vinda do SUAP — tanto para quem acompanha o resultado
prático (equipe pedagógica/coordenação) quanto para quem precisa rastrear o código (equipe de TI).
Resumo prático¶
Como colaborador em educação, o resultado prático que você vê no Moodle após a sincronização é:
Salas organizadas: pastas de campus, curso e semestre organizadas sem esforço manual.
Salas prontas: sala de diário e sala de coordenação de curso criadas automaticamente na categoria correspondente.
Pessoas certas nos lugares certos: alunos e professores inscritos com acesso ativo ou suspenso em sincronia com o SUAP Edu.
Facilidade de gestão: estudantes já divididos em grupos por polo ou período de ingresso dentro de cada disciplina.
Vocabulário¶
SUAPO ERP (Enterprise Resource Planning) construído pelo IFRN.
SUAP EduMódulo do SUAP que funciona como Sistema de Gestão Acadêmica (SGA); é onde reside o registro acadêmico oficial (matrículas, notas oficiais, dados pessoais, vínculos). Não é onde as aulas acontecem — toda informação acadêmica oficial é gerida ali.
MoodleA plataforma de AVA (Ambiente Virtual de Aprendizagem / LMS) que hospeda as salas de aula virtuais do IFRN. É onde ocorre o processo de ensino-aprendizagem. Nenhuma informação acadêmica oficial é gerada diretamente aqui; ela é apenas refletida a partir do SUAP (inscrições) e só volta a ser oficial após retornar ao SUAP (notas).
Integrador AVAA ponte entre os dados do SUAP e o Moodle — o middleware que viabiliza esta integração, tipicamente o cliente HTTP que chama o serviço
sync_up_enrolmentsdeste plugin.Painel AVAInterface que unifica, para o usuário, o acesso às salas de vários Moodle.
Sincronizar/sincronizaçãoProcesso de cadastrar, alterar ou remover categoria, sala, usuário, inscrição, grupo ou vinculação a grupo, tanto de SUAP para Moodle quanto de Moodle de volta para SUAP (no caso de notas).
CategoriaEquivale a uma category no Moodle.
SalaEquivale a um course no Moodle. Evita-se o termo “curso” aqui porque, na educação, “curso” já tem outro significado (o curso acadêmico do SUAP) e conflitaria com a terminologia institucional.
UsuárioEquivale a um user no Moodle — normalmente em relação 1 para 1 com uma conta no SUAP.
DocenteProfessor formador, professor conteudista, professor principal, tutor ou mediador.
InscriçãoEquivale a um enrolment associado a um ou mais role assign no Moodle. Um usuário pode ter várias inscrições/role assign em uma sala, especialmente educadores; de alunos espera-se apenas uma inscrição.
GrupoEquivale a um group no Moodle: uma forma de agrupar usuários dentro de uma sala para atividades coletivas.
AgrupamentoEquivale a um grouping (grupo de grupos) no Moodle. A suíte não lida com este cenário.
CoorteEquivale a um cohort no Moodle: um grupo global de usuários (diferente do grupo, que é por sala), usado para inscrever/desinscrever automaticamente o usuário nas salas onde a coorte foi adicionada.
VinculaçãoEquivale a um group member no Moodle: o vínculo de um usuário a um grupo ou a uma coorte.
Curso(no sentido do SUAP)Não tem equivalente direto no Moodle — o course do Moodle equivale à Sala definida acima. Cada curso do SUAP gera, no entanto, uma categoria no Moodle.
TurmaNão tem equivalente no Moodle; cada turma gera uma categoria, e opcionalmente um grupo dentro da sala, com os alunos vinculados a ele.
PoloNão tem equivalente no Moodle; opcionalmente gera um grupo, com os alunos vinculados a ele.
ProgramaNão tem equivalente no Moodle; opcionalmente gera um grupo, com os alunos vinculados a ele.
Disciplina/componente curricularNão tem equivalente no Moodle — escopo de gestão acadêmica do SUAP. Não confundir com Diário.
Média da etapaEquivale à nota de uma categoria de notas no quadro de notas do Moodle, mapeada para
N1,N2,N3ouN4(conforme o Projeto Político Pedagógico do curso), no campoidnumberda categoria de notas. Vejanotes_to_syncem Instalação.Nota da avaliação finalEquivale à nota de uma categoria de notas mapeada para
NAF; só deve ser disponibilizada, no quadro de notas, para os alunos que precisaram ir para a atividade final de recuperação do diário.Média do diário/Média final do diárioNão têm equivalente no Moodle — são calculadas pelo próprio SUAP, independentemente de a nota vir do Moodle ou ser lançada manualmente pelo docente, conforme o PPC.
Quando a sincronização é executada¶
A sincronização é acionada por chamadas HTTP ao serviço sync_up_enrolments (veja API e serviços), tipicamente
disparadas:
por ações no SUAP (por exemplo, ao confirmar uma oferta ou executar uma ação específica na Suite);
por agendamento de tarefas (cron) configurado pela equipe de TI no lado do Integrador AVA, que roda periodicamente e mantém tudo atualizado.
Na prática, o colaborador de educação enxerga “rodadas” de sincronização ao longo do dia, sem precisar fazer ajustes manuais no Moodle.
Cada chamada recebida é sempre persistida em suap_enrolment_to_sync e processada de duas formas possíveis
(veja Administração para a tela de acompanhamento):
síncrona — quando o payload traz
"sincrono": true, todo o processamento (inscrições, grupos, suspensão) ocorre na própria requisição HTTP;assíncrona (padrão) — a requisição apenas garante a estrutura (categorias/curso/coortes) e devolve imediatamente a URL da sala; o restante (inscrições, grupos, suspensão de alunos, e a sincronização dos próprios alunos) é processado em segundo plano por uma tarefa adhoc (
sync_up_enrolments_task).
Fluxo de sincronização no Moodle¶
Em cada sincronização, o Moodle passa duas vezes pelo fluxo de sala:
uma vez para a sala de coordenação do curso;
uma vez para a sala de aula dos estudantes (diário, autoinscrição, práticas ou modelo), conforme o tipo definido pelo campo
sala_tipo.
Em resumo, a sincronização faz três coisas principais:
garante que a estrutura exista (categorias e salas);
garante que as pessoas certas estejam nas salas, com o papel correto, em conformidade com o SUAP;
organiza os estudantes em grupos, quando aplicável, para facilitar a gestão pedagógica.
O mesmo fluxo, na notação de origem (Mermaid) do diagrama acima:
flowchart TD
A([Início]) --> B
subgraph SISTEMA["Nível de sistema"]
direction TD
B[1. Sincroniza categorias] --> C[2. Sincroniza usuários]
C --> D[3. Sincroniza coortes]
end
D --> F
subgraph LACO["Laço: salas (coordenação e aula)"]
direction TD
F[4. Sincroniza sala] --> G[5. Vincula coorte à sala]
G --> H{processando em background}
H -->|sim| I[6. Instância o tipo de inscrição na sala]
I --> J[7. Inscreve usuários na sala]
J --> K[8. Sincroniza grupos]
K --> L[9. Vincula ALUNOS aos respectivos grupos]
L --> M{sala_tipo igual a diarios}
M -->|sim| N[10. Suspende ALUNOS que não vieram na sincronização]
end
M -->|não| O([Fim da sincronização])
N --> O
Passo a passo¶
1. Sincroniza categorias¶
As categorias funcionam como pastas para manter as salas organizadas. A sincronização garante a seguinte hierarquia padrão:
Pasta raiz (Diários): pasta principal que contém todos os diários (
idnumber/nameconfiguráveis emtop_category_idnumber/top_category_name, veja Instalação).Subpasta Campus: ex. Natal-Zona Leste.
Subpasta Curso: criada para o curso (ex. Tecnologia em Sistemas para Internet).
Subpasta Semestre: organiza os diários por ano e período letivo (ex. 2026.1).
Subpasta Turma: pasta final contendo as salas específicas de uma turma (ex. 20261.1.011001.1P).
Se alguma dessas pastas ainda não existir no Moodle, ela é criada automaticamente. Nenhuma delas é removida ou renomeada em sincronizações futuras.
2. Sincroniza usuários¶
O Moodle verifica todos os usuários envolvidos na chamada (professores, equipe de apoio, coortes e, quando processado em background, também os alunos):
Criação de novos usuários: se um aluno acabou de se matricular ou um professor foi contratado, a conta é criada no Moodle, com senha aleatória e método de autenticação resolvido por
auths_mapping/default_auth. As preferências dedefault_user_preferencessão aplicadas apenas nesta criação.E-mail de fallback: o e-mail é buscado, nesta ordem, em
email_preferencial,email,email_secundario,email_google_classroomeemail_academico(valores vazios são ignorados). Se o SUAP não informar nenhum, o usuário novo é criado com<username>@sem-email.invalide, para usuário existente, o e-mail atual é preservado.Atualização de dados: alteração de e-mail, nome ou método de autenticação no SUAP é refletida no perfil do Moodle a cada sincronização.
Metadados do perfil: informações como polo de apoio presencial, programa, modalidade do curso e campus são gravadas nos campos personalizados do perfil do usuário para relatórios posteriores.
3. Sincroniza coortes (grupos globais)¶
As coortes são grupos de usuários no nível do sistema Moodle (geralmente equipes pedagógicas, coordenação ou apoio ao campus):
o sistema cria ou atualiza as coortes no Moodle (ex. a coorte de colaboradores do curso);
adiciona membros a essas coortes de acordo com a listagem recebida do SUAP (a remoção de membros que saíram da lista não é feita por esta etapa).
4. Sincroniza sala¶
Internamente, a Suite classifica a sala em um dos tipos abaixo (campo sala_tipo, calculado por
get_sala_tipo()), de acordo com os dados recebidos:
|
Quando se aplica |
|---|---|
|
Sempre que a chamada é para a sala de coordenação de curso (metade do laço descrito acima). |
|
Quando |
|
Quando |
|
Quando |
|
Caso padrão, quando nenhum dos anteriores se aplica. |
Durante esta etapa, o Moodle grava dezenas de campos customizados do curso (carga horária, tipo de disciplina,
turma, diário, se exige autoinscrição, se é sala de coordenação etc. — veja sync_course() em
api/sync_up_enrolments.php). Na criação, a sala nasce oculta (visible = 0) para que o professor possa
organizar o conteúdo antes de disponibilizá-la; em sincronizações seguintes a visibilidade não é mais alterada por
este passo.
5. Vincula coorte à sala¶
A coorte correspondente é associada à sala virtual via uma instância de inscrição do tipo cohort. Na sala de
coordenação, a coorte costuma agrupar coordenadores, equipe pedagógica e outros colaboradores do curso; na sala de
aula, representa o conjunto de estudantes esperado naquela oferta.
6. Instancia o tipo de inscrição na sala¶
O Moodle garante que a sala tenha as instâncias de método de inscrição necessárias (normalmente manual, uma
por combinação sala_tipo:papel_suap presente entre os usuários da chamada), conforme roles_mapping. Se o
método ainda não existir na sala, ele é criado com as configurações padrão da Suite — o professor não precisa
configurar manualmente o tipo de inscrição no curso.
7. Inscreve usuários na sala¶
Define quem pode acessar cada sala e com qual papel (estudante, professor, equipe etc.):
Inscrição de usuários: professores, equipe e (em processamento assíncrono) alunos ativos são inscritos na sala correspondente, com o papel resolvido por
roles_mapping.Atualização de status (ativo/suspenso): se a situação do estudante/servidor no SUAP for
ativo, o acesso é liberado/mantido; caso contrário (trancamento, cancelamento, desligamento), a inscrição é marcada como suspensa (ENROL_USER_SUSPENDED) — o usuário não perde o histórico de atividades já realizadas, mas deixa de acessar a sala.
8. Sincroniza grupos¶
Dentro da sala, os estudantes são subdivididos automaticamente conforme as opções course_group_*/
room_group_* (veja Instalação):
Grupo de Entrada: agrupa pelo ano/semestre de ingresso (5 primeiros caracteres da matrícula do aluno, ex. 20251).
Grupo de Turma: agrupa pela sigla/código da turma no SUAP.
Grupo de Polo: útil em cursos EaD — agrupa pelo polo de apoio presencial (ex. Polo Macau), ou
--Sem polo--quando ausente.Grupo de Programa: agrupa pelo programa acadêmico (ex. Institucional, quando ausente).
9. Vincula alunos aos grupos¶
O Moodle verifica quem já está no grupo e adiciona apenas os alunos faltantes. Se um grupo ainda não existir na sala, ele é criado nesta etapa.
Note
No código-fonte atual, os passos 8 e 9 são implementados por uma única função (sync_groups(), que chama
sync_group() internamente) em api/sync_up_enrolments.php — não existe uma função separada chamada
sync_students_to_groups(). A separação em dois passos aqui é conceitual (criar o grupo × vincular os
alunos a ele).
10. Suspende alunos que não vieram na sincronização¶
Este passo só acontece para salas do tipo diarios (suspend_students_not_in_list_all_enrols()).
A Suite compara a lista de estudantes enviada pelo SUAP com quem está inscrito, com papel de aluno, na sala. Se um aluno estiver inscrito no Moodle mas não constar mais na lista oficial (cancelamento, trancamento, troca de turma etc.), sua inscrição é suspensa automaticamente, preservando as atividades já realizadas, mas impedindo novo acesso.
Observações¶
Um usuário pode estar em vários grupos na mesma sala, mas isso tende a complicar o processo de ensino-aprendizagem — o estudante precisa escolher em qual grupo realizar cada atividade, o que aumenta a complexidade para docentes e estudantes e confunde a leitura de relatórios e notas. A Suite permite múltiplas vinculações, mas a recomendação padrão é manter uma configuração simples e clara.
Sincronização de preferências individuais: além de estruturar cursos e matrículas, o plugin também permite a sincronização rápida de preferências de interface do usuário (favoritar um curso, expandir um menu etc.) entre o Moodle e o Painel AVA, através dos serviços
set_user_preferenceesync_user_preference— veja API e serviços.Notas: as notas oficiais continuam sendo do SUAP Edu (médias de etapa, de diário e final). O Moodle apenas devolve as notas das categorias configuradas em
notes_to_sync(ex.N1–N4,NAF) através do serviçosync_down_grades— veja API e serviços. O cálculo da média do diário e da média final permanece sempre no SUAP.
Para a equipe de TI¶
Esta seção mapeia as 10 etapas acima para a implementação em api/sync_up_enrolments.php
(sync_up_enrolments_service).
Orquestração geral (método process()):
sync_categories() → sync_users() → sync_cohorts()
→ para cada tipo de sala (coordenação, depois aula):
sync_course() → sync_enrols_cohorts()
→ se síncrono/background:
sync_enrols_manuals() → sync_enrolments() → sync_groups()
→ se sala_tipo == 'diarios':
suspend_students_not_in_list_all_enrols()
Mapeamento dos 10 passos para métodos:
# |
Método |
O que faz |
|---|---|---|
1 |
|
Cria/recupera a hierarquia de categorias (diários, campus, curso, semestre, turma) via
|
2 |
|
Cria/atualiza |
3 |
|
Cria/atualiza coortes ( |
4 |
|
Cria/atualiza o curso ( |
5 |
|
Garante uma instância de |
6 |
|
Resolve, por combinação |
7 |
|
Cria/atualiza inscrições ( |
8–9 |
|
Cria/atualiza grupos ( |
10 |
|
Apenas para |
Laço por tipo de sala: o bloco de sala (passos 4 a 10) roda duas vezes por chamada de sincronização — uma para
a sala de coordenação e outra para a sala de aula (diário, autoinscrição, práticas ou modelos), conforme
get_sala_tipo(). A execução dos passos 6 a 10 (inscrições e grupos) só ocorre quando $this->inBackground
é verdadeiro — ou seja, quando o payload trouxe "sincrono": true ou quando a chamada está rodando dentro da
tarefa adhoc sync_up_enrolments_task (veja Administração).
Monitorando o processamento assíncrono via linha de comando:
ava exec moodle php admin/cli/scheduled_task.php --showdebugging --execute='\\local_suap\\task\\sync_up_enrolments_task'
Note
Este comando dispara o scheduler de tarefas agendadas do Moodle, mas sync_up_enrolments_task é uma
tarefa adhoc (\core\task\adhoc_task), não uma tarefa agendada por cron — na prática, ela é processada
pelo executor de tarefas adhoc do Moodle (admin/cli/adhoc_task.php) sempre que houver itens pendentes na
fila, não por este comando específico de tarefa agendada. Trate este trecho como um exemplo de comando de
diagnóstico herdado da documentação original do plugin, não necessariamente como o comando correto para esta
tarefa.
Áreas descritas como incompletas no README do repositório¶
O README.md deste repositório documenta ainda, como trabalho não finalizado, a sincronização de notas e a
sincronização de faltas (“Descrever mais.”) — o serviço sync_down_grades (veja API e serviços) já existe e
cobre parte da sincronização de notas; a sincronização de faltas não tem endpoint implementado no código-fonte
atual (apenas o arquivo de exemplo vazio examples/sync_down_attendances_sample.json).