Skip to main content

Pesquisa — coezzion_vendas_app (zzapp)

Repo: /Users/alt-zz/projetos/arezzo/coezzion_vendas_app
Data: 2026-07-09
Escopo: UI/create/edit de vitrines e expiração


1. Hub “Vitrines”

Arquivo: lib/screens/show_case/show_case/show_case_screen.dart
Rota: /show_case

CardQuemRota
Vitrine da marcaSeller + managerbrandShowCaseList
Vitrine por histórico de comprasSellerrecommendShowCaseList
Minhas vitrinesSellerstoreShowCaseList / my show case

Feature flag: enable_showcase (Firebase Remote Config).


2. Minhas vitrines (Store)

Fluxo create

  1. Lista → CRIAR VITRINE (my_show_case_list_*)
  2. Busca produtos (show_case_search_products_*) — setCreateMode define expirationDate = startDate + 31d
  3. Conferir (show_case_check_products_* + check_fast_catalog_product_list.dart)
  4. POST api/show-case-new (CreateShowCaseRequest)

Fluxo edit

  1. Detalhe (show_case_detail_*)
  2. Campo expiração só se API retornou dateExpiration != null
  3. PUT update / PUT delete

Regras de data (UI)

Valor
Default+31 dias
Min pickeramanhã (now+1)
Max pickernow+31
RequiredSoft — sempre pré-preenchido; fallbacks +31 no submit

Models

ModeldateExpiration
CreateShowCaseRequestDateTime? — serializa ISO ou null
UpdateShowCaseRequestDateTime required no tipo Dart
ShowCaseResponseItemrequired (asDateTimeOrThrow)
ShowCaseDetailResponsenullable

Listagem

listItem.dart — Minhas não passa nullExpirationLabel (assume data).


3. Histórico de compras (Recommend)

Fluxo create

Customer → produtos recomendados → check products → POST api/show-case-new/recommend

Controller create: recommend_show_case_check_products_controller.dart

  • Default = lastExpirationDate (now+31 start of day)
  • Min = amanhã; max = now+31
  • Se null no submit: toast "Selecione a data de expiração"

Fluxo edit

recommend_show_case_detail_*

  • Required no update (mesmo toast)
  • Min = hoje
  • Sem finalDateRange no edit (sem max no picker)

Models

Modelexpiration
Create/Update requestdateExpiration enviado
List/Detailnullable; testes cobrem null

Listagem

Passa nullExpirationLabel: 'Sem data de expiração'UI parcialmente preparada.


4. Vitrine da marca (read-only no app)

  • Lista/detalhe só leitura de expiração formatada.
  • Share: POST brand-seller.
  • Fora do CA de edição da SP.

5. Widget compartilhado de lista

lib/screens/show_case/widgets/listItem.dart:

final showExpiration = expirationDate != null || nullExpirationLabel != null;
final expirationText = expirationDate != null
? 'Data de expiração: ${MaskUtils.formatDateBr(expirationDate!)}'
: nullExpirationLabel ?? '';

CA-4 da SP encaixa neste padrão com label "Sem data de expiração".


6. APIs usadas (ApiUtils)

Prefixo: api/show-case-new

FluxoMétodos principais
MinhasGET store, GET app/{id}, POST/, PUT/, PUT/delete
RecommendGET recommend/..., POST recommend, PUT/DELETE recommend/{id}, POST recommend/products
BrandGET brand/app, detail, items-app, POST brand-seller

7. Impacto da Spike neste repo

ItemAção
Date picker clearable (minhas + recommend create/edit)Implementar
Remover hard-required recommendImplementar
Default +31 mantido na UIManter (D3)
UpdateShowCaseRequest.dateExpiration nullableSim
ShowCaseResponseItem nullable + label na lista minhasSim
Detail minhas: mostrar campo mesmo se nullSim
Recommend edit: aplicar max rangeAlinhar com create
Testes models nullEstender

Arquivos-chave

lib/screens/show_case/show_case/show_case_screen.dart
lib/screens/show_case/my_show_case_list/
lib/screens/show_case/show_case_detail/
lib/screens/show_case/search/show_case_search_products_controller.dart
lib/screens/show_case/show_case_check_products/
lib/screens/show_case/recommend_show_case_*
lib/screens/show_case/widgets/listItem.dart
lib/models/show_case/*
lib/models/recommend_show_case/*
lib/theme_widgets/date_form_field/zz_date_form_field.dart

8. Quirks AS-IS

  1. Default/max +31, não +30 (SP).
  2. Recommend edit sem max; create com max.
  3. Minhas detail esconde campo se API não manda data.
  4. Minhas list quebra parse se dateExpiration null (OrThrow).
  5. Recommend list já tolera null com label.