Roadmap
Este é o resumo público do estado do produto: o que já funciona, o que está em construção e os problemas que reconhecemos. Atualizado manualmente pela equipe.
Estado atual
Operacional- Garagem — cadastro de motos, odômetro, perfil de uso e templates de fábrica com especificações pré-preenchidas.
- Abastecimento — registro de litros, preço, tipo de combustível, estatísticas de consumo e alertas de anomalia.
- Manutenção — registro de revisões, trocas de óleo, planos de manutenção baseados em km ou data, e peças cadastradas.
- Pneus — cadastro de dianteiro e traseiro, desgaste percentual, calibragem e estimativa de troca.
- Documentos — anexos de CRLV, seguro, manual e notas fiscais com validade.
- Lembretes e alertas — notificações por km, data ou intervalo; health score consolidado no painel.
- Relatórios e linha do tempo — resumo de custos, tendência de consumo, distribuição de gastos e eventos históricos.
- API v1 (leitura) — endpoints REST para abastecimentos, manutenções, pneus, lembretes, documentos e despesas via token.
Funcionalidades planejadas
Backlog- Fila offline com sincronização em background — usar o service worker para armazenar POSTs (abastecimento, manutenção, odômetro) em IndexedDB e sincronizar quando a conexão voltar.
- API v1 (escrita) — endpoints POST e PUT/PATCH para criar e atualizar registros de abastecimento, manutenção, pneus e lembretes via token.
- Geolocalização do posto — capturar lat/lng no registro de abastecimento e sugerir postos próximos do histórico do usuário.
- OCR de cupom fiscal — extrair litros, valor total e nome do posto automaticamente a partir da foto do comprovante.
- Visão multi-moto no painel — pagina de garagem com health score, odômetro e alertas de todas as motos ativas em um único quadro.
- Fotos na manutenção — anexar imagens antes/depois a cada registro de manutenção.
- Relatório de venda imprimivel/PDF — exportar consolidado de custos, manutenções, pneus e documentos em pagina pronta para impressão.
- Alertas de anomalia no contexto — exibir badge de aviso diretamente na lista de abastecimentos quando consumo ou preço estiverem fora da faixa.
- Importação em lote via CSV — importar abastecimentos de planilha com validação e preview antes do commit.
Melhorias planejadas
Refactoring- Hash de API keys — armazenar apenas o hash no banco e devolver a chave em texto puro apenas no momento da criação.
- Criptografia de chaves push — criptografar `p256dh` e `auth` do VAPID no banco de dados.
- Parsing DST-safe de datas — tratar `AmbiguousTimeError` e `NonExistentTimeError` no utilitario de undo.
- Extrair HTML inline para templates — mover o HTML gerado em Python (`onboarding_template_preview_view`) para um template parcial.
- Reduzir complexidade da view de onboarding — extrair a lógica de criação de `Motorcycle`, `FuelRecord`, `MaintenanceRecord` e `TireRecord` para um service dedicado.
- Mover imports locais para o topo — eliminar late imports dentro de views quando não houver dependência circular real.
- Separar testes monolíticos — dividir `test_core.py` (~740 linhas) em arquivos por domínio: views, onboarding, dashboard services, sitemap.
- Usar reverse() em URLs de teste — substituir strings literais como `"/robots.txt"` e `"/sitemap.xml"` por `reverse("...")` para evitar quebras silenciosas.
- Asserções mais fortes no sitemap — verificar que `sitemap.location()` retorna uma URL resolvida válida, não apenas truthy.
Correções planejadas
Pendente- Colisão de API keys — gerar com retry automatico em caso de `IntegrityError` na criação do token (collision astronômica, mas possivel).
- Asserção fraca de sitemap — `test_sitemap_uses_existing_url_names` so verifica truthiness de `location()`; deve validar formato de URL.
Problemas conhecidos
Abertos- API keys em texto plano — o campo `key` de `ApiToken` armazena a chave inteira no banco. Em caso de vazamento de banco, todos os tokens são comprometidos.
- Chaves push sem criptografia — `p256dh` e `auth` de `PushSubscription` estão armazenados em texto claro no banco.
- HTML inline em Python — `onboarding_template_preview_view` monta um article inteiro via f-string, dificultando manutenção de markup e escapamento manual.