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ério | Status | Evidência / Observação |
|---|---|---|
| CA-1 — Bloco "Recomendados" | Atendido | showRecommendationsSection (!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 informativos | Atendido | Recomendações renderizadas em _ContentRecommendations separado; resumo usa totalItems / total do pedido, não a lista de recomendações. |
| CA-3 — Conversão via zzlink | Atendido (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 blocos | Atendido (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 card | Atendido | CartStatusProductCardNew 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étrica | develop | feat/196869_upsell_status_pedido | Delta |
|---|---|---|---|
| Testes executados | 379 | 433 | +54 |
| Arquivos de teste novos | — | 6 | ver 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)
| Branch | Linhas cobertas | Linhas rastreadas | % |
|---|---|---|---|
develop | 2.821 | 45.841 | 6,15% |
feat/196869_upsell_status_pedido | 3.068 | 45.993 | 6,67% |
| Delta | +247 | +152 | +0,52 pp |
Cobertura nos arquivos alterados (lib/)
| Arquivo | develop | feat | Delta |
|---|---|---|---|
cart_detail.dart | 0,0% (0/62) | 88,2% (60/68) | +88,2 pp |
cart_item_recommendation.dart | — (novo) | 89,7% (26/29) | novo |
product_cart_detail.dart | 90,9% (30/33) | 92,5% (37/40) | +1,6 pp |
cart_status_detail_screen.dart | 0,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.dart | 0,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.dart | 37,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.dartpermanece praticamente sem cobertura (~0,7%) em ambas as branches — o bloco_ContentRecommendationse 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.dartcom 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
CartStatusProductCardfoi 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 deprintTime) 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
productIdemproductsecartItemRecommendations; não há filtro defensivo no client. - Suggestion: Filtrar recomendações cujo
productIdjá exista emproducts, 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 amanuale 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
0pode 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? keypara itens emListView. - Suggestion: Encaminhar
Key? keynas 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
| Severidade | Quantidade |
|---|---|
| bug | 0 |
| suggestion | 5 |
| nit | 3 |
| Total | 8 |
Recomendações antes do merge
- Testes de tela — Prioridade alta para fechar lacuna de CA-1/CA-3 e elevar cobertura de
cart_status_detail_screen.dart. - Escopo — Remover ou isolar
logger_utils.dartdo PR. - Card legado — Confirmar com o time se a remoção de
cart_status_product_card.darté intencional. - QA manual — Validar cenário
discountOrigin: bothe overlap deproductIdentre blocos.
Referências
- User Story: 196869.md
- Diff:
feat/196869_upsell_status_pedidovsorigin/develop - Review ID interno:
ecee130d