# Ponte Quest → CRM Web

## Visão geral

A **ponte** entre o resultado da sessão Quest e o CRM Web permite que a experiência imersiva alimente a operação comercial do hotel/espaço sem acoplar a camada Quest à Web. A conversão é feita por **mapeamento** (DTO e mapper), não por dependência directa da UI Web ao runtime da cena Quest.

## Como a sessão Quest alimenta o CRM

1. **Origem dos dados (Quest)**  
   Na sessão de apresentação no headset são gerados, quando aplicável:
   - **QuestCommercialOutcome** (decisão, CTA, próxima ação, prioridade)
   - **QuestSessionExportPayload** (payload exportável)
   - **QuestSessionHandoffReport** (relatório handoff)
   - **QuestSessionShareableSummary**, **QuestSessionQualityAssessment**, **QuestSessionImprovementPlan**

2. **DTO de fronteira (Web)**  
   O CRM Web não referencia tipos Quest. O contrato de entrada é o **QuestSessionSnapshot** (em `Assets/Web/Application/QuestSessionSnapshot.cs`), com campos como: SessionId, RecommendedProposalId, SelectedProposalId, FinalDecisionState (WebSessionDecisionState), ConfirmedCTA, SuggestedNextAction, FollowUpPriority, OutcomeSummary, EngagementLabel, QualityLabel, flags de artefactos, Timestamp.

3. **Adaptador (Bridge)**  
   O **QuestOutcomeToSnapshotAdapter** (em `Assets/Web/Bridge/`) é o único componente que referencia tipos Quest. Converte QuestCommercialOutcome (e opcionalmente ExportPayload, HandoffReport, QualityAssessment) em QuestSessionSnapshot. Pode ser invocado no futuro quando existir um fluxo "Exportar para CRM" a partir da Quest; nesta etapa **não é chamado** pela camada Quest.

4. **Mapper (Web)**  
   O **QuestSessionToCRMMapper** (em `Assets/Web/Application/`) recebe apenas QuestSessionSnapshot e produz:
   - actualização para **SessionRecord** (criação ou preenchimento)
   - sugestão de **OpportunityStage** (Ready to Close, Follow-up, Quest Session Done, etc.)
   - lista de **indicadores** comerciais (Alta intenção, Precisa follow-up, Pronta para fechamento, Sessão pouco conclusiva, Precisa revisar proposta)

5. **Aplicação mock**  
   O serviço **IMockWebDataService.ApplyQuestSessionToOpportunity(snapshot, opportunityId)** aplica o snapshot à oportunidade: cria/actualiza SessionRecord, actualiza SalesOpportunity (Stage sugerido, campos LastQuest*, SuggestedNextAction) e devolve os indicadores. A acção **"Aplicar resultado da sessão Quest (mock)"** no dashboard CRM cria um snapshot mock e chama este método.

## Como o pipeline comercial é ajustado com base na sessão

O **QuestSessionToCRMMapper.SuggestOpportunityStage** aplica lógica simples:

- **ReadyToClose** na sessão → oportunidade passa a **Ready to Close**
- **ExplorationOnly** → **Follow-up**
- **Interested** ou **NeedsFollowUp** → **Quest Session Done**
- **ReadyToAdvance** → **Ready to Close**

Assim, o pipeline na Web reflecte o sinal comercial da sessão Quest sem a Quest depender da Web.

## Indicadores comerciais derivados da sessão

- **Alta intenção**: FinalDecisionState ReadyToClose ou ReadyToAdvance
- **Precisa follow-up**: Interested ou NeedsFollowUp
- **Pronta para fechamento**: ReadyToClose
- **Sessão pouco conclusiva**: ExplorationOnly ou rótulos de engajamento/qualidade baixos
- **Precisa revisar proposta**: QualityLabel ou EngagementLabel baixos

Estes aparecem na faixa de indicadores do dashboard e no resultado da acção "Aplicar resultado Quest".

## Limitações actuais (sem persistência real)

- **Sem backend real**: os dados são mantidos em memória (MockWebDataService). Reiniciar a aplicação perde alterações.
- **Sem chamada real da Quest**: a ponte é usada em modo mock (botões "Aplicar resultado Quest" no dashboard). Quando houver fluxo real, o adaptador **QuestOutcomeToSnapshotAdapter** poderá ser invocado com outcome/export/handoff/quality da sessão e o resultado enviado para o CRM (ex.: API ou evento).
- **Sem autenticação**: não há controle de acesso.
- A **camada Quest não foi alterada**: nenhum controller Quest chama a Web nem o Bridge; a ponte é consumidora dos dados Quest, não intrusiva.
