Sistema Syens
Repositório: educacao
Sistema de gestão educacional para redes públicas de ensino. Roda em multiescola (multitenant) na mesma instância: uma única aplicação atende várias mantenedoras (clientes) e, dentro de cada uma, várias escolas. Cobre o ciclo escolar completo — pessoas, turmas, matrículas, notas, frequência, documentação, censo, transporte e alimentação. É a maior e mais antiga base de código da Appolus (~627 models e mais de 3.000 migrations).
Manual de uso (não técnico): Sistema Syens.
Usuários, perfis, contexto e permissões
Entender esse esquema é o primeiro passo do onboarding: quase toda tela e toda query do sistema dependem dele.
Autenticação. Login por Devise. Cada User está ligado a uma Person
(que pode ser um Profissional) e a um perfil (Perfil).
Contexto (multitenancy). Os dados são escopados por três níveis, representados
em UserContext (app/models/user_context.rb):
- Mantenedora (
Customer/cliente) — a rede de ensino. Um usuário pode ter acesso a mais de uma (allowed_customers). - Escola — a unidade. As escolas que um usuário enxerga vêm dos seus
vínculos (
Vinculo) de profissional.superadministrador?,adm?e quem é da Secretaria de Educação enxergam todas as escolas da mantenedora. - Ano letivo — recorta o período dos dados.
Regra de ouro: nunca vaze dados entre escolas ou mantenedoras. Toda consulta nova deve respeitar o contexto.
Perfis e permissões. Cada usuário tem um Perfil, que reúne Permissao. Uma
permissão é o par papel (role) × ação (create, read, update, destroy).
A autorização usa CanCan (app/models/ability.rb):
superadministrador?recebecan :manage, :all.- Para os demais, as permissões do perfil viram regras CanCan. Quando o perfil tem
as 4 ações de um papel, ele recebe
managedaquele recurso.
Os papéis disponíveis ficam em config/locales/roles.yml. Para criar um papel
novo de permissão:
- Adicione o nome do papel em
config/locales/roles.yml. - Rode
bundle exec rake roles:update(executa oRolesUpdater, que cria as 4 ações no banco e remove papéis que saíram da lista). - Atribua o papel ao(s) perfil(is) desejado(s).
Menus. O menu lateral é montado a partir de config/menu.yml, que apenas
inclui os arquivos de config/menu/ — um por área de uso: secretariat,
school, secretary_teacher, pedagogue, principal, school_transport,
nutrition, programs, ead, data e security. O que cada usuário vê é
filtrado pelas suas permissões.
Stack
- Linguagem: Ruby 2.6.10
- Framework: Rails 3.2
- Banco: PostgreSQL
- Autenticação: Devise
- Autorização: CanCan (
app/models/ability.rb) - Jobs: Sidekiq + Redis
- Auditoria: audited
- Front-end: ERB + Bootstrap, Vue 2 e React 15 (legado), Webpack 5
- Armazenamento: AWS S3 (
aws-sdk) - Testes: RSpec; features Gherkin (
features/,especificacao/)
Como rodar localmente
Passo a passo resumido (guia completo em docs/project_setup.md e
docs/installing_a_new_environment.md):
- Dependências de sistema (macOS):
brew install openssl@1.1 bison gmp libffi libyaml readline zlibebrew install --force icu4c@74. - Ruby e Node via asdf (as versões já estão no
.tool-versions):asdf install ruby 2.6.10easdf install nodejs 22. - Gems: instale o
bundler 1.17.3, compile ocharlock_holmes 0.7.6apontando para oicu4c@74(comando exato no guia) e rodebundle. - JavaScript:
npm install -g yarne depoisyarn. - Banco: suba um PostgreSQL e restaure um dump de desenvolvimento (peça o link
ao time) com
bin/local-to-local <arquivo-dump> <nova-senha>. - Assets:
npm run watchrecompila os módulos antigos (Babel); o Webpack (app/webpack) sobe junto com oforeman.
Com Docker Compose: copie config/database.postgres.yml para
config/database.yml, rode docker-compose run webpack yarn,
docker-compose run web bin/bundle exec rake db:create e
docker-compose up.
Variáveis de ambiente
Configuradas em .env.dev. As principais:
DB_HOST,DB_PORT,DB_NAME,DB_USERNAME,DB_PASSWORD— conexão com o PostgreSQL.REDIS_URL— Redis usado pelo Sidekiq.ENCRYPTION_KEY— chave de criptografia de dados sensíveis.MAILER_SENDER— remetente padrão dos e-mails.BIOMETRIC_READINGS_API_KEY,FACE_RECOGNIZER_API_URL— integrações de biometria e reconhecimento facial.LGPD_URL— endpoint do fluxo de LGPD.SMAR_CUSTOMER_ID— identificador de integração externa.NEW_RELIC_AGENT_ENABLED— liga/desliga o monitoramento do New Relic.
Padrões do projeto
Além do MVC, o app/ tem camadas próprias: services/ e actions/ (regra de
negócio), queries/ (consultas), policies/, presenters/, serializers/,
forms/, validators/, workers/ (Sidekiq), uploaders/, enumerations/,
parsers/ e adapters/.
Convenções específicas (Rails 3 / Ruby 2.6):
- Código em inglês; textos de interface via i18n (
config/locales, pt-BR). - Sem
ApplicationRecord— models herdam deActiveRecord::Base. - Strong parameters via
attr_accessible(nãoparams.permit). - Evite sintaxe de Ruby 2.7+ e APIs de Rails 4+.
- Multitenancy em primeiro lugar: escope tudo à escola/mantenedora.
- O repositório traz um
CLAUDE.mdcom o contexto do projeto.
BigPicture
Deploy
CI no GitHub Actions (RuboCop, ESLint, build do Webpack e testes). Imagens Docker
(Dockerfile, Dockerfile.sedu); a infraestrutura AWS é provisionada pelo
InfraSpawn (syens.tf).