# Etapa 87 — Resumo da entrega

## Objetivo

Criar a **base do plano de recuperação do ciclo** e **estratégia sugerida** para casos em risco ou bloqueados, para que a gestão passe da leitura diagnóstica para um **plano estruturado de recuperação**. Sem quebrar a camada Quest nem as camadas web já existentes. A nova etapa **adiciona** a visão de recuperação; não substitui alertas, gargalos nem ações recomendadas.

---

## Ficheiros criados

### Web (Assets/Web/)

| Caminho | Descrição |
|---------|-----------|
| **Core/EventCycleRecoveryPriority.cs** | Enum: Low, Medium, High, Urgent. |
| **Core/EventCycleRecoveryEffort.cs** | Enum: Small, Medium, Large. |
| **Core/EventCycleRecoveryResponsibleRole.cs** | Enum: HotelSales, HotelAdmin, Producer, InternalAdmin, Shared. |
| **Domain/EventCycleRecoveryAction.cs** | RecoveryActionId, CycleId, Title, Summary, Priority, ResponsibleRole, RelatedBottleneckId, RelatedSectionKey, EstimatedRecoveryImpact, EstimatedRecoveryEffort, IsImmediateAction, Notes. |
| **Domain/EventCycleRecoveryPlanState.cs** | CycleId, RecoveryActions, RecoverySummary, PrimaryRecoveryAction, IsRecoveryNeeded, RecoveryConfidenceLabel, LastGeneratedAt. |
| **Application/CompletedRecoveryActionStore.cs** | MarkCompleted(recoveryActionId), IsCompleted, ClearCompletedForCycle, ClearAllCompleted — em memória. |
| **Application/EventCycleRecoveryPlanController.cs** | GenerateRecoveryPlans(orders, opportunities, proposals, sessions, followUpTasks); GenerateRecoveryPlanForCycle(cycleId, dashboardState, closure, alertState, actionPlan, summary, sla, depMap, bottleneckState, generatedAt). Regras: ciclo bloqueado → ação "Desbloquear ciclo"; gargalos bloqueantes → uma ação por categoria (Handoff, Scope, Execution, FinalAcceptance, Commercial/Quest, Preparation, CrossStage); ciclo em risco + riscos executivos → ação comercial; SLA em atraso → ação de redução de atraso. PrimaryRecoveryAction = primeira por Priority e Impact. RecoveryConfidenceLabel = Alta/Média/Baixa. Filtra concluídas via CompletedRecoveryActionStore. MarkRecoveryActionCompleted, ClearCompletedForCycle, ClearAllCompleted. |
| **Presentation/EventCycleRecoveryPlanPanel.cs** | Painel: resumo da estratégia, ★ principal, lista de ações (prioridade, impacto, esforço, responsável, secção), "Marcar concluída", "Recalcular", "Limpar concluídas". |
| **Presentation/EventCycleRecoveryPlanStripView.cs** | Faixa: primeiro ciclo com recuperação necessária — principal, prioridade, esforço, confiança, timestamp. |

### Documentação

| Caminho | Descrição |
|---------|-----------|
| **Docs/Web/WEB_EVENT_CYCLE_RECOVERY.md** | Plano de recuperação, diferença alerta/gargalo/ação recomendada/ação de recuperação, regras, UI, limitações. |
| **Docs/Web/ETAPA_87_RESUMO.md** | Este resumo. |

---

## Ficheiros alterados

| Caminho | Alteração |
|---------|-----------|
| **Presentation/EventCycleDashboardPanel.cs** | Geração de planos (GenerateRecoveryPlans); por ciclo, quando IsRecoveryNeeded e existe PrimaryRecoveryAction, linha "Recuperação: Sim \| Principal: [título] \| Confiança: [label] \| timestamp". |
| **Presentation/HotelCRMDashboardController.cs** | Novas secções: EventCycleRecoveryPlanStripView ("Plano de recuperação (resumo)"), EventCycleRecoveryPlanPanel ("Plano de recuperação do ciclo e estratégia sugerida"). |

---

## Como o plano de recuperação foi implementado

1. **Fontes**  
   Para cada ciclo obtêm-se: EventCycleDashboardState, EventCycleClosureState, EventCycleAlertState, EventCycleActionPlanState, EventCycleExecutiveSummary, EventCycleSLAState, EventCycleDependencyMapState, EventCycleBottleneckState.

2. **Geração**  
   - Se ciclo bloqueado e ClosingRecommendation → ação "Desbloquear ciclo" (Urgent, HotelAdmin).  
   - Para cada gargalo bloqueante (ordenado por severidade e unlock): mapeia categoria para título/resumo/prioridade/responsável/secção/impacto/esforço/imediata (MapBottleneckToRecovery). Evita duplicar por RelatedBottleneckId na mesma corrida.  
   - Se ciclo em risco (não bloqueado) e há TopRisks no resumo → ação "Reduzir risco comercial" (HotelSales, Secção Comercial).  
   - Se SLA DelayRiskLevel ≥ Medium → ação "Reduzir atraso no ciclo" (Shared; Urgent se Critical).  
   Concluídas (CompletedRecoveryActionStore) são excluídas.

3. **Ordenação e principal**  
   Ações ordenadas por Priority (desc) e EstimatedRecoveryImpact (desc). PrimaryRecoveryAction = primeira. IsRecoveryNeeded = (actions.Count > 0). RecoveryConfidenceLabel = Alta (≤2), Média (≤4), Baixa (>4).

4. **Strip e Painel**  
   Strip mostra primeiro ciclo com IsRecoveryNeeded: principal, prioridade, esforço, confiança, timestamp. Painel mostra por ciclo: resumo, principal em destaque, lista com "Marcar concluída" (mock).

5. **Dashboard**  
   Por ciclo, quando há plano com IsRecoveryNeeded e PrimaryRecoveryAction, linha com título da ação principal, confiança e timestamp.

---

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

- **Quest** — Nenhuma alteração em QuestPresentation, QuestPresentationSession, controllers Quest, runtime XR, input ou apresentação.
- **Web Hotel** — CRM mantido; apenas adicionadas duas secções (Strip e Panel de recuperação) e uma linha condicional no dashboard. Gargalos, SLA e restantes secções inalterados.
- **Web Produtor** — Painel do produtor e módulos operacionais não foram alterados.
- **Camada agregadora** — O plano de recuperação apenas **lê** closure, alertas, plano de ações, resumo executivo, SLA, mapa de dependências e gargalos; não duplica lógica complexa; não introduz dependência circular.
