Pesquisa — coezzion-portal (zzportal / vitrine da marca)
Repo: /Users/alt-zz/projetos/arezzo/coezzion-portal
Data: 2026-07-09
Escopo: expiração da vitrine da marca (referência; fora do CA da SP 198299)
1. Papel no ecossistema
Portal cria/edita apenas vitrines da marca (Brand). Não cria Store nem Recommendation.
Rotas:
| Path | Tela |
|---|---|
/vitrines | Lista |
/vitrines/:id | Criar conclusão / editar header |
/vitrines/:id/adicionarProduto | Produtos |
Perfis: admin, coezzion user, easy, CRM, merchan.
2. Fluxo create/edit
- Lista → CRIAR → modal CSV de SKUs →
POST /api/show-case-new/brand - Backend cria temp; portal abre edit header
- Form: nome, descrição, startDate (obrigatório), dateExpiration (opcional), canais/lojas, banner
- Save:
PUT /api/show-case-new/brand/header
Arquivo principal: src/routes/Vitrine/ListShowcase/EditShowcase/index.tsx
3. Expiração na UI (precedente de produto)
| Regra | Comportamento |
|---|---|
| Obrigatória? | Não |
| Placeholder | "Sem data de expiração" |
| Clearable | Sim (isClearable) |
| Default | Vazio (sem data) |
| Desabilitada | Até haver data de ativação |
| Min | Dia seguinte à ativação |
| Max | Nenhum no portal |
| Validação se preenchida | ≠ ativação; ≥ ativação; ≥ hoje |
Submit envia dateExpiration possivelmente undefined.
4. Contrato com API
Service: src/services/showcase/index.ts + model.ts
Backend (showcase) interpreta null → DateTime.MaxValue.
Lista: coluna “Data de expiração” formata data se presente (Header.tsx).
5. Impacto da Spike
| Mudança de código no portal? | Não (CA da SP) |
| Valor para a Spike | Referência de UX e contrato “sem data” + MaxValue |
| Risco de regressão | Baixo se API Brand não for alterada indevidamente |
6. Arquivos-chave (referência)
src/routes/Vitrine/index.tsx
src/routes/Vitrine/ListShowcase/index.tsx
src/routes/Vitrine/ListShowcase/EditShowcase/index.tsx
src/routes/Vitrine/ListShowcase/EditShowcase/constants.ts
src/routes/Vitrine/ListShowcase/Header.tsx
src/services/showcase/index.ts
src/services/showcase/model.ts