Skip to main content

Subtask 04 — Detalhe: Regras de Negócio no Controller

Task pai: 197313 — Ajuste de layout nova vitrine Ordem de execução: 04 de 07 Depende de: 01b — Ajuste Enum String. Pode ser feita em paralelo com a subtask 03 (arquivos diferentes: controller vs. screen/layout), mas ambas devem estar prontas antes da subtask 05.

Objetivo

Ajustar as regras de negócio do ShowCaseDetailController: correção da semântica de enableEditButton (comparação real de data, aplicada aos dois tipos), remoção do guard de estoque vazio para SellerStock, PUT forçando lista vazia de produtos para SellerStock, e supressão de reward events para SellerStock (aguardando task 197192).

Requisitos atendidos

  • RF-04 — Detalhe da vitrine condicionado ao showCaseType: AC8, AC9, AC10, AC11, AC12.

Relação com o design doc

  • Decisão #4 — Detalhe Condicional por showCaseType (desing-doc.md), parte controller:
    • updateShowCase() força showCaseItems: [] quando showCaseType == ShowCaseType.sellerStock.
    • Correção de enableEditButton: comparação real de data (expirationDate.value != detail.value?.dateExpiration), aplicada a Store e SellerStock; guard de showCaseItems.isNotEmpty mantido só para showCaseType == ShowCaseType.store.
    • Reward events (viewShowCase/shareShowCase/copyLink) suprimidos quando showCaseType == ShowCaseType.sellerStock.
  • Ver também context/comportamento-controller-detalhe-sellerstock.md (achado original com os 4 pontos investigados).

Arquivos a modificar

ArquivoModificação
lib/screens/show_case/show_case_detail/show_case_detail_controller.dartGetter enableEditButton reescrito (ver snippet na Decisão #4 do design doc); updateShowCase() monta showCaseItems: [] quando showCaseType == ShowCaseType.sellerStock; viewShowCase()/shareShowCase()/copyLink() só chamam rewardEventController.register(...) quando showCaseType == ShowCaseType.store.

Testes unitários a criar

  • test/screens/show_case/show_case_detail/show_case_detail_controller_test.dart
    • enableEditButton: showCaseType == ShowCaseType.store, showCaseItems vazio, data alterada → false (guard de lista não-vazia mantido para Store)
    • enableEditButton: showCaseType == ShowCaseType.sellerStock, showCaseItems vazio (loja sem estoque), data alterada → true (guard removido para SellerStock)
    • enableEditButton: reabrir o seletor de data e escolher a mesma data já salva → false para os dois tipos (comparação real, não "campo tocado")
    • enableEditButton: detail.value == nullfalse (cobre o caso de loading/erro, usado depois na subtask 05)
    • updateShowCase(): showCaseType == ShowCaseType.sellerStock → o payload do PUT contém showCaseItems: [] (não os productIds do preview carregado)
    • updateShowCase(): showCaseType == ShowCaseType.store → payload do PUT mantém showCaseItems com os produtos atuais (comportamento existente, sem regressão)
    • viewShowCase()/shareShowCase()/copyLink(): showCaseType == ShowCaseType.sellerStock → nenhuma chamada a rewardEventController.register(...)
    • viewShowCase()/shareShowCase()/copyLink(): showCaseType == ShowCaseType.storerewardEventController.register(...) chamado normalmente (sem regressão)

Critérios de aceite (RF-04, parte controller)

  1. showCaseType == ShowCaseType.sellerStock e o vendedor altera apenas a data de expiração: o App envia PUT /api/show-case-new com showCaseType == ShowCaseType.sellerStock contendo somente dateExpiration efetivo (demais campos ignorados pela API, mas showCaseItems enviado como [] explicitamente).
  2. showCaseType == ShowCaseType.sellerStock: ações Visualizar, Compartilhar e Copiar link mantidas na seção Escolha uma opção (sem reward event, ver AC12).
  3. showCaseType == ShowCaseType.sellerStock: botões ATUALIZAR VITRINE (habilitado somente se a data mudou) e EXCLUIR VITRINE mantidos; ATUALIZAR VITRINE não exige showCaseItems não-vazio para este tipo.
  4. Em qualquer showCaseType, o botão ATUALIZAR VITRINE só habilita se a nova data for realmente diferente da data originalmente carregada.
  5. showCaseType == ShowCaseType.sellerStock: nenhum reward event nativo do detalhe (Visualizar, Compartilhar, Copiar link) é registrado até a task 197192.

Definição de Pronto (Definition of Done)

  • enableEditButton, updateShowCase(), viewShowCase()/shareShowCase()/copyLink() atualizados conforme especificado.
  • flutter analyze sem erros novos.
  • flutter test executando os testes listados acima, 100% verdes.
  • Projeto compila.
  • Nenhuma regressão no fluxo de showCaseType == ShowCaseType.store (Store) — coberta pelos testes de "sem regressão" listados acima.