# Aceite final do hotel e encerramento do ciclo (Etapa 75)

## Visão geral

A **Etapa 75** cria a **base de aceite final do hotel** e **encerramento completo do ciclo operacional/comercial** do pedido: o fluxo Quest → Hotel → Produtor termina com um estado formal de conclusão. O hotel pode revisar o relatório final do produtor, aceitar ou rejeitar a entrega, solicitar ajuste final, registar notas e encerrar o ciclo. O produtor visualiza o status desse aceite. Opcionalmente, a oportunidade de venda (SalesOpportunity) é marcada como Won quando o ciclo é encerrado.

| Conceito | Descrição |
|----------|-----------|
| **Estado de aceite** | **HotelFinalAcceptanceState**: ProducerOrderId, IsHotelAcceptanceOpen, AcceptanceStatus, AcceptedAt, RejectedAt, NeedsFinalAdjustment, FinalAcceptanceSummary, HotelAcceptanceNotes, ClosedAt, IsOrderCycleClosed. |
| **Status** | **HotelFinalAcceptanceStatus**: PendingReview, Accepted, Rejected, NeedsAdjustment, Closed. |
| **Controller** | **HotelFinalAcceptanceController**: CanHotelReviewFinal, GetOrCreateState, GetState, AcceptFinalDelivery, RejectFinalDelivery, RequestFinalAdjustment, CloseOrderCycle, IsOrderCycleClosed. |
| **Store** | **HotelFinalAcceptanceStore**: GetOrCreate, SetState, GetState, IsOrderCycleClosed (em memória). |
| **Indicadores** | **HotelFinalAcceptanceIndicatorHelper**: GetAcceptanceLabel, GetHotelAcceptanceIndicator, GetProducerAcceptanceIndicator, HasObservations. |

## Fluxo

1. **Revisão disponível**  
   O hotel só pode tomar decisão de aceite final quando **ProducerExecutionFinalReport** existe e **ClosedByProducerAt** está preenchido (produtor concluiu operacionalmente). **CanHotelReviewFinal(orderId)** devolve true nesse caso.

2. **Aceitar entrega**  
   **AcceptFinalDelivery(orderId, summary, notes)** define AcceptanceStatus = Accepted, AcceptedAt, IsHotelAcceptanceOpen = false, FinalAcceptanceSummary, HotelAcceptanceNotes e chama **SetHotelAcknowledged** no relatório.

3. **Rejeitar**  
   **RejectFinalDelivery(orderId, summary, notes)** define Rejected, RejectedAt, IsHotelAcceptanceOpen = false.

4. **Solicitar ajuste final**  
   **RequestFinalAdjustment(orderId, summary, notes)** define NeedsAdjustment, NeedsFinalAdjustment = true, IsHotelAcceptanceOpen = true (o hotel pode depois aceitar ou rejeitar).

5. **Encerrar ciclo**  
   **CloseOrderCycle(orderId, notes)** só é permitido quando AcceptanceStatus é Accepted ou Rejected. Define IsOrderCycleClosed = true, ClosedAt, AcceptanceStatus = Closed. Opcionalmente, se o pedido tem **OpportunityId**, a camada Web pode marcar a **SalesOpportunity** como **Won** (MarkOpportunityOrderCycleClosed no mock).

## Relação entre relatório final, aceite e fechamento

- **Relatório final (Etapa 74)**: produtor gera e conclui operacionalmente → relatório com ClosedByProducerAt.
- **Aceite final (Etapa 75)**: hotel revisa esse relatório e decide: Aceitar | Rejeitar | Solicitar ajuste.
- **Encerramento**: após aceitar ou rejeitar, o hotel pode clicar "Encerrar ciclo" → estado formal de conclusão do pedido; opcionalmente a oportunidade passa a Won no pipeline.

## Indicadores

- **Aguardando aceite final do hotel**: produtor concluiu; hotel ainda não decidiu (PendingReview ou sem estado).
- **Aceite final concedido**: AcceptanceStatus = Accepted.
- **Ajuste final solicitado**: NeedsAdjustment / AcceptanceStatus = NeedsAdjustment.
- **Ciclo encerrado**: IsOrderCycleClosed = true, AcceptanceStatus = Closed.
- **Concluído com observações**: HotelAcceptanceNotes preenchido.

## Integração

- **ProducerOrder**: identificação (orderId, OpportunityId para opcional atualização do pipeline).
- **ProducerExecutionFinalReport / FinalReportStore**: CanHotelReviewFinal usa relatório e ClosedByProducerAt; AcceptFinalDelivery chama SetHotelAcknowledged.
- **ProducerExecutionStatusState**: não alterado; contexto da execução já está no relatório.
- **SalesOpportunity**: opcionalmente Stage = Won quando o ciclo é encerrado (MarkOpportunityOrderCycleClosed no mock).
- **ProposalRecord, SessionRecord, FollowUpTask**: ligação conceptual por oportunidade/pedido; sem alteração directa nesta etapa.

Nenhuma alteração em Quest, handoff, comunicação, escopo, readiness, checklist, tracking de execução nem relatório final (apenas novas secções e lógica de aceite/encerramento).

## UI

- **Hotel (OrderFinalAcceptancePanel)**  
  Por pedido: indicador e se ciclo encerrado. Se não pode rever (sem relatório/conclusão do produtor): mensagem de espera. Caso contrário: resumo e notas do aceite, datas de aceite/rejeição/encerramento; botões "Aceitar entrega", "Rejeitar", "Solicitar ajuste" (quando PendingReview ou NeedsAdjustment); botão "Encerrar ciclo" (quando Accepted ou Rejected e ainda não encerrado).

- **Produtor (ProducerFinalReportView)**  
  Por pedido, na secção do relatório final: linha "Aceite final hotel: [indicador]" (aguardando, aceite concedido, rejeitado, ajuste solicitado, ciclo encerrado); resumo e notas do hotel quando existirem.

## Limitações actuais

- Sem persistência real (HotelFinalAcceptanceStore em memória).
- Sem workflow empresarial (aprovações em cadeia, notificações ao produtor quando o hotel rejeita ou solicita ajuste).
- Notas e resumo são texto livre; sem campos estruturados para “motivo da rejeição” ou “itens a ajustar”.
- Atualização da oportunidade para Won é opcional e apenas no mock (sem sincronização com CRM externo).
