Fisioterapia domiciliar: agenda, prontuário e evolução clínica no bolso do profissional — sem servidor central e sem os dados saírem da conta do fisioterapeuta.
Acessar o aplicativo · Documentação · Modelo de dados · Segurança e LGPD
Fisioterapeuta domiciliar atende na casa do paciente, entre um deslocamento e outro. A rotina real é caderno, WhatsApp e planilha solta: a agenda mora num lugar, a evolução clínica em outro, o valor da sessão na cabeça. E qualquer prontuário em SaaS tradicional significa entregar dado de saúde de terceiro para uma empresa — responsabilidade que a LGPD coloca no colo do profissional.
O Alta — nome do desfecho de todo tratamento, "dar alta" — junta agenda, prontuário e financeiro num app só, e resolve a questão dos dados invertendo o modelo: BYODB (Bring Your Own Database). O fisioterapeuta conecta a própria conta Google, e o app cria e usa uma planilha no Drive dele. Não existe banco central, não existe prontuário sob custódia de terceiro, não existe conta a pagar por armazenamento.
| Pacientes | Cadastro com anamnese clínica completa (queixa, histórico, comorbidades, medicamentos, alergias, cirurgias, hábitos), validação de CPF e cálculo de idade |
| Agenda | Visão calendário e lista, agendamento com valor da sessão, desfechos (Realizado / Cancelado / Faltou), reagendamento |
| Evolução clínica | Registro por sessão com protocolo aplicado, ditado por voz, timeline por paciente e janela de edição de 24h — depois disso o registro fecha, mas continua legível |
| Financeiro | Resumo mensal por situação de sessão |
| Rotas | Abertura do endereço do paciente no Google Maps / Waze |
🚧 Pendente: capturas de tela ainda não adicionadas. Os PNGs entram em
docs/imagens/e substituem os links abaixo.
Não há backend próprio. O app fala direto com as APIs do Google usando o token OAuth do próprio usuário — o Firebase Hosting só entrega arquivos estáticos.
flowchart LR
subgraph cliente["Cliente"]
APP["App Alta<br/>Flutter · Riverpod<br/>Android · Web"]
end
subgraph host["Firebase Hosting"]
EST["Arquivos estáticos<br/>(sem backend)"]
end
subgraph google["Conta Google DO FISIOTERAPEUTA"]
OAUTH["OAuth 2.0<br/>Google Sign-In"]
DRIVE["Drive API v3<br/>localiza a planilha"]
SHEETS["Sheets API v4<br/>CRUD"]
DB[("__saas_fisio_db__<br/>Pacientes · Agenda · Evoluções<br/>Configurações · Auditoria")]
end
EST -.serve o app.-> APP
APP -->|login| OAUTH
OAUTH -->|token com escopo restrito| APP
APP -->|busca por nome exato| DRIVE
DRIVE --> DB
APP -->|leitura e escrita| SHEETS
SHEETS --> DB
Consequências do desenho:
- Nenhum dado clínico passa por infraestrutura do mantenedor — LGPD por arquitetura
- Custo de operação praticamente zero (sem banco, sem servidor)
- O profissional pode abrir a planilha e ver os próprios dados a qualquer momento
- Em troca: sem consulta relacional, sem transação; o versionamento de esquema
(
lib/servicos/versao_esquema.dart) é quem mantém a compatibilidade
| Tecnologia | Versão | Papel |
|---|---|---|
| Flutter + Dart | SDK ^3.12.0 (CI em 3.44.1) |
App Android + Web, Material 3, null-safety |
| Riverpod | 3.x | Estado e injeção de dependência |
| Google Sheets API | v4 | Banco de dados (BYODB) |
| Google Drive API | v3 | Localizar a planilha do usuário |
| Google Sign-In | 7.2.0 (google_sign_in_web 1.1.3) |
Autenticação OAuth 2.0 |
| Table Calendar | 3.1.3 | Visão calendário da agenda |
| Speech to Text | — | Ditado dos registros clínicos |
| Firebase Hosting | — | Entrega dos arquivos web |
Código, pastas e nomenclatura em português (PT-BR) — decisão deliberada, o domínio é clínico e brasileiro.
lib/
├── telas/ # 14 telas (login, início, pacientes, sessões, evolução, financeiro…)
├── componentes/ # design system e widgets reutilizáveis
├── provedores/ # estado com Riverpod
├── modelos/ # Paciente · Agendamento · Evolução (serialização de/para planilha)
├── servicos/ # Google Sign-In, Drive, Sheets, preferências, versão de esquema
└── utilitarios/ # validadores (CPF, telefone, data), máscaras, cálculo de idade
Pré-requisitos: Flutter 3.44.1, uma conta Google e um projeto no Google Cloud com as APIs Drive e Sheets habilitadas.
git clone git@github.com:lacerdaRodrigo/alta.git
cd alta
flutter pub get
cp .env.example .env # preencha os client IDs OAuthmake dev-web # http://localhost:5000- Ative Depuração USB no celular e conecte via cabo
flutter devices— confirme que o aparelho aparecemake dev-android
⚠️ Pendência aberta desde a renomeação para "Alta". OapplicationIdpassou decom.rodrigo.fisio_careparacom.rodrigo.alta, e ogoogle-services.jsonatual ainda descreve o pacote antigo. Enquanto isso, todo build Android falha com:No matching client found for package name 'com.rodrigo.alta'Para destravar: no Firebase Console adicione um app Android com o pacote
com.rodrigo.alta+ o SHA-1 do keystore debug, baixe ogoogle-services.jsonnovo paraandroid/app/, e no Google Cloud Console → Credenciais crie o cliente OAuth Android para o mesmo pacote (sem ele o build passa mas o login falha em execução). Web e testes não são afetados.SHA-1 debug local:
keytool -list -v -keystore ~/.android/debug.keystore \ -alias androiddebugkey -storepass android -keypass android
368 testes automatizados — 174 unitários + 194 de widget, cobrindo as 14 telas, os 3 modelos, os serviços de Drive/Sheets/repositório e os validadores.
flutter test # todos
flutter test test/unitarios/ # lógica pura
flutter test test/widgets/ # UI e interação
flutter test --coverage # relatório de cobertura
make ci-local # exatamente o que a CI roda (lint + testes + build web)Fora de cobertura por decisão: APIs reais do Google (consumiriam quota), login
real (exigiria device/navegador) e testes de carga. As chamadas HTTP ao Drive e
ao Sheets são exercitadas contra um servidor falso
(test/unitarios/auxiliares/servidor_google_fake.dart).
Detalhe teste a teste em documentacao/testes/.
develop ──► lint + testes ──► preview channel (URL temporária)
│
▼ merge quando aprovado
main ──► lint + testes ──► bump de versão ──► produção (app-fisio-care-2.web.app)
Se lint ou testes falharem, a publicação é cancelada — código quebrado não vai ao ar. Não existe workflow de CI separado: a verificação está embutida nos dois deploys.
make ci-local # roda a mesma verificação da CI, localmente
make release-dev # mescla a branch atual em develop → dispara o preview
make release-prod # mescla develop em main → PUBLICA EM PRODUÇÃO (pede confirmação)Guia completo, secrets e troubleshooting em documentacao/CI_CD.md.
O ícone é desenhado em código (tool/gerar_icones.dart) e renderizado pelo
engine do Flutter em cada tamanho final — Android (legado, redondo, adaptativo e
monocromático), web, iOS, macOS e Windows. Cada tamanho é renderizado direto, não
redimensionado a partir do 1024, o que mantém o traço limpo a 20px.
make icones # não edite os PNGs à mão — a próxima execução os sobrescreveOs dados clínicos ficam na conta Google do profissional; o app usa OAuth 2.0 com escopos restritos a Drive e Sheets. Nenhum dado de paciente transita por infraestrutura do mantenedor.
- Política de segurança e como reportar falhas:
SECURITY.md - Modelo de dados, escopos e conformidade:
documentacao/SEGURANCA_E_DADOS.md
| Arquivo | Conteúdo |
|---|---|
documentacao/MODELO_DADOS.md |
Estrutura das 5 abas da planilha |
documentacao/DIAGRAMA_FLUXOS.md |
Navegação e fluxos do app |
documentacao/ESPECIFICACOES_TELAS.md |
Requisitos funcionais das telas |
documentacao/SEGURANCA_E_DADOS.md |
LGPD, OAuth e o modelo BYODB |
documentacao/CI_CD.md |
Pipeline, secrets e troubleshooting |
documentacao/IMPLEMENTAR.md |
Roadmap priorizado |
documentacao/testes/ |
Os 368 testes, um a um |
QA/qa.md |
Roteiro de QA manual |
CHANGELOG.md |
Histórico de versões |
Proprietária — código público para leitura, estudo e avaliação técnica; uso
comercial, redistribuição e obras derivadas dependem de autorização por escrito.
Ver LICENSE.
Desenvolvido por Rodrigo Lacerda · lacerdaa.rodrigo@gmail.com