Sincronizar grupos
Objetivo: crear en Presente las asignaturas y los grupos de su sistema académico y mantener el vínculo entre ellos. A diferencia de alumnos y actividades, no hay importación CSV de grupos: se usan las rutas de alta, una por una.
Necesita: CADASTRAR en la institución para crear asignaturas (rol CURADOR) y CADASTRAR en la asignatura para crear grupos (COORDENADOR de la asignatura o CURADOR). Vea Permisos.
Guarde la correspondencia
Presente no tiene un campo de identificador externo. Para saber qué grupo de Presente corresponde a qué grupo de su sistema, guarde la relación de su lado: id del grupo en su sistema → id del grupo en Presente (un UUID). Al crear, anote el id de la respuesta.
Dos reglas de unicidad cambian el cuidado que debe tener:
| Recurso | Unicidad | Si repite la creación |
|---|---|---|
| Asignatura | sigla única y nome único dentro de la institución | 409 CONFLICT con fields: {"sigla": "taken"} (o nome). Seguro. |
| Grupo | ninguna | Crea otro grupo con el mismo nombre. No repita la creación: consulte antes. |
Flujo
- Descubrir la institución (
GET /instituicoes, ousuario.vinculos[].instituicaoId). - Garantizar la asignatura (listar; crear si no existe).
- Garantizar el grupo (consultar su correspondencia; crear solo si falta).
- Definir el período, si tiene las fechas.
- Desactivar grupos terminados, si corresponde.
1 y 2. Asignatura
# ¿la asignatura ya existe? (la búsqueda mira nombre y sigla)
curl "$API/instituicoes/$INST/disciplinas?busca=ENF101&limite=200" -H "Authorization: Bearer $TOKEN"
# crear
curl -X POST "$API/instituicoes/$INST/disciplinas" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"sigla":"ENF101","nome":"Enfermería Básica"}'sigla tiene hasta 15 caracteres (letras, números, ., _ y -; empieza con letra o número); nome hasta 200. ementa (texto) y semanas (1 a 520) son opcionales. La asignatura nace con los criterios de evaluación predeterminados.
Como la sigla es única, una estrategia simple y segura es crear y tratar el 409: si llega CONFLICT con fields.sigla, la asignatura ya existe; léala desde el listado.
3. Grupo
curl -X POST "$API/disciplinas/$DISC/turmas" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"nome":"Grupo A 2026/1"}'Solo nome es obligatorio. Opcionales: endereco, localAtividade, lat, lng (usadas en la cerca de ubicación de las actividades), toleranciaAntesMin y toleranciaDepoisMin (ventana de horario, 0 a 720 minutos) y notasVisiveisEm (fecha desde la cual el alumno ve las notas). La respuesta es el grupo creado, con el id que usted guarda en la correspondencia.
Sin la correspondencia (por ejemplo, en el primer uso), busque el grupo por nombre antes de crear: GET /disciplinas/{disciplinaId}/turmas?busca=<nombre>.
4. Período
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"}'El período abre el plazo del feedback final. Quién puede definirlo: el profesor del grupo, el coordinador de la asignatura y el curador de la institución (la cuenta de integración necesita uno de esos roles). dataFim no puede ser anterior a dataInicio; envíe null en las dos para limpiar.
5. Editar y desactivar
PATCH /turmas/{turmaId} modifica los campos de arriba y ativo:
curl -X PATCH "$API/turmas/$TURMA" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"ativo": false}'Desactivar no borra: el historial del grupo sigue disponible, y el grupo desaparece de las listas predeterminadas (use inativos=true para verlo). GET /turmas/{turmaId}/prontidao devuelve solo conteos de lo que ya está listo en el grupo (atividadesFuturas, alunos, alunosComAcesso, avaliadores, avaliadoresConvidados), útil para comprobar el resultado de la sincronización.
Ejemplo (JavaScript): garantizar la asignatura y crear el grupo una vez
async function llama(metodo, ruta, cuerpo) {
const r = await fetch(`${API}${ruta}`, { method: metodo, headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" }, body: cuerpo && JSON.stringify(cuerpo) })
const datos = r.status === 204 ? null : await r.json()
return { status: r.status, datos }
}
// asignatura: crea; si la sigla ya existe (409), busca
let disc = await llama("POST", `/instituicoes/${INST}/disciplinas`, { sigla: "ENF101", nome: "Enfermería Básica" })
if (disc.status === 409) {
const lista = await llama("GET", `/instituicoes/${INST}/disciplinas?busca=ENF101&limite=200`)
disc = { datos: lista.datos.items.find((d) => d.sigla === "ENF101") }
}
// grupo: solo crea si su correspondencia aún no lo tiene
let turmaId = miCorrespondencia.get("GRUPO-A-2026-1")
if (!turmaId) {
const t = await llama("POST", `/disciplinas/${disc.datos.id}/turmas`, { nome: "Grupo A 2026/1" })
turmaId = t.datos.id
miCorrespondencia.set("GRUPO-A-2026-1", turmaId)
}Qué hacer después
Con el grupo creado, traiga los alumnos y las actividades.