11 KiB
Retrospectiva — Epic 2: Acréscimo Financeiro no Pedido
Data: 2026-04-16 Projeto: SARandroid Epic: 2 — Acréscimo Financeiro no Pedido Facilitador: Julio (Project Lead) Primeiro retro do projeto — sem retrospectiva anterior para comparar follow-through.
1. Resumo do Epic
| Métrica | Valor |
|---|---|
| Stories planejadas | 4 |
| Stories concluídas | 4 (100%) |
| FRs cobertos | FR5–FR13 (9 requisitos funcionais) |
| Code reviews aprovados | 4/4 |
| Migrações SQLite | v41→v42 (story 2.3), v42→v43 (story 2.4) |
| Arquivos de código alterados | 6 únicos (DatabaseHelper, PedidoDB, PedidoConsultaDB, Pedido VO, MainPedidoFragment, TotalPedidoFragment) |
| Incidentes em produção | 0 (feature ainda não publicada) |
| Débitos técnicos formalmente deferred | 19 itens acumulados em deferred-work.md |
Stories entregues
- 2.1 Exibir campo Acréscimo na tela do pedido (sempre R$ 0,00)
- 2.2 Calcular acréscimo ao selecionar forma de pagamento
- 2.3 Persistir acréscimo ao fechar o pedido
- 2.4 Exibir acréscimo na consulta de pedidos
2. O Que Foi Bem
- Padrão de migração SQLite robusto: cada story de migração (1.1, 2.3, 2.4) atualizou
dbVersao+ blocoonUpgrade+onCreatesimultaneamente. Esse padrão triplo evitou a regressão clássica "instalação nova crasha porque só o upgrade foi atualizado" — explicitamente documentado em Story 2.4. - Escopo por story bem isolado: cada history entregou 1 responsabilidade clara (UI → cálculo → persistência → consulta). Nada de stories-monstro que misturam camadas.
- Review adversarial tripla (Blind + EdgeCase + Auditor) consistentemente filtrou ruído de sinal: vários falsos positivos (ex: locale em
Double.toString) foram corretamente classificados como dismiss, e os riscos reais (sync PG ausente, MD5 semvl_acrescimo) foram deferred com justificativa. - Tolerância a dados ausentes do ERP: padrão estabelecido em Story 1.2 (
acrescausente no PG) foi replicado em Story 2.4 (vl_acrescimo = 0.0default na sync). Mantém retro-compatibilidade com schemas antigos. - Separação
pedido(editável) vspedido_consulta(histórico): Story 2.4 identificou que o guardstatus >= STATUS_ENVIADOnos dois fragments (Main + Total) era necessário para preservar o valor histórico — evitou o bug sutil de "recalcular acréscimo de pedido enviado usandotx_acrescimoatual". - Documentação de verificação manual: cada story incluiu roteiro de teste manual passo-a-passo (com SQL de inspeção, cenários de edge case). Mitigação razoável da ausência de testes automatizados no projeto.
3. O Que Não Foi Bem / Desafios
- Esquecimento inicial: Story 2.3 só migrou a tabela
pedido, nãopedido_consulta. O erro foi parcialmente sistemático — o padrão dual-DB do projeto (*DB.java+*ConsultaDB.java) exige que features que afetam ambas as tabelas migrem ambas. Story 2.4 teve que corrigir isso via v43. Lição: ao planejar features que afetam pedidos históricos, sempre verificar o parpedido+pedido_consultadesde a primeira story. - Sync PG do
vl_acrescimopermanece deferred (end-to-end incompleto). Das Jornadas do PRD, a Jornada 3 (consulta de pedido histórico com acréscimo) não está 100% funcional: pedidos que vêm do ERP via sync sempre terãovl_acrescimo = 0empedido_consultaaté quePedidoPGSQLseja atualizado. Isso é documentado mas a feature ainda NÃO está production-ready sem esse incremento. - Lógica de cálculo de acréscimo duplicada em 3 pontos (
MainPedidoFragment.fillFields,MainPedidoFragment.atualizarResumoPedido,TotalPedidoFragment.FillFields): flagged em review da 2.2, repetido em 2.3 e 2.4. Cada story deferred a extração de helper. A duplicação cresceu (agora são 3 cópias com o mesmo guard de status). - Débitos técnicos pré-existentes perpetuados: SQL por concatenação de string, cursor por índice posicional,
Global.pedidosem null-check,UpdatePedItemActivityinstanciada fora do lifecycle — cada review flagged, cada story deferred. Padrão: débito não-introduzido-por-esta-story nunca é resolvido nesta-story. - Epic 1 sem retrospectiva:
epic-1-retrospectiveficouoptionale foi pulado. Lições da Epic 1 (ex: verificar schema PG antes de implementar sync) só foram capturadas informalmente nos arquivosdeferred-work.md.
4. Principais Insights
-
Features que afetam pedidos precisam mapear os 2 fluxos desde o planejamento. Existem dois caminhos de leitura do pedido (
BrowsePedido→PedidoDBpara editáveis;BrowsePedidoConsulta→PedidoConsultaDBpara históricos) e dois caminhos de escrita (save local + sync PG). Esquecer qualquer um deles cria trabalho retroativo. -
Guard por
statusé o padrão idiomático do projeto para separar "valor computado em tempo real" de "valor congelado histórico". Já existia paradescontoV; agora existe paravl_acrescimo. Candidato claro a extrair um helper compartilhado. -
Tolerância "campo novo = 0" na sync PG é o padrão canônico: ao adicionar coluna no SQLite antes do PG, o read-path trata valor ausente como 0 (não erro). Assim o app é forward-compatible quando o PG recebe a coluna.
-
Débitos técnicos pré-existentes viram "invariantes silenciosas". A cada review eles reaparecem, a cada story são deferred. Para quebrar o ciclo, dedicar uma story explícita de refactor (ou um epic de "technical-debt burndown") é o único caminho — enxertar em stories funcionais é rejeitado corretamente como scope creep.
-
Review adversarial em 3 camadas teve custo/benefício alto. Mesmo com muitos findings falsos positivos, o Auditor aprovou todos os ACs sem violações e o EdgeCase identificou corretamente os 2 riscos reais (sync PG e MD5). Manteria a prática para features de complexidade similar.
5. Action Items
Débitos técnicos prioritários (carry-forward)
| # | Item | Dono | Prioridade | Notas |
|---|---|---|---|---|
| A1 | Sync PG do vl_acrescimo: atualizar PedidoPGSQL.insert (envio) e selectAllPedConsulta (retorno). Schema de destino varia por sistema: Gerente grava em gerente.pedidos.acrep (% taxa) + gerente.pedidos.acrev (valor). SIG grava em sig.pedidos.tx_acrescimo (só a taxa — valor é derivado server-side). Sem isso, Epic 2 não está production-ready. |
Julio | Alta | Criar como Epic 3 ou Story 3.1 em módulo novo |
| A2 | Incluir vl_acrescimo no MD5 de change-detection de pedido/pedido_consulta |
Julio | Média | Depende de A1 |
| A3 | Extrair helper de cálculo de acréscimo compartilhado entre MainPedidoFragment.fillFields, MainPedidoFragment.atualizarResumoPedido e TotalPedidoFragment.FillFields |
Julio | Média | Debt burndown |
| A4 | Null-check global em acessos a Global.pedido (padrão defensivo) |
Julio | Baixa | Afeta vários fragments; pacote técnico |
| A5 | Migrar leitura de cursor para getColumnIndexOrThrow() em PedidoDB.selectAllFull e PedidoConsultaDB.selectFull |
Julio | Baixa | Reduz risco quando JOINs mudam |
Processo
| # | Item | Dono |
|---|---|---|
| P1 | Ao planejar feature que toca pedido, adicionar checklist: "afeta pedido, pedido_consulta, ambos, ou só PG?" — incorporar no template de story |
Julio |
| P2 | Rodar retrospectiva de Epic 1 retroativamente (lições de migração SQLite, sync PG com coluna ausente, FormaPagamentoDB patterns) ou explicitamente documentar que Epic 1 foi skipped | Julio |
| P3 | Considerar transicionar epic-1 e epic-2 de in-progress para done no sprint-status.yaml agora que todas as stories estão done (ação imediata, feita nesta retro) |
Julio |
6. Próximo Epic — Preparação
Status: Epics 1 e 2 são os únicos definidos em epics.md. Não há Epic 3 planejado.
Feature completa?
Funcionalmente:
- Ciclo offline-first (criar pedido com acréscimo, salvar, ver total correto) — ✅ completo
- Consulta histórica de pedido local com acréscimo — ✅ completo (via
BrowsePedido/PedidoDB) - Consulta histórica de pedido sincronizado do ERP com acréscimo — ⚠️ INCOMPLETO (depende de A1)
Pré-requisitos para fechar a feature em produção
- Implementar A1 (sync PG do
vl_acrescimo) antes de considerar a feature production-ready. - Validação manual em dispositivo real com ERP conectado: criar pedido com acréscimo, sincronizar, reabrir via
BrowsePedidoConsulta, confirmar que o valor histórico aparece corretamente. - Treinamento/comunicação com representantes sobre o novo campo "Acréscimo" na tela do pedido.
Recomendação
Criar novo epic ("Epic 3: Sync Bidirecional de Acréscimo PG↔SQLite") antes de declarar a feature encerrada. Escopo mínimo:
-
Gerente (
Global.SISTEMA_GERENTE):- DDL server-side: adicionar
acrep REAL DEFAULT 0eacrev REAL DEFAULT 0emgerente.pedidos PedidoPGSQL.insert(branch Gerente, linha ~129): enviarped.getFormapag().getTxAcrescimo()→acrepeped.getVlAcrescimo()→acrevselectAllPedConsulta(branch Gerente): leracrep+acrev, popularPedido.vlAcrescimo
- DDL server-side: adicionar
-
SIG (
Global.SISTEMA_SIG):- DDL server-side: adicionar
tx_acrescimo REAL DEFAULT 0emsig.pedidos PedidoPGSQL.insert(branch SIG, linha ~342): enviarped.getFormapag().getTxAcrescimo()→tx_acrescimo(só a taxa — valor é calculado server-side)selectAllPedConsulta(branch SIG): lertx_acrescimoe calcularvlAcrescimo = total × tx/100para popular o VO
- DDL server-side: adicionar
-
Tolerar ausência das colunas no PG durante migração (padrão Story 1.2)
-
Incluir os campos no MD5 de change-detection (item A2)
7. Readiness Assessment
| Dimensão | Status | Observações |
|---|---|---|
| Testing & Quality | ⚠️ Parcial | Sem suite automatizada (limitação do projeto Eclipse ADT). Roteiros manuais documentados em cada story. Recomendado: validação em dispositivo real antes de publicar APK. |
| Deployment | 🔴 Não publicado | APK ainda não gerado/publicado. Aguardando A1 (sync PG). |
| Aceitação de stakeholder | 🔴 Pendente | Stakeholders (representantes de vendas, escritório) ainda não viram a feature rodando. |
| Saúde técnica | ✅ Sólida | Migrações idempotentes, guards de status consistentes, nenhuma regressão introduzida. |
| Bloqueadores carry-forward | ⚠️ Sim | A1 (sync PG) bloqueia a Jornada 3 end-to-end. Feature não é production-ready sem ele. |
8. Conclusão
Epic 2 entregou o escopo planejado com qualidade consistente em todas as 4 stories. Os débitos técnicos acumulados são previsíveis (padrões pré-existentes do projeto brownfield) e estão documentados. A feature NÃO está 100% end-to-end funcional até que a sync PG do vl_acrescimo seja implementada (item A1).
Lição principal para próximos epics: features que afetam o modelo de pedido precisam planejar os 4 caminhos (read/write × local/PG) desde a primeira story, em vez de descobrir lacunas no final.