# Ajustes de escopo e confirmação operacional (Etapa 70)

## Visão geral

A **Etapa 70** introduz a base de **ajuste de escopo do pedido** e **confirmação operacional** entre hotel e produtor: revisões de escopo com aprovação bilateral (hotel e produtor), versão actual do escopo e indicador de “pronto para preparação”.

| Conceito | Descrição |
|----------|-----------|
| **Revisão de escopo** | **ProducerOrderScopeRevision**: alterações propostas (ChangeItems) ao escopo do pedido; quem pediu (RequestedByRole), resumo, aprovação hotel/produtor, revisão activa. |
| **Item de mudança** | **ProducerScopeChangeItem**: tipo (AddItem, RemoveItem, ReplaceItem, ClarifyRequirement, ChangePriority, ChangeExecutionNote), referência, descrição, valor anterior/novo. |
| **Estado de confirmação** | **ProducerScopeConfirmationState** por pedido: Status (Draft, PendingHotelApproval, PendingProducerApproval, Confirmed, Rejected, NeedsRevision), ConfirmedRevisionId. |

## Como as versões de escopo são tratadas

- **Escopo inicial**: o pedido (ProducerOrder) tem OrderSummary, RequiredShowroomItems, KeyNotesFromSales, etc. Sem revisões confirmadas, o escopo em vigor é o do próprio pedido.
- **Revisão**: qualquer dos lados pode criar uma **ProducerOrderScopeRevision** (hotel via “Solicitar ajuste de escopo”, produtor via “Propor ajuste de escopo”). A revisão tem **RequestedByRole** (HotelSales, Producer, etc.):
  - Se o **produtor** pediu → estado inicial **PendingHotelApproval** (hotel aprova ou rejeita).
  - Se o **hotel** pediu → estado inicial **PendingProducerApproval** (produtor aprova ou rejeita).
- **Aprovação**: cada lado vê apenas as revisões que aguardam a sua aprovação. Ao **aprovar**, o controlador marca IsApprovedByHotel ou IsApprovedByProducer. Quando **ambos** aprovaram, a revisão passa a **Confirmed** e é marcada como **IsCurrentActiveRevision**; o **ProducerScopeConfirmationState** do pedido fica com Status = Confirmed e ConfirmedRevisionId = essa revisão.
- **Rejeição**: um dos lados pode rejeitar; a revisão fica com Status = Rejected e nota opcional.
- **Versão actual**: a revisão com **IsCurrentActiveRevision** é a versão de escopo confirmada em vigor. A UI mostra “Escopo actual” (OrderSummary do pedido ou da revisão activa, conforme implementação) e “Operacionalmente confirmado” quando Status = Confirmed.

## Integração

- **ProducerOrder**: revisões e estado de confirmação são identificados por **ProducerOrderId** (OrderId). Nenhum campo do ProducerOrder é alterado pela revisão de escopo; a ligação é por ID.
- **Communication**: pedidos de esclarecimento ou ajuste podem ser acompanhados por mensagens na thread (CommunicationMessage tipo ScopeAdjustment ou GeneralNote); a revisão de escopo é o registo formal das alterações e aprovações.
- **SalesOpportunity / ProposalRecord / SessionRecord**: ligação conceptual por IDs no pedido (OpportunityId, ProposalId, SessionId); não há referência directa destes tipos no módulo de escopo.

Sem dependência circular: o módulo de escopo vive em **Producer** (Core, Domain, Application); o hotel usa Producer.Application e Producer.Domain para ler/escrever revisões.

## Indicadores

- **ScopeIndicatorHelper.GetScopeStatusLabel(state, activeRevision)**:
  - "Escopo inicial" (Draft ou sem estado).
  - "Aguardando aprovação do hotel" (PendingHotelApproval).
  - "Aguardando aprovação do produtor" (PendingProducerApproval).
  - "Escopo confirmado" (Confirmed).
  - "Revisão rejeitada" (Rejected).
  - "Escopo em revisão" (NeedsRevision).
- **GetReadyForPreparationLabel(state, orderAccepted)**: "Pronto para preparação" quando Status = Confirmed e pedido aceite pelo produtor.

## Limitações actuais

- Sem persistência real: **ScopeRevisionStore** é em memória; revisões e estados perdem-se ao reiniciar.
- Sem workflow empresarial complexo (ex.: múltiplas rondas de revisão automáticas, notificações, prazos).
- Aplicação do escopo confirmado ao pedido (ex.: actualizar RequiredShowroomItems a partir da revisão) não está implementada; a revisão serve como registo de alterações e acordo bilateral.
