Documento de Requisitos — Itens recomendados na tela conferir pedido
Tarefa: #193223
Contexto: #193223 — Criar tela de recomendação upsell
Visão Geral
No fluxo de venda do zzapp, após a vendedora selecionar itens recomendados na tela de upsell (task-09), o CartDTO é populado com recommendedItems (List<CartItemDTO>?). Ao chegar na tela de conferir pedido (check_sell), esses itens devem ser exibidos em uma nova seção "Recomendados", posicionada entre o botão "ADICIONAR PRODUTOS" e a seção "Endereço de entrega".
A seção inclui um warning informando que os itens ficam disponíveis por 1 hora e uma lista de cards seguindo o mesmo padrão visual dos produtos do carrinho. A vendedora pode aplicar desconto nos itens recomendados (mesmo fluxo de CheckSellProductDiscount) ou removê-los da lista (com modal de confirmação).
Ao gerar o link de pagamento, os recommendedItems selecionados são enviados no payload do POST api/cart como propriedade opcional, para que o backend os persista como CartRecommendedItem vinculados ao Cart recém-criado.
Papéis Envolvidos
- Vendedora (zzapp): Visualiza os itens recomendados na tela de conferir pedido, aplica desconto e remove itens indesejados antes de gerar o link de pagamento
- Cliente (zzlink): Recebe as recomendações no link de pagamento após o cart ser criado
Requisitos Funcionais
RF-01 — Exibição condicional da seção de recomendados
História de Usuário:
Como vendedora, quero visualizar os itens recomendados na tela de conferir pedido apenas quando houver recomendações disponíveis, para evitar poluir a interface com seções vazias.
Critérios de Aceitação:
-
A seção "Recomendados" DEVE ser exibida SOMENTE quando
cartDTO.recommendedItemsnão for nulo e contiver ao menos 1 item -
Se
cartDTO.recommendedItemsfor nulo ou vazio, a seção inteira DEVE ser ocultada
Casos de Borda:
- Se recommendedItems contiver itens mas todos forem removidos pela vendedora, a seção deve desaparecer
- Se o stepper de upsell (task-09) não tiver populado recommendedItems, a seção não deve ser renderizada
RF-02 — Título da seção e warning de disponibilidade
História de Usuário:
Como vendedora, quero identificar claramente a seção de itens recomendados e saber por quanto tempo eles ficarão disponíveis para a cliente.
Critérios de Aceitação:
-
O título da seção DEVE ser "Recomendados"
-
Abaixo do título, DEVE ser exibido um warning com o texto: "Os produtos recomendados ficarão disponíveis para a cliente por até 1 hora."
-
O texto do warning É estático — não requer lógica de countdown
Casos de Borda:
- O warning deve ser exibido mesmo que haja apenas 1 item recomendado
- O warning não deve ser exibido se a seção inteira estiver oculta (RF-01)
RF-03 — Card de item recomendado
História de Usuário:
Como vendedora, quero visualizar cada item recomendado no mesmo formato dos produtos do carrinho, para ter consistência visual e funcional na tela de conferir pedido.
Critérios de Aceitação:
-
Cada item recomendado DEVE ser exibido usando o mesmo padrão visual do card de produto do carrinho (_ProductCard em check_sell_products.dart)
-
O card DEVE exibir: imagem do produto, nome, SKU, tamanho selecionado, preço cheio, desconto aplicado e preço final
-
O item recomendado NÃO DEVE exibir quantidade (fixo em 1)
Casos de Borda:
- Se recommendedItems contiver entre 1 e 3 itens, todos devem ser exibidos
- O limite de 1-3 itens é garantido pelo stepper de upsell (task-09) — não é necessário validar no check_sell
RF-04 — Remoção de item recomendado
História de Usuário:
Como vendedora, quero remover um item recomendado da lista antes de gerar o link de pagamento.
Critérios de Aceitação:
-
Cada card de item recomendado DEVE exibir um botão de excluir (ícone X)
-
Ao clicar no botão de excluir, DEVE ser exibida uma modal de confirmação (ConfirmBottomSheet)
-
Ao confirmar, o item DEVE ser removido da lista
cartDTO.recommendedItemsviachangeWith()síncrono (sem chamada API) -
Após a remoção, DEVE ser exibido um snackbar verde com o texto "Recomendação removida"
-
A remoção É apenas local (CartDTO) — não há endpoint backend envolvido nesta etapa do fluxo
Casos de Borda:
- Se o último item recomendado for removido, a seção inteira deve desaparecer (RF-01)
- O botão de excluir deve estar visível mesmo quando há apenas 1 item recomendado (diferente do cart, que exige mais de 1 item)
RF-05 — Aplicação de desconto no item recomendado
História de Usuário:
Como vendedora, quero aplicar desconto nos itens recomendados seguindo as mesmas regras dos produtos do carrinho.
Critérios de Aceitação:
-
Cada card de item recomendado DEVE exibir o botão "EDITAR" para aplicar desconto
-
Ao clicar, DEVE abrir o mesmo bottom sheet
CheckSellProductDiscountusado para produtos do carrinho -
As validações de limite máximo de desconto e desconto de funcionário DEVEM ser aplicadas (mesma lógica do cart)
-
O desconto aplicado NÃO DEVE impactar o total do carrinho (
itemsTotal/total)
Casos de Borda:
- Itens recomendados são criados com discountType=none e discountValue=0 (task-09) — o desconto é opcional
- A confirmação sobre se o limite máximo de desconto do pedido deve considerar recommendedItems será feita com PO após o refinamento
RF-06 — Posicionamento da seção na tela
História de Usuário:
Como vendedora, quero que a seção de recomendados apareça em uma posição lógica na tela de conferir pedido.
Critérios de Aceitação:
-
A seção de recomendados DEVE ser posicionada entre o widget
CheckSellProducts(que contém o botão "ADICIONAR PRODUTOS") e o widgetCheckSellAddress("Endereço de entrega") -
A seção DEVE ser um widget
CheckSellRecommendedque recebecartController,checkSellControllereemployeeSalesController
Casos de Borda:
- Se a tela estiver em modo ecommerce (sem endereço de entrega), a seção deve ser posicionada após CheckSellProducts
- O widget deve respeitar o padding/margem consistente com os demais widgets da tela
RF-07 — Envio dos itens recomendados no POST api/cart
História de Usuário:
Como vendedora, quero que os itens recomendados selecionados sejam enviados ao backend ao gerar o link de pagamento.
Critérios de Aceitação:
-
O
toJson()do CartDTO DEVE incluir o camporecommendedItemsna serialização -
O payload do POST api/cart (enviado por
ConfirmPaymentLinkController.onTapGerar) DEVE conter os recommendedItems -
Esta serialização É garantida pela task-09 (CartDTO.recommendedItems + toJson/fromJson)
Casos de Borda:
- Se recommendedItems for nulo, o campo não deve ser enviado ou deve ser enviado como null (comportamento padrão do JSON)
- Se recommendedItems for uma lista vazia, deve ser enviado como array vazio []
RF-08 — Isolamento dos recommendedItems do total do carrinho
História de Usuário:
Como vendedora, quero que os itens recomendados não interfiram nos valores e cálculos do carrinho.
Critérios de Aceitação:
-
Os recommendedItems NÃO DEVEM compor
itemsTotaldo carrinho -
Os recommendedItems NÃO DEVEM compor
totaldo carrinho -
Os recommendedItems NÃO DEVEM afetar cálculos de desconto, frete ou CRM Bonus
-
Este comportamento já é garantido pela task-09 (
addRecommendedItemsusachangeWith()síncrono semcomputeValuesAndTotals())
Casos de Borda:
- Alterações de desconto em recommendedItems não devem disparar recálculo de total
- Remoção de recommendedItems não deve disparar recálculo de total
Dependências
| Dependência | Descrição | Status |
|---|---|---|
| task-09-193223 | CartDTO.recommendedItems, addRecommendedItems(), MutableCartDTO, serialização toJson/fromJson | Pendente |
| ADR-009 | Size armazenado em CartRecommendedItems — define contrato do RecommendedItemsInfoDTO | Aceito |
| ADR-002 | Query separada para GetRecommendedItemsAsync no fluxo store | Aceito |
Questões em Aberto
- Confirmação PO — Limite máximo de desconto: Confirmar com PO se as regras de limite máximo de desconto no pedido devem considerar os itens recomendados (além dos itens do carrinho).
- Confirmação UX/PO — Modal de confirmação ao excluir: Validar com UX e PO se a exclusão de item recomendado deve exibir modal de confirmação (ConfirmBottomSheet) ou se deve ser direta (apenas snackbar).
- Confirmação PO — Regras de desconto funcionário: Validar com PO se as regras de desconto de funcionário se aplicam integralmente aos itens recomendados.