121 lines
2.9 KiB
Markdown
121 lines
2.9 KiB
Markdown
# 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
|
|
```
|