13 KiB
13 KiB
Deferred Work
Deferred from: code review de 3-2-ler-acrescimo-do-postgresql-no-sync-de-consulta (2026-04-16)
hasColunaAcrescimoSig()chamado duas vezes por sessão de sync emPedidoPGSQL.save()(insert path, Story 3.1) e emPedidoPGSQL.selectAllPedConsulta()(consult read path, Story 3.2) — durante janela de DDL migration, os doisbooleanpodem divergir, causando insert comtx_acrescimo+ read sem (ou vice-versa). Em produção, DDL deve ocorrer fora de janelas de sync. Mitigação: elevar o boolean para campo de instância ou parâmetro compartilhado de sessão se a migração ao vivo se tornar necessária.
Deferred from: code review de 3-3-incluir-vl-acrescimo-no-md5-de-change-detection (2026-04-16)
- Ramo Gerente sem guard
hasColunaAcrescimoGerente()paraacrevemPedidoPGSQL.selectAllPedConsulta()linha 629 — premissa verificada em Story 3.1: colunaacrevexiste emgerente.pedidosdesde antes do Epic 3 (estava no INSERT sendo gravada como 0). Adicionar guard seria over-engineering; se aparecer instalação Gerente legada hipotética, considerar simetria com SIG. - Colisão teórica por concatenação MD5 sem delimitador entre
A.totaleCOALESCE(A.acrev, 0.0)(e entre outros termos numéricos adjacentes já presentes no hash) emPedidoPGSQL.selectAllPedConsulta()— risco pré-existente em todo o MD5 Gerente/SIG. Mitigação seria refatorar o hash inteiro para usar separador (ex:|| '|' ||), forçando novo re-sync em massa e sendo inconsistente se aplicado só ao novo termo. Avaliar em refatoração maior do sync de consulta. - Hash pode variar entre versões do PostgreSQL por mudanças em
extra_float_digits/float4outafetando formatação textual deREALem concatenações|| A.total || COALESCE(A.acrev, 0.0)— risco pré-existente (A.totaljá sofria a mesma exposição). Mitigação: usarto_char(campo, 'FM999999990.00')em todos os termos numéricos do hash; upgrade do PG pode causar re-sync em massa silencioso. pedido_consulta.md5TEXT sem NOT NULL emDatabaseHelper→ped.setMd5(null)gera literal"'null'"no INSERT e loop de update infinito — pré-existente; caminho requer falha doMD5()server-side (improvável). Adicionar guard emPedidoConsultaDB.insert/updateErpouNOT NULLna coluna em migração futura.
Deferred from: code review de 3-1-enviar-acrescimo-ao-postgresql-ao-salvar-pedido (2026-04-16)
ped.getFormapag()sem null-check antes degetTxAcrescimo()emPedidoPGSQL.insert()linha 182 einsertSig()linha 425 — pré-existente: a mesma ausência de null-check existe nas linhas 160 e 387 que vêm antes; se formapag fosse null, crasharia antes das novas chamadas.- Schema
'sig'hardcoded como string literal emhasColunaAcrescimoSig()— pré-existente projeto-wide; toda a classe usa literais'sig'e'gerente'sem constante. - Valores monetários com
setDoubleparaacrep/acrev— pré-existente projeto-wide; todos os campos monetários usamsetDouble. codVend2 = nullpode causar NullPointerException emst.setInt(36, codVend2)sesig.correntnão tiver registro para o cliente — bug pré-existente eminsertSig().information_schema.columnssem filtrotable_catalog— baixo risco prático em JDBC por-banco; consistente comschemaTes().information_schema.columnsmais lento quepg_attribute— consistente com padrão deschemaTes()na mesma classe; otimizar se latência se tornar problema.keys.close()/st.close()não garantidos se loop de itens lança exceção eminsertSig()— pré-existente; conexão fecha ao final da sessão.- Comentário morto
//int ultimoNumeroPedido = 0;emsave()— pré-existente.
Deferred from: code review de 2-4-exibir-acrescimo-na-consulta-de-pedidos (2026-04-16)
- PedidoPGSQL não inclui
vl_acrescimona sync com PostgreSQL — nem no envio local→PG nem no retorno PG→pedido_consulta; pedidos recém-sincronizados via PG terãovl_acrescimo = 0empedido_consultaaté que o sync PG do acréscimo seja implementado em story futura; já deferred em Story 2.3. - MD5 de
pedido_consultanão incluivl_acrescimoem change-detection — mudanças isoladas de acréscimo não disparam re-sync; reavaliar junto com sync PG; já deferred em Story 2.3. totalé recalculado de itens em tempo real enquantovl_acrescimoé congelado quandostatus >= STATUS_ENVIADO— mesmo padrão quedescontoVestabelecido em Story 2.3; risco teórico de inconsistência se itens forem reprecificados após envio, mas cenário improvável (itens de pedido enviado geralmente não mudam localmente).- Índice 66 hard-coded em
PedidoConsultaDB.selectFull()— lista de índices posicionais cresceu para 43–66; migrar parac.getColumnIndexOrThrow("vl_acrescimo")em refatoração futura da camada DB. - SQL por concatenação de strings em
PedidoConsultaDB.insert/updateErp— padrão projeto-wide pré-existente; migrar paraPreparedStatement/bind params em refatoração maior. - Lógica duplicada de cálculo+guard de acréscimo em
MainPedidoFragment.fillFields,MainPedidoFragment.atualizarResumoPedidoeTotalPedidoFragment.FillFields— três cópias da mesma lógica; extrair para helper em refatoração futura; já deferred em Story 2.2. - Ausência de
onDowngrade()emDatabaseHelper— padrão projeto-wide pré-existente; instalação de APK mais antigo após v43 crashará comSQLiteException; implementar política de downgrade (drop+recreate ou reject) em refatoração futura.
Deferred from: code review de 2-3-persistir-acrescimo-ao-fechar-o-pedido (2026-04-16)
- PedidoPGSQL não inclui
vl_acrescimo— sync para PostgreSQL não transmite o acréscimo calculado; escopo de story futura de sincronização; reavaliar quando PedidoPGSQL for atualizado para enviar pedidos com acréscimo. fillFields()recalculavlAcrescimocom taxa atual ao abrir pedido existente — se o usuário abrir e re-salvar um pedido sem alterações, ovl_acrescimoé recalculado com otx_acrescimovigente, potencialmente perdendo o valor histórico. By-design para esta história; AC2 cobre apenas sync automático.- MD5 do pedido não inclui
vl_acrescimo— change-detection para sync pode não detectar pedidos cujo único campo alterado é o acréscimo; reavaliar quando PedidoPGSQL for atualizado. - Índice 59 do cursor lê
DATE(D.data_inicio)em vez deC.md5— bug pré-existente emPedidoDB.selectAllFull()eselectFull()que preencheFormaPagamento.md5com um valor de data incorreto; não introduzido por esta story. - SQL building via string concatenation — toda a camada
PedidoDBusaStringBuilderem vez dePreparedStatement; risco de SQL injection se camposStringforem concatenados no futuro; padrão projeto-wide. Global.pedidosem null-check antes desetVlAcrescimo()— padrão pré-existente emMainPedidoFragment; mesmo risco de NPE existente em todos os outros acessos aGlobal.pedido.- Aritmética de ponto flutuante para valor monetário —
vl_acrescimousadouble/REAL, padrão projeto-wide; arredondamento gerenciado porUtil.formataValorMonetario().
Deferred from: code review de 1-1-migracao-do-schema-sqlite-para-suporte-a-acrescimo (2026-04-16)
FormaPagamentoPGSQLnão lêacrescdo PostgreSQL —tx_acrescimosempre sincronizará como 0.0 até Story 1.2 ser implementada. Esperado — escopo da Story 1.2.ClienteDBjoin emformapagnão lêtx_acrescimo—FormaPagamentocarregado via consulta de cliente terátxAcrescimo=0.0. Considerar ao implementar Story 2 (cálculo do acréscimo no pedido): garantir que o cálculo useFormaPagamentoDB.selectId()ou equivalente, não o VO hidratado via ClienteDB.PedidoDBjoin emformapagnão incluitx_acrescimo— formapag hidratado em contexto de pedido/consulta terátxAcrescimo=0.0. Sem impacto em Story 1.x; monitorar em Story 2.selectIdErpcom lista de colunas incompleta (faltadesco_percetx_acrescimo) — bug pré-existente emFormaPagamentoDB.java:194. O método só verifica existência, sem impacto funcional. Corrigir quando refatorar a classe.- Padrão de SQL por concatenação de strings (SQL injection risk) em
FormaPagamentoDB.java— risco pré-existente em toda a classe. Migrar paradb.execSQL()com?placeholders quando houver refatoração maior.
Deferred from: code review de 2-1-exibir-campo-de-acrescimo-na-tela-do-pedido (2026-04-16)
layout_weight="1"comlayout_width="wrap_content"nos layouts de pedido — tecnicamente0dpé o correto para distribuição de peso em LinearLayout/TableRow, mas padrão pré-existente em todos os rows do projeto. Considerar corrigir em refatoração de layout futura.atualizarResumoPedido()emMainPedidoFragmentnão possui null-guard nem try/catch —tvAcrescimoPedido(e os demais campostvQtdTotal,tvTotalGeral) podem lançar NPE se chamado antes deonCreateView()ou apósGlobal.pedido = null. Risco pré-existente; adicionar try/catch em refatoração futura.setUserVisibleHint()emTotalPedidoFragmentpode dispararFillFields()antes deonCreateView()— todos os TextViews (incluindotvAcrescimo) seriam null; NPE silenciosamente engolido pelocatch(Exception e){}sem log. Pré-existente; adicionar null-check no início deFillFields().- Strings hardcoded no XML dos layouts de pedido (
"Acréscimo","Acréscimo (+)", etc.) em vez de@string/resources — padrão pré-existente em todo o projeto; migrar parastrings.xmlem refatoração de internacionalização futura. new UpdatePedItemActivity().precoComIpi()instancia Activity fora do ciclo de vida Android — anti-padrão pré-existente emMainPedidoFragmenteTotalPedidoFragment; extrair para método estático ou utilitário em refatoração futura.
Deferred from: code review de 2-2-calcular-acrescimo-ao-selecionar-forma-de-pagamento (2026-04-16)
txAcrescimonegativo não guardado no cálculo do acréscimo — banco de dados do ERP possui checagem para valores negativos; guardMath.max(0.0, txAcrescimo)desnecessário.Global.pedidosem null-check ematualizarResumoPedido()— método já acessaGlobal.pedido.*sem guard; padrão pré-existente [MainPedidoFragment.java:958].Global.pedidosem null-check emTotalPedidoFragment.FillFields()— NPE seria silenciosa dentro docatch(Exception e){}vazio [TotalPedidoFragment.java:74].- Lógica de cálculo do acréscimo duplicada em
fillFields()eatualizarResumoPedido()sem método auxiliar — padrão DRY violado pré-existente no projeto. catch (Exception e) {}vazio emTotalPedidoFragment.FillFields()engole exceções sem log — pré-existente.- Aritmética de ponto flutuante (
double) para valores monetários — padrão projeto-wide;Util.formataValorMonetario()já trata formatação. codigoLiberacao2()computa hash de autorização sem acréscimo — supervisor autoriza valor menor que o real quandotxAcrescimo > 0; endereçar em Story 2.3 ao persistir o total com acréscimo.validaCampos()verificações de limite de crédito evlPedMinusamgetTotalProduto()excluindo acréscimo — pré-existente, avaliar em Story 2.3.- Race condition:
listForPagtospreenchido em background thread vs UI thread — pré-existente [MainPedidoFragment.java:193]. - Inconsistência de threshold em
fillFields()(≤ STATUS_LIBERADO) vsatualizarResumoPedido()(< STATUS_ENVIADO) paradescontoV— pré-existente. FormaPagamentoemGlobal.pedidopode estar stale após sync —txAcrescimoreflete taxa pré-sync até usuário navegar da tela.
Deferred from: code review de 1-2-sincronizacao-da-taxa-de-acrescimo-do-erp (2026-04-16)
- Resource leak:
PreparedStatementeResultSetemFormaPagamentoPGSQL.executaSelectAll()não são fechados em blocofinally— se uma exceção ocorrer mid-iteration, os recursos não são liberados. Pre-existente na classe; corrigir com try-with-resources ou blocofinallyem refatoração futura. - SQL injection via concatenação de strings no WHERE em
FormaPagamentoPGSQL—id_empresaedt_atualinterpolados diretamente. Pre-existente; mesma origem que o item acima deFormaPagamentoDB. coalesce(libera_credito)sem argumento padrão no SELECT do PostgreSQL —COALESCEcom argumento único é no-op e não protege contra NULL. Pre-existente; usarcoalesce(libera_credito, 0)em refatoração futura.setDescontoPerc(rs.getInt(6))lê coluna decimal como inteiro, truncando frações — pre-existente; usarrs.getDouble()em refatoração futura.- Chave mal colocada em
AtualizaDados.atualizaFormaPag(): blocoif (ultAtualizacao == null)tem{após a declaração mas antes deinativaAll, fazendoinativaAllexecutar sempre. Pre-existente; verificar comportamento real em testes manuais e corrigir.