# Etapa 84 — Resumo da entrega

## Objetivo

Criar a **base de visão de SLA do ciclo** e **tempo estimado entre marcos críticos**, para que a gestão enxergue **atrasos**, **riscos de demora** e **tempo esperado entre etapas** do fluxo. Sem quebrar a camada Quest nem as camadas web já existentes. A nova etapa **adiciona** visão de SLA/tempo; não substitui timeline (quando existir), métricas, benchmark nem outros módulos.

---

## Ficheiros criados

### Web (Assets/Web/)

| Caminho | Descrição |
|---------|-----------|
| **Core/EventCycleDelaySeverity.cs** | Enum: None, Low, Medium, High, Critical. |
| **Domain/EventCycleSLASegment.cs** | FromMilestoneType, ToMilestoneType, ExpectedDurationDays, CurrentOrObservedDurationDays, IsDelayed, DelaySeverity, Notes. |
| **Domain/EventCycleSLAState.cs** | CycleId, TotalEstimatedCycleTimeDays, CurrentElapsedCycleTimeDays, expectativas por trecho (LeadToQuest, QuestToHandoff, …), Segments, DelayRiskLevel, MainDelayReason, LastEvaluatedAt. |
| **Application/EventCycleSLAController.cs** | EvaluateSLA(orders, opportunities, proposals, sessions, followUpTasks); EvaluateSLAForCycle(order, dashboardState, alertState, session, execState, finalReport, finalAcceptance, evaluatedAt). Gera segmentos com expectativas fixas (dias); calcula observado quando há datas (order, session, execState, finalReport, finalAcceptance); marca IsDelayed e DelaySeverity; ApplyDelayRules (execução bloqueada, handoff pendente após Quest, aceite produtor pendente, aceite final pendente). |
| **Presentation/EventCycleSLAPanel.cs** | Painel: tempo decorrido vs estimado, risco, principal atraso, lista de segmentos com atraso destacado; botão Recalcular. |
| **Presentation/EventCycleSLAStripView.cs** | Faixa: risco, maior atraso, timestamp; cor para High/Critical. |

### Documentação

| Caminho | Descrição |
|---------|-----------|
| **Docs/Web/WEB_EVENT_CYCLE_SLA.md** | Visão de SLA/tempo do ciclo, marcos e trechos críticos, como ajuda gestão de atraso e risco, limitações. |
| **Docs/Web/ETAPA_84_RESUMO.md** | Este resumo. |

---

## Ficheiros alterados

| Caminho | Alteração |
|---------|-----------|
| **Presentation/EventCycleDashboardPanel.cs** | Avaliação SLA (EvaluateSLA); por ciclo, quando DelayRiskLevel ≠ None, linha "SLA: Risco X \| MainDelayReason \| timestamp" com cor para High/Critical. |
| **Presentation/HotelCRMDashboardController.cs** | Novas secções: EventCycleSLAStripView ("SLA do ciclo (resumo)"), EventCycleSLAPanel ("SLA e tempo entre marcos críticos"). |

---

## Como a análise de SLA foi implementada

1. **Modelos**  
   **EventCycleSLASegment** representa um trecho entre dois marcos (Lead, QuestSession, Handoff, ProducerAcceptance, Preparation, ExecutionStarted, FinalReport, HotelAcceptance) com duração esperada (dias), observada (quando há datas), IsDelayed e DelaySeverity. **EventCycleSLAState** agrega o ciclo: tempo total estimado, tempo decorrido, lista de segmentos, DelayRiskLevel (máximo das severidades), MainDelayReason (pior segmento) e LastEvaluatedAt.

2. **Cálculo**  
   **EvaluateSLA** obtém dashboard e alertas; para cada pedido obtém session, execState, finalReport, finalAcceptance. **EvaluateSLAForCycle** calcula CurrentElapsedCycleTimeDays (desde order.CreatedAt), cria um segmento por trecho com **AddSegment**: esperado em dias (constantes), observado quando há timestamps (sessão, handoff, aceite, execução, relatório, aceite final). Se observado > esperado ou marco pendente há mais dias que o esperado, marca IsDelayed e atribui severidade (excesso ≥14d Critical, ≥7d High, ≥3d Medium, senão Low). **ApplyDelayRules** sobrescreve/ajusta para: execução bloqueada (Critical no segmento FinalReport); Quest sem handoff (High); handoff sem aceite produtor (Medium); relatório sem aceite hotel (High). DelayRiskLevel = max(segmentos); MainDelayReason = pior segmento em atraso.

3. **Strip**  
   **EventCycleSLAStripView** chama EvaluateSLA e mostra o primeiro ciclo: risco, maior atraso, timestamp.

4. **Painel**  
   **EventCycleSLAPanel** lista SLA por ciclo com tempo decorrido/estimado, risco, principal atraso e segmentos (esperado vs observado, destaque para atraso).

5. **Dashboard**  
   **EventCycleDashboardPanel** avalia SLA e, por ciclo, quando há risco (≠ None), mostra uma linha com risco, principal atraso 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, targeting ou apresentação. A SLA usa apenas **SessionRecord** (LastSessionTimestamp, HeldAt) já exposto na Web.
- **Web Hotel** — CRM mantido; apenas adicionadas duas secções (Strip e Panel de SLA) e uma linha condicional no dashboard (quando há risco). Benchmark, métricas, closure e restantes secções inalterados.
- **Web Produtor** — Painel do produtor e módulos de pedido, execução, relatório e aceite final não foram alterados; apenas leitura via controllers existentes.
- **Camada agregadora** — A SLA apenas **lê** dashboard, alertas, execução e aceite final; não duplica lógica complexa; não introduz dependência circular.
