Sistema de ponto eletrônico e gestão de equipe com frontend em Flutter e backend em FastAPI. O foco do repositório é um fluxo corporativo enxuto, com autenticação por token opaco, proteção de dados sensíveis em nível de aplicação e uma base pensada para evoluir sem acoplamento desnecessário.
O Bunchin App reúne:
- app Flutter para operação diária, autenticação, configurações e time tracking
- API FastAPI para autenticação, funcionários, projetos, admin e ponto
- persistência local com SQLite em desenvolvimento e PostgreSQL em ambientes superiores
- criptografia de PII antes da persistência e sessões rastreáveis por token hash
Para detalhes da API e dos contratos do backend, veja backend/README.md.
flowchart LR
subgraph App["Flutter app"]
Auth[Auth]
Admin[Admin]
Settings[Settings]
Time[Time tracking]
end
subgraph Api["FastAPI backend"]
Routes[api/routes]
Services[services]
Domain[domain]
Authz[authorization]
Boot[bootstrap / seed]
end
DB[(SQLite / PostgreSQL)]
Mail[Brevo]
App -->|HTTPS JSON| Api
Routes --> Services
Services --> Domain
Services --> Authz
Boot --> DB
Api --> DB
Api --> Mail
sequenceDiagram
autonumber
actor User as Usuário
participant App as Flutter app
participant Api as FastAPI
participant Db as Banco
User->>App: Informa email e senha
App->>Api: POST /auth/login
Api->>Db: Valida credenciais e cria sessão
Db-->>Api: Token hash persistido
Api-->>App: Access token opaco
App-->>User: Usuário autenticado
User->>App: Logout
App->>Api: POST /auth/logout
Api->>Db: Revoga sessão atual
Observação de sessão:
keepConnected=truepede o TTL longo no backend.keepConnected=falsepede o TTL curto, mas a sessão ainda fica armazenada localmente e pode ser reaproveitada atéexpiresAt.POST /api/v1/auth/logoutcontinua sendo o caminho para revogação imediata.
flowchart TD
Start([Usuário abre a área de ponto]) --> Action{Qual ação?}
Action -->|Clock-in| In[Registrar entrada]
Action -->|Pause| Pause[Registrar pausa]
Action -->|Return| Back[Registrar retorno]
Action -->|Clock-out| Out[Registrar saída]
In --> Api1[POST/PUT na API de time clock]
Pause --> Api2[POST/PUT na API de time clock]
Back --> Api3[POST/PUT na API de time clock]
Out --> Api4[POST/PUT na API de time clock]
Api1 --> Db[(Persistência)]
Api2 --> Db
Api3 --> Db
Api4 --> Db
Db --> View[Histórico paginado de ponto]
flowchart LR
Root["self-bunchin-app"]
Root --> Frontend["frontend/"]
Root --> Backend["backend/"]
Root --> Docs["CONTEXT.md + README.md"]
Frontend --> UI["lib/features/*"]
Frontend --> Core["lib/core/*"]
Frontend --> Tests["test/"]
Backend --> Api["app/api/*"]
Backend --> Domain["app/domain/*"]
Backend --> Services["app/services/*"]
Backend --> Db["app/models.py + database_schema.py"]
Backend --> Seed["app/seed.py"]
Backend --> Tests2["tests/"]
| Área | O que cobre |
|---|---|
| Autenticação | Login, logout, sessão persistida e revogação individual |
| Ponto | Clock-in, clock-out, pausa, retorno e histórico paginado |
| Gestão de equipe | CRUD de funcionários, vínculo com projetos e regras por papel |
| Admin | Operação interna com permissões separadas |
| Configurações | Tema global com modos claro, escuro e seguir sistema |
| E-mail transacional | Fluxos de convite, redefinição e boas-vindas via Brevo |
| Segurança | PII criptografada, token opaco com hash e CORS configurável |
| Tecnologia | Uso |
|---|---|
| Python | Linguagem principal |
| FastAPI | API REST |
| SQLAlchemy | ORM |
| Pydantic | Schemas e validação |
| Cryptography | AES-GCM para PII |
| Pytest | Testes |
| SQLite | Banco local |
| PostgreSQL | Banco de produção/staging |
| Tecnologia | Uso |
|---|---|
| Flutter | UI mobile/web |
| Dart | Linguagem |
| Freezed | Modelos imutáveis |
| Build Runner | Geração de código |
| Flutter Secure Storage | Persistência segura |
| Geolocator | Geolocalização |
| HTTP | Cliente HTTP |
| Google Fonts | Tipografia |
backend/
app/
api/
domain/
schemas/
services/
main.py
bootstrap.py
database_schema.py
tests/
.env.example
requirements.txt
frontend/
lib/
core/
features/
theme/
main.dart
test/
pubspec.yaml
cd backend
python -m venv .venv
.venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
uvicorn app.main:app --reloadcd frontend
flutter pub get
dart run build_runner build
flutter run -d web-serverO frontend pode ser publicado como site estático no Vercel usando o diretório frontend/ como root do projeto.
- Root Directory:
frontend - Build Command:
bash scripts/vercel-build.sh - Output Directory:
build/web - Environment Variable:
API_BASE_URLcom a URL pública da API, por exemplohttps://api.suaempresa.com/api/v1 - O backend precisa permitir o origin do domínio do Vercel em
BUNCHIN_ALLOWED_ORIGINS
O build script baixa o Flutter SDK quando necessário, gera o web build e falha com mensagem clara se o API_BASE_URL não estiver definido no ambiente do Vercel.
As variáveis mais importantes são:
BUNCHIN_TOKEN_SECRETBUNCHIN_ENCRYPTION_SECRETBUNCHIN_ALLOWED_ORIGINSBUNCHIN_ENFORCE_HTTPSBUNCHIN_SEED_ON_STARTUPBUNCHIN_SEED_ADMIN_PASSWORDBUNCHIN_BREVO_API_KEYBUNCHIN_BREVO_SENDER_EMAILBUNCHIN_BREVO_SENDER_NAMEBUNCHIN_BREVO_WELCOME_ENABLEDAPI_BASE_URLpara o frontend web publicado no Vercel
O backend também documenta seed, autenticação, permissões e endpoints em backend/README.md.
- Base path:
/api/v1 - Formato: JSON
- Autenticação:
Authorization: Bearer <token> - Erros:
{"detail":"mensagem"}
Rotas principais:
/auth/login/auth/logout/employees/projects/time-clock/time-clock/me?page=&limit=/time-clock/employees/{employee_id}/punches?page=&limit=/admin
O CI do repositório executa:
pytestembackend/flutter testemfrontend/
Comandos úteis localmente:
cd backend && pytest
cd frontend && flutter test
cd frontend && dart format lib test- backend/README.md - detalhes da API, seed e permissões
- CONTEXT.md - regras e contexto compartilhado do projeto
Uso proprietário. Consulte o repositório ou o time responsável para detalhes de distribuição.