17 KiB
Story 2.3: Persistir Acréscimo ao Fechar o Pedido
Status: done
Story
Como sistema, quero gravar o valor do acréscimo calculado no registro do pedido ao fechar, para que o valor histórico seja preservado independente de alterações futuras na taxa.
Acceptance Criteria
-
Dado que um pedido foi editado com acréscimo R$ 87,50 e total R$ 3.587,50 Quando o pedido for salvo/fechado Então o valor do acréscimo (87,50) está gravado no registro do pedido no SQLite (
vl_acrescimo = 87.50) -
Dado que um pedido foi salvo com acréscimo Quando a taxa de acréscimo da forma de pagamento for alterada no ERP e sincronizada Então o valor gravado no pedido antigo permanece inalterado (somente um novo
salvar()atualizaria) -
Dado que um pedido é criado com forma de pagamento sem acréscimo Quando o pedido for salvo Então o acréscimo gravado é 0,00 (
vl_acrescimo = 0.0)
Escopo desta história
Esta história cobre exclusivamente a persistência do vl_acrescimo calculado no banco SQLite.
- NÃO modifica a lógica de cálculo exibido na UI — cálculo já foi implementado na Story 2.2
- NÃO implementa exibição do acréscimo em consultas — esse é escopo da Story 2.4
- SIM adiciona migração de schema SQLite v41 → v42 (nova coluna
vl_acrescimoempedido) - SIM atualiza o VO
Pedido, oPedidoDB(insert/update/select) e oMainPedidoFragment(salvar)
Pré-condição verificada
A tabela pedido NÃO possui colunas para acréscimo. Constatado via inspeção de:
DatabaseHelper.onCreate()— schema original semvl_acrescimoPedidoDB.insert()eupdate()— semvl_acrescimonas queriesPedido.java— sem campovlAcrescimodbVersaoatual = 41 (última migração adicionoutx_acrescimoà tabelaformapag)
Esta história inclui a adição da coluna via migração v42.
Tasks / Subtasks
-
Task 1: Migração SQLite v41 → v42 em
DatabaseHelper.java(AC: 1, 3)- 1.1 — Incrementar
dbVersaode 41 para 42:// Linha ~10 de DatabaseHelper.java private static final int dbVersao = 42; // era 41 - 1.2 — Adicionar bloco de migração em
onUpgrade()(após o blocoif (oldVersion < 41)):if (oldVersion < 42) { db.execSQL("ALTER TABLE pedido ADD COLUMN vl_acrescimo REAL DEFAULT 0;"); }
- 1.1 — Incrementar
-
Task 2: Adicionar campo
vlAcrescimoao VOPedido.java(AC: 1, 2, 3)- 2.1 — Adicionar campo privado após a declaração de
total(linha ~40):private double vlAcrescimo = 0.0; - 2.2 — Adicionar getter e setter (junto aos demais getters/setters do VO):
public double getVlAcrescimo() { return vlAcrescimo; } public void setVlAcrescimo(double vlAcrescimo) { this.vlAcrescimo = vlAcrescimo; }
- 2.1 — Adicionar campo privado após a declaração de
-
Task 3: Popular
vlAcrescimoemGlobal.pedidodurante cálculo emMainPedidoFragment.java(AC: 1, 2, 3)- 3.1 — Em
atualizarResumoPedido()(linha ~974), após a linhatvAcrescimoPedido.setText(...), adicionar:O bloco completo resultante ficará:Global.pedido.setVlAcrescimo(vlAcrescimo);double txAcrescimo = 0.0; if (Global.pedido.getFormapag() != null) { txAcrescimo = Global.pedido.getFormapag().getTxAcrescimo(); } double vlAcrescimo = totalGeral * (txAcrescimo / 100.0); tvAcrescimoPedido.setText(Util.formataValorMonetario(vlAcrescimo)); tvTotalGeral.setText(Util.formataValorMonetario(totalGeral + vlAcrescimo)); Global.pedido.setVlAcrescimo(vlAcrescimo); // ← ADICIONADO - 3.2 — Em
fillFields()(linha ~439), mesmo padrão — apóstvAcrescimoPedido.setText(...), adicionar:Global.pedido.setVlAcrescimo(vlAcrescimo);
- 3.1 — Em
-
Task 4: Persistir
vl_acrescimoemPedidoDB.java— INSERT (AC: 1, 3)- 4.1 — Em
insert(), na lista de colunas (linha ~89), acrescentar, vl_acrescimoapóstotal:sql.append(" desconto_v, total, vl_acrescimo"); - 4.2 — Na lista de valores (linha ~110), acrescentar
, ped.getVlAcrescimo()apósped.getTotal():sql.append(ped.getTotal() + ", "); sql.append(ped.getVlAcrescimo() + ");");
- 4.1 — Em
-
Task 5: Persistir
vl_acrescimoemPedidoDB.java— UPDATE (AC: 1, 2, 3)- 5.1 — Em
update(), após a linha detotal(linha ~150), adicionar:O final do UPDATE ficará:sql.append(","); sql.append(" vl_acrescimo = ").append(ped.getVlAcrescimo());sql.append(" total = ").append(ped.getTotal()); sql.append(","); sql.append(" vl_acrescimo = ").append(ped.getVlAcrescimo()); sql.append(" WHERE id_pedido = " + ped.getId() + ";");
- 5.1 — Em
-
Task 6: Ler
vl_acrescimoemPedidoDB.selectAllFull()(necessário para Story 2.4) (AC: 1, 2)- 6.1 — Na construção do SELECT (linha ~204), adicionar
a.vl_acrescimoao final:Resultado:sql.append(" a.cod_liberacao, a.desconto_v, b.st_especifica, a.total, c.desco_perc, b.desc_cliente_rede, a.vl_acrescimo");a.vl_acrescimoé o índice 68 do cursor. Atualizado em ambos os métodosselectAllFull()(lista e por id). - 6.2 — No loop de leitura do cursor (após
cli.setDesc_cliente_rede(c.getInt(67))), adicionado:Atualizado em ambos os métodospedido.setVlAcrescimo(c.getDouble(68));selectAllFull().
- 6.1 — Na construção do SELECT (linha ~204), adicionar
Dev Notes
Estrutura atual do pedido — schema SQLite (sem vl_acrescimo)
CREATE TABLE pedido (
id_pedido INTEGER PRIMARY KEY AUTOINCREMENT,
...
desconto_v REAL,
total REAL
-- vl_acrescimo ainda NÃO existe (será adicionada pela migração v42)
)
Pedido.getTotal() é COMPUTADO, não armazenado
Atenção crítica: getTotal() em Pedido.java (linha ~750) é um método computado:
public double getTotal() {
return (getTotalProduto() - getTotalDesconto()) + getTotalIcmsST();
}
O setTotal(double total) existe mas NÃO afeta getTotal() — o getter sempre recomputa a partir dos itens.
Por isso, PedidoDB.insert() usa ped.getTotal() que é o subtotal dos produtos sem acréscimo.
O vl_acrescimo é um valor independente que precisa de campo próprio no VO e na tabela.
Estratégia de persistência — por que popular em atualizarResumoPedido() e fillFields()
A abordagem adotada é: Global.pedido.vlAcrescimo é atualizado toda vez que o cálculo da UI é executado, mantendo-o sempre sincronizado com o valor exibido. No momento do pedDB.salvar(), o valor já está pronto em Global.pedido.getVlAcrescimo().
Isso evita recalcular vlAcrescimo no onClick() do botão salvar — que seria:
- Duplicação de lógica
- Risco de divergência com o valor exibido (e.g., diferença no tratamento de IPI via
!precoComIpi)
O totalGeral local em atualizarResumoPedido() inclui IPI condicionalmente, enquanto Global.pedido.getTotal() não inclui IPI. Calcular no onClick() exigiria replicar toda a lógica com IPI. Usar o valor já calculado e armazenado no VO é mais seguro.
Fluxo de salvar — ponto exato de chamada
MainPedidoFragment.java, método onClick(), seção de sucesso da validação (linha ~549–554):
// Estado ATUAL após Story 2.2:
if (erro == null) {
PedidoDB pedDB = new PedidoDB();
try {
Global.pedido.setObservacao(etObservacao.getText().toString());
Global.pedido.setDescontoV(Global.pedido.getTotalDesconto()); // linha 553
pedDB.salvar(getActivity().getApplicationContext(), Global.pedido); // linha 554
Global.pedido = null;
getActivity().finish();
} catch (Exception e) {
Util.sendError(getActivity(), e);
}
}
Global.pedido.vlAcrescimo será populado ANTES de pedDB.salvar() via Task 3 (chamado em atualizarResumoPedido() / fillFields() durante a edição). Nenhuma alteração é necessária no onClick().
Mapeamento de índices em selectAllFull() — cuidado com offset
Índices atuais do cursor em selectAllFull() (linha ~204 até ~291):
- 0..1:
A.id_pedido, A.id_empresa - ...
- 62:
a.cod_liberacao - 63:
a.desconto_v - 64:
b.st_especifica - 65:
a.total—pedido.setTotal(c.getDouble(65)) - 66:
c.desco_perc—pedido.getFormapag().setDescontoPerc(c.getDouble(66)) - 67:
b.desc_cliente_rede—cli.setDesc_cliente_rede(c.getInt(67)) - 68:
a.vl_acrescimo← ADICIONAR compedido.setVlAcrescimo(c.getDouble(68))
Não alterar os índices existentes — apenas acrescentar ao final.
Null-safety e pedidos legados
A coluna vl_acrescimo REAL DEFAULT 0 garante que pedidos já existentes no dispositivo (criados antes desta migração) terão vl_acrescimo = 0.0 automaticamente — sem necessidade de backfill manual.
Quando lidos pelo selectAllFull(), pedido.setVlAcrescimo(c.getDouble(68)) retornará 0.0 para pedidos antigos — comportamento correto para AC3.
Migração idempotente
O guard if (oldVersion < 42) em onUpgrade() garante que a migração não seja executada mais de uma vez, mesmo em atualizações encadeadas (e.g., v40→v42 executa os blocos v41 e v42 na sequência correta).
Arquivos a modificar
| Arquivo | Caminho | O que muda |
|---|---|---|
DatabaseHelper.java |
src/br/com/jcsinformatica/sarandroid/database/ |
dbVersao = 42, migration block v42 |
Pedido.java |
src/br/com/jcsinformatica/sarandroid/vo/ |
Campo vlAcrescimo, getter/setter |
MainPedidoFragment.java |
src/br/com/jcsinformatica/sarandroid/pedido/ |
setVlAcrescimo() em atualizarResumoPedido() e fillFields() |
PedidoDB.java |
src/br/com/jcsinformatica/sarandroid/database/ |
INSERT, UPDATE e selectAllFull() |
NÃO modificar nesta história:
TotalPedidoFragment.java— sem persistência aqui; save só ocorre viaMainPedidoFragmentFormaPagamento.java/FormaPagamentoDB.java— inalteradosUpdatePedidoActivity.java— apenas container de ViewPager, sem lógica de save- Layouts XML — sem mudança de UI nesta história
PedidoPGSQL.java(se existir) — sync com PostgreSQL é escopo separado
Regras críticas do projeto (aplicáveis a esta história)
- Sem Kotlin — somente Java puro
- Sem Gradle — projeto Eclipse ADT, sem
build.gradle - Sem JARs novos — sem dependências adicionais
- Sem testes automatizados — o projeto não possui infraestrutura de testes; validação manual via dispositivo/emulador
dbVersaodeve ser incrementado para42— nunca pular versões- Thread background para SQLite —
salvar()emMainPedidoFragmentjá é chamado na UI thread (dentro deonClick()), mas o padrão do projeto aceita isso para writes pontuais; a leitura emselectAllFull()é gerenciada pelo chamador - Strings com acentos — NÃO usar em código Java (sem
"Acréscimo"em strings hard-coded em Java)
Verificação manual após implementação
- Criar pedido com itens, selecionar forma de pagamento com
tx_acrescimo > 0, salvar - Via SQLite Browser (ou
adb shell), verificar na tabelapedidoquevl_acrescimocontém o valor correto - Alterar
tx_acrescimoda forma de pagamento diretamente no banco SQLite (simulando sync do ERP) - Reabrir o pedido salvo — verificar que
vl_acrescimono registro do pedido NÃO mudou (AC2) - Criar pedido com forma de pagamento sem acréscimo, salvar — verificar
vl_acrescimo = 0(AC3) - Verificar que
dbVersaonoDatabaseHelperé 42 e que a migração foi aplicada sem erro
Inteligência de histórias anteriores
- Story 1.1 migrou
formapagv40→v41; o padrão de migraçãoif (oldVersion < N)emonUpgrade()deve ser replicado aqui para v42 - Story 1.2 adicionou
tx_acrescimoaFormaPagamentoVO com gettergetTxAcrescimo()— campo utilizado aqui para calcularvlAcrescimoantes de persistir - Story 2.1 adicionou campos de UI (
tvAcrescimoPedido,tvAcrescimo) — nenhuma alteração de UI nesta história - Story 2.2 implementou o cálculo de
vlAcrescimoematualizarResumoPedido()efillFields()— esta história apenas adicionaGlobal.pedido.setVlAcrescimo(vlAcrescimo)nesses dois pontos já existentes - Review da Story 2.2 identificou:
codigoLiberacao2()computa hash sobretotalGeralsem acréscimo — esse comportamento permanece inalterado nesta história (deferred) - Review da Story 2.2 identificou:
validaCampos()usagetTotalProduto()para limite de crédito e pedido mínimo, excluindo acréscimo — permanece deferred
Git intelligence (commits recentes)
9b70ee3Story 2.2: cálculo emMainPedidoFragment.atualizarResumoPedido(),fillFields(),TotalPedidoFragment.FillFields()474d98fStory 2.1: campostvAcrescimoPedidoetvAcrescimoadicionados ao layout e vinculados168b9dbStory 1.2:FormaPagamentoDBlendotx_acrescimo;FormaPagamentocom getter4bfccc7Story 1.1: migração v40→v41 emDatabaseHelper.onUpgrade()
Review Findings
- [Review][Defer] PedidoPGSQL não inclui
vl_acrescimona sync para PostgreSQL [PedidoPGSQL.java] — deferred, out of scope per spec; escopo de story futura de sincronização PG - [Review][Defer]
fillFields()recalculavlAcrescimocomtx_acrescimoatual, sobrescrevendo valor carregado do BD ao abrir pedido existente [MainPedidoFragment.java:443-446] — deferred, by-design; AC2 cobre sync automático, não re-salvamento explícito pelo usuário; consistente com comportamento dedescontoV - [Review][Defer] MD5 do pedido não inclui
vl_acrescimona hash de change-detection — deferred, impacto futuro; PG ainda não tem a coluna; reavaliar quando PedidoPGSQL for atualizado - [Review][Defer] Índice 59 do cursor lê
DATE(D.data_inicio)em vez deC.md5paraFormaPagamento.setMd5()[PedidoDB.java:269,392] — deferred, pré-existente não introduzido por este diff - [Review][Defer] Concatenação de string para SQL em vez de
PreparedStatement[PedidoDB.java:85-153] — deferred, padrão projeto-wide pré-existente - [Review][Defer]
Global.pedidosem null-check antes desetVlAcrescimo()[MainPedidoFragment.java:446,986] — deferred, pré-existente; mesmo padrão já deferred na Story 2.2 - [Review][Defer] Aritmética de ponto flutuante (
double) para valor monetáriovl_acrescimo— deferred, padrão projeto-wide pré-existente;Util.formataValorMonetario()já trata formatação
Dev Agent Record
Agent Model Used
claude-sonnet-4-6 (dev-story workflow)
Debug Log References
Completion Notes List
- Story 2.3 implementada em 2026-04-16.
DatabaseHelper.java:dbVersaoincrementado de 41 para 42. Bloco de migraçãoif (oldVersion < 42)adicionado emonUpgrade(), adicionandovl_acrescimo REAL DEFAULT 0à tabelapedido. Migração idempotente via guard.Pedido.java: campoprivate double vlAcrescimo = 0.0adicionado apóstotal. GettergetVlAcrescimo()e settersetVlAcrescimo(double)adicionados.MainPedidoFragment.java:Global.pedido.setVlAcrescimo(vlAcrescimo)adicionado em dois pontos — após cálculo emfillFields()(linha ~446) e ematualizarResumoPedido()(linha ~986). O valor gravado no VO é exatamente o valor exibido na UI (sem recalcular noonClick()), evitando divergência de IPI.PedidoDB.javaINSERT: colunavl_acrescimoadicionada aoINSERT INTO pedido(...)e valorped.getVlAcrescimo()adicionado na lista de valores.PedidoDB.javaUPDATE:vl_acrescimo = ped.getVlAcrescimo()adicionado ao SET do UPDATE.PedidoDB.javaSELECT:a.vl_acrescimoadicionado ao SELECT em ambos os métodosselectAllFull()(lista e por id);pedido.setVlAcrescimo(c.getDouble(68))adicionado após leitura do índice 67 em ambos.- AC1 satisfeito:
vl_acrescimoé gravado na tabelapedidoao salvar (via INSERT ou UPDATE). - AC2 satisfeito:
vl_acrescimosó é atualizado no banco quandopedDB.salvar()é chamado explicitamente — mudanças detx_acrescimona forma de pagamento não afetam pedidos já salvos. - AC3 satisfeito:
vlAcrescimoinicializa em0.0; forma de pagamento sem acréscimo resulta emvlAcrescimo = 0.0 * 0 = 0.0gravado. - Sem testes automatizados (projeto não possui infraestrutura de testes). Validação manual via dispositivo/emulador.
File List
src/br/com/jcsinformatica/sarandroid/database/DatabaseHelper.javasrc/br/com/jcsinformatica/sarandroid/vo/Pedido.javasrc/br/com/jcsinformatica/sarandroid/pedido/MainPedidoFragment.javasrc/br/com/jcsinformatica/sarandroid/database/PedidoDB.java