From 6f5d1833657557b43203c2e306986f9d0fb2d8ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Faleiros?= Date: Tue, 29 Sep 2026 10:57:34 -0300 Subject: [PATCH] fix: show the real freight status on the Kanban The Integrations tab always said freight was not configured. It now reads the server's adapter and, with Jadlog on, shows the package weight rule and the production days the Site prices with. Co-Authored-By: Claude Opus 5.5 --- app/api/operator.py | 12 ++++++++++-- web/kanban.js | 7 ++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/api/operator.py b/app/api/operator.py index 2ef06dd..68d4c14 100644 --- a/app/api/operator.py +++ b/app/api/operator.py @@ -17,7 +17,7 @@ from ..printjobs import queue as queue_print_files from .. import quote_review from .. import tiny from ..runtime import (BACK, BOARD_FINISHED_LIMIT, BOARD_QUOTE_LIMIT, ENVIRONMENT, STATES, TRANSITIONS, payment, - enqueue, quote_view, storage) + enqueue, freight, quote_view, storage) from ..scanning import require_clean router = APIRouter() @@ -59,6 +59,14 @@ def operator_logout(request: Request, response: Response): audit('operator_logout') return {'ok': True} +def freight_status(): + """What delivery the Site offers, and the package rule it prices with.""" + if freight.name != 'jadlog': + return {'provider': freight.name} + return {'provider': 'jadlog', 'base_kg': str(freight.base_kg), 'per_metre_kg': str(freight.per_metre_kg), + 'production_days': freight.production_days} + + @router.get('/api/operator/board') def board(user=Depends(operator)): with db.connect() as c: @@ -91,7 +99,7 @@ def board(user=Depends(operator)): WHERE (outcome LIKE 'refused%' OR outcome LIKE 'attention%') AND resolved_at IS NULL''').fetchone()['n'] return {'states': STATES, 'transitions': TRANSITIONS, 'back': BACK, 'orders': orders, 'payment_issues_total': issues_total, 'tiny': tiny_status(), 'operator': user, - 'providers': {'payment': payment.name}, 'environment': ENVIRONMENT, + 'providers': {'payment': payment.name, 'freight': freight_status()}, 'environment': ENVIRONMENT, 'finished_shown': len(finished), 'finished_total': finished_total, 'quotes': [quote_view(c, q) for q in pending + approved], 'pending_total': pending_total, 'approved_total': approved_total} diff --git a/web/kanban.js b/web/kanban.js index 4463853..9d9010b 100644 --- a/web/kanban.js +++ b/web/kanban.js @@ -657,7 +657,12 @@ function renderIntegrations(){ const mp=board.providers?.payment; cards.push(integration('Mercado Pago',mp==='mercadopago'?'Ativo':'Não configurado',mp==='mercadopago'?'ok':'off', mp==='mercadopago'?'PIX e cartão ativos.':'Aguardando credenciais.')); - cards.push(integration('Frete','Não configurado','off','Somente retirada.')); + const fr=board.providers?.freight||{}; + const kg=v=>String(v).replace('.',',')+' kg'; + cards.push(fr.provider==='jadlog' + ? integration('Frete','Ativo','ok','Entrega pela Jadlog e retirada em Franca. Pacote: '+kg(fr.base_kg)+ + ' + '+kg(fr.per_metre_kg)+' por metro · prazo da Jadlog + '+fr.production_days+' dia(s) de produção.') + : integration('Frete','Não configurado','off','Somente retirada.')); cards.push(integration('WhatsApp','Não configurado','off','Mensagens registradas, sem envio.')); $('integrations').replaceChildren(...cards); eventFilters();