56 lines
1.9 KiB
Markdown
56 lines
1.9 KiB
Markdown
# ClientFlow v4.9.26.5 — Manual opportunity from fiscal customer
|
|
|
|
Inclui também a hotfix `v4926.4.1_skip_duplicate_identity_suggestion`.
|
|
|
|
## Alterações principais
|
|
|
|
- Página do cliente fiscal passa a ter formulário **Nova oportunidade**.
|
|
- Permite criar oportunidade manual por telefone, WhatsApp, email, presencial ou manual.
|
|
- A oportunidade nasce já ligada ao `customers.id` fiscal.
|
|
- Opcionalmente cria uma task inicial para a próxima ação.
|
|
- Guarda snapshot fiscal do cliente na metadata da oportunidade.
|
|
- Regista evento `manual_opportunity_created` na timeline da oportunidade.
|
|
- O assistente de identidade de email deixa de criar sugestão pendente duplicada quando o cliente sugerido já é o cliente fiscal atual.
|
|
- O detalhe da oportunidade mostra mensagem específica quando a identidade extraída confirma o cliente fiscal atual.
|
|
|
|
## Configuração recomendada
|
|
|
|
```env
|
|
EMAIL_IDENTITY_EXTRACTION_ENABLED=true
|
|
EMAIL_IDENTITY_EXTRACTION_USE_LLM=true
|
|
EMAIL_IDENTITY_LLM_MODEL=qwen/qwen3-235b-a22b-2507
|
|
EMAIL_IDENTITY_LLM_FALLBACK_MODEL=qwen/qwen3-max
|
|
EMAIL_IDENTITY_LLM_TIMEOUT_SECONDS=20
|
|
EMAIL_IDENTITY_LLM_MAX_BODY_CHARS=3500
|
|
```
|
|
|
|
## Testes manuais recomendados
|
|
|
|
### Criar oportunidade a partir de cliente fiscal
|
|
|
|
1. Abrir `/customers`.
|
|
2. Abrir uma ficha de cliente.
|
|
3. Usar o formulário **Nova oportunidade**.
|
|
4. Confirmar que a nova oportunidade abre em `/opportunities/{id}`.
|
|
5. Confirmar que o cliente fiscal já está associado.
|
|
6. Confirmar que a task inicial aparece quando a checkbox está marcada.
|
|
|
|
### Validar skip duplicate identity suggestion
|
|
|
|
```bash
|
|
PYTHONPATH=. python - <<'PY'
|
|
from app.fiscal_enrichment_service import assist_email_identity_enrichment
|
|
print(assist_email_identity_enrichment("OPPORTUNITY_ID", refresh=True, apply_safe=False))
|
|
PY
|
|
```
|
|
|
|
Se a identidade extraída apontar para o mesmo cliente fiscal já associado, o esperado é:
|
|
|
|
```json
|
|
{
|
|
"suggested": 0,
|
|
"skipped": 1,
|
|
"status": "email_identity_matches_current_fiscal_customer"
|
|
}
|
|
```
|