Changelog
Each release's date and main changes. Newest at the top.
To upgrade: left navigation About → Check for Updates → follow the install prompt. The plugin .app is reinstalled by Solution Provider.
v1.6.5 — 2026-05-04
Multiple GRNs per PO + delta-based booking + master/detail grid
One PO can now have multiple GRNs
- Previously a PO mapped to a single GRN — partial receipts caused data loss.
- Each RECEIVING / RECEIVED / CLOSED webhook now creates a fresh GRN containing only the delta (cumulative minus already-booked).
- Retransmits naturally skip (delta = 0) — no double-booking.
Critical bug fixes
- Unit confusion:
PODTL.TransferedQtyis stored in EA (smallest qty), not the PO line's UOM. The previous code compared cumulative-in-CT against booked-in-EA — delta math was off. Everything is now compared in EA. - PODTL.TransferedQty not advancing:
grn.AddDetail()doesn't link the GRN to the PO viaFromDocType, so AutoCount didn't updateTransferedQty. We now manuallyUPDATE PODTL.TransferedQty += actual SmallestQtyaftergrn.Save(), so the next webhook computes against an accurate baseline. - Qty-rounding drift: AutoCount rounds line
Qtyto the item-master's decimal places (e.g. 2.5 CT → 3 CT). We read backGRDTL.SmallestQtyafter save and use the actual value to advancePODTL.TransferedQty— keeps PO ↔ GRN ↔ inventory aligned even when rounding occurs.
More robust receive-quantity sourcing
- WMS sometimes leaves
asnLineItems[].quantityat 0 while the actual receipts live inasnItemReceiveDetails(per-event RV records). - The new logic sums
receiveQtyacross both sources and takes the MAX per SKU — works regardless of which field WMS populated.
Plugin UI: PO → ASN Sync master/detail
- Master row: one per PO + a GRNs count column
- Click ▶ to expand: every GRN for that PO with GRN # (View button) / WMS Status / GRN Date / Created By / Items / Webhook At
Removed
- The "DUPLICATE_SKIPPED" guard from v1.6.3 — the delta logic replaces it naturally.
v1.6.4 — 2026-05-03
Plugin stall fix
- M009 schema migration: auto-creates a filtered index on
Z_WmsPickingNoteStatus(WmsSyncEnabled).- Previously,
PickingNoteWorker's 15-second poll did a full table scan on every cycle. On databases with 50K+ rows, lock contention stalled the plugin UI for tens of seconds. - Now the worker hits only the small "currently syncing" subset via the index — milliseconds. Plugin's Picking List loading is no longer slow.
- Customer-invisible: index is created instantly on API startup (< 1 second), no data impact.
- Previously,
v1.6.3 — 2026-05-02
Sync Log overhaul + duplicate-GRN protection + Retry Failed buttons
Sync Log enhancements
- View Payload dialog: select a row + click View Payload (or double-click) to open a dialog showing pretty-printed Request + Response JSON, each panel with a Copy button.
- Ctrl + Alt + 0 cleanup panel: on the Sync Log tab, this hotkey opens a "Cleanup & Retention" dialog supporting date-range + Type-based bulk Clear Payloads (preserves rows) or Delete Rows (hard delete).
- Auto per-day cleanup: controlled by
PayloadRetentionDayssetting (default 90 days). Every hour the API NULLs payload columns on rows older than N days, bounding DB growth. - All workers now save full payloads: previously only PoTransferController + ItemSync saved payloads; now PickingNoteWorker / AsnCreateWorker / CancellationWorker / AsnCancellationWorker do too.
Duplicate GRN protection
- WmsCallbackController.HandleAsnStatus: now checks
Z_WmsAsnReceivingandPODTL.TransferedQtybefore creating a new GRN. - Previously, every ASN webhook re-fire (network retransmit, partial→complete reception, per-SKU partial deliveries) would create a fresh GRN. Now duplicates are skipped, callback row links to the original GRN.
- Source labelling:
Z_WmsAsnReceivingorPODTL.TransferedQtyfor clear audit.
New Retry Failed buttons
- One on each of three tabs:
- Item Code Sync → "Retry Failed Items" (ticked rows)
- PO → ASN Sync → "Retry Failed PO Pushes" (Ctrl+Click selected rows)
- Picking List Sync → "Retry Failed Picking Notes" (ticked rows)
- All have confirmation dialogs listing what's about to retry. Touches selected rows only — never bulk-retries.
AsnCreateWorker no longer retries forever
- Failed POs are now parked at
WmsStage = 'Failed'and skipped on the next poll. - Previously every 15 seconds it retried — for permanently-bad POs, it would keep hammering WMS.
- Users must check the Sync Log for the cause, fix it, then explicitly use Retry Failed PO Pushes.
Other
- All Sync Now buttons get confirmation dialogs (Picking / Item Code / Item Type).
- Item Code Sync Now cap raised from 5 to 20.
- Sync Log column header z-order bug fixed (was hidden by injected button bar).
v1.6.2 — 2026-05-02
Large-PO support + B2B order type + picking-note SQL timeout fix
- WmsGatewayClient: replaced
FormUrlEncodedContentwith manual byte-identicalStringContent.FormUrlEncodedContenthad an internal ~65520-char URI cap, causing PO pushes with 200+ line items to fail with "Invalid URI: The Uri string is too long".- Now 1000+ line items work.
- PickingNoteWorker: OrderType =
B2B, addedserviceLevel = LTL.- Melodies' warehouse flow needs both, otherwise the Ship button fails downstream.
- PickingNoteWorker SQL timeout: replaced
db.GetDataTablewith rawSqlCommand+CommandTimeout = 120.- Customer's DB has 50K+ Z_PickingNote rows + millions of detail rows; the 30-second default timed out.
v1.6.1 — 2026-05-02
PO Transfer skips local item check + full payload logging
- PoTransferController: removed pre-push item-exists check.
- Customer prefers WMS returning errors directly (more authoritative + real-time).
- WMS errors (with full request + response) saved to Z_WmsSyncLog for diagnostics.
- On push failure, the entire request + response payload lands in the sync log.
v1.6.0 — 2026-05-02
Major navigation + UI overhaul
Default menu order changed
- Operation menu order: Item Code Sync → PO → ASN Sync → Picking List Sync → Cancel Picking Job → Sync Log → About.
- Item Type Sync and UOM Names Sync are no longer separate menus — they're now buttons in the top-right of Item Code Sync (modal dialogs).
Default behaviour changes
- Picking List Sync defaults to manual: Auto-sync new is OFF by default; revealed via Ctrl + Alt + 0 dialog (advanced).
- Cancel Picking Job is read-only by default: rows can't be ticked unless Ctrl + Alt + 0 enables "selectable mode".
- Default landing page is Item Code Sync (was Picking List).
Search functionality
- Each tab has a Search textbox + Filter button.
- Enter key = trigger Filter.
- Search is "any column match": item code, PN number, PO number, customer name, driver, remark…
Page titles
- Header dynamically displays the current page ("WMS Sync Hub / Item Code Sync"), no longer just the logo.
Picking List column width
- Picking Note column shrunk by 70% to free up space.
- ItemCode column shrunk by 20%.
v1.5.0 — 2026-05-02
UOM push opt-in + per-row trigger + full sync log audit
- PackageInfoSyncStarted master switch: UOM description push (Phase 2) is OFF by default; explicit opt-in.
- Push UOM (focused) button: top-right of Item Code Sync, pushes UOM for the currently focused row only. Pre-condition: item must be already synced (LastSyncDate not null).
- Z_WmsSyncLog audit: UOM_PUSH log entries store the full payload.
v1.4.0 — 2026-05-01
BAS Packaging Description Sync (Phase 2 of Item Sync)
- New WmsBasService: logs into BAS direct API (gwmsth.best-inc.com) for token + cookie.
- ItemSyncWorker adds Phase 2: after Phase 1 (GLINK BatchOperateItem pushes the SKU) succeeds, automatically calls BAS API to overwrite WMS packaging descriptions with AutoCount UOM names (UN / CT etc.).
- 1-5 second random jitter + max 10 items per cycle to avoid hitting BAS API limits.
v1.3.x — 2026-05-01
Item Type Sync via WMS BAS direct API
- v1.3.0: backend ItemTypeSyncWorker, pushes AutoCount.ItemType to WMS categories via BAS API.
- v1.3.1: hardening + plugin UI Start Sync button.
- v1.3.2: navBar inject bug fix + Sync Now retries fail / never-seen rows.
v1.2.x — 2026-05-01 / 2026-04-27
Early feature iterations
- v1.2.3: Item Sync UX overhaul + worker hardening + switched to AED_LS_01.
- v1.2.4: AutoCount resolver skips backup folders (_bk20250207 etc.), added appsettings override path.
- ShipFrom supports StreetLine2 + StreetLine3 (long addresses).
- DPAPI auto-encrypts SqlPassword + LoginPassword on service start.
Earlier — 2026-04-24 / 25
Foundations
- API wrapped as Windows Service via Topshelf.
- About dialog + Check-for-Updates (WmsHubUpdater + S3 release pipeline).
- Plugin-side ErrorLogger wired into hot paths + footer version indicator.
Releases sometimes ship in rapid succession (v1.6.0 to v1.6.4 all on the same day) — these are field-feedback fixes during customer rollout. Keep API auto-update enabled so you don't fall behind.