Pular para o conteúdo principal

Guia de Migração: Matrículas e Movimentações de matrículas — Service Layer V1 → V2

Público: integradores, equipes de conversão de dados e desenvolvedores que consomem o Service Layer de Educação.

1. Visão Geral

O que foi migrado

Os seguintes recursos do Service Layer V1 ( api-educacao-service ) foram migrados para o V2 (api-service-layer).

Recurso V2Equivalente V1Operações V2
matricula MatriculaConvertService → /api/matriculas GET, POST, PUT, DELETE
matricula-atividade Conversão de matrícula atividadeGET, POST, PUT, DELETE
matricula-eja-modular MatriculaEjaModularConvertService GET, POST, PUT, DELETE
matricula-movimentacao MatriculaMovimentacaoConversaoService + serviços de movimentaçãoGET, POST (somente inserção — sem PUT/DELETE no V2)

Movimentações passivas unificadas (6 tipos): CANCELAMENTO, TRANSFERENCIA, DEIXOU_DE_FREQUENTAR, FALECIMENTO, READMISSAO, RECLASSIFICACAO — todas via POST /v2/api/matricula-movimentacao com campo discriminador tipo .

Status da descontinuação do V1

O V2 está disponível e validado para os recursos acima. O V1 ( /conversao/api/... ) permanece em operação até comunicado formal de descontinuação (avisaremos com antecedência a data em que ele será desligado).

Importante: Integradores priorizarem a migração para a V2 em novas integrações e adapte integrações existentes conforme este guia.

2. Service Layer: matricula (matrícula padrão)

Endpoints

OperaçãoV1 (deprecado)V2 (usar)
ListarGET /conversao/api/matriculas GET /service-layer/v2/api/matricula
Consultar-GET /service-layer/v2/api/matricula/{id}
CriarPOST /conversao/api/matriculas POST /service-layer/v2/api/matricula
AtualizarPUT /conversao/api/matriculas PUT /service-layer/v2/api/matricula
RemoverDELETE /conversao/api/matriculas ou PUT .../remover DELETE /service-layer/v2/api/matricula

Schema Swagger V2: MatriculaVagaEtapa (campo vaga obrigatório).

Regras de negócio

RegraDescrição
R01aluno obrigatório
R02tipo obrigatório — valores: EDUCACAO_BASICA, COMPLEMENTAR, AEE, ATIVIDADE_COMPLEMENTAR, PROGRESSAO_PARCIAL, ACELERACAO, EJA
R03situacao obrigatória
MVE-VAGAvaga obrigatória — V2 persiste em matriculas + matriculas_vagas_etapas
RegraDescrição
Auto-enturmaçãoSe turma informada e não há enturmação ativa: cria enturmação, incrementa turmas.qtd_alunos , situação → CURSANDO
Saldos de vagaSe situação requer vaga: ocupa saldos_vagas no POST; libera no DELETE
MultiturnoSe turno = INTEGRAL e turnoFrequenta informado: ocupa saldo multiturno
DELETERemove movimentações, reclassificações, itens de rematrícula, avaliações sem nota, enturmações; ajusta saldos

Diferenças de contrato V1 → V2

Campo / comportamentoV1V2
Polimorfismo typeMATRICULA_VAGA_ETAPA, MATRICULA_DISCIPLINA, etc.Ignorado — V2 usa sempre MatriculaVagaEtapa
Campo vagaOpcional em alguns fluxos V1Obrigatório
Wrapper do payload{ "matricula": { ... } } em alguns endpointsCampos flat em conteudo
Retorno do lotePodia incluir idEnturmacaoApenas idGerado da matrícula
PUTReprocessa efeitos via persistInNewTransactionAtualização direta — não reprocessa auto-enturmação/saldos automaticamente

Impactos para integradores

  1. Incluir vaga em toda criação de matrícula padrão — sem vaga, a matrícula pode não aparecer corretamente na UI.
  2. Remover dependência do campo type polimórfico do V1.
  3. Não depender de idEnturmacao no retorno do lote — buscar enturmação via consulta ou outro endpoint.
  4. Cuidado com PUT: alterar turma ou situação via PUT pode não reproduzir todos os efeitos colaterais do V1; preferir fluxos explícitos de movimentação quando a situação mudar.

Exemplos HTTP

POST — Criar matrícula

Request V2:

 POST {BASE_URL}/service-layer/v2/api/matricula
Authorization: Bearer {token}
Content-Type: application/json

[
{
"idIntegracao": "mat-post-001",
"conteudo": {
"aluno": { "id": "{idAluno}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"vaga": { "id": "{idVaga}" },
"tipo": "EDUCACAO_BASICA",
"situacao": "MATRICULADO",
"turno": "MATUTINO",
"data": "2025-02-20"
}
}
]

Response (lote enfileirado):

{ "id": "lote-mongo-id", "situacao": "AGUARDANDO_EXECUCAO" }

Equivalente V1 (deprecado):

POST {BASE_URL}/conversao/api/matriculas

{
"idIntegracao": "mat-post-001",
"matricula": {
"type": "MATRICULA_VAGA_ETAPA",
"aluno": { "id": "{idAluno}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"tipo": "EDUCACAO_BASICA",
"situacao": "MATRICULADO",
"turno": "MATUTINO",
"data": "2025-02-20"
}
}
O que mudouDetalhe
EnvelopeObjeto → array; matriculaconteudo
vagaAgora obrigatório no V2
typeRemover — ignorado no V2

POST — Criar matrícula com turma (auto-enturmação)

Adicionar ao conteudo:

 "turma": { "id": "{idTurma}" }

Efeitos: enturmação criada, turmas.qtd_alunos incrementado, situação → CURSANDO, saldos de turma atualizados (cenários SV-01 a SV-06 nos testes).

GET — Consultar matrícula

 GET {BASE_URL}/service-layer/v2/api/matricula/{id}

Response (campos principais):

  {
"id": 450999001,
"aluno": { "id": 123 },
"anoLetivo": { "id": 456 },
"estabelecimento": { "id": 789 },
"vaga": { "id": 101 },
"tipo": "EDUCACAO_BASICA",
"situacao": "MATRICULADO",
"turno": "MATUTINO",
"data": "2025-02-20",
"observacao": null
}

PUT — Atualizar observação

      PUT {BASE_URL}/service-layer/v2/api/matricula

[
{
"idIntegracao": "mat-put-001",
"conteudo": {
"id": 450999001,
"aluno": { "id": "{idAluno}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"vaga": { "id": "{idVaga}" },
"tipo": "EDUCACAO_BASICA",
"situacao": "MATRICULADO",
"turno": "MATUTINO",
"data": "2025-02-20",
"observacao": "Texto atualizado via PUT"
}
}
]

Limitação conhecida: PUT cobre atualização de campos simples; não garante reprocessamento de enturmação/saldos como o V1.

DELETE — Remover matrícula

 DELETE {BASE_URL}/service-layer/v2/api/matricula

[
{
"idIntegracao": "mat-del-001",
"conteudo": { "id": 450999001 }
}
]

Efeitos (MVE-DEL): remove registros em matriculas e matriculas_vagas_etapas ; libera saldos de vaga/turma/multiturno; remove enturmações e dependências.

POST — Negativo: sem vaga (MVE-VAGA) Omitir vaga do conteudo → lote finaliza com erro de validação.

3. Service Layer: matricula-atividade

OperaçãoV2
Listar / ConsultarGET /v2/api/matricula-atividade, GET /v2/api/matricula-atividade/{id}
CriarPOST /v2/api/matricula-atividade
AtualizarPUT /v2/api/matricula-atividade
RemoverDELETE /v2/api/matricula-atividade

Regras de negócio

RegraDescrição
R02atividade obrigatória — referência à atividade complementar vinculada à turma
R04tipo deve ser AEE ou ATIVIDADE_COMPLEMENTAR
Auto-enturmaçãoCom turma informada: cria enturmação na turma de atividade
CRUD completoTodas as operações disponíveis no V2

Diferenças V1 → V2

  • Payload flat em conteudo (sem wrapper matricula).
  • Mesmo padrão de lote assíncrono do V2.

Exemplo POST

      POST {BASE_URL}/service-layer/v2/api/matricula-atividade

[
{
"idIntegracao": "mat-atividade-001",
"conteudo": {
"aluno": { "id": "{idAluno}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"atividade": { "id": "{idAtividade}" },
"turma": { "id": "{idTurmaAtividade}" },
"tipo": "ATIVIDADE_COMPLEMENTAR",
"situacao": "MATRICULADO",
"turno": "MATUTINO",
"data": "2025-02-20"
}
}
]

Exemplo DELETE

 DELETE {BASE_URL}/service-layer/v2/api/matricula-atividade

[
{
"idIntegracao": "mat-atividade-del-001",
"conteudo": { "id": "{idMatriculaAtividade}" }
}
]

4. Service Layer: matricula-eja-modular

Endpoints

OperaçãoV1V2
CRUDPOST/PUT/DELETE /conversao/api/matricula-eja-modularPOST/PUT/DELETE /v2/api/matricula-eja-modular

Regras de negócio

RegraDescrição
Agregado pai/filhoCria/atualiza Matricula (pai, tipo EJA) + MatriculaDisciplina (filho)
R03/R04Situações MOVIMENTADO e RECLASSIFICADO rejeitadas no create/update
R06aluno obrigatório
R07disciplina obrigatória
Defaulttipo = EJA, situacao = MATRICULADO se nula
EnturmaçãoAuto-enturmação após persistência; PUT com nova turma reconcilia enturmação
DELETE parcialSe pai tem múltiplos filhos: remove só a disciplina (R08 / MVEJA-DEL-02)
DELETE totalSe pai tem um único filho: remove agregado completo (MVEJA-DEL-01)
MultiturnoCom turno = INTEGRAL: ocupa turmas_saldos conforme turno da matrícula

Diferenças V1 → V2

AspectoV1V2
PayloadConversão via representationCampos flat: aluno, disciplina, turno, turma, pai?
WrapperPodia usar estrutura aninhadaSem wrapper matricula

Exemplo POST

  POST {BASE_URL}/service-layer/v2/api/matricula-eja-modular

[
{
"idIntegracao": "eja-post-001",
"conteudo": {
"aluno": { "id": "{idAluno}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"disciplina": { "id": "{idDisciplina}" },
"turno": "MATUTINO",
"turma": { "id": "{idTurmaEja}" },
"data": "2025-02-20",
"situacao": "MATRICULADO"
}
}
]

Exemplo PUT — Trocar turma

Incluir id da matrícula filho e nova turma no conteudo; o V2 reconcilia a enturmação ativa.

5. Service Layer: matricula-movimentacao — criação de matrícula

Este endpoint permite criar matrícula já com situação alterada, incluindo movimentação ou reclassificação no mesmo lote — contrato herdado do V1 (MatriculaConversaoRepresentation.COMPLETO).

Endpoints

OperaçãoV1V2
Criar matrícula + movimentaçãoPOST /conversao/api/matricula-movimentacaoPOST /v2/api/matricula-movimentacao
Remover matrícula criada via movimentaçãoDELETE /conversao/api/matricula-movimentacaoDELETE /v2/api/matricula (usar service matricula)

Operações V2 em matricula-movimentacao: apenas GET e POST (LoteType restrito a INSERIR). Movimentações passivas em matrícula existente também usam POST neste endpoint.

Nota: o Swagger V2 não expõe DELETE em matricula-movimentacao. Para remover matrículas, usar DELETE /v2/api/matricula.

Estrutura do payload (wrapper preservado)

 [
{
"idIntegracao": "mat-mov-001",
"conteudo": {
"matricula": {
"aluno": { "id": "{idAluno}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"tipo": "EDUCACAO_BASICA",
"situacao": "CURSANDO",
"data": "2025-02-20"
},
"turma": { "id": "{idTurma}" },
"movimentacao": {
"tipo": "TRANSFERENCIA",
"motivo": { "id": "{idMotivo}" },
"data": "2025-03-01",
"estabelecimentoDestino": { "id": "{idEstabDestino}" }
}
}
}
]

Regras de negócio

RegraDescrição
R04Situação default MATRICULADO se nula em novo registro
R05Situações "simples" não exigem movimentação: APROVADO, APROVADO_CONSELHO, APROVADO_DEPENDENCIA, EM_EXAME, REPROVADO, REPROVADO_FREQUENCIA, CURSANDO
R03Situações alteradoras (TRANSFERIDO, CANCELAMENTO, etc.) exigem movimentacao ou reclassificacao
R02Turma obrigatória para situação alteradora (exceto EJA modular)
R01Tipo do motivo deve coincidir com o tipo da movimentação (exceto FALECIMENTO)
ReclassificaçãoUsar bloco reclassificacao (não movimentacao) com turmaDestino, tipo e justificativa

Exemplo — Matrícula CURSANDO sem movimentação

 {
"matricula": {
"aluno": { "id": "{idAluno}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"tipo": "EDUCACAO_BASICA",
"situacao": "CURSANDO",
"data": "2025-02-20"
},
"turma": { "id": "{idTurma}" }
}

Gap conhecido — remoção (R07)

No V1, DELETE /matricula-movimentacao removia matrícula com cascata (movimentações, avaliações, enturmações). No V2, não há DELETE em matricula-movimentacao — usar DELETE /v2/api/matricula.

6. Movimentações passivas - 6 tipos

Endpoint recomendado (unificado)

   POST {BASE_URL}/service-layer/v2/api/matricula-movimentacao

Discriminador: campo tipo no conteudo.

Atenção: o Swagger lista REMANEJAMENTO_INTERNO no enum, mas esse tipo não está implementado no MatriculaMovimentacaoProcessor — requisições com esse valor falharão em runtime.

Campos comuns a todos os tipos

CampoObrigatórioDescrição
tipoSimDiscriminador da movimentação
matriculaSim{ "id": N } — matrícula existente
anoLetivoRecomendado{ "id": N }
estabelecimentoRecomendado{ "id": N }
dataRecomendadoData da movimentação (YYYY-MM-DD)
observacoesNãoTexto livre
motivoConforme tipo{ "id": N } — não se aplica a FALECIMENTO e RECLASSIFICACAO

Importante: situacaoMatricula não deve ser enviado — o servidor define com base no tipo.

Cancelamento

AspectoValor
Situação resultanteCANCELAMENTO
Campos extrasmotivo
AspectoValor
EfeitosDesenturmação (enturmacoes.dt_fim), saldos turma/vaga, histórico, tabela cancelamentos

Exemplo:

 [
{
"idIntegracao": "cancel-001",
"conteudo": {
"tipo": "CANCELAMENTO",
"matricula": { "id": "{idMatricula}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"motivo": { "id": "{idMotivoCancelamento}" },
"data": "2025-03-10",
"observacoes": "Cancelamento via V2"
}
}
]

Transferência

AspectoValor
Situação resultanteTRANSFERIDO
Campos extrasmotivo, estabelecimentoDestino, nomeEstabelecimentoDestino, municipio
EfeitosTabela transferencias, desenturmação, saldos, histórico

Exemplo:

 {
"tipo": "TRANSFERENCIA",
"matricula": { "id": "{idMatricula}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"motivo": { "id": "{idMotivoTransferencia}" },
"estabelecimentoDestino": { "id": "{idEstabDestino}" },
"nomeEstabelecimentoDestino": "ESCOLA DESTINO",
"data": "2025-03-15"
}

Deixou de frequentar

AspectoValor
Situação resultanteDEIXOU_FREQUENTAR
Campos extrasmotivo
Atenção ao enumUsar DEIXOU_DE_FREQUENTAR no campo tipo — não DEIXOU_FREQUENTAR

Exemplo:

 {
"tipo": "DEIXOU_DE_FREQUENTAR",
"matricula": { "id": "{idMatricula}" },
"motivo": { "id": "{idMotivo}" },
"data": "2025-03-20"
}

Falecimento

AspectoValor
Situação resultanteFALECIDO
Campos extrascancelouOutrasMatriculas (boolean, obrigatório no V1)
Efeito cancelouOutrasMatriculas=trueAplica falecimento a todas as matrículas ativas do aluno no ano letivo
Efeito adicionalAtualiza pessoas_fisicas_obito.data_obito

Exemplo — falecimento isolado:

 {
"tipo": "FALECIMENTO",
"matricula": { "id": "{idMatricula}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"data": "2025-04-05",
"cancelouOutrasMatriculas": false
}

Exemplo — cancelar outras matrículas do aluno:

{
"tipo": "FALECIMENTO",
"matricula": { "id": "{idMatricula}" },
"data": "2025-04-05",
"cancelouOutrasMatriculas": true
}

Readmissão

AspectoValor
Situação resultanteCURSANDO (se havia enturmação inativa) ou MATRICULADO
Campos extrasmotivo (opcional conforme cadastro)
EfeitosReenturmação da última enturmação elegível, reocupação de saldos

Exemplo:

{
"tipo": "READMISSAO",
"matricula": { "id": "{idMatricula}" },
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"motivo": { "id": "{idMotivo}" },
"data": "2025-04-10"
}

Gap READM-02: V1 rejeita readmissão em matrícula ainda ativa/enturmada; V2 pode aceitar. Validar cenário antes de migrar integrações críticas.

Reclassificação

AspectoValor
Situação resultanteRECLASSIFICADO_AVANCO ou RECLASSIFICADO_ACELERACAO
Campos extrastipoReclassificacao (AVANCO | ACELERACAO), matriculaDestino, nomeEstabelecimentoDestino
Pré-condiçãoA matrícula de destino deve existir — criar via POST /v2/api/matricula antes
Sem motivoRECLASSIFICACAO não utiliza motivo (tipo não cadastrável)

Fluxo recomendado:

  1. POST /v2/api/matricula → obter idMatriculaDestino
  2. POST /v2/api/matricula-movimentacao na matrícula origem

Exemplo:

  {
"tipo": "RECLASSIFICACAO",
"matricula": { "id": "{idMatriculaOrigem}" },
"matriculaDestino": { "id": "{idMatriculaDestino}" },
"tipoReclassificacao": "AVANCO",
"anoLetivo": { "id": "{idAnoLetivo}" },
"estabelecimento": { "id": "{idEstabelecimento}" },
"data": "2025-05-10",
"nomeEstabelecimentoDestino": "ESCOLA DESTINO"
}

Fluxo comum das movimentações passivas

  1. Recarrega matrícula (instância gerenciada JPA).
  2. Define nova situação na matrícula.
  3. Captura enturmações ativas → associa à movimentação (mov_enturmacoes).
  4. Persiste movimentação + tabela filha (cancelamentos, transferencias, etc.).
  5. Desenturma ativas (dt_fim = data da movimentação).
  6. Libera saldos de vaga/turma/multiturno se aplicável.
  7. Gera histórico cadastral (tp_historico = MOVIMENTACAO).
  8. Libera saldos de vaga/turma/multiturno se aplicável.
  9. Gera histórico cadastral (tp_historico = MOVIMENTACAO).

DELETE de movimentação

O DELETE de movimentação remove apenas o registro — não reverte situação da matrícula, enturmações ou saldos (mesmo comportamento do V1).

7. Guia prático de migração para integradores

Checklist de migração para a API V2

  • Trocar a base URL de /conversao/api/ para /service-layer/v2/api/.
  • Adaptar o envelope da requisição: de objeto único com item para array com conteudo.
  • Adaptar o polling: utilizar id (string) no lugar de idLote (numérico) e consultar retorno[].idGerado.
  • Incluir o campo vaga em toda criação de matrícula padrão.
  • Remover o campo polimórfico type utilizado na V1.
  • Remover a dependência de idEnturmacao no retorno do lote.
  • Unificar as movimentações utilizando POST /matricula-movimentacao com o campo tipo.
  • Descontinuar o endpoint síncrono V1 /sincrona/matriculas/{id}/movimentacoes/movimentar.
  • Para RECLASSIFICACAO, criar previamente a matrícula de destino por meio de POST /matricula antes de registrar a movimentação.
  • Consultar o Swagger da V2 para validar os schemas atualizados (MatriculaVagaEtapa e MovimentacaoEnvelope).
  • Testar os cenários críticos no ambiente de homologação antes da implantação em produção.

Mapeamento rápido V1 → V2

V1V2
POST /conversao/api/matriculasPOST /v2/api/matricula
POST /conversao/api/matricula-eja-modularPOST /v2/api/matricula-eja-modular
POST /conversao/api/matricula-movimentacaoPOST /v2/api/matricula-movimentacao
V1V2
POST /conversao/api/sincrona/.../movimentarPOST /v2/api/matricula-movimentacao
GET /conversao/api/lotes/{id}GET /v2/api/lotes/{id}