Pular para o conteúdo principal

CPE Console

Repositório: cpe-console

Backend e console de gestão da Chamada Escolar (matrícula da rede). Configura as chamadas, recebe as inscrições do portal público, pontua e classifica os candidatos, gerencia a fila de espera e expõe a API consumida pelo portal. Sincroniza dados com o sistema acadêmico (Syens).

Manual de uso: Chamada Escolar.

Usuários, perfis, contexto e permissões

Autenticação. O console não tem cadastro próprio de usuários: a pessoa autentica com a conta do sistema acadêmico (Syens). A partir daí o cpe-console cria uma UserSession (token JWT, via concerns Tokenizable/Sessionable) que guarda os dados vindos do Syens (syens_data): nome, e-mail, escolas permitidas e os papéis.

Papéis. Dois papéis vêm do Syens e definem o que o usuário pode fazer:

  • Gestor da Chamada Escolar (cpe_manager?) — acesso de administração.
  • Visualizador (cpe_viewer?) — somente consulta.

Contexto. Os dados são escopados pelo Customer (cliente/rede de ensino, com um ref que liga ao Syens) e pelas escolas permitidas da sessão. As regras de funcionamento da chamada ficam em um registro único Settings.

Permissões e menus. A autorização usa Pundit (app/policies/). Cada área tem sua policy — classification, planning, public_call, question, subscription, sync. O menu é controlado pela MenuPolicy (ex.: show_administration? e show_settings? só liberam para o gestor).

Stack

  • Linguagem: Ruby 3.4.6
  • Framework: Rails 7.2
  • Banco: PostgreSQL
  • Busca: Elasticsearch
  • Autorização: Pundit (app/policies)
  • Autenticação/API: JWT
  • Jobs: Sidekiq
  • Auditoria: audited
  • Front-end: React 18 + esbuild

Como rodar localmente

  1. Use as versões do .tool-versions (Ruby 3.4.6).
  2. Rode bin/setup para instalar dependências e preparar o banco.
  3. Suba a aplicação com foreman start -f Procfile.dev (ou docker-compose up).
  4. Bootstrap de um ambiente novo: abra o console (bundle exec rails c) e crie o Customer e o Settings (registro único), preenchendo com os dados do cliente:
Customer.create!(
name: "SEDU", # nome do cliente (obrigatório e único)
ref: 1, # referência do cliente no sistema acadêmico
active: true
)

Settings.create!(
classification_rule: "default", # "default" ou "cariacica"
score_methods: "none", # CSV dos métodos de pontuação ou "none"
visual_identity: "es" # identidade visual do portal
# ...demais campos opcionais (integração com o Educação, reCAPTCHA, etc.)
)

Variáveis de ambiente

Configuradas em .env e acessadas por um objeto Settings (não use ENV espalhado pelo código). As principais:

  • Banco e infraestrutura: DB_HOST, DB_PORT, DB_NAME, DB_USERNAME, DB_PASSWORD, REDIS_URL, ELASTICSEARCH_URL, DOMAIN, SENTRY_DSN.
  • Integração com o Syens/Educação: EDUCACAO_URL, EDUCACAO_KEY, EDUCACAO_CUSTOMER_ID, EDUCACAO_CADASTRO_ID.
  • Pontuação e classificação: SCORE_METHODS, DISABILITY_POINTS, CLASSIFICATION_VIEW, SIBLING_IN_SCHOOL_QUESTION_ID, SIBLING_IN_SCHOOL_ANSWER_ID.
  • Portal e antifraude: API_KEY, RECAPTCHA_SITE_KEY, RECAPTCHA_SECRET_KEY, GOOGLE_API_KEY (Distance Matrix/Geocoding), IDV.

Padrões do projeto

Destaque para app/interactor/ (interactors que orquestram pontuação e classificação), além de policies/, serializers/, services/, jobs/ e sidekiq/. Os controllers de API ficam em app/controllers/api/v1.

Modelos centrais: public_call (chamada), subscription (inscrição), classification, score, offer, question/answer, customer (rede/tenant), school, school_year, curriculum, além de distance_log/geocoding_log (integração com o Google Maps) e sync (sincronização com o acadêmico).

Pontuação e classificação acontecem em duas etapas — primeiro pontuar, depois classificar:

  • As regras de pontuação vivem nos interactors, em classes Score.
  • Quais regras pontuam é definido por SCORE_METHODS, por exemplo: disability, maria_penha_law, ciase, distance, school_neighborhood, same_school_sibling, school_zone, sibling_in_school.
  • Todo ano os critérios devem ser revisados (pesos por distância, novos critérios) e, se necessário, um novo Score é implementado.

A lógica funcional está descrita no manual, em Processamento e Classificação.

BigPicture

Módulos do Console da Chamada Escolar

Deploy

Imagem Docker publicada no Amazon ECR (chamada-publica): docker builddocker tag <conta>.dkr.ecr.us-east-1.amazonaws.com/chamada-publica:TAGdocker push. Infraestrutura AWS provisionada pelo InfraSpawn (cpe.tf).