Import ClientFlow production v4928.1.5.132.4

This commit is contained in:
plx
2026-07-29 13:11:01 +00:00
parent 6445044ac6
commit 261d342057
405 changed files with 48373 additions and 1401 deletions

View File

@@ -0,0 +1,108 @@
# ClientFlow v4928.1.5.122 — Stabilization & Revenue Forecast
Data: 2026-07-14
## Objetivo
Consolidar a versão remota após os hotfixes v4928.1.5.x, corrigir regressões de workflow observadas em produção e introduzir uma previsão comercial auditável de 30/60/90 dias.
## Correções
### Orçamento enviado sem documento associado
Uma task `SEND_QUOTE` concluída passa a contar como evidência de que o orçamento foi enviado, independentemente de o documento Jasmin já estar associado.
Nestes casos, a próxima ação passa a ser:
- `RECONCILE_DOCUMENTS`
- **Associar orçamento enviado**
O motor deixa de sugerir `CREATE_JASMIN_QUOTE`, evitando orçamentos duplicados.
### Follow-ups alinhados com a fase
- `SEND_PROFORMA` passa a agendar `FOLLOW_UP_PAYMENT`.
- Em `WAITING_PAYMENT`, `FOLLOW_UP_QUOTE` e `FOLLOW_UP_PROFORMA` são convertidos em `FOLLOW_UP_PAYMENT`.
- Follow-ups de orçamento são encerrados quando existe uma task mais avançada, como `SEND_INVOICE`, `CONFIRM_PAYMENT`, `PREPARE_ORDER` ou `CREATE_SHIPMENT`.
- O agendador bloqueia novas cascatas de orçamento quando a oportunidade já avançou para fatura, pagamento ou operação.
Script de auditoria/reparação:
```bash
python scripts/repair_stale_followups.py
python scripts/repair_stale_followups.py --apply
```
O script é dry-run por defeito e não envia mensagens.
### Proteção do enriquecimento fiscal
Um resultado externo com `match_type=nif_exato` deixa de ser autoaplicado quando o nome empresarial devolvido contradiz o nome empresarial presente na fonte operacional.
- confiança máxima: 70%;
- `source_name_conflict=true` no payload da sugestão;
- autoaplicação bloqueada;
- decisão fica disponível para revisão manual.
### Segurança de produção
Em `prod`, `production` e `staging`:
- `CLIENTFLOW_ADMIN_TOKEN` é obrigatório;
- UI admin e API interna falham fechadas se a autenticação não estiver configurada;
- `admin_token` por query string é desativado;
- lookup externo ativo exige `EXTERNAL_COMPANY_LOOKUP_API_KEY`.
### Configuração e testes
- restaurado `.env.example` sem segredos;
- suíte final: **476 testes passados**;
- `compileall` sem erros.
## Previsão comercial de receitas
Novos endpoints:
- `/finance/forecast`
- `/financeiro/previsao`
- `GET /api/internal/revenue-forecast?limit=1000`
Modelo:
```text
valor ponderado = valor da oportunidade × probabilidade da fase × fator de atividade
```
Fontes de valor, por prioridade:
1. documento Jasmin atual/principal;
2. linhas da oportunidade;
3. `opportunities.value_amount`.
A probabilidade usa taxas históricas quando existem pelo menos oito oportunidades resolvidas que passaram pela fase. Sem amostra suficiente, usa probabilidades explícitas por fase.
O fator de atividade considera:
- recência da oportunidade;
- tasks vencidas;
- tasks concluídas recentemente;
- conflitos fiscais/identidade.
A página apresenta pipeline bruto e ponderado em:
- até 30 dias;
- 3160 dias;
- 6190 dias;
- mais de 90 dias.
Esta funcionalidade é uma previsão comercial. Não representa receita contabilística, faturação reconhecida ou tesouraria.
## Aplicação recomendada
```bash
python -m compileall -q app scripts tests
pytest -q
python scripts/repair_stale_followups.py
python scripts/repair_stale_followups.py --apply
sudo systemctl restart clientflow-api
```