Crie a rota `main` a qual o usuário poderá ter acesso após fazer login.
Os dados podem ser buscado na view `view_lotacao_professor`, consulte os dados informando o `id_usuario`.
Esta rota retorna o seguintes dados em formato json:

```json
[
    {
        'ano': 'ano'
        'escolas': [
            {
                escola: 'nome',
                escola_id: 'id',
                turmas: [
                    {
                        turma: 'nome',
                        tipo: 'REGULAR | AEE/ATIV. COMPLEMENTAR',
                        turma_id: 'id',
                        series: [
                            {
                                serie: 'nome',
                                serie_id: 'id',
                                'disciplinas': [
                                    {
                                        'disciplina': 'nome',
                                        'regencia_id': 'id',
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
]
```

Armazene este dados no cache do usuário para posterior consulta, todas a vezes que o usuário fizer login ou logout remova este dados.

Cria as migration para os seguintes index:
```sql
-- escola.rechumanocgm — join "cgm.z01_numcgm = rechumanocgm.ed285_i_cgm"
-- Só existe o índice ÚNICO COMPOSTO (ed285_i_rechumano, ed285_i_cgm); como ed285_i_cgm
-- é a 2ª coluna, uma busca só por ed285_i_cgm não usa esse índice de forma eficiente.
CREATE INDEX IF NOT EXISTS idx_rechumanocgm_cgm
    ON escola.rechumanocgm USING btree (ed285_i_cgm);

-- escola.turmaachorarioprofissional — join "ed346_rechumano = rechumanoescola.ed75_i_rechumano"
-- Coluna sem nenhum índice hoje (só há índices em diasemana, funcaoatividade e turmaac).
CREATE INDEX IF NOT EXISTS idx_turmaachorarioprofissional_rechumano
    ON escola.turmaachorarioprofissional USING btree (ed346_rechumano);

-- escola.turmaac — joins com escola.escola e escola.calendario (ramo AEE/ATIV. COMPLEMENTAR)
-- Tabela só tem índice na PK; ed268_i_escola e ed268_i_calendario (FKs usadas nos joins) não têm índice.
CREATE INDEX IF NOT EXISTS idx_turmaac_escola
    ON escola.turmaac USING btree (ed268_i_escola);

CREATE INDEX IF NOT EXISTS idx_turmaac_calendario
    ON escola.turmaac USING btree (ed268_i_calendario);

-- escola.regencia — índice PARCIAL para o filtro "ed59_c_freqglob = 'F'"
-- Usado 2x: dentro da CTE "regente" (join regenteconselho -> regencia) e no join final
-- "regencia.ed59_c_freqglob = 'F' AND regente.id_regencia = regencia.ed59_i_codigo".
-- Um índice parcial é mais compacto e mais seletivo que os índices simples já existentes
-- em ed59_i_turma, pois filtra só as linhas relevantes ('F').
CREATE INDEX IF NOT EXISTS idx_regencia_turma_freqglob_f
    ON escola.regencia USING btree (ed59_i_turma)
    WHERE ed59_c_freqglob = 'F';

-- escola.docentesubstituto — índice COMPOSTO cobrindo a cadeia de substituição
-- Acelera a resolução "professor -> docentesubstituto -> docenteausencia/regencia" em uma
-- única leitura de índice, em vez de 3 índices simples combinados via bitmap AND.
CREATE INDEX IF NOT EXISTS idx_docentesubstituto_rechumano_regencia
    ON escola.docentesubstituto USING btree (ed322_rechumano, ed322_regencia, ed322_docenteausente);
```

A partir desta consulta crie uma migrate para view `view_lotacao_professor`
```sql
with regente as (
    select distinct
        regenteconselho.ed235_i_rechumano id_rechumano,
        regencia.ed59_i_codigo id_regencia
    from escola.regenteconselho
    join escola.regencia on regencia.ed59_i_turma = regenteconselho.ed235_i_turma
        and regencia.ed59_c_freqglob = 'F'
),
professor as ( -- resolve o rechumano do professor logado, uma única vez
    select distinct
        db_usuacgm.id_usuario,
        cgm.z01_nome professor,
        rechumanoescola.ed75_i_rechumano
    from configuracoes.db_usuacgm
    join protocolo.cgm on db_usuacgm.cgmlogin = cgm.z01_numcgm
    left join pessoal.rhpessoal on cgm.z01_numcgm = rhpessoal.rh01_numcgm
    left join escola.rechumanopessoal on rhpessoal.rh01_regist = rechumanopessoal.ed284_i_rhpessoal
    left join escola.rechumanocgm on cgm.z01_numcgm = rechumanocgm.ed285_i_cgm
    join escola.rechumanoescola on rechumanoescola.ed75_i_rechumano in (
        rechumanopessoal.ed284_i_rechumano, rechumanocgm.ed285_i_rechumano
    )
),
via_horario as ( -- caso (a): regência própria do professor
    select distinct p.id_usuario, p.professor, regenciahorario.ed58_i_regencia id_regencia, p.ed75_i_rechumano id_rechumano
    from professor p
    join escola.regenciahorario on regenciahorario.ed58_i_rechumano = p.ed75_i_rechumano
),
via_substituicao as ( -- caso (b): professor substituto validado pelo horário do ausente
    select p.id_usuario, p.professor, regenciahorario.ed58_i_regencia id_regencia, p.ed75_i_rechumano id_rechumano
    from professor p
    join escola.docentesubstituto on docentesubstituto.ed322_rechumano = p.ed75_i_rechumano
    join escola.docenteausencia on docenteausencia.ed321_sequencial = docentesubstituto.ed322_docenteausente
    join escola.regenciahorario on regenciahorario.ed58_i_rechumano = docenteausencia.ed321_rechumano
        and regenciahorario.ed58_i_regencia = docentesubstituto.ed322_regencia
),
via_regente as ( -- caso (c): regente/conselho, sem horário explícito
    select p.id_usuario, p.professor, regente.id_regencia, p.ed75_i_rechumano id_rechumano
    from professor p
    join regente on regente.id_rechumano = p.ed75_i_rechumano
)
select
    'REGULAR' tipo,
    u.id_usuario,
    escola.ed18_i_codigo escola_id,
    trim(escola.ed18_c_nome) escola,
    turma.ed57_i_codigo turma_id,
    trim(turma.ed57_c_descr) turma,
    serie.ed11_i_codigo serie_id,
    trim(serie.ed11_c_descr) serie,
    trim(caddisciplina.ed232_c_descr) disciplina,
    calendario.ed52_i_ano ano,
    u.professor,
    u.id_regencia,
    serie.ed11_i_ensino ensino,
    serie.ed11_i_sequencia sequencia,
    u.id_rechumano
from (
    select * from via_horario
    union
    select * from via_substituicao
    union
    select * from via_regente
) u
join escola.regencia on regencia.ed59_i_codigo = u.id_regencia
join escola.turma on turma.ed57_i_codigo = regencia.ed59_i_turma
join escola.serie on serie.ed11_i_codigo = regencia.ed59_i_serie
join escola.escola on escola.ed18_i_codigo = turma.ed57_i_escola
join escola.disciplina on disciplina.ed12_i_codigo = regencia.ed59_i_disciplina
join escola.caddisciplina on caddisciplina.ed232_i_codigo = disciplina.ed12_i_caddisciplina
join escola.calendario on calendario.ed52_i_codigo = turma.ed57_i_calendario
union
select
    distinct
    'AEE/ATIV. COMPLEMENTAR' tipo,
    db_usuacgm.id_usuario,
    escola.ed18_i_codigo escola_id,
    trim(escola.ed18_c_nome) escola,
    turmaac.ed268_i_codigo turma_id,
    trim(turmaac.ed268_c_descr) turma,
    0 serie_id,
    '' serie,
    '' disciplina,
    calendario.ed52_i_ano ano,
    trim(cgm.z01_nome) professor,
    0 id_regencia,
    0 ensino,
    0 serie,
    rechumanoescola.ed75_i_rechumano id_rechumano
from configuracoes.db_usuacgm
join protocolo.cgm on db_usuacgm.cgmlogin = cgm.z01_numcgm
left join pessoal.rhpessoal on cgm.z01_numcgm = rhpessoal.rh01_numcgm
left join escola.rechumanopessoal on rhpessoal.rh01_regist = rechumanopessoal.ed284_i_rhpessoal
left join escola.rechumanocgm on cgm.z01_numcgm = rechumanocgm.ed285_i_cgm
join escola.rechumanoescola on rechumanopessoal.ed284_i_rechumano = rechumanoescola.ed75_i_rechumano
    or rechumanocgm.ed285_i_rechumano = rechumanoescola.ed75_i_rechumano
join escola.turmaachorarioprofissional on turmaachorarioprofissional.ed346_rechumano = rechumanoescola.ed75_i_rechumano
join escola.turmaac on turmaachorarioprofissional.ed346_turmaac = turmaac.ed268_i_codigo
join escola.escola on turmaac.ed268_i_escola = escola.ed18_i_codigo
join escola.calendario on turmaac.ed268_i_calendario = calendario.ed52_i_codigo
order by ano, escola, tipo desc, ensino, serie, turma
```


- Documente todos os arquivos criados.