Requisitos — [Front][App] Ajuste de layout nova vitrine
Task #197313
Task pai: US 196053 ADRs relacionados: — AS-IS validado: context/AS-IS.md
Status: refinado Sessão de grilling: 25/06/2026 — refinamento com base na US 196053, contrato de API (
frontend-contract-diff.md), referências visuais e código do App
Visão geral
Adaptar o fluxo de Minhas Vitrines no App Flutter (coezzion_vendas_app) para suportar a modalidade Vitrine de Estoque da Loja (showCaseType = 4 / SellerStock), coexistindo com a vitrine personalizada atual (showCaseType = 1 / Store).
A task cobre exclusivamente alterações de layout e DTOs no App: bottom sheet de escolha de modalidade, integração do endpoint v2 da listagem com hasSellerStock, fluxo de criação sem seleção de produtos e tela de detalhe condicionada ao tipo de vitrine.
Papéis
| Papel | Responsabilidade |
|---|---|
| Vendedor | Cria, visualiza, compartilha e edita data de expiração das vitrines no App |
| App (Flutter) | Renderiza layouts, consome APIs show-case-new e aplica regras por showCaseType |
| API Show Case | Persiste vitrines, retorna hasSellerStock, showCaseType e totalItems |
Requisitos
RF-01 — Listagem com endpoint v2 e flag hasSellerStock
User Story: Como vendedor, eu quero que a listagem de Minhas Vitrines reflita se já possuo uma Vitrine de Estoque da Loja ativa, para que o App saiba quando bloquear uma nova criação dessa modalidade.
Acceptance Criteria:
- WHEN o App carrega a listagem de Minhas Vitrines THEN o App SHALL consumir
GET /api/show-case-new/v2/store/{storeId}no lugar do endpoint v1. - WHEN a API retorna a listagem paginada THEN o App SHALL parsear os campos
data,total,pageNumber,pageSizeehasSellerStockconforme o contrato emfrontend-contract-diff.md. - WHEN
hasSellerStockétrueTHEN o App SHALL armazenar esse estado no controller da listagem para uso no bottom sheet de criação. - WHEN
hasSellerStockéfalseTHEN o App SHALL permitir a criação de uma nova Vitrine de Estoque da Loja. - WHEN a listagem é exibida THEN o App SHALL manter o comportamento atual de busca, paginação infinita e navegação para o detalhe ao tocar em um item.
RF-02 — Bottom sheet de escolha de modalidade ao criar vitrine
User Story: Como vendedor, eu quero escolher o tipo de vitrine ao clicar em "CRIAR VITRINE", para decidir entre compartilhar o estoque completo da loja ou criar uma vitrine personalizada.
Acceptance Criteria:
- WHEN o vendedor toca no botão
CRIAR VITRINEna tela Minhas Vitrines THEN o App SHALL exibir um bottom sheet com títuloEscolha uma opçãoe botão de fechar, conforme referência visualcontext/image-1.png. - WHEN o bottom sheet é exibido THEN o App SHALL apresentar a opção
Vitrine do estoque da lojacom badgeNovae descriçãoCrie uma vitrine com todos os produtos do estoque da loja.. - WHEN o bottom sheet é exibido THEN o App SHALL apresentar a opção
Criar nova vitrinecom descriçãoCrie vitrines personalizadas escolhendo os produtos ideais para cada cliente.. - WHEN o vendedor seleciona
Criar nova vitrineTHEN o App SHALL iniciar o fluxo atual de criação viaShowCaseSearchProducts(showCaseType = 1). - WHEN o vendedor seleciona
Vitrine do estoque da lojaehasSellerStockéfalseTHEN o App SHALL iniciar o fluxo de criação da Vitrine de Estoque da Loja (RF-03). - WHEN
hasSellerStockétrueTHEN o App SHALL manter a opçãoVitrine do estoque da lojavisível porém desabilitada para toque. - WHEN
hasSellerStockétrueTHEN o App SHALL exibir abaixo do título da opção a mensagemVocê já possui uma Vitrine de Estoque ativa. Apenas uma vitrine desta modalidade é permitida por vez., conformecontext/image-2.png. - WHEN o vendedor fecha o bottom sheet sem selecionar THEN o App SHALL retornar à listagem sem alterar o estado.
RF-03 — Criação da Vitrine de Estoque da Loja
User Story: Como vendedor, eu quero criar uma vitrine com todo o estoque da loja sem selecionar produtos manualmente, para compartilhar o catálogo completo com menos esforço operacional.
Acceptance Criteria:
- WHEN o vendedor inicia o fluxo de Vitrine de Estoque da Loja THEN o App SHALL exibir tela com título
Estoque da loja, conformecontext/image-3.png. - WHEN a tela de criação é exibida THEN o App SHALL apresentar o campo Nome pré-preenchido com
Estoque da lojae desabilitado para edição. - WHEN a tela de criação é exibida THEN o App SHALL apresentar o campo Data de expiração editável, respeitando o intervalo já existente no fluxo de vitrines (mínimo amanhã, máximo 31 dias a partir de hoje).
- WHEN o vendedor confirma a criação THEN o App SHALL enviar
POST /api/show-case-newcomshowCaseType = 4,showCaseItems = []e os demais campos obrigatórios deCreateShowCaseRequest. - WHEN a API retorna sucesso na criação THEN o App SHALL navegar para a tela de detalhe da vitrine criada ou exibir o bottom sheet de ações (Visualizar / Compartilhar / Copiar link), mantendo o padrão já usado em
ShowCaseBottomSheet. - WHEN a API retorna erro por vitrine SellerStock já existente THEN o App SHALL exibir mensagem de erro compreensível ao vendedor e não criar duplicata.
- WHEN o fluxo de criação SellerStock está ativo THEN o App SHALL NOT exibir etapa de busca ou seleção de produtos (
ShowCaseSearchProducts).
RF-04 — Detalhe da vitrine condicionado ao showCaseType
User Story: Como vendedor, eu quero visualizar e gerenciar vitrines de estoque da loja com layout e regras distintas das vitrines personalizadas, para não tentar editar campos que o negócio restringe.
Acceptance Criteria:
- WHEN o App carrega o detalhe via
GET /api/show-case-new/app/{showCaseId}THEN o App SHALL parsear os camposshowCaseTypeetotalItemsemShowCaseDetailResponse. - WHEN
showCaseType = 1(Store) THEN o App SHALL manter o layout e comportamento atuais da tela de detalhe (nome editável, seleção/remoção de produtos, botãoADICIONAR PRODUTOS). - WHEN
showCaseType = 4(SellerStock) THEN o App SHALL exibir o título da AppBar comoEstoque da loja. - WHEN
showCaseType = 4THEN o App SHALL exibir o campo Nome com valor fixoEstoque da lojadesabilitado para edição. - WHEN
showCaseType = 4THEN o App SHALL exibir a seção de produtos com labelConfira os produtose contagem"{totalItems} produtos recomendados", usandototalItemse nãoshowCaseItems.length. - WHEN
showCaseType = 4THEN o App SHALL exibir no máximo 4 cards de produtos a partir deshowCaseItems(prévia) e linkTodos os produtosquandototalItemsfor maior que 4. - WHEN
showCaseType = 4THEN o App SHALL NOT exibir botãoADICIONAR PRODUTOS, ícones de remoção de produto nem fluxo de edição de listagem. - WHEN
showCaseType = 4e o vendedor altera apenas a data de expiração THEN o App SHALL enviarPUT /api/show-case-newcomshowCaseType = 4contendo somentedateExpirationefetivo (demais campos ignorados pela API). - WHEN
showCaseType = 4THEN o App SHALL manter as açõesVisualizar,CompartilhareCopiar linkna seçãoEscolha uma opção. - WHEN
showCaseType = 4THEN o App SHALL manter os botõesATUALIZAR VITRINE(habilitado somente se a data de expiração mudou) eEXCLUIR VITRINE.
RF-05 — DTOs e requests atualizados
User Story: Como desenvolvedor do App, eu quero que os models reflitam o contrato da API, para serializar e desserializar corretamente os novos campos da modalidade SellerStock.
Acceptance Criteria:
- WHEN o App serializa criação ou atualização de vitrine THEN
CreateShowCaseRequesteUpdateShowCaseRequestSHALL incluir o camposhowCaseType. - WHEN o App desserializa o detalhe THEN
ShowCaseDetailResponseSHALL incluirshowCaseType(int) etotalItems(int). - WHEN o App desserializa a listagem v2 THEN o model de resposta paginada SHALL expor
hasSellerStock(bool) além da lista de vitrines. - WHEN
showCaseType = 4na criação THEN o App SHALL enviarshowCaseItemscomo lista vazia independentemente de estado local.
Fora de Escopo
- Experiência da cliente na vitrine web (abas Recomendados / Mais produtos) — coberto pela task 197194
- Nova URL de vitrine SellerStock — coberto pela task 197189
- Integração de eventos Rewards específicos da modalidade SellerStock — coberto pela task 197192
- Alterações de backend e contratos de API — coberto pelas tasks 197190 e 197191
- Vitrines recomendadas por cliente (
recommend) e vitrines de marca (brand) - Testes automatizados e documentação de QA
Dependências
| Dependência | Descrição | Status |
|---|---|---|
| 197190 | Backend com endpoints v2, showCaseType e hasSellerStock disponíveis | Pendente |
| frontend-contract-diff.md | Contrato de API validado para DTOs e regras por tipo | Disponível |
| AS-IS.md | Mapeamento do código atual do App | Disponível |
| Referências visuais Figma | context/image.png a image-3.png | Disponível |
| 197192 | Eventos Rewards específicos pós-criação/compartilhamento SellerStock | Pendente (não bloqueia layout) |