toga-ai 1.0.129 → 1.0.130

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@
2
2
 
3
3
  | Doc | Framework | Summary | Files |
4
4
  |-----|-----------|---------|-------|
5
- | [Compass ASN → ItemFulfillment Auto-Creation](features/asn-to-item-fulfillment.md) | 2.0 | For Compass USA, posting an AdvanceShippingNotice (ASN) auto-creates the ItemFulfillment (IF) on the upstream SalesOrder. | _underscore/Model/Compass/AdvanceShippingNotice.php, _underscore/Model/Compass/PurchaseOrder.php, api2/Component/Api/Cxml/Cxml.php, dbchanges2/Client_Compass/2026-06-11 - AsnItemTrackingNumberAcl.sql, dbchanges2/Client_Compass/2026-06-15b - BackfillSA132781ItemFulfillmentTracking.sql, dbchanges2/Client_Compass/2026-06-16 - CleanupSA132763CrossLineTracking.sql, dbchanges2/Client_Compass/2026-06-16b - CleanupSA132743CrossLineTracking.sql, dbchanges2/Client_Compass/2026-06-16c - BackfillSA132763C40QYUCTracking.sql |
5
+ | [Compass ASN → ItemFulfillment Auto-Creation](features/asn-to-item-fulfillment.md) | 2.0 | For Compass USA, posting an AdvanceShippingNotice (ASN) auto-creates the ItemFulfillment (IF) on the upstream SalesOrder. | _underscore/Model/Compass/AdvanceShippingNotice.php, _underscore/Model/Compass/PurchaseOrder.php, api2/Component/Api/Cxml/Cxml.php, dbchanges2/Client_Compass/2026-06-11 - AsnItemTrackingNumberAcl.sql, dbchanges2/Client_Compass/2026-06-15b - BackfillSA132781ItemFulfillmentTracking.sql, dbchanges2/Client_Compass/2026-06-16 - CleanupSA132763CrossLineTracking.sql, dbchanges2/Client_Compass/2026-06-16b - CleanupSA132743CrossLineTracking.sql, dbchanges2/Client_Compass/2026-06-16c - BackfillSA132763C40QYUCTracking.sql, dbchanges2/Client_Compass/2026-06-18a - CleanupSA132898DuplicateTracking.sql |
6
6
  | [Compass: Item-Fulfillment TableViews (for-sales-order-items & for-sales-orders, tracking via bridge)](features/item-fulfillment-tracking-tableview.md) | 2.0 | Two sibling Compass TableViews in `Client_Compass` display fulfilled items in toga2-supply, both driven by `TableViews` / `TableViewJoins` / `TableViewFields` c | dbchanges2/Client_Compass/2026-06-10 - ItemFulfillmentsForSalesOrderItemsTableView.sql, dbchanges2/Client_Compass/2026-06-11 - ItemFulfillmentsForSalesOrdersTableView.sql, dbchanges2/Client_Compass/2026-06-15a - FixItemFulfillmentTrackingNumberJoins.sql |
7
7
  | [Compass MITS PO → SO Item Linking](features/mits-po-to-so-item-linking.md) | 2.0 | MITS sends Compass inbound Purchase Orders (`POST /v2/purchase-orders`) against a Sales Order (`mitsSalesOrder`). | _underscore/Model/Compass/PurchaseOrder.php, worker/crons/toga2/compass/workflow/3a_import_office_depot_purchase_orders.php |
8
8
  | [Compass USA](profile.md) | 2.0 | Compass USA is a TOGA client running a multi-tier supply-chain commerce operation. | |
@@ -5,7 +5,7 @@ project: _Underscore
5
5
  client: compass-usa
6
6
  type: client-feature
7
7
  status: active
8
- updated: 2026-06-16
8
+ updated: 2026-06-18
9
9
  owners: [jcardinal]
10
10
  files:
11
11
  - _underscore/Model/Compass/AdvanceShippingNotice.php
@@ -16,6 +16,7 @@ files:
16
16
  - dbchanges2/Client_Compass/2026-06-16 - CleanupSA132763CrossLineTracking.sql
17
17
  - dbchanges2/Client_Compass/2026-06-16b - CleanupSA132743CrossLineTracking.sql
18
18
  - dbchanges2/Client_Compass/2026-06-16c - BackfillSA132763C40QYUCTracking.sql
19
+ - dbchanges2/Client_Compass/2026-06-18a - CleanupSA132898DuplicateTracking.sql
19
20
  related:
20
21
  - ../../../2.0/apps/_underscore/features/recursive-item-fulfillments.md
21
22
  ---
@@ -54,6 +55,11 @@ the gotcha about already-fulfilled orders). Flow:
54
55
  - **`remaining <= 0`** (reconcile path, new): the tracking targets are the **existing IFIs**
55
56
  for that SOI (resolved via `ItemFulfillmentItems.salesOrderItemId` → their `itemFulfillmentId`),
56
57
  **not** an SO-number lookup — NetSuite/toga2-supply IFs are `F`-numbered, not SO-numbered.
58
+ As of **2026-06-18** an existing IFI that **already carries item-level tracking is skipped**
59
+ here (`itemFulfillmentItemHasTracking()`): reconcile only attaches onto untracked
60
+ out-of-band IFIs. An already-tracked, fully-fulfilled line revisited by a later ASN is a
61
+ vendor re-transmission and must not gain a second tracking number (see the duplicate-tracking
62
+ gotcha).
57
63
  4. Copy the ASN item's tracking (`AdvanceShippingNoticeItems_TrackingNumbers`) onto each target
58
64
  IFI via `POST /item-fulfillment-item-tracking-numbers` → `ItemFulfillmentItems_TrackingNumbers`
59
65
  — **idempotent** (skipped if the bridge row already exists; ASNs get re-POSTed).
@@ -176,8 +182,29 @@ Compass Canada (`Model/Compass/Canada/`) is a separate sub-client. The Compass c
176
182
  `NOT EXISTS`. ~116 PO items across other Compass orders share the off-by-one fingerprint and
177
183
  are not yet repaired — a broader reviewed backfill is still outstanding.
178
184
 
185
+ - **Duplicate tracking from vendor ASN re-transmission (root cause, fixed forward 2026-06-18)
186
+ — DISTINCT from the cross-line contamination above.** Compass vendors (Office Depot, Strategic
187
+ Systems) re-send the **same** shipment ASN file for several days; one PO can receive many ASNs
188
+ (e.g. SA132898 / PO `50305272-1` got 6). The first ASN takes the create path and attaches its
189
+ tracking; a later ASN re-listing the same, now fully-fulfilled line takes the **reconcile path**
190
+ and — pre-fix — attached its *different* tracking number onto the existing IFI. On a qty-1 line
191
+ this yields two item-level tracking rows (plus a propagated package row). Unlike the cross-line
192
+ bug, **both** tracking numbers here map cleanly to the correct line via their own valid ASN
193
+ items, so the `NOT EXISTS (ASN item with matching VendorItems.itemId)` cleanup guard does **not**
194
+ catch it — diagnose instead by an IFI carrying more item-level tracking numbers than its
195
+ fulfilled quantity. Fix: the reconcile path now skips any IFI that already has item-level
196
+ tracking (`itemFulfillmentItemHasTracking()`), so only untracked out-of-band IFIs receive ASN
197
+ tracking. The legitimate out-of-band case (IFI has no tracking, one ASN arrives) is preserved.
198
+ Forward-only; SA132898 repaired by `2026-06-18a` (delete the later tracking + orphaned package
199
+ row, keep the original; no backfill needed since the correct number is already present).
200
+
179
201
  ## Change history
180
202
  Dated one-liners, newest first.
203
+ - 2026-06-18 — Reconcile path now skips IFIs that already carry item-level tracking
204
+ (`itemFulfillmentItemHasTracking()`), stopping duplicate/different tracking numbers from
205
+ vendor ASN re-transmissions piling onto fully-fulfilled lines (qty-1 SA132898 / USB31CC1 had
206
+ 2). Distinct root cause from the 2026-06-16 cross-line contamination. SA132898 repaired by
207
+ `2026-06-18a` (cleanup-only; original tracking already correct). (jcardinal)
181
208
  - 2026-06-16 — Identified cross-line tracking contamination root cause: bad
182
209
  `SalesOrderItems_PurchaseOrderItems` rows (PO-local lineNumber collision in
183
210
  `_Model_Compass_PurchaseOrder`, fixed forward 2026-06-11 `ec935478`; and the worker ODP-PO
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.129",
3
+ "version": "1.0.130",
4
4
  "description": "TOGA Technology Team Claude Knowledge System — shared AI coding harness with skills, knowledge base CLI, and project installer for Claude Code.",
5
5
  "keywords": [
6
6
  "claude",