Release v4928.1.4.2 stable

This commit is contained in:
2026-06-09 22:55:58 +01:00
commit 6445044ac6
280 changed files with 41775 additions and 0 deletions

View File

@@ -0,0 +1,120 @@
# ClientFlow v3.3 — HTMX manual e operação Jasmin mais estável
Esta versão é incremental sobre a v3.2 e foca-se em remover o comportamento visual estranho causado pelo auto-refresh do cartão **Documentos Jasmin**.
## Alterações principais
### 1. Documentos Jasmin sem auto-refresh
Foi removido o polling HTMX automático do cartão de Documentos Jasmin.
Antes:
```html
hx-trigger="every 10s"
```
Agora:
- o cartão não se reconstrói sozinho;
- existe botão **Atualizar estado**;
- os botões **Criar orçamento** e **Converter em fatura** continuam a atualizar o cartão uma vez após o clique;
- o operador controla quando quer atualizar o estado.
Fluxo esperado:
```text
[Criar orçamento]
→ cria item na outbox
→ mostra feedback imediato
→ timer/worker processa
→ operador clica [Atualizar estado]
→ vê orçamento criado ou erro
```
### 2. Feedback visível após ações Jasmin
Os botões continuam a devolver mensagens visíveis no cartão:
- Pedido de orçamento enviado para a outbox Jasmin.
- Pedido de fatura enviado para a outbox Jasmin.
- Erros de validação antes de criar a outbox.
### 3. Outbox Jasmin visível na oportunidade
O cartão de Documentos Jasmin continua a mostrar as ações da outbox associadas à oportunidade:
- action type;
- estado;
- erro resumido;
- botão **Reprocessar** para itens pendentes/falhados.
### 4. Validação antes de criar orçamento
Mantém-se a validação preventiva:
- cliente associado;
- NIF válido;
- nome fiscal;
- morada/código postal/cidade quando o cliente ainda não existe no Jasmin;
- pelo menos uma linha de produto;
- todas as linhas com `jasmin_sales_item`;
- preço unitário maior que zero.
### 5. SKU/Odoo separado de artigo Jasmin
Mantém-se a regra introduzida na v3.1/v3.2:
```text
products.sku = código interno/Odoo
products.jasmin_sales_item = artigo Jasmin
opportunity_items.sku = código interno/Odoo
opportunity_items.jasmin_sales_item = artigo Jasmin usado no orçamento
```
A criação de orçamento usa `jasmin_sales_item`, não o SKU Odoo.
## Deploy
Aplicar como nas versões anteriores:
```bash
rsync -avz --delete \
--exclude ".env" \
--exclude ".venv/" \
--exclude "venv/" \
--exclude "__pycache__/" \
--exclude ".git/" \
--exclude "*.db" \
--exclude "*.log" \
--exclude "uploads/" \
./ plx@alarmsys:/mnt/ssd/home/plx/clientflow_backend/
```
Depois no remoto:
```bash
cd /mnt/ssd/home/plx/clientflow_backend
source .venv/bin/activate
python -m py_compile app/*.py scripts/*.py
sudo systemctl restart clientflow-api
```
## Nota operacional
O botão **Atualizar estado** não processa a outbox. Ele apenas recarrega o cartão.
Para processar automaticamente, manter ativo o timer systemd da outbox Jasmin:
```bash
systemctl list-timers | grep clientflow-outbox-jasmin
```
Ou processar manualmente:
```bash
JASMIN_OUTBOX_ENABLED=true \
OUTBOX_TARGET_SYSTEM=jasmin \
OUTBOX_DRY_RUN=false \
python scripts/process_outbox.py
```