Skip to main content

Code Review — US 196869 (zzapp — MVP upsell na tela de status do pedido — PT. 2)

Branch: feat/196869_upsell_status_pedido
Base: origin/develop (merge-base cc743fd8)
Data: 2026-06-30
Escopo: 19 arquivos, +2033 / −210 linhas


Summary

A branch entrega a Parte 2 do MVP de upsell na tela de Status do Pedido (CartStatusDetailScreen). Estende CartDetail com cartItemRecommendations e o getter showRecommendationsSection, adiciona o bloco _ContentRecommendations após o resumo do pedido, substitui o card legado por CartStatusProductCardNew na seção de itens, e introduz modelos/DTOs/mappers com testes unitários sólidos para parsing, mapeamento de desconto, DTOs e o novo widget de card.

Contra os critérios de aceite CA-1 a CA-5, o fluxo somente-leitura parece correto: visibilidade condicional (!saleEcommerce + lista não vazia), recomendações não alimentam totalizadores, itens convertidos exibem tag via fromRecommendation, e o novo layout de card é aplicado sem alterar o fluxo de rastreamento existente. Os principais riscos são a ausência de testes de widget/integração para _ContentRecommendations (CA-1/CA-3 não validados end-to-end), a remoção de cart_status_product_card.dart, e mudanças não relacionadas em logger_utils.dart.

Veredito: Aprovável para merge com ressalvas (testes de tela, política do card legado, escopo). Nenhum bug bloqueante identificado sob o contrato de API documentado.


Validação dos Critérios de Aceite

CritérioStatusEvidência / Observação
CA-1 — Bloco "Recomendados"AtendidoshowRecommendationsSection (!saleEcommerce && cartItemRecommendations.isNotEmpty) + if em cart_status_detail_screen.dart:71. Testado via unit tests de CartDetail; sem widget test de tela.
CA-2 — Produtos informativosAtendidoRecomendações renderizadas em _ContentRecommendations separado; resumo usa totalItems / total do pedido, não a lista de recomendações.
CA-3 — Conversão via zzlinkAtendido (exibição)fromRecommendation mapeado em ProductCardDto → tag "Item recomendado adicionado ao pedido" no card. Conversão real depende de refresh da API; sem teste de fluxo completo na tela.
CA-4 — Consistência entre blocosAtendido (contrato API)Sem deduplicação client-side; assume que backend não retorna o mesmo productId em ambas as listas.
CA-5 — Novo layout de cardAtendidoCartStatusProductCardNew substitui o card antigo na seção "Itens"; cobre estoque da loja e Prateleira Infinita via mesmo componente. Rastreamento não alterado.

Cobertura de Código vs develop

Comparação gerada com flutter test --coverage em ambas as branches (mesmo ambiente local).

Suite de testes

Métricadevelopfeat/196869_upsell_status_pedidoDelta
Testes executados379433+54
Arquivos de teste novos6ver lista abaixo

Novos arquivos de teste (+1413 linhas):

  • test/models/cart/cart_detail_test.dart (269 linhas)
  • test/models/cart/cart_item_recommendation_test.dart (159 linhas)
  • test/models/product/product_cart_detail_new_fields_test.dart (227 linhas)
  • test/screens/cart_status/models/product_card_dto_test.dart (113 linhas)
  • test/screens/cart_status/utils/product_card_discount_mapper_test.dart (457 linhas)
  • test/screens/cart_status/widgets/cart_status_product_card_new_test.dart (188 linhas)

Cobertura global (lcov)

BranchLinhas cobertasLinhas rastreadas%
develop2.82145.8416,15%
feat/196869_upsell_status_pedido3.06845.9936,67%
Delta+247+152+0,52 pp

Cobertura nos arquivos alterados (lib/)

ArquivodevelopfeatDelta
cart_detail.dart0,0% (0/62)88,2% (60/68)+88,2 pp
cart_item_recommendation.dart— (novo)89,7% (26/29)novo
product_cart_detail.dart90,9% (30/33)92,5% (37/40)+1,6 pp
cart_status_detail_screen.dart0,8% (2/263)0,7% (2/281)~0 pp
product_card_dto.dart— (novo)100% (31/31)novo
product_card_discount_mapper.dart— (novo)100% (32/32)novo
cart_status_product_card.dart0,0% (removido)deletado
cart_status_product_card_new.dart— (novo)100% (52/52)novo
cart_item_discount_origin.dart— (novo)100% (9/9)novo
discount_type.dart— (novo)100% (5/5)novo
logger_utils.dart37,5% (3/8)66,7% (4/6)+29,2 pp
zz_confirmation_banner.dart— (novo)100% (12/12)novo

Análise de cobertura

Pontos fortes: modelos, enums, DTO, mapper e widget do novo card com cobertura excelente (89–100%). A suíte ganhou 54 testes focados na feature.

Lacunas:

  • cart_status_detail_screen.dart permanece praticamente sem cobertura (~0,7%) em ambas as branches — o bloco _ContentRecommendations e a integração CA-1/CA-3 não são exercitados por testes automatizados.
  • coezzion_design_flutter.dart (export barrel) não aparece no lcov (esperado).
  • Cobertura global sobe pouco (+0,52 pp) porque a base do app é grande; o ganho real está concentrado nos arquivos novos/alterados da US.

Issues

Issue 1 — Severity: suggestion

  • File: lib/screens/cart_status/cart_status_detail_screen.dart:71
  • Description: Visibilidade do bloco "Recomendados" (CA-1) é validada apenas via unit tests de CartDetail.showRecommendationsSection. Não há widget test que asserte o título "Recomendados", subtítulo ou cards na tela.
  • Suggestion: Adicionar cart_status_detail_screen_test.dart com cenários visível/oculto (saleEcommerce, lista vazia, lista com itens).
  • Status: open

Issue 2 — Severity: suggestion

  • File: lib/screens/cart_status/widgets/cart_status_product_card.dart:1
  • Description: O widget legado CartStatusProductCard foi removido. Se outras telas ou rollback dependiam dele, isso pode ser breaking change fora do escopo da US.
  • Suggestion: Restaurar o arquivo como deprecated ou documentar/remover referências e obter sign-off explícito.
  • Status: open

Issue 3 — Severity: suggestion

  • File: lib/shared/utils/logger_utils.dart:3
  • Description: Refatoração do logger (singleton _logger, remoção de printTime) não está relacionada à US 196869 e aumenta o escopo do PR.
  • Suggestion: Reverter ou extrair para PR separado.
  • Status: open

Issue 4 — Severity: suggestion

  • File: lib/screens/cart_status/cart_status_detail_screen.dart:742
  • Description: CA-4 depende inteiramente da API não retornar o mesmo productId em products e cartItemRecommendations; não há filtro defensivo no client.
  • Suggestion: Filtrar recomendações cujo productId já exista em products, ou documentar garantia de backend para QA.
  • Status: open

Issue 5 — Severity: suggestion

  • File: lib/screens/cart_status/utils/product_card_discount_mapper.dart:31
  • Description: Quando discountOrigin == both, o mapper trata igual a manual e exibe apenas desconto manual/funcionário — não combina remarcação + desconto manual como o card antigo fazia com linha separada de "Remarcação".
  • Suggestion: Validar com QA em payloads reais Both; estender mapper ou documentar simplificação intencional.
  • Status: open

Issue 6 — Severity: nit

  • File: lib/theme_widgets/banner/zz_confirmation_banner.dart:20
  • Description: Padding horizontal 0 pode divergir do Figma para a tag de CA-3.
  • Suggestion: Ajustar padding horizontal (8–12 px) e adicionar widget test.
  • Status: open

Issue 7 — Severity: nit

  • File: lib/screens/cart_status/widgets/cart_status_product_card_new.dart:19
  • Description: Factories não expõem Key? key para itens em ListView.
  • Suggestion: Encaminhar Key? key nas factories para facilitar testes e reconciliação de lista.
  • Status: open

Issue 8 — Severity: nit

  • File: test/screens/cart_status/models/product_card_dto_test.dart:114
  • Description: Arquivo sem newline no EOF.
  • Suggestion: Adicionar newline final.
  • Status: open

Contagem de Issues

SeveridadeQuantidade
bug0
suggestion5
nit3
Total8

Recomendações antes do merge

  1. Testes de tela — Prioridade alta para fechar lacuna de CA-1/CA-3 e elevar cobertura de cart_status_detail_screen.dart.
  2. Escopo — Remover ou isolar logger_utils.dart do PR.
  3. Card legado — Confirmar com o time se a remoção de cart_status_product_card.dart é intencional.
  4. QA manual — Validar cenário discountOrigin: both e overlap de productId entre blocos.

Referências

  • User Story: 196869.md
  • Diff: feat/196869_upsell_status_pedido vs origin/develop
  • Review ID interno: ecee130d