Painel
Dashboard
Próximos eventos
Atividades recentes
Agenda
Eventos
| Evento | Tipo | Data | Local | Inscritos | Status |
|---|
Base
Participantes
| Nome | CPF | Contato | Cidade/UF | Status |
|---|
Relação participante + evento
Inscrições
| Número | Participante | Evento | Data | Tipo | Status |
|---|
Controle
Presença
| Participante | Inscrição | Check-in | Entrada | Check-out | Saída | Permanência | Status | Certificado |
|---|
Lei de incentivo à cultura
Frequência
Emissão e validação
Certificados
| Chave | Número | Participante | Evento | Carga | Consultas | Status |
|---|
Prestação de contas
Comprovação cultural
Formulário do site
Contatos
| Data | Contato | Mensagem | Status |
|---|
Auditoria
Logs
| Quando | Ação | Detalhe | Usuário |
|---|
Projeto
Configurações
Banco de dados
Só o administrador faz login. O site público lê eventos e certificados sem autenticação e grava apenas contatos e consultas.
Regras do Realtime Database
{
"rules": {
"odp": {
"events": { ".read": true, ".write": "auth != null" },
"certificates": { ".read": true, ".write": "auth != null" },
"settings": { ".read": true, ".write": "auth != null" },
"adminMeta": {
".read": true,
"created": { ".write": "auth != null && !data.exists()" }
},
"participants": { ".read": "auth != null", ".write": "auth != null" },
"registrations": { ".read": "auth != null", ".write": "auth != null" },
"attendance": { ".read": "auth != null", ".write": "auth != null" },
"evidence": { ".read": "auth != null", ".write": "auth != null" },
"auditLogs": { ".read": "auth != null", ".write": "auth != null" },
"contacts": { ".read": "auth != null",
"$id": { ".write": "!data.exists()" } },
"consultas": { ".read": "auth != null",
"$id": { ".write": "!data.exists()" } },
"certsByCpf": {
"$cpf": { ".read": true, ".write": "auth != null" }
}
}
}
}
O nó adminMeta/created controla o primeiro acesso: enquanto estiver vazio, a tela de login mostra "criar conta administradora"; a regra !data.exists() permite gravá-lo uma única vez, e só por quem acabou de se autenticar — depois disso o cadastro fecha sozinho. Dados pessoais de participantes, inscrições e presença ficam fechados: só quem está autenticado lê. Em contacts e consultas, a mesma regra !data.exists() permite criar um registro novo, mas nunca ler, alterar ou apagar os que já existem. Em certsByCpf a leitura só é liberada por CPF específico ($cpf) — dá para ler quem já sabe o CPF, mas não listar o nó inteiro; a escrita continua exigindo login, feita automaticamente ao emitir um certificado.