# Módulos da camada Web

## Core (Assets/Web/Core/)

- **LeadStatus**: enum (New, Contacted, Qualified, Disqualified, Converted).
- **OpportunityStage**: enum (Prospecting, Qualification, Proposal, Negotiation, ClosedWon, ClosedLost; pipeline CRM: NewLead, Contacted, ProposalSent, QuestSessionDone, FollowUp, ReadyToClose, Won, Lost).
- **CommercialPriority**: enum (Low, Medium, High, Critical).
- **ProposalRecordStatus**: enum (Draft, Sent, Viewed, Accepted, Rejected, Expired).
- **FollowUpPriority**: enum (Low, Medium, High, Urgent).
- **WebSessionDecisionState**: enum conceptual para estado de decisão da sessão (espelha conceptualmente o resultado Quest: ExplorationOnly, Interested, NeedsFollowUp, ReadyToAdvance, ReadyToClose), usado apenas na Web para não acoplar ao Core Quest.

## Domain (Assets/Web/Domain/)

- **WebLead**: lead comercial (Id, Name, Email, Phone, Company, Status, Source, CreatedAt, Notes).
- **SalesOpportunity**: oportunidade (Id, LeadId, Title, Stage, Value, ProposalRecordId, SessionRecordId, CommercialPriority, SuggestedNextAction, CreatedAt, UpdatedAt; LastQuestSessionId, LastQuestDecisionState, LastQuestCTA, LastQuestNextAction, LastQuestFollowUpPriority, LastQuestEngagementLabel, LastQuestQualityLabel, LastQuestSummary, LastQuestRecommendedProposalId, LastQuestSelectedProposalId).
- **ProposalRecord**: registo de proposta (Id, OpportunityId, Name, Status, SentAt, ViewedAt, AcceptedAt).
- **SessionRecord**: registo de sessão (ponte com Quest): SessionId, OpportunityId, ProposalRecordId, RecommendedProposalId, SelectedProposalId, FinalDecisionState, ConfirmedCTA, SuggestedNextAction, FollowUpPriority, HasExportPayload, HasHandoffReport, HasShareableSummary, HasQualityAssessment, HasImprovementPlan, OutcomeSummary, EngagementLabel, QualityLabel, ConfidenceLevel, LastSessionTimestamp, HeldAt, CreatedAt.
- **FollowUpTask**: tarefa de follow-up (Id, OpportunityId, SessionRecordId, Title, DueDate, Priority, IsCompleted, CreatedAt).

## Application (Assets/Web/Application/)

- **IMockWebDataService** / **MockWebDataService**: listas em memória; **ApplyQuestSessionToOpportunity(snapshot, opportunityId)** aplica resultado Quest à oportunidade (mock).
- **HotelToProducerHandoffService**: geração formal do pedido operacional (ProducerOrder) a partir de SalesOpportunity, ProposalRecord e SessionRecord; regista no HandoffStore (Producer). Mock; sem backend real.
- **QuestSessionSnapshot**: DTO de fronteira para resultado da sessão Quest (sem referência a tipos Quest).
- **QuestSessionToCRMMapper**: mapeia snapshot → SessionRecord + sugestão de estágio + indicadores (Alta intenção, Precisa follow-up, Pronta para fechamento, Sessão pouco conclusiva, Precisa revisar proposta).
- **ICRMIndicatorsService** / **CRMIndicatorsService**: indicadores por oportunidade/proposta/sessão.
- **Bridge (Assets/Web/Bridge/)**: **QuestOutcomeToSnapshotAdapter** — único ponto que referencia tipos Quest; converte QuestCommercialOutcome/ExportPayload/HandoffReport/QualityAssessment em QuestSessionSnapshot.

## Presentation (Assets/Web/Presentation/)

- **HotelCRMDashboardController**: dashboard CRM com scroll (Indicadores, Aplicar resultado Quest mock, **Handoff para produtor**, **Comunicação operacional (thread por pedido)**, **Escopo do pedido e confirmação operacional**, Pipeline, Oportunidade ↔ Sessão Quest, Leads, Oportunidades, Propostas, Sessões Quest, Follow-ups).
- **HandoffToProducerPanel**: secção no CRM do hotel — Gerar pedido operacional por oportunidade, ver status do handoff (HandoffStore); usa HotelToProducerHandoffService e HandoffIndicatorHelper.
- **OrderCommunicationPanel**: secção no CRM do hotel — thread por pedido, mensagens recentes, nova mensagem (mock), indicadores (dúvida pendente, resposta recebida); usa ProducerOrderCommunicationController e CommunicationIndicatorHelper.
- **OrderScopePanel**: secção no CRM do hotel — escopo actual, revisões de escopo, solicitar ajuste, aprovar/rejeitar revisão (quando aguarda hotel), visualizar status de confirmação operacional; usa ProducerOrderScopeController e ScopeIndicatorHelper.
- **OrderReadinessPanel**: secção no CRM do hotel — prontidão do pedido, bloqueios pendentes, resumo operacional, status pronto para preparação / não pronto; usa ProducerExecutionReadinessController e ReadinessIndicatorHelper.
- **OrderChecklistPanel**: secção no CRM do hotel — resumo do checklist operacional por pedido, pronto para preparação, preparação confirmada, pendências principais; usa ProducerPreparationChecklistController e ChecklistIndicatorHelper.
- **WebDashboardController**: dashboard mais simples (etapa 64); mantido para compatibilidade.
- **OpportunityPipelineView**: visão do pipeline comercial (estágios com contagem e títulos).
- **OpportunitySessionRelationView**: relação oportunidade–sessão Quest (sessão ou LastQuest*: decisão, CTA, próxima ação, prioridade, engajamento, qualidade, resumo).
- **ApplyQuestResultPanel**: acção mock "Aplicar resultado da sessão Quest à oportunidade" (botão por oportunidade; cria snapshot mock e chama ApplyQuestSessionToOpportunity).
- **CRMMetricsStripView**: faixa de indicadores agregados.
- **LeadListView**, **OpportunityBoardView**, **ProposalRecordView** (lista de propostas), **SessionRecordView**, **FollowUpTaskView**: listas/vistas por entidade.

A cena **WebDashboard** usa WebDashboardController; para o CRM completo use um GameObject com **HotelCRMDashboardController** (cenas WebDashboard, HotelCRM).

## Painel Produtor / Prestador (Assets/Web/Producer/)

- **Core**: ProducerOrderStatus, ProducerRequirementType, ProducerAcceptanceStatus, ProducerScopeChangeType, ProducerScopeConfirmationStatus, ScopeRevisionRequestedByRole, ProducerExecutionBlockingSeverity, **ProducerPreparationChecklistCategory** (Scope, Communication, Approval, Logistics, Materials, Team, Other).
- **Domain**: ProducerOrder, ProducerRequirementItem, ProducerExecutionNote, ProducerStatusUpdate, ProducerOrderScopeRevision, ProducerScopeChangeItem, ProducerScopeConfirmationState, ProducerExecutionBlockingItem, ProducerExecutionReadinessState, **ProducerPreparationChecklistItem**, **ProducerPreparationChecklistState**.
- **Application**: IMockProducerDataService, MockProducerDataService, HandoffStore, HandoffIndicatorHelper, ScopeRevisionStore, ProducerOrderScopeController, ScopeIndicatorHelper, ResolvedBlockingStore, ProducerExecutionReadinessController, ReadinessIndicatorHelper, **PreparationChecklistStore**, **ProducerPreparationChecklistController** (EnsureChecklist, MarkItemCompleted/Incomplete, ConfirmPreparation), **ChecklistIndicatorHelper**.
- **Presentation**: ProducerDashboardController, ProducerOrderListView, ProducerOrderDetailsView, ProducerAcceptancePanel, ProducerOrderCommunicationView, ProducerScopeRevisionView, ProducerReadinessView, **ProducerPreparationChecklistView** (checklist, marcar concluído, confirmar preparação), ProducerRequirementListView, ProducerStatusView, ProducerExecutionNotesView.
- **Scenes**: ProducerDashboard.unity.

O produtor não referencia CRM nem Quest; usa IDs e rótulos em ProducerOrder como ponte conceptual. Para comunicação operacional com o hotel, usa o módulo **Communication** (thread por OrderId). Para ajustes de escopo e confirmação operacional, usa **ProducerOrderScopeController** e **ScopeRevisionStore**. Para prontidão para execução, usa **ProducerExecutionReadinessController**. Para checklist operacional e confirmação de preparação, usa **ProducerPreparationChecklistController**. Ver **Docs/Web/WEB_PRODUCER.md**, **Docs/Web/WEB_COMMUNICATION.md**, **Docs/Web/WEB_SCOPE.md**, **Docs/Web/WEB_READINESS.md**, **Docs/Web/WEB_CHECKLIST.md**.

## Comunicação operacional (Assets/Web/Communication/)

- **Core**: CommunicationParticipantRole (HotelSales, HotelAdmin, Producer, InternalAdmin), CommunicationMessageType (GeneralNote, ClarificationRequest, ClarificationResponse, StatusUpdate, ScopeAdjustment, PriorityNote).
- **Domain**: CommunicationThread (OrderId como vínculo principal; OpportunityId, ProposalId, SessionId opcionais), CommunicationMessage (ThreadId, OrderId, SenderRole, MessageType, Content), CommunicationParticipant (ThreadId, Role, DisplayLabel).
- **Application**: CommunicationStore (em memória; GetOrCreateThread, GetThreadByOrderId, AddMessage, GetMessages, GetMessagesForOrder), **ProducerOrderCommunicationController** (EnsureThreadForOrder, GetOrCreateThread, AddMessage, AddClarificationRequest, AddClarificationResponse, AddStatusUpdate, AddGeneralNote), **CommunicationIndicatorHelper** (GetCommunicationLabel: Aguardando resposta do produtor/hotel, Escopo em esclarecimento, Comunicação ativa, Pronto para seguir).
- A thread é criada ao gerar o pedido (HotelToProducerHandoffService chama EnsureThreadForOrder). Hotel e Produtor usam OrderCommunicationPanel e ProducerOrderCommunicationView para ver e enviar mensagens (mock).
