Ir para o conteúdo

Sincronizar turmas ​

Objetivo: criar no Presente as disciplinas e turmas do seu sistema acadêmico e manter o vínculo entre elas. Diferente de alunos e atividades, não há importação CSV de turmas: você usa as rotas de cadastro, uma por uma.

Você precisa de: CADASTRAR na instituição para criar disciplinas (papel CURADOR) e CADASTRAR na disciplina para criar turmas (COORDENADOR da disciplina ou CURADOR). Veja Permissões.

Guarde o mapeamento ​

O Presente não tem campo de identificador externo. Para saber qual turma do Presente corresponde a qual turma do seu sistema, guarde a relação do seu lado: id da turma no seu sistema → id da turma no Presente (um UUID). Ao criar, anote o id da resposta.

Duas regras de unicidade mudam o cuidado que você precisa ter:

RecursoUnicidadeSe repetir a criação
Disciplinasigla única e nome único dentro da instituição409 CONFLICT com fields: {"sigla": "taken"} (ou nome). Seguro.
TurmanenhumaCria outra turma com o mesmo nome. Não repita a criação: consulte antes.

Fluxo ​

  1. Descobrir a instituição (GET /instituicoes, ou usuario.vinculos[].instituicaoId).
  2. Garantir a disciplina (listar; criar se não existir).
  3. Garantir a turma (consultar o seu mapeamento; criar só se faltar).
  4. Definir o período, se você tiver as datas.
  5. Desativar turmas encerradas, se for o caso.

1 e 2. Disciplina ​

bash
# a disciplina já existe? (a busca pega nome e sigla)
curl "$API/instituicoes/$INST/disciplinas?busca=ENF101&limite=200" -H "Authorization: Bearer $TOKEN"

# criar
curl -X POST "$API/instituicoes/$INST/disciplinas" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"sigla":"ENF101","nome":"Enfermagem Básica"}'

sigla tem até 15 caracteres (letras, números, ., _ e -; começa com letra ou número); nome até 200. ementa (texto) e semanas (1 a 520) são opcionais. A disciplina já nasce com os critérios de avaliação padrão.

Como a sigla é única, uma estratégia simples e segura é criar e tratar 409: se vier CONFLICT com fields.sigla, a disciplina já existe; leia-a pela listagem.

3. Turma ​

bash
curl -X POST "$API/disciplinas/$DISC/turmas" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"nome":"Turma A 2026/1"}'

Só nome é obrigatório. Opcionais: endereco, localAtividade, lat, lng (usadas na cerca de localização das atividades), toleranciaAntesMin e toleranciaDepoisMin (janela de horário, 0 a 720 minutos) e notasVisiveisEm (data a partir da qual o aluno vê as notas). A resposta é a turma criada, com o id que você guarda no mapeamento.

Sem o mapeamento (por exemplo, no primeiro uso), procure a turma pelo nome antes de criar: GET /disciplinas/{disciplinaId}/turmas?busca=<nome>.

4. Período ​

bash
curl -X PUT "$API/turmas/$TURMA/periodo" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"dataInicio":"2026-03-02","dataFim":"2026-07-10"}'

O período abre o prazo do feedback final. Quem pode definir: o professor da turma, o coordenador da disciplina e o curador da instituição (a conta de integração precisa de um desses papéis). dataFim não pode ser anterior a dataInicio; envie null nos dois para limpar.

5. Editar e desativar ​

PATCH /turmas/{turmaId} altera os campos acima e ativo:

bash
curl -X PATCH "$API/turmas/$TURMA" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"ativo": false}'

Desativar não apaga: o histórico da turma continua disponível, e a turma some das listas padrão (use inativos=true para vê-la). GET /turmas/{turmaId}/prontidao devolve só contagens do que já está pronto na turma (atividadesFuturas, alunos, alunosComAcesso, avaliadores, avaliadoresConvidados), útil para conferir o resultado da sincronização.

Exemplo (JavaScript): garantir a disciplina e criar a turma uma vez ​

js
async function chama(metodo, caminho, corpo) {
  const r = await fetch(`${API}${caminho}`, { method: metodo, headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" }, body: corpo && JSON.stringify(corpo) })
  const dados = r.status === 204 ? null : await r.json()
  return { status: r.status, dados }
}

// disciplina: cria; se a sigla já existe (409), procura
let disc = await chama("POST", `/instituicoes/${INST}/disciplinas`, { sigla: "ENF101", nome: "Enfermagem Básica" })
if (disc.status === 409) {
  const lista = await chama("GET", `/instituicoes/${INST}/disciplinas?busca=ENF101&limite=200`)
  disc = { dados: lista.dados.items.find((d) => d.sigla === "ENF101") }
}

// turma: só cria se o seu mapeamento ainda não tem
let turmaId = meuMapeamento.get("TURMA-A-2026-1")
if (!turmaId) {
  const t = await chama("POST", `/disciplinas/${disc.dados.id}/turmas`, { nome: "Turma A 2026/1" })
  turmaId = t.dados.id
  meuMapeamento.set("TURMA-A-2026-1", turmaId)
}

O que fazer em seguida ​

Com a turma criada, traga os alunos e as atividades.

contato@presente.app.br