toga-ai 1.0.336 → 1.0.337

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.
@@ -6,7 +6,7 @@
6
6
  | [Cost Centers — Unit Locations, numeric-only policy](features/cost-centers.md) | 2.0 | A Compass "cost center" — the value a user picks in commerce and that lands on an order — is **not** a `CostCenters` row. | toga2-commerce/src/pages/Cart/api/CartApi.ts, worker1.5/crons/toga2/compass/import_locations.php, _underscore/Model/Compass/SalesOrder.php, api2/Component/Api/V2/V2.php, dbchanges2/Client_Compass/2026-07-06 - RemoveNonNumericCostCenters.sql |
7
7
  | [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 |
8
8
  | [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 |
9
- | [Compass MITS PO Transmission to Vendors](features/mits-po-transmission-to-vendors.md) | 2.0 | The 1.0 worker cron `2_transmit_mits_purchase_orders_to_vendors.php` transmits Compass PurchaseOrders to their vendors (Office Depot, Strategic Systems, Compass | worker/crons/toga2/compass/workflow/2_transmit_mits_purchase_orders_to_vendors.php, library/app/client/compass.php |
9
+ | [Compass MITS PO Transmission to Vendors](features/mits-po-transmission-to-vendors.md) | 2.0 | The 1.0 worker cron `2_transmit_mits_purchase_orders_to_vendors.php` transmits Compass PurchaseOrders to their vendors (Office Depot, Strategic Systems, Compass | worker/crons/toga2/compass/workflow/2_transmit_mits_purchase_orders_to_vendors.php, worker/crons/toga2/compasscanada/workflow/2_transmit_mits_purchase_orders_to_vendors.php, library/app/client/compass.php |
10
10
  | [Compass MR/MA Order Auto-Approval & Status Gate](features/mr-ma-order-approval-and-status.md) | 2.0 | Compass **MR** and **MA** sales orders are system-generated from the MITS / Office Depot EDI pipeline (they do not originate as user-entered SA orders) and must | _underscore/Model/Compass/SalesOrder.php, _underscore/Model/Compass/PurchaseOrder.php, worker/crons/toga2/compass/workflow/3a_import_office_depot_purchase_orders.php |
11
11
  | [Compass USA](profile.md) | 2.0 | Compass USA is a TOGA client running a multi-tier supply-chain commerce operation. | |
12
12
  | [Compass Cross-Kit Bundle Corruption — Detection & Repair](workflows/cross-kit-bundle-corruption.md) | 2.0 | A frontend regression in `toga2-commerce`'s edit-order bundle submission mis-attributed bundle (kit) line items and **fees/warranties** to the **wrong kit**, pe | src/api/syncSalesOrderItemsFromLocalStorageCartToApi.ts |
@@ -5,10 +5,11 @@ project: _Underscore
5
5
  client: compass-usa
6
6
  type: client-feature
7
7
  status: active
8
- updated: 2026-06-22
9
- owners: ["rgirish"]
8
+ updated: 2026-07-14
9
+ owners: ["rgirish", "bala"]
10
10
  files:
11
11
  - worker/crons/toga2/compass/workflow/2_transmit_mits_purchase_orders_to_vendors.php
12
+ - worker/crons/toga2/compasscanada/workflow/2_transmit_mits_purchase_orders_to_vendors.php
12
13
  - library/app/client/compass.php
13
14
  related:
14
15
  - mits-po-to-so-item-linking.md
@@ -47,6 +48,34 @@ Routing note: Office Depot (vendor 1) `defaultPoSubmissionIntegrationId = 2`, wh
47
48
  cXML, unless a `VendorItem` overrides it. There is also a CXML integration (id 1,
48
49
  "Office Depot / No") that is NOT the default.
49
50
 
51
+ **A single PO can split across channels.** Because grouping is per item
52
+ (`VendorItems.overridePoSubmissionIntegrationId`), the same PO can have some items on the
53
+ EMAIL integration (id 2) and others on the CXML integration (id 1). The emailed PDF therefore
54
+ contains only the **subset** of line items on the EMAIL integration — the CXML items go to
55
+ Office Depot separately with no PDF. Note the PDF's "Order Total" cell prints the whole-PO
56
+ `_total`, **not** a per-integration subtotal, so it can exceed the sum of the items shown.
57
+
58
+ ## PDF rendering (EMAIL branch)
59
+ The EMAIL branch renders the PO with **ezpdf** (`Cezpdf`). The "MAIN ITEM LISTING" draws one
60
+ row per line item; the DESCRIPTION cell is 150pt wide and wraps to multiple lines for long
61
+ descriptions.
62
+ - **Row height must be measured, not assumed.** Each row's true height is taken from the
63
+ lowest y any cell reached (`ezText` returns the y it finished wrapping at). A row advances
64
+ by `max($spacingY, ($rowStartY - $rowLowestY) + ($spacingY - $pdf->getFontHeight(11)))` with
65
+ `$spacingY = 40`: single-line rows stay at 40pt (no regression), multi-line rows grow to fit,
66
+ and the `($spacingY - getFontHeight)` term gives every row the same trailing gap a
67
+ single-line row has so tall rows are not cramped.
68
+ - **Pagination is height-aware, not count-based.** Before drawing each row, its wrapped line
69
+ count is pre-measured and a new page is started before the row would spill past the item box
70
+ (first page ≈420pt, extra pages ≈625pt). Count-based chunking (8 then 10 per page) overflowed
71
+ once rows took their true taller height, which made ezpdf's internal `ezText` auto-page-break
72
+ fire per cell and scatter each cell of the overflowing item onto its own blank page.
73
+ - **Measuring wrapped height without drawing (ezpdf):** call
74
+ `$pdf->addTextWrap($x, $y, $columnWidth, $size, $text, 'left', 0, 1)` with the last arg
75
+ (`$test`) = `1`. In test mode `addTextWrap` does not draw (guarded by `if (!$test)`) but wraps
76
+ identically to `ezText` and returns the remainder, so looping it mirrors `ezText`'s own
77
+ wrapping exactly — the reliable way to pre-measure a row for pagination decisions.
78
+
50
79
  ## Data model
51
80
  - `Client_Compass.PurchaseOrders.dtSubmitted` — set by step 4; the outer query's `IS NULL`
52
81
  guard means a PO is only ever picked up once.
@@ -80,6 +109,12 @@ Compass Canada has a parallel `compasscanada/workflow/2_transmit_...` keyed on
80
109
  `dtSubmitted` stamped without a log (separate, previously-observed failure mode).
81
110
 
82
111
  ## Change history
112
+ - 2026-07-14 — Fixed the emailed-PO PDF for both US Compass and Compass Canada: line-item
113
+ rows now advance by their measured wrapped height (long descriptions no longer overwritten),
114
+ and pagination is height-aware (a real 21-item PO went from a broken 17-page PDF to a clean
115
+ 3-page one). Recorded the ezpdf `addTextWrap($test=1)` line-height measurement technique and
116
+ the single-PO EMAIL/CXML channel split (emailed PDF shows only the EMAIL-integration subset;
117
+ Order Total prints the whole-PO `_total`). (bala)
83
118
  - 2026-06-22 — Documented the cron and the unconditional-`dtSubmitted` gotcha: item-less POs
84
119
  get marked submitted without transmitting or logging; diagnosed via MR241298 inbound MITS
85
120
  payload showing empty item arrays. No code change made (diagnosis only). (rgirish)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.336",
3
+ "version": "1.0.337",
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",