"""Integration configuration and action routes. Moved from app.admin_dashboard in v4.7.2. The handlers still reuse legacy helpers to keep this refactor behavior-preserving. """ from fastapi import APIRouter import app.admin_dashboard as legacy from app.admin_dashboard import * # noqa: F401,F403 router = APIRouter() @router.get("/integrations", response_class=HTMLResponse) @router.get("/integracoes", response_class=HTMLResponse) async def integrations_page(): odoo_stats = {} odoo_last_sync = "—" odoo_error = "" try: snapshot = get_odoo_product_snapshot(limit=1) odoo_stats = snapshot.get("stats") or {} odoo_last_sync = odoo_stats.get("last_synced_at") or "—" except Exception as exc: odoo_error = str(exc) def badge(enabled: bool) -> str: if enabled: return 'Ativo' return 'Inativo' odoo_enabled = bool(getattr(settings, "odoo_enabled", False)) jasmin_enabled = bool(getattr(settings, "jasmin_enabled", False)) packlink_enabled = bool(getattr(settings, "packlink_enabled", False)) chatwoot_enabled = bool(getattr(settings, "chatwoot_base_url", "")) odoo_error_html = "" if odoo_error: odoo_error_html = f"""
Erro Odoo: {esc(odoo_error)}
""" body = f"""
Configuração

Integrações

Ligações externas usadas pelo cockpit operacional.

Odoo

Produtos vendáveis, stock e estado operacional.
{badge(odoo_enabled)}
Base URL
{esc(getattr(settings, "odoo_base_url", "") or "—")}
Base de dados
{esc(getattr(settings, "odoo_db", "") or "—")}
Produtos sincronizados
{esc(odoo_stats.get("synced_products") or 0)}
Com BOM
{esc(odoo_stats.get("products_with_bom") or 0)}
Com stock disponível
{esc(odoo_stats.get("products_with_available_stock") or 0)}
Último sync
{esc(odoo_last_sync)}
{odoo_error_html}

Jasmin

Orçamentos, faturas e documentos fiscais.
{badge(jasmin_enabled)}
Base URL
{esc(getattr(settings, "jasmin_base_url", "") or "—")}
URL público
{esc(getattr(settings, "jasmin_public_url", "") or "—")}

Packlink PRO

Recolhas, envios, etiquetas e tracking.
{badge(packlink_enabled)}
Base URL
{esc(getattr(settings, "packlink_base_url", "") or "—")}
URL público
{esc(getattr(settings, "packlink_public_url", "") or "—")}

Chatwoot

Comunicação com cliente.
{badge(chatwoot_enabled)}
Base URL
{esc(getattr(settings, "chatwoot_base_url", "") or "—")}
URL público
{esc(getattr(settings, "chatwoot_public_url", "") or "—")}

Regra operacional

O ClientFlow não replica Odoo, Jasmin ou Packlink. Apenas consulta e guarda o estado necessário para decidir a próxima ação com o cliente.

""" return layout("Integrações", "Configuração das ligações externas", body, "integrations") @router.post("/integrations/odoo/test") async def integrations_odoo_test_action(request: Request): try: test_odoo_connection() except Exception: pass return RedirectResponse(url="/integrations", status_code=303) @router.post("/integrations/odoo/sync-products") async def integrations_odoo_sync_products_action(request: Request): try: sync_odoo_products(limit=1000, include_inactive=True) except Exception: pass return RedirectResponse(url="/integrations", status_code=303)