# Análise da camada Web — Verificação e correções

**Data:** Verificação minuciosa da camada Web (handoff, comunicação, escopo, readiness, checklist) e das pontas soltas antes de avançar.

---

## 1. Resumo do que foi verificado

| Área | Verificação |
|------|--------------|
| **Stores** | HandoffStore, ScopeRevisionStore, PreparationChecklistStore, ResolvedBlockingStore, CommunicationStore — uso consistente, locks, null checks. |
| **Fluxo hotel → produtor** | Pedidos gerados pelo hotel (HotelToProducerHandoffService) entram no HandoffStore; MockProducerDataService.GetOrders() devolve HandoffStore.GetOrders(); produtor e hotel partilham os mesmos pedidos. |
| **Thread de comunicação** | EnsureThreadForOrder é chamado após AddOrder no HotelToProducerHandoffService; pedidos de seed (ord-1, ord-2, ord-3) não têm thread até alguém abrir comunicação (GetOrCreateThread cria na primeira vez). |
| **Checklist** | Geração só quando não existem itens (EnsureChecklist); confirmação só quando há obrigatórios e todos concluídos. |
| **Escopo** | SetCurrentActiveRevision altera os objectos na lista Revisions; não é necessário UpdateRevision por revisão. |
| **UI** | Lambdas com orderId/itemId/code correctos; Refresh() após acções; campos opcionais do pedido com ?? "—". |
| **Evento de refresh** | Painéis de handoff/readiness/checklist não subscreviam OnDataChanged; ao gerar novo pedido, só o HandoffToProducerPanel refrescava. |

---

## 2. Correções aplicadas

### 2.1. Confirmação de preparação com checklist vazio (bug)

- **Ficheiro:** `Assets/Web/Producer/Application/ProducerPreparationChecklistController.cs`
- **Problema:** Se `GetChecklistState` devolvesse estado com 0 itens (RequiredItems = 0, CompletedRequiredItems = 0), a condição `CompletedRequiredItems < RequiredItems` era falsa e permitia confirmar preparação sem checklist.
- **Correção:** Passou a exigir `RequiredItems > 0` e `CompletedRequiredItems >= RequiredItems`:  
  `if (state.RequiredItems == 0 || state.CompletedRequiredItems < state.RequiredItems) return false;`

### 2.2. Campos nulos na vista de detalhes do pedido

- **Ficheiro:** `Assets/Web/Producer/Presentation/ProducerOrderDetailsView.cs`
- **Problema:** `EventCategory`, `ThemeLabel` e `SelectedCommercialPackageLabel` podem ser null (ex.: pedido gerado pelo hotel sem proposta/sessão); a concatenação mostrava "null".
- **Correção:** Uso de `?? "—"` para esses três campos na linha do escopo/tema/pacote.

### 2.3. Refresh dos painéis ao alterar dados (pontas soltas)

- **Ficheiro:** Vários painéis no hotel.
- **Problema:** HandoffToProducerPanel, OrderCommunicationPanel, OrderScopePanel, OrderReadinessPanel e OrderChecklistPanel não subscreviam `WebRuntimeContext.OnDataChanged`. Ao gerar um novo pedido (ou alterar dados Noutro painel), estes painéis não refrescavam até sair/voltar à cena.
- **Correção:** Em cada um destes painéis: em `Start()` subscrever `WebRuntimeContext.OnDataChanged += Refresh` e em `OnDestroy()` desinscrever `WebRuntimeContext.OnDataChanged -= Refresh`. Assim, sempre que for chamado `NotifyDataChanged()` (gerar pedido, aplicar resultado Quest, etc.), todos os painéis actualizam.

---

## 3. Pontos confirmados (sem alteração)

- **ProducerOrder:** RequiredShowroomItems, KeyHotspots, KeyNotesFromSales são inicializados na classe (listas não nulas); não há risco de NullReferenceException.
- **ScopeRevisionStore:** GetConfirmationState cria estado por ordem quando não existe; SetCurrentActiveRevision altera os objectos dentro de Revisions (referências partilhadas).
- **ProducerPreparationChecklistView:** O botão de confirmar só aparece quando `!state.IsPreparationConfirmed`; o estado é obtido de novo em cada Refresh(); o clique na caixa usa `itemId` e `orderId` correctos.
- **ProducerAcceptancePanel / ProducerReadinessView:** Refresh() após UpdateOrderAcceptance e após MarkBlockingResolved/MarkBlockingUnresolved; o produtor não tem evento global de dados, mas cada painel refresca na sua própria acção.
- **OrderScopePanel / ProducerScopeRevisionView:** Aprovar/Rejeitar usam `rev.RevisionId` capturado no loop; filtro por PendingHotelApproval (hotel) e PendingProducerApproval (produtor) está correcto.
- **HandoffIndicatorHelper, ScopeIndicatorHelper, ReadinessIndicatorHelper, ChecklistIndicatorHelper:** Tratamento de state/order null; GetChecklistLabel com TotalItems == 0 devolve "—".
- **Dependências:** Não há dependência circular; Quest não é referenciada pela Web; hotel usa Producer; produtor não referencia o Domain/Application do hotel.

---

## 4. Limitações conhecidas (documentadas, sem alteração)

- Persistência em memória: todos os stores perdem dados ao reiniciar.
- O produtor não tem evento global tipo OnDataChanged; cada secção refresca quando o utilizador actua nessa secção (ex.: aceitar pedido refresca o painel de aceite; para ver o impacto no readiness/checklist o utilizador pode rolar até essas secções, que são recalculadas no próximo Refresh quando o painel for visível/activo, ou ao reabrir a cena). Opcionalmente pode ser adicionado um evento no ProducerRuntimeContext em etapa futura.
- "Marcar bloqueio como resolvido" (readiness) e "Confirmar preparação" (checklist) são mock: não alteram o estado real do pedido/escopo em backend.

---

## 5. Ficheiros modificados nesta análise

| Ficheiro | Alteração |
|----------|-----------|
| `Assets/Web/Producer/Application/ProducerPreparationChecklistController.cs` | Condição de confirmação: exigir `RequiredItems > 0`. |
| `Assets/Web/Producer/Presentation/ProducerOrderDetailsView.cs` | Null-safe para EventCategory, ThemeLabel, SelectedCommercialPackageLabel. |
| `Assets/Web/Presentation/HandoffToProducerPanel.cs` | Subscrever e desinscrever OnDataChanged. |
| `Assets/Web/Presentation/OrderCommunicationPanel.cs` | Subscrever e desinscrever OnDataChanged. |
| `Assets/Web/Presentation/OrderScopePanel.cs` | Subscrever e desinscrever OnDataChanged. |
| `Assets/Web/Presentation/OrderReadinessPanel.cs` | Subscrever e desinscrever OnDataChanged. |
| `Assets/Web/Presentation/OrderChecklistPanel.cs` | Subscrever e desinscrever OnDataChanged. |

---

## 6. Conclusão

- **Bugs corrigidos:** 1 (confirmação com checklist vazio) + 1 (campos nulos na UI).
- **Pontas soltas corrigidas:** refresh dos painéis do hotel ao gerar/alterar dados (subscrição a OnDataChanged).
- **Quest e camadas web existentes:** não foram alterados de forma destrutiva; apenas as correções e melhorias acima.
- O projeto está em condições para avançar; a camada Web está consistente e sem dependências quebradas.
