# v4928.1.5.105 — fechar oportunidade só com fatura enviada e WH/OUT concluído

## Objetivo

Alinhar a decisão final da oportunidade com o fluxo operacional BLIF:

- pagamento antes do envio: orçamento → pagamento → fatura → envio fatura → Odoo/WH-OUT → concluir;
- pagamento pós-entrega: Odoo/WH-OUT → fatura → envio fatura → follow-up pagamento → concluir.

## Alterações

- `CLOSE_OPPORTUNITY` só é sugerido quando existe:
  - fatura associada;
  - evidência de fatura enviada ao cliente;
  - pagamento confirmado;
  - venda Odoo ligada;
  - picking/WH-OUT concluído.
- Se WH/OUT está concluído mas a fatura ainda não foi enviada, a próxima ação volta a ser `SEND_INVOICE`.
- Se o pagamento é pós-entrega e WH/OUT/fatura enviada estão OK, mas pagamento ainda não está confirmado, a próxima ação é `FOLLOW_UP_PAYMENT`.
- `FOLLOW_UP_PAYMENT` passa a poder ser materializado automaticamente em task pendente, tal como `SEND_INVOICE`.
- Ordens de fabrico/MO (`WH/MO/...`) deixam de conduzir a decisão principal; ficam apenas como detalhe técnico Odoo.
- O painel Odoo da oportunidade passa a apresentar produção/preparação dentro de `<details>` técnico, deixando a venda e WH/OUT como sinal operacional principal.
- `workflow_guard.delivered` passa a bloquear fecho sem evidência de fatura enviada.

## Validação rápida

```bash
PYTHONPATH=. python -m py_compile \
  app/domain/opportunity_flow/evidence.py \
  app/domain/opportunity_flow/rules.py \
  app/workflow_guard.py \
  app/opportunity_action_task_materializer.py \
  app/admin_ui/pages/opportunities.py \
  scripts/repair_missing_materialized_next_action_tasks.py

PYTHONPATH=. pytest -q tests/test_v4928_1_5_105_odoo_done_close_requires_invoice_sent_static.py
```

## Backfill opcional

```bash
PYTHONPATH=. python scripts/repair_missing_materialized_next_action_tasks.py
PYTHONPATH=. python scripts/repair_missing_materialized_next_action_tasks.py --apply
```
