10 KiB
Story 1.1: Migração do Schema SQLite para Suporte a Acréscimo
Status: done
Story
Como desenvolvedor do sistema,
quero migrar o schema SQLite de v40 para v41 adicionando tx_acrescimo na tabela formapag,
para que as taxas de acréscimo possam ser armazenadas localmente sem afetar dados existentes.
Acceptance Criteria
-
Dado que o app está sendo atualizado em um dispositivo com schema SQLite v40 Quando
DatabaseHelper.onUpgrade()for executado Então a colunatx_acrescimo REAL DEFAULT 0é adicionada à tabelaformapagE todos os registros existentes de formas de pagamento são preservados comtx_acrescimo = 0 -
Dado que
onUpgrade()é chamado comoldVersion >= 41Quando o bloco de migração v41 for avaliado Então a migração é ignorada (guardif (oldVersion < 41)) sem erro -
Dado que
dbVersaoemDatabaseHelperQuando a migração for aplicada EntãodbVersao = 41 -
Dado que o VO
FormaPagamentoé instanciado após a migração QuandoFormaPagamentoDBpreencher o objeto a partir do SQLite Então o campotxAcrescimoestá acessível no VO, com valor0.0para registros antigos
Tasks / Subtasks
-
Task 1: Incrementar versão e adicionar migração em DatabaseHelper (AC: 1, 2, 3)
- 1.1 - Alterar
dbVersaode40para41na linha 10 deDatabaseHelper.java - 1.2 - Adicionar bloco de migração em
onUpgrade()após o bloco v40 existente (linhas 700-703):if (oldVersion < 41) { db.execSQL("ALTER TABLE formapag ADD COLUMN tx_acrescimo REAL DEFAULT 0;"); } - 1.3 - Atualizar o
CREATE TABLE formapagemonCreate()(linhas 82-95) para incluirtx_acrescimo REAL DEFAULT 0antes do fechamento dos parênteses (apóslibera_credito INT)
- 1.1 - Alterar
-
Task 2: Adicionar campo
txAcrescimoao Value Object FormaPagamento (AC: 4)- 2.1 - Adicionar campo
private double txAcrescimo;emFormaPagamento.java - 2.2 - Adicionar getter
getTxAcrescimo()e settersetTxAcrescimo(double txAcrescimo) - 2.3 - Inicializar
txAcrescimo = 0.0(padrão implícito para double, mas documentar intenção)
- 2.1 - Adicionar campo
-
Task 3: Atualizar FormaPagamentoDB para incluir
tx_acrescimoem todas as operações (AC: 4)- 3.1 - Atualizar INSERT em
FormaPagamentoDB.java: adicionartx_acrescimona lista de colunas eformaPagamento.getTxAcrescimo()nos valores (linha ~68) - 3.2 - Atualizar UPDATE em
FormaPagamentoDB.java: adicionartx_acrescimo = ?na cláusula SET e o valor correspondente nos ContentValues (linha ~89-103) - 3.3 - Atualizar todos os SELECT em
FormaPagamentoDB.javaque mapeiam ResultSet para o VO: adicionar leitura detx_acrescimoe chamarsetTxAcrescimo()comcursor.getDouble(colIndex)— verificar linhas ~115-116, ~163-164, ~227, ~255, ~282 - 3.4 - Usar
cursor.isNull(colIndex) ? 0.0 : cursor.getDouble(colIndex)ao lertx_acrescimopara tratar NULL defensivamente (NFR3)
- 3.1 - Atualizar INSERT em
Dev Notes
Escopo desta história
Esta história cobre APENAS migração de schema SQLite e atualização do VO/DAO local (FR3, FR4).
A sincronização com PostgreSQL (gestao.formapag.acresc → tx_acrescimo) é escopo da Story 1.2.
A UI do pedido e cálculo são escopo do Epic 2.
Arquivos a modificar
| Arquivo | Caminho | O que muda |
|---|---|---|
DatabaseHelper.java |
src/br/com/jcsinformatica/sarandroid/database/ |
dbVersao 40→41, onCreate() CREATE TABLE, onUpgrade() bloco v41 |
FormaPagamento.java |
src/br/com/jcsinformatica/sarandroid/vo/ |
Novo campo txAcrescimo, getter/setter |
FormaPagamentoDB.java |
src/br/com/jcsinformatica/sarandroid/database/ |
INSERT, UPDATE, todos os SELECTs |
NÃO modificar nesta história:
FormaPagamentoPGSQL.java— escopo da Story 1.2ComunicaActivity.java— escopo da Story 1.2- Qualquer Activity ou layout de pedido — escopo do Epic 2
Estado atual do código (verificado em análise)
DatabaseHelper.java linha 10:
private static int dbVersao = 40;
formapag CREATE TABLE atual (linhas 82-95):
CREATE TABLE formapag (
id_formapag INTEGER PRIMARY KEY AUTOINCREMENT,
id_empresa INT NOT NULL,
id_erp INT NOT NULL,
codigo INT NOT NULL,
descricao TEXT NOT NULL,
ativo INT NOT NULL,
parcelas INT NOT NULL,
desco_perc REAL NOT NULL,
md5 TEXT NOT NULL,
vl_ped_min REAL ,
libera_credito INT ,
FOREIGN KEY ( id_empresa ) REFERENCES empresa ( id_empresa ),
UNIQUE ( id_empresa, id_erp ) ON CONFLICT ABORT
)
Último bloco onUpgrade() — v40 (linhas 700-703):
if (oldVersion < 40){
db.execSQL("ALTER TABLE empresa ADD COLUMN id_empresa_prod INT NOT NULL DEFAULT 0;");
db.execSQL("ALTER TABLE empresa ADD COLUMN id_empresa_grup INT NOT NULL DEFAULT 0;");
}
FormaPagamento.java — campos atuais:
id, idErp, codigo, descricao, ativo (boolean), parcelas, descontoPerc, md5, vlPedMin, liberaCredito
Regras críticas do projeto
- Sem testes automatizados — o projeto não tem JUnit/Espresso. Validação é manual via dispositivo/emulador. Não criar arquivos de teste.
- Sem Kotlin — somente Java puro
- Sem Gradle — projeto Eclipse ADT, não criar build.gradle
- guard obrigatório:
if (oldVersion < 41)— idempotência da migração (NFR4) - NULL defensivo:
cursor.isNull()antes decursor.getDouble()emtx_acrescimo(NFR3) - DEFAULT 0 na coluna: garante que registros existentes não ficam com NULL após ALTER TABLE (FR4)
- Strings visíveis ao usuário em
res/values/strings.xml— esta história não tem UI, regra não se aplica aqui onUpgrade()sem guard de versão apaga dados de produção — nunca omitir oif (oldVersion < N)
Tratamento de NULL
SQLite ALTER TABLE ... ADD COLUMN com DEFAULT 0 preenche automaticamente os registros existentes com 0, mas registros inseridos antes da migração com NULL explícito precisam ser tratados no código. Usar sempre:
double txAcrescimo = cursor.isNull(colIndex) ? 0.0 : cursor.getDouble(colIndex);
formaPagamento.setTxAcrescimo(txAcrescimo);
Mapeamento PostgreSQL → SQLite (referência para Story 1.2)
A coluna PostgreSQL é gestao.formapag.acresc → mapeia para formapag.tx_acrescimo no SQLite.
O FormaPagamentoPGSQL.java precisa ser atualizado na próxima história para incluir este mapeamento.
Verificação manual após implementação
- Instalar app em dispositivo/emulador com banco v40 existente → verificar que
formapagganha colunatx_acrescimosem perda de dados - Instalar app em dispositivo limpo (fresh install) → verificar que
formapagé criado comtx_acrescimo - Reinstalar app (v41 → v41) → verificar que não ocorre erro (idempotência)
Project Structure Notes
- Estrutura Eclipse ADT: código em
src/, recursos emres/, libs emlib/ - Pacote raiz:
br.com.jcsinformatica.sarandroid - Nomenclatura DAO SQLite:
*DB.java—FormaPagamentoDB.javajá segue o padrão
References
- [Source: _bmad-output/project-context.md#Schema SQLite] — regras de migração, dbVersao, guard obrigatório
- [Source: _bmad-output/project-context.md#Regras Críticas] — proibições absolutas (sem Kotlin, sem Gradle, sem testes)
- [Source: _bmad-output/planning-artifacts/epics.md#Story 1.1] — ACs e requisitos funcionais FR3, FR4
- [Source: _bmad-output/planning-artifacts/prd.md#Schema e Migração] — FR3, FR4, NFR3, NFR4
- [Source: src/br/com/jcsinformatica/sarandroid/database/DatabaseHelper.java] — estrutura atual, dbVersao=40
- [Source: src/br/com/jcsinformatica/sarandroid/vo/FormaPagamento.java] — campos atuais do VO
- [Source: src/br/com/jcsinformatica/sarandroid/database/FormaPagamentoDB.java] — INSERT linha ~68, UPDATE linha ~89, SELECTs linhas ~115, ~163, ~227, ~255, ~282
Review Findings
- [Review][Defer]
FormaPagamentoPGSQLnão lêacrescdo PostgreSQL —tx_acrescimosempre sincroniza como 0.0 até Story 1.2 ser implementada [postgres/FormaPagamentoPGSQL.java] — deferred, escopo da Story 1.2 - [Review][Defer]
ClienteDBjoin emformapagnão lêtx_acrescimo—FormaPagamentocarregado via consulta de cliente terátxAcrescimo=0.0; considerar ao implementar Story 2 [database/ClienteDB.java] — deferred, pre-existing - [Review][Defer]
PedidoDBjoin emformapagnão incluitx_acrescimo— formapag hydratado em contexto de pedido/consulta terátxAcrescimo=0.0[database/PedidoDB.java] — deferred, pre-existing - [Review][Defer]
selectIdErpcom lista de colunas incompleta (faltadesco_percetx_acrescimo) — bug pré-existente, sem impacto pois o método só verifica existência [database/FormaPagamentoDB.java:194] — deferred, pre-existing - [Review][Defer] Padrão de SQL por concatenação de strings (SQL injection risk) — pré-existente em toda a classe, não introduzido por este diff [database/FormaPagamentoDB.java] — deferred, pre-existing
Dev Agent Record
Agent Model Used
claude-sonnet-4-6 (create-story workflow)
Debug Log References
Completion Notes List
- Story 1.1 implementada em 2026-04-16.
dbVersaoincrementado 40→41 emDatabaseHelper.java.- Bloco
if (oldVersion < 41)adicionado emonUpgrade()comALTER TABLE formapag ADD COLUMN tx_acrescimo REAL DEFAULT 0. onCreate()atualizado para incluirtx_acrescimo REAL DEFAULT 0na definição da tabelaformapag.- Campo
txAcrescimo(double) adicionado ao VOFormaPagamento.javacom getter/setter. - 5 métodos SELECT em
FormaPagamentoDB.javaatualizados:selectAll,select,selectUltimoUsado,selectAvista,selectId— todos lendo índice 11 comisNulldefensivo. - Métodos
inserteupdateemFormaPagamentoDB.javaatualizados para persistirtx_acrescimo. - Sem testes automatizados (projeto não possui infraestrutura de testes). Validação é manual via emulador/dispositivo.
File List
src/br/com/jcsinformatica/sarandroid/database/DatabaseHelper.javasrc/br/com/jcsinformatica/sarandroid/vo/FormaPagamento.javasrc/br/com/jcsinformatica/sarandroid/database/FormaPagamentoDB.java