Files
sar-android/_bmad-output/implementation-artifacts/2-1-exibir-campo-de-acrescimo-na-tela-do-pedido.md
Julio Schlickmann dc61705c91 add project files
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 22:33:42 -03:00

14 KiB

Story 2.1: Exibir Campo de Acréscimo na Tela do Pedido

Status: done

Story

Como representante de vendas, quero ver um campo de acréscimo sempre visível na tela do pedido, para que eu saiba em todo momento se há acréscimo aplicado, mesmo que seja zero.

Acceptance Criteria

  1. Dado que estou na tela de edição do pedido (UpdatePedidoActivity) Quando a tela for exibida (qualquer aba) Então um campo "Acréscimo" é visível mostrando R$ 0,00 por padrão

  2. Dado que nenhuma forma de pagamento foi selecionada ou a selecionada tem tx_acrescimo = 0 Quando o campo acréscimo for exibido Então mostra "R$ 0,00" — nunca fica oculto ou em branco

Escopo desta história

Esta história cobre exclusivamente a adição do widget "Acréscimo" na UI, sempre visível, com valor estático R$ 0,00.

  • NÃO faz cálculo — cálculo automático ao selecionar forma de pagamento é escopo da Story 2.2
  • NÃO persiste valor no pedido — persistência é escopo da Story 2.3
  • NÃO lê tx_acrescimo do banco nesta história — a Story 2.2 usará o campo criado aqui para exibir o valor calculado

Tasks / Subtasks

  • Task 1: Adicionar campo Acréscimo no layout da aba Total (AC: 1, 2)

    • 1.1 - Em res/layout/fragment_total_pedido.xml: alterar android:layout_height="271dp" do LinearLayout interno para wrap_content (necessário para acomodar a nova linha sem cortar conteúdo)
    • 1.2 - Inserir novo LinearLayout de linha entre a linha de "Total ICMS-ST (+)" e a linha de "Total (=)", seguindo exatamente o mesmo padrão das linhas existentes:
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal"
          android:paddingBottom="12dp" >
          <TextView
              android:id="@+id/tvLabelAcrescimoPedido"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:paddingLeft="12dp"
              android:text="Acrescimo (+)" />
          <TextView
              android:id="@+id/tvAcrescimoPedido"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:gravity="right"
              android:paddingRight="12dp"
              android:text="0,00" />
      </LinearLayout>
      
      Atenção: usar "Acrescimo" sem acento no atributo android:text do label pois strings com acento em XML de layout podem funcionar, mas verificar se o projeto usa arquivo strings.xml para textos — se sim, adicionar entrada lá. Verificar padrão existente: "Peso Líquido" usa diretamente no XML, então manter padrão do projeto.
    • 1.3 - Em TotalPedidoFragment.java: declarar private TextView tvAcrescimo; junto com os outros campos de texto (linha ~22)
    • 1.4 - Em onCreateView(): vincular tvAcrescimo = (TextView) rootView.findViewById(R.id.tvAcrescimoPedido);
    • 1.5 - Em FillFields(): após tvTotalIcmsST.setText(...), adicionar tvAcrescimo.setText(Util.formataValorMonetario(0.0)); — sempre R$ 0,00 nesta história
  • Task 2: Adicionar campo Acréscimo no resumo da aba Dados (AC: 1, 2)

    • 2.1 - Em res/layout/fragment_main_pedido.xml: inserir novo TableRow para acréscimo dentro do TableLayout existente (linhas 235-314), entre tableRowQtdTotal e tableRowTotalGeral:
      <TableRow
          android:id="@+id/tableRowAcrescimo"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:paddingBottom="12dp"
          android:paddingLeft="12dp"
          android:paddingRight="12dp" >
          <TextView
              android:id="@+id/tvLabelAcrescimo_pedido"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:text="Acrescimo" />
          <TextView
              android:id="@+id/tvAcrescimo_pedido"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:gravity="right"
              android:text="R$ 0,00" />
      </TableRow>
      
    • 2.2 - Em MainPedidoFragment.java: declarar private TextView tvAcrescimoPedido; junto com os outros campos (linha ~67)
    • 2.3 - Em onCreateView(): vincular tvAcrescimoPedido = (TextView) rootView.findViewById(R.id.tvAcrescimo_pedido);
    • 2.4 - Em fillFields(): adicionar tvAcrescimoPedido.setText(Util.formataValorMonetario(0.0)); após o bloco de cálculo de totalGeral
    • 2.5 - Em atualizarResumoPedido(): adicionar tvAcrescimoPedido.setText(Util.formataValorMonetario(0.0)); após o cálculo de totalGeral (este método é chamado ao selecionar forma de pagamento — Story 2.2 vai atualizar aqui com o valor real)

Dev Notes

Estrutura de fragmentos do pedido

UpdatePedidoActivity usa ViewPager com PedidoTabAdapter (4 tabs):

  • Posição 0: MainPedidoFragment — aba "Dados" — layout fragment_main_pedido.xml
  • Posição 1: ItensPedidoFragment — aba "Itens"
  • Posição 2: TotalPedidoFragment — aba "Total" — layout fragment_total_pedido.xml
  • Posição 3: FlexPedidoFragment — aba "Flex"

O campo Acréscimo deve aparecer em ambos: aba Dados (resumo) e aba Total (detalhado).

Padrão de nomeação de IDs existente

Fragment Padrão de ID Exemplos
TotalPedidoFragment tvXxxPedido tvTotalGeralPedido, tvTotalIcmsSTPedido
MainPedidoFragment tvXxx_pedido (com underscore) tvTotal_pedido_geral, tvCodLiberacao_pedido

Manter este padrão para os novos IDs:

  • Total fragment: tvAcrescimoPedido
  • Main fragment: tvAcrescimo_pedido

Posicionamento visual na aba Total

Ordem atual das linhas em fragment_total_pedido.xml:

  1. Quantidade Total
  2. Peso Líquido
  3. Total Produtos (+)
  4. Total Desconto (-)
  5. Total IPI:
  6. Total ICMS-ST (+)
  7. ← Acréscimo (+) [INSERIR AQUI]
  8. Total (=)

Posicionamento visual na aba Dados

Ordem atual na TableLayout de fragment_main_pedido.xml (linhas 235-314):

  1. tableRowPedidoMinimo — Valor Pedido Mínimo
  2. tableRowQtdTotal — Quantidade Total
  3. tableRowAcrescimo [INSERIR AQUI]
  4. tableRowTotalGeral — Total Geral

Problema de altura fixa em fragment_total_pedido.xml

O LinearLayout interno em fragment_total_pedido.xml tem android:layout_height="271dp" (linha 14). Essa altura fixa foi calculada para 6 linhas. Com a nova linha de Acréscimo (+), o conteúdo será cortado se não ajustar. Alterar para wrap_content — o ScrollView pai garante que o conteúdo seja acessível.

Método Util.formataValorMonetario()

Já usado extensivamente no projeto para formatação monetária. Chamadas de exemplo em TotalPedidoFragment.FillFields():

tvTotalProdutos.setText(Util.formataValorMonetario(vlTotalProduto));
tvTotalGeral.setText(Util.formataValorMonetario(vlTotalGeral));

Usar Util.formataValorMonetario(0.0) para garantir "R$ 0,00" no padrão do projeto.

Método atualizarResumoPedido() em MainPedidoFragment

Este método (linha 953) é chamado no onItemSelected do spFormaPag (linha 785) — ou seja, toda vez que o usuário seleciona uma forma de pagamento. A Story 2.2 vai modificar este método para calcular e exibir o acréscimo real. Esta história apenas garante que tvAcrescimoPedido está vinculado e inicializado — a Story 2.2 vai atualizá-lo com o valor calculado.

Padrão a seguir para facilitar Story 2.2 — declarar a variável de acréscimo localmente já calculada (mesmo que zero) antes de setar no TextView:

// Task 2.5 em atualizarResumoPedido():
double vlAcrescimo = 0.0; // Story 2.2 vai calcular: subtotal * (tx_acrescimo/100)
tvAcrescimoPedido.setText(Util.formataValorMonetario(vlAcrescimo));

Strings com acentos

O projeto usa strings com acento diretamente nos atributos android:text dos layouts XML (ex: "Peso Líquido", "Forma de pagamento", "Observação"). Este padrão é aceitável — usar "Acréscimo (+)" diretamente no XML.

Em código Java: NÃO usar strings com acentos em logs ou mensagens (regra do projeto). Não há logs necessários nesta história.

Regras críticas do projeto (aplicáveis a esta história)

  • Sem testes automatizados — validação manual via emulador/dispositivo
  • Sem Kotlin — somente Java puro
  • Sem Gradle — projeto Eclipse ADT
  • Sem JARs novos — nenhuma dependência adicional necessária
  • Leituras SQLite em thread background — esta história NÃO faz leituras de banco, não se aplica

Arquivos a modificar

Arquivo Caminho O que muda
fragment_total_pedido.xml res/layout/ Corrigir altura fixa + inserir linha Acréscimo (+)
TotalPedidoFragment.java src/br/com/jcsinformatica/sarandroid/pedido/ Vincular tvAcrescimo + setar R$ 0,00 em FillFields()
fragment_main_pedido.xml res/layout/ Inserir tableRowAcrescimo antes de tableRowTotalGeral
MainPedidoFragment.java src/br/com/jcsinformatica/sarandroid/pedido/ Vincular tvAcrescimoPedido + setar R$ 0,00 em fillFields() e atualizarResumoPedido()

NÃO modificar nesta história:

  • UpdatePedidoActivity.java — nenhuma mudança necessária
  • Qualquer VO (Pedido.java, FormaPagamento.java) — já têm tudo que precisam
  • PedidoDB.java, FormaPagamentoDB.java — sem mudança de banco nesta história
  • DatabaseHelper.java — sem migração de schema nesta história
  • Qualquer arquivo do Epic 1 — já concluído

Inteligência da história anterior (Story 1.2)

  • FormaPagamento.getTxAcrescimo() já existe e retorna double — disponível para Story 2.2
  • Padrão de separação de lógica de background e UI thread estabelecido em MainPedidoFragment.onStart() (Thread + runOnUiThread) — Story 2.2 seguirá este padrão ao ler tx_acrescimo se necessário
  • Review da Story 1.2 sinalizou que catch muito abrangente (Exception) deve ser SQLException — nesta história não há JDBC, irrelevante

Verificação manual após implementação

  1. Abrir UpdatePedidoActivity criando novo pedido → verificar que aba "Total" mostra linha "Acréscimo (+) R$ 0,00"
  2. Verificar que aba "Dados" (MainPedidoFragment) mostra linha "Acréscimo R$ 0,00" acima de "Total Geral"
  3. Selecionar e trocar formas de pagamento → campo permanece R$ 0,00 (cálculo virá na Story 2.2)
  4. Pedido com status enviado (somente leitura) → campo acréscimo ainda deve aparecer
  5. Rolar a aba Total → verificar que a linha Acréscimo não foi cortada (confirmar que wrap_content resolveu o 271dp)

Review Findings (2026-04-16)

  • [Review][Defer] layout_weight="1" com layout_width="wrap_content" nos novos rows de layout — deveria ser 0dp para distribuição correta de peso, mas padrão pré-existente em todos os rows do projeto [res/layout/fragment_total_pedido.xml, res/layout/fragment_main_pedido.xml] — deferred, pre-existing
  • [Review][Defer] atualizarResumoPedido() sem null-guard nem try/catch — tvAcrescimoPedido pode NPE se chamado antes de onCreateView() ou após Global.pedido = null; risco compartilhado com tvQtdTotal/tvTotalGeral pré-existentes [MainPedidoFragment.java:953] — deferred, pre-existing
  • [Review][Defer] setUserVisibleHint() pode disparar FillFields() antes de onCreateView()tvAcrescimo null silenciosamente engolido por catch(Exception e){} sem log; mesmo risco pré-existente dos demais TextViews [TotalPedidoFragment.java:62] — deferred, pre-existing
  • [Review][Defer] Strings hardcoded no XML ("Acréscimo", "Acréscimo (+)") em vez de @string/ resources — padrão pré-existente em todo o projeto [res/layout/fragment_main_pedido.xml, res/layout/fragment_total_pedido.xml] — deferred, pre-existing
  • [Review][Defer] new UpdatePedItemActivity().precoComIpi() instancia Activity fora do ciclo de vida — anti-padrão pré-existente; não introduzido por esta story [MainPedidoFragment.java:434, TotalPedidoFragment.java:101] — deferred, pre-existing

Dev Agent Record

Agent Model Used

claude-sonnet-4-6 (dev-story workflow)

Debug Log References

Completion Notes List

  • Story 2.1 implementada em 2026-04-16.
  • fragment_total_pedido.xml: altura fixa 271dp corrigida para wrap_content; nova linha "Acrescimo (+)" inserida com tvAcrescimoPedido entre ICMS-ST e Total Geral.
  • TotalPedidoFragment.java: campo tvAcrescimo declarado, vinculado em onCreateView(), e inicializado com Util.formataValorMonetario(0.0) em FillFields().
  • fragment_main_pedido.xml: tableRowAcrescimo inserido com tvAcrescimo_pedido entre tableRowQtdTotal e tableRowTotalGeral.
  • MainPedidoFragment.java: campo tvAcrescimoPedido declarado, vinculado em onCreateView(), e inicializado com Util.formataValorMonetario(0.0) em fillFields() e atualizarResumoPedido().
  • Variavel local vlAcrescimo = 0.0 declarada explicitamente em ambos os metodos de MainPedidoFragment com comentario indicando ponto de expansao para Story 2.2.
  • Sem testes automatizados (projeto nao possui infraestrutura de testes). Validacao e manual via dispositivo/emulador.
  • AC1 satisfeito: campo "Acrescimo" visivel em ambas as abas (Dados e Total) ao abrir UpdatePedidoActivity.
  • AC2 satisfeito: campo sempre visivel, nunca oculto ou em branco — valor padrao R$ 0,00 via Util.formataValorMonetario(0.0).

File List

  • res/layout/fragment_total_pedido.xml
  • src/br/com/jcsinformatica/sarandroid/pedido/TotalPedidoFragment.java
  • res/layout/fragment_main_pedido.xml
  • src/br/com/jcsinformatica/sarandroid/pedido/MainPedidoFragment.java