Skip to content

1.11.13

⚙️ Patch 1.11.13 — Wholesaler orders: positions, n8n parse, credentials, caching

🚀 Summary

Extends Wholesalers → Orders with merged positions (line item + tracking per row), sync n8n file parse into the create dialog, a Credentials tab for the parse webhook (X-API-KEY), localStorage caching with Reload, and order files on a dedicated wholesalers_orders volume (File Manager).

✨ Details

Area Behavior
Positions wholesale_po_items carries carrier, tracking, status, units, goods value; separate shipments table removed / migrated
Create order Upload file → parse via n8n → fill order_number, order_date, order_value_net, total_units + items; editable table with headers and line totals (qty × unit price)
n8n contract Production: JSON with items[] (+ optional header fields). Test: HTTP < 400 on webhook-test URL; stored DB token used if field empty
Credentials Wholesalers → Credentials: webhook URL, generate/save token, Test connection
Files Volume wholesalers_orders on omni (/app/wholesalers_orders) and File Manager (/srv/wholesalers_orders); download from order drawer
Caching Directory + Orders cache in localStorage; filter client-side; Reload / mutate refreshes
Delete wholesaler Cascades linked purchase orders (confirm warns)
Carriers DHL, UPS, GLS, DPD, DSV, Hermes, FedEx, freight, pickup (+ tracking URLs)

📌 Notes

  • Redeploy service-omni, frontend, and file-manager (new volume). Restart omni so ensure_wholesale_po_positions_merged runs, or apply docker/postgres/updates/merge_wholesale_po_items_shipments.sql.
  • Add wholesalers_orders in Portainer compose as well (docker-compose-portainer.yml).
  • Tracking status updates for open tracked positions are intended via a second n8n job reading/updating Postgres directly (tracking_no set, status <> delivered).

✅ Verify

  1. Wholesalers → Credentials → save webhook + token → Test connection succeeds on HTTP OK.
  2. Orders → New order → choose wholesaler + file → Parse with n8n → header fields and positions fill; line totals show; Create attaches file.
  3. Order drawer → Positions: edit tracking/carrier, mark delivered; Download invoice file when present.
  4. Switch Open ↔ Payment due without network reload of summary; Reload refetches.
  5. Delete a wholesaler that has demo orders → succeeds after confirm.

📁 Files

  • backend/service_omni/app/schemas/wholesale_purchase_orders.py, crud/, api/.../wholesale_orders.py
  • backend/service_omni/app/services/wholesale_orders/ — calc.py, files.py, n8n_parse.py
  • backend/service_omni/app/core/schema_patches.py
  • docker/postgres/updates/merge_wholesale_po_items_shipments.sql, add_wholesale_purchase_orders.sql, seed
  • docker-compose.yml, docker-compose-portainer.yml — wholesalers_orders volume
  • frontend/src/pages/Wholesalers/ — OrdersTab.jsx, CredentialsTab.jsx, index.jsx, cache.js, orderConstants.js
  • frontend/src/services/api/omni/wholesaleOrders.js
  • docs/docs/services/service_omni/services/wholesale_orders.md
  • docs/docs/infrastructure/file_manager.md
  • docs/docs/patchnotes/1.11/1.11.13.md — this file