# ClientFlow v4926.8.1 — Jasmin candidate association + fiscal suggestion cleanup

## Objetivo

Corrige dois problemas observados no detalhe de oportunidade:

1. Quando já existe um orçamento Jasmin para o cliente, a oportunidade mostrava "Ainda sem documentos Jasmin" e não dava uma forma clara de associar o orçamento existente antes de criar novo.
2. Sugestões fiscais antigas `accepted` podiam continuar visíveis com `NIF —`, mesmo quando o cliente fiscal atual já tinha NIF correto.

## Alterações

### Documentos Jasmin

- O painel `Documentos Jasmin` passa a procurar documentos Jasmin compatíveis em `reconciliation_items` por:
  - `customer_id` interno;
  - NIF fiscal;
  - NIF dentro do payload Jasmin;
  - email;
  - domínio no payload;
  - nome fiscal exato.
- Se encontrar candidatos ainda não importados, mostra aviso: associar documento existente antes de criar novo.
- Novo botão por candidato: `Associar e importar`.
- Novo endpoint:
  - `POST /opportunities/{opportunity_id}/jasmin/link-candidate/{item_id}`
- A ação liga o `reconciliation_item` à oportunidade e reaproveita o backfill Jasmin para importar:
  - `commercial_documents`;
  - `commercial_document_lines`;
  - `opportunity_items`;
  - `value_amount`;
  - `product_interest`.

### Sugestões fiscais

- `list_fiscal_suggestions_for_opportunity` passa a fazer `LEFT JOIN customers` para preencher `suggested_nif`/`suggested_name` com o cliente interno quando a sugestão antiga tem NIF vazio.
- A UI deixa de mostrar sugestões `accepted` que apenas confirmam o cliente fiscal já ligado à oportunidade.
- Isto remove ruído como `SEMENTENERGIAS accepted NIF —` quando a ficha fiscal atual já mostra `NIF 516356216`.

## Validação

- `python -m compileall -q app scripts`
