# ClientFlow v4926.8.2 ## Objetivo Evitar que uma oportunidade associe/importa um orçamento Jasmin antigo, fechado, convertido ou anulado quando existe um orçamento/proforma aberto mais recente para o mesmo cliente fiscal. ## Alterações - Classificação de ciclo de vida dos documentos Jasmin a partir de `payload.record`: - `documentStatusDescription` - `documentStatus` - `documentLineStatusDescription` - `statusWasCompleted` - `isDeleted` - `isDraft` - Candidatos Jasmin agora são ordenados por: 1. aberto/válido primeiro; 2. quotation/proforma antes de invoice; 3. data/série mais recente; 4. score de match fiscal. - Documentos fechados/convertidos/anulados aparecem apenas como auditoria e o botão fica desativado. - `link_and_import_jasmin_candidate_async` rejeita importação de candidato não aberto/válido. - Novo botão na UI: **Sincronizar Jasmin** para buscar documentos recentes antes de escolher candidato. - Novo botão na UI: **Substituir atual**, para trocar um orçamento/proforma importado por engano por um candidato aberto mais recente. - Novo script de inspeção: - `scripts/inspect_jasmin_candidates_for_opportunity.py` - Novo script de reparação: - `scripts/replace_jasmin_document_for_opportunity.py` ## Operação segura Para diagnosticar: ```bash PYTHONPATH=. python scripts/inspect_jasmin_candidates_for_opportunity.py \ --opportunity-id \ --sync \ --days 30 ``` Para substituir por um candidato válido: ```bash PYTHONPATH=. python scripts/replace_jasmin_document_for_opportunity.py \ --opportunity-id \ --item-id \ --dry-run PYTHONPATH=. python scripts/replace_jasmin_document_for_opportunity.py \ --opportunity-id \ --item-id ```