# Etapa 90 — Resumo da entrega

## Objetivo

Criar a **base da visão resumida da carteira** com **agrupamento por status, risco e prioridade**, para que a gestão faça **leitura rápida do portfólio de casos** sem abrir cada ciclo. Sem quebrar a camada Quest nem as camadas web já existentes. A nova etapa **adiciona** a visão resumida; não substitui priorização entre ciclos nem os módulos que a alimentam.

---

## Ficheiros criados

### Web (Assets/Web/)

| Caminho | Descrição |
|---------|-----------|
| **Domain/EventCyclePortfolioGroup.cs** | GroupKey, Title, ItemCount, Summary, HighestPriorityItemId, Notes. |
| **Domain/EventCyclePortfolioOverviewState.cs** | TotalCycles, InProgressCount, AtRiskCount, BlockedCount, CompletedCount, CompletedWithIssuesCount, HighPriorityCount, ClosingSoonCount, RecoveryOpportunityCount, OverviewSummary, Groups, LastUpdatedAt. |
| **Application/EventCyclePortfolioOverviewController.cs** | BuildOverview(orders, opportunities, proposals, sessions, followUpTasks) — chama BuildPortfolioPriority e BuildOverviewFromPriorityState. BuildOverviewFromPriorityState(priorityState, updatedAt) — classifica cada item em grupos (Bloqueados, Em risco, Alta prioridade, Recuperação, Perto fechar, Em andamento, Concluídos, Concluídos com issues); preenche contagens; cria EventCyclePortfolioGroup por grupo com ItemCount, Summary, HighestPriorityItemId (CycleId do item de maior PriorityScore no grupo), Notes; ordena grupos por ItemCount desc. |
| **Presentation/EventCyclePortfolioOverviewPanel.cs** | Painel: resumo geral, total, última atualização; card por grupo (título, contagem, resumo, item prioritário). Botão Atualizar. |
| **Presentation/EventCyclePortfolioOverviewStripView.cs** | Faixa: total ciclos, grupo mais crítico (Bloqueados/Em risco), grupo mais numeroso e contagem, timestamp. |

### Documentação

| Caminho | Descrição |
|---------|-----------|
| **Docs/Web/WEB_EVENT_CYCLE_PORTFOLIO_OVERVIEW.md** | Visão resumida, agrupamentos, leitura rápida, UI, limitações. |
| **Docs/Web/ETAPA_90_RESUMO.md** | Este resumo. |

---

## Ficheiros alterados

| Caminho | Alteração |
|---------|-----------|
| **Presentation/EventCycleDashboardPanel.cs** | Obtém overview a partir de portfolioState (BuildOverviewFromPriorityState). Bloco "Carteira: N ciclo(s) | Em andamento X | Em risco Y | Bloqueados Z | Crítico: [grupo] | Maior grupo: [nome] (M) | timestamp". |
| **Presentation/HotelCRMDashboardController.cs** | Secções EventCyclePortfolioOverviewStripView ("Visão resumida da carteira (resumo)") e EventCyclePortfolioOverviewPanel ("Visão resumida da carteira por status, risco e prioridade"). |

---

## Como a visão resumida da carteira foi implementada

1. **Fonte**  
   EventCyclePortfolioPriorityState (lista de EventCyclePortfolioItem já com RiskLevelLabel, ClosureStatus, PriorityScore, TopRecoveryAction, SimulatedBestScenarioDelta, etc.).

2. **Contagens**  
   Por item: bloqueado (RiskLevelLabel "Bloqueado"), em risco (Em risco/Crítico/Alertas bloqueantes), perto fechar (razão ou closure/estágio), concluído (closure concluído), concluído com issues (concluído e score &lt; 70), em andamento (não concluído e não bloqueado), alta prioridade (score ≥ 70), recuperação (TopRecoveryAction e delta não vazios). Totais guardados em OverviewState.

3. **Grupos**  
   Para cada grupo (Blocked, AtRisk, HighPriority, RecoveryOpportunity, ClosingSoon, InProgress, Completed, CompletedWithIssues): filtrar itens pelo predicado; ItemCount = inGroup.Count; HighestPriorityItemId = CycleId do item com maior PriorityScore no grupo; Notes = "Prioritário no grupo: [Title]". Grupos ordenados por ItemCount descendente.

4. **Strip, painel e dashboard**  
   Strip: total, grupo crítico (Blocked ou AtRisk), maior grupo (primeiro da lista ordenada), timestamp. Painel: resumo geral, total, última atualização, card por grupo. Dashboard: overview derivado do portfolioState já calculado; linha com total, contagens principais, grupo crítico, maior grupo e timestamp.

---

## Garantia de que Quest e camadas web existentes não foram quebradas

- **Quest** — Nenhuma alteração em QuestPresentation, QuestPresentationSession, controllers Quest, runtime XR ou apresentação.
- **Web Hotel** — CRM mantido; apenas duas novas secções (Strip e Panel do overview) e um bloco no dashboard. Priorização e restantes secções inalterados.
- **Web Produtor** — Painel do produtor e módulos operacionais não foram alterados.
- **Camada agregadora** — A visão resumida **só consome** EventCyclePortfolioPriorityState (e, na build completa, a priorização consome closure, métricas, alertas, etc.); não altera módulos detalhados; não introduz dependência circular.
