toga-ai 1.0.683 → 1.0.685

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.
@@ -92,6 +92,43 @@ response that walks that collection can 500. Two defences, both cheap:
92
92
  The fragility itself is **unfixed** — any depth ≥ 2 response is exposed. Lowering depth removes
93
93
  *your* exposure, not the defect.
94
94
 
95
+ ### ⚠ `calcDepth` defaults to **1** — a calculated field one FK hop out comes back NULL, silently
96
+
97
+ `calcDepth` bounds how deep `FIELD_SQL` **calculated** fields are evaluated, independently of
98
+ `depth`. At the default of **1** only the requested record's own calculated fields resolve; a
99
+ calculated field on a record reached through an FK returns **`null` with no message** — no `EV-8`,
100
+ no warning, a 200 that merely looks like empty data.
101
+
102
+ Worked example: `_Model_Client_Location` exposes
103
+ `_addressLine1/_addressLine2/_addressCity/_addressState/_addressZip` as `FIELD_SQL`. Requested from
104
+ a record that only *points at* a Location (`GET /v2/transfer-orders/{uuid}` with the location
105
+ expanded), they need **`calcDepth: 2`**. Rule of thumb: **raise `calcDepth` by one for every FK hop
106
+ between the requested record and the calculated field's model**, and suspect it first whenever a
107
+ calculated field is null on a nested object but correct when that object is fetched directly.
108
+ Definition of the fields themselves:
109
+ [FIELD_SQL calculated fields](../../_underscore/features/calculated-sql-fields.md).
110
+
111
+ ### What nests by default is `InherentRecordChildren` — everything else needs the nested ROUTE
112
+
113
+ A record's one-to-many children arrive inside the record response **only** if `Core.
114
+ InherentRecordChildren` declares them. `sales-orders` (record 14) has **seven**; plenty of records
115
+ have **none** — `transfer-orders` (312) had **zero** as of 2026-08-28, so `transferOrderItems` never
116
+ appears in the record payload no matter what `fields`/`depth` ask for. The client must call the
117
+ **nested route** instead:
118
+
119
+ ```
120
+ GET /v2/transfer-orders/{uuid}/transfer-order-items
121
+ ```
122
+
123
+ - **The JSON key of an inherent child is the camelCase of the child ROUTE**, not of the table or the
124
+ model (`V2.php` ~L6310, via `_String::CASE_KEBAB` → `CASE_CAMEL`). `transfer-order-items` →
125
+ `transferOrderItems`.
126
+ - **Adding an `InherentRecordChildren` row is a breaking-shape change, not a feature flag.** It
127
+ alters the default response for **every** existing caller of that route — including 1.0 importers
128
+ and NetSuite sync — so the blast radius has to be surveyed first. The transfer-order build
129
+ deliberately declined to add one and named the child route in the consuming surface's config
130
+ instead. See [Transfer Orders page](../../toga25-supply/features/transfer-orders-page.md).
131
+
95
132
  ### ⚠ `join` / `ojoin` drive the WHERE/filter — NOT the response shape
96
133
 
97
134
  **`join` and `ojoin` change which rows come back, not what the JSON looks like.** The response
@@ -9,7 +9,7 @@
9
9
  | [Column Visibility (URL-driven show/hide columns)](features/column-visibility.md) | A "Columns" header button that opens a modal listing every column from the table meta, lets the user show/hide columns, adjusts the table live, and persists the | toga25-supply/src/components/ColumnVisibilityModal/, toga25-supply/src/pages/SalesOrders/SalesOrders.tsx, toga25-supply/src/pages/SalesOrders/viewModel/useSalesOrdersPageViewModel.tsx, toga25-supply/src/pages/SalesOrders/hooks/useSalesOrdersTableData.tsx |
10
10
  | [Force Logout on Deployment (useDeploymentGuard)](features/force-logout-on-deployment.md) | On large deployments the backend bumps the Core parameter `META_LAST_REFRESH_DATETIME`. | toga25-supply/src/hooks/useDeploymentGuard.tsx, toga25-supply/src/App.tsx |
11
11
  | [Meta-Driven Page & Table Setup](features/meta-driven-table-data.md) | A page in this app is **meta-driven end to end**: the page view model fetches *page meta* (labels, sections, ACL) and *table meta* (the columns/fields + table s | toga25-supply/src/pages/SalesOrders/viewModel/useSalesOrdersPageViewModel.tsx, toga25-supply/src/pages/TransferOrders/viewModel/useTransferOrdersPageViewModel.tsx, toga25-supply/src/pages/SalesOrders/hooks/useSalesOrdersTableState.ts, toga25-supply/src/hooks/useTablePageMeta.ts, toga-blox-npm/dist/hooks/useFetchPageMeta.d.ts, toga-blox-npm/dist/hooks/useFetchTablePageMeta.d.ts, toga-blox-npm/dist/hooks/useAssignTableFieldLabels.d.ts, toga-blox-npm/dist/components/Table/hooks/useTableData.d.ts |
12
- | [Record Modals & Nested Tables](features/record-modals-and-nested-tables.md) | The repo's family of modal + nested-table patterns layered over toga-blox `TableRecordModal` and `PrimaryTable*Layout`. | toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/hooks/usePurchaseOrderDetails.ts, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/viewModel/useSalesOrderRecordModalLayoutModel.tsx, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/viewModel/FIELDS/apiFields.json, toga25-supply/src/pages/SalesOrders/helpers/surfaceBundleToTenantFields.ts, toga25-supply/src/layout/PrimaryTableServerLayout/PrimaryTableServerLayout.tsx, toga25-supply/src/layout/PrimaryTableServerLayout/types.ts, toga25-supply/src/layout/ItemRecordModalLayout/, toga25-supply/src/layout/SalesOrderRecordModalLayout/, toga25-supply/src/layout/SalesOrderItemsTableLayout/, toga25-supply/src/layout/ItemFulfillmentModal/, toga25-supply/src/layout/GenericNestedTables/GenericNestedTables.tsx, toga25-supply/src/layout/GenericNestedTables/GenericTableLayout.tsx, toga25-supply/src/pages/Inventory/viewModel/useInventoryPageViewModel.tsx, toga25-supply/src/pages/Inventory/viewModel/FIELDS/DEFAULT/inventoryGroupings.json, toga25-supply/src/hooks/useTableCellInteractions.ts, toga25-supply/src/hooks/useServerTableUrlState.ts, toga25-supply/src/layout/RecordApprovalModal/helpers/handleFormatApprovalWorkflowPayload.ts, toga25-supply/src/layout/RecordApprovalModal/api/approvalDecisionsApi.ts |
12
+ | [Record Modals & Nested Tables](features/record-modals-and-nested-tables.md) | The repo's family of modal + nested-table patterns layered over toga-blox `TableRecordModal` and `PrimaryTable*Layout`. | toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/hooks/usePurchaseOrderDetails.ts, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/viewModel/useSalesOrderRecordModalLayoutModel.tsx, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/viewModel/FIELDS/apiFields.json, toga25-supply/src/pages/SalesOrders/helpers/surfaceBundleToTenantFields.ts, toga25-supply/src/layout/PrimaryTableServerLayout/PrimaryTableServerLayout.tsx, toga25-supply/src/layout/PrimaryTableServerLayout/types.ts, toga25-supply/src/layout/ItemRecordModalLayout/, toga25-supply/src/layout/SalesOrderRecordModalLayout/, toga25-supply/src/layout/SalesOrderItemsTableLayout/, toga25-supply/src/layout/ItemFulfillmentModal/, toga25-supply/src/layout/GenericNestedTables/GenericNestedTables.tsx, toga25-supply/src/layout/GenericNestedTables/GenericTableLayout.tsx, toga25-supply/src/pages/Inventory/viewModel/useInventoryPageViewModel.tsx, toga25-supply/src/pages/Inventory/viewModel/FIELDS/DEFAULT/inventoryGroupings.json, toga25-supply/src/pages/TransferOrders/view/TransferOrderRecordModalLayout/TransferOrderRecordModalLayout.tsx, toga25-supply/src/hooks/useTableCellInteractions.ts, toga25-supply/src/hooks/useServerTableUrlState.ts, toga25-supply/src/layout/RecordApprovalModal/helpers/handleFormatApprovalWorkflowPayload.ts, toga25-supply/src/layout/RecordApprovalModal/api/approvalDecisionsApi.ts |
13
13
  | [Side navigation & default route — an empty nav renders a BLANK PAGE and gets reported as "cannot log in"](features/side-navigation-and-default-route.md) | The 2.5 side nav is **100% backend-driven** by the `navigation` surface bundle, and the same list also decides **which routes exist** and **where `/` lands**. | toga25-supply/src/routes.tsx, toga25-supply/src/layout/AppLayout/viewModel/useAppLayoutViewModel.ts, api2/Component/Api/V2/V2.php, _underscore/Model/Core/Surface.php |
14
14
  | [SSO redirect & public-vs-user session gating (useAuthenticationFlow)](features/sso-redirect-and-session-gating.md) | How 2.5 Supply decides, on every navigation, whether an anonymous visitor should be bounced to their client's SSO IdP instead of the local `/login` form. | toga25-supply/src/hooks/useAuthenticationFlow.ts, toga25-supply/src/routes.tsx, toga25-supply/src/contexts/AuthContext.tsx, toga25-supply/src/api/api.ts |
15
15
  | [Surface Frontend (DB-driven UI consumption, src/surface/)](features/surface-frontend.md) | The frontend consumer of the platform-wide Surface layer — DB-driven UI config fetched from `GET /v2/surfaces/meta?slug=<slug>` instead of statically-imported J | toga25-supply/src/App.tsx, toga25-supply/src/surface/evaluateSurfaceRule.ts, toga25-supply/src/layout/RecordApprovalModal/, toga25-supply/src/contexts/AuthContext.tsx, toga25-supply/src/surface/applyColSpan.ts, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/helpers/sectionRenderers.tsx, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/helpers/getVisibleSections.ts, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/view/layoutComponents/SalesOrderApprovalSummaryGrid.tsx, toga25-supply/src/surface/useFetchSurfaceMeta.ts, toga25-supply/src/pages/SalesOrders/helpers/surfaceBundleToTenantFields.ts, toga25-supply/src/pages/ServiceRequests/view/ServiceRequestRecordModalLayout/ServiceRequestRecordModalLayout.tsx, toga25-supply/src/pages/ServiceRequests/view/ServiceRequestRecordModalLayout/view/ServiceRequestsView.tsx, toga25-supply/src/pages/ServiceRequests/view/ServiceRequestRecordModalLayout/viewModel/useServiceRequestRecordModalLayoutModel.tsx, toga25-supply/src/pages/ServiceRequests/view/ServiceRequestRecordModalLayout/viewModel/FIELDS/apiFields.json, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/view/sections/SalesOrderTopBar.tsx, toga25-supply/src/pages/SalesOrders/helpers/buildPatchedTenantFields.ts, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/viewModel/useSalesOrderRecordModalLayoutModel.tsx, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/view/SalesOrderView.tsx, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/view/layoutComponents/SalesOrderSummaryGrid.tsx, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/helpers/getDetailSections.tsx, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/view/sections/SalesOrderNotesSection.tsx, toga25-supply/src/pages/SalesOrders/helpers/cleanOrder.ts, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/view/sections/AdminNotesSection.tsx, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/helpers/getAdminNotes.ts, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/helpers/index.ts, toga25-supply/src/surface/evaluateSurfaceRule.ts, toga25-supply/src/surface/resolveElementState.ts, toga25-supply/src/pages/SalesOrders/helpers/evaluateEnableRule.ts, toga25-supply/src/pages/SalesOrders/hooks/useSalesOrderRowRecordState.ts, toga25-supply/src/surface/actionRegistry.ts, toga25-supply/src/surface/componentRegistry.tsx, toga25-supply/src/surface/SurfaceActionBar.tsx, toga25-supply/src/surface/SurfaceSection.tsx, toga25-supply/src/surface/resolve.ts, toga25-supply/src/surface/types.ts, toga25-supply/src/surface/index.ts, toga25-supply/src/pages/Login/LoginPage.tsx, toga25-supply/src/pages/SalesOrders/SalesOrders.tsx, toga25-supply/src/pages/SalesOrders/view/SurfaceRowActions.tsx, toga25-supply/src/pages/SalesOrders/hooks/useSalesOrderVip.ts, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/view/sections/SalesOrderTopBar.tsx, toga25-supply/src/pages/Items/ItemsPage.tsx, toga25-supply/src/pages/Items/viewModel/useItemsPageViewModel.tsx, toga25-supply/src/pages/VendorItems/VendorItemsPage.tsx, toga25-supply/src/pages/VendorItems/viewModel/useVendorItemsPageViewModel.tsx, toga25-supply/src/pages/Inventory/Inventory.tsx, toga25-supply/src/pages/Inventory/viewModel/useInventoryPageViewModel.tsx, toga25-supply/src/pages/Inventory/viewModel/FIELDS/index.ts, toga25-supply/src/fieldsConfig/index.ts, toga25-supply/src/layout/ItemRecordModalLayout/helpers/surfaceBundleToItemFields.ts, toga25-supply/src/layout/ItemRecordModalLayout/helpers/index.ts, toga25-supply/src/layout/ItemRecordModalLayout/viewModel/useItemRecordModalViewModel.tsx, toga25-supply/src/layout/ItemRecordModalLayout/ItemRecordModalLayout.tsx, toga25-supply/src/layout/ItemRecordModalLayout/components/ItemRecordView.tsx, toga25-supply/src/surface/useStatusColors.ts, toga25-supply/src/surface/SurfaceHeader.tsx, toga25-supply/src/pages/SalesOrders/view/SalesOrderApprovalModalsLayout/helpers/surfaceBundlesToDecisionFields.ts, toga25-supply/src/pages/SalesOrders/view/SalesOrderApprovalModalsLayout/viewModel/useApprovalModalViewModel.tsx |
@@ -6,7 +6,7 @@ project: TOGa 2.5 Supply
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-08-21
9
+ updated: 2026-08-28
10
10
  owners: [apeterson]
11
11
  files:
12
12
  - toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/hooks/usePurchaseOrderDetails.ts
@@ -23,6 +23,7 @@ files:
23
23
  - toga25-supply/src/layout/GenericNestedTables/GenericTableLayout.tsx
24
24
  - toga25-supply/src/pages/Inventory/viewModel/useInventoryPageViewModel.tsx
25
25
  - toga25-supply/src/pages/Inventory/viewModel/FIELDS/DEFAULT/inventoryGroupings.json
26
+ - toga25-supply/src/pages/TransferOrders/view/TransferOrderRecordModalLayout/TransferOrderRecordModalLayout.tsx
26
27
  - toga25-supply/src/hooks/useTableCellInteractions.ts
27
28
  - toga25-supply/src/hooks/useServerTableUrlState.ts
28
29
  - toga25-supply/src/layout/RecordApprovalModal/helpers/handleFormatApprovalWorkflowPayload.ts
@@ -31,6 +32,8 @@ related:
31
32
  - ../architecture.md
32
33
  - meta-driven-table-data.md
33
34
  - ../../api2/features/tableview-field-metadata.md
35
+ - transfer-orders-page.md
36
+ - ../../api2/features/v2-rest-query-contract.md
34
37
  ---
35
38
 
36
39
  ## What it is
@@ -235,7 +238,25 @@ Scaffold per the `ItemRecordModalLayout` pattern (`src/layout/ItemRecordModalLay
235
238
  join is not feasible for a list, so that column needs the backend field (promote `_purchaseOrders`
236
239
  to base `_Model_Client_SalesOrder`) or be hidden for Quad. **Not addressed** — open follow-up.
237
240
 
241
+ - **ONE `TableRecordModal` must own every state — loading, error and loaded.** Rendering a second
242
+ `TableRecordModal` for the loaded state puts a **different element type at the same position in the
243
+ tree**, so React unmounts the first and mounts the second: the CSS keyframe restarts and the user
244
+ sees the slide-up animation replay the moment the data arrives. Keep a single modal element and
245
+ switch only its **children** on the fetch state. Same defect and same fix on the ServiceRequest and
246
+ Transfer Order modals.
247
+ - **A record's child rows may need a SECOND request.** Children nest inside the record response only
248
+ when `Core.InherentRecordChildren` declares them — `sales-orders` does, `transfer-orders` does
249
+ **not**. When they do not, fetch the nested route (`/{record}/{uuid}/{child-route}`) and read the
250
+ child route from the surface's `config.childRoute` rather than hardcoding it. See
251
+ [v2-rest-query-contract](../../api2/features/v2-rest-query-contract.md) and
252
+ [Transfer Orders page](transfer-orders-page.md).
253
+
238
254
  ## Change history
255
+ - 2026-08-28 — Added two modal rules confirmed on the Transfer Orders build: **one
256
+ `TableRecordModal` owns loading/error/loaded** (a second one at the same tree position swaps
257
+ element types and replays the slide-up animation), and a record whose children are **not** declared
258
+ in `InherentRecordChildren` needs a **second** request to the nested child route, with the route
259
+ read from the surface `config.childRoute`. (apeterson)
239
260
  - 2026-08-21 — Fixed Quad SO record-modal 400 (`EV-8 _purchaseOrders`): the modal fetch requested
240
261
  the Compass-only `_purchaseOrders` calc field for all tenants, but it exists only on the Compass
241
262
  model — Quad has no such field, and the missing field failed the whole modal fetch. Split PO-number
@@ -5,4 +5,4 @@
5
5
  | [NYCHH NetSuite → TransferOrders import (stocking-flag routing, PO bridges, origin location)](features/netsuite-transfer-order-import.md) | 1.0 | NYCHH's NetSuite **transfer orders are represented as NetSuite sales orders** (same as the GroWrk pattern), so the shared NetSuite → TOGa Supply importer (`App_ | library/app/api/toga2.php, library/app/api/netsuite/rest.php, library/app/netsuite.php, worker/crons/toga2/netsuite/sync_togasupply_hh.php, worker/crons/toga2/netsuite/common_sync_togasupply.php |
6
6
  | [NYCHH PO links are UPSTREAM — the downstream SO→PO route returns empty](features/po-number-upstream-direction.md) | 2.0 | NYCHH's sales orders are created **from the customer's purchase order**, so their SO↔PO links live in the **upstream** table `PurchaseOrders_SalesOrders` (route | _underscore/Model/Client/SalesOrder.php, _underscore/Trait/Netsuite/SalesOrder.php, toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/hooks/usePurchaseOrderDetails.ts, dbchanges2/Client/2026-08-11b - SalesOrderPurchaseOrdersField.sql, dbchanges2/Client/2026-08-25 - SalesOrderPurchaseOrdersFieldAllClients.sql |
7
7
  | [NYCHH transfer-order 2.0 model — inventory quantities + V2 field enablement](features/transfer-order-inventory-quantities.md) | 2.0 | The 2.0 (`_underscore`) side of NYCHH transfer-order support: a **two-branch inventory quantity model** on the NYCHH `Item` override, plus the **client-override | _underscore/Model/Nychh/Item.php, _underscore/Model/Nychh/TransferOrder.php, _underscore/Model/Nychh/TransferOrderStage.php, _underscore/Model/Client/TransferOrder.php, dbchanges2/Client_Nychh/2026-08-27a - TransferOrderCustomFieldWritePermission.sql, dbchanges2/Client_Nychh/2026-08-27b - TransferOrderStageStatusIdentifier.sql |
8
- | [NYC Health & Hospitals](profile.md) | 2.0 | NYC Health & Hospitals (NYCHH) is a TOGA 2.0 client on the `_underscore` platform, prod schema `Client_Nychh`. | dbchanges2/Client_Nychh/2026-08-18 - InventoryUnitsItemColumns.sql, dbchanges2/Client_Nychh/2026-08-24 - FixInventoryGroupingsUnitsTopologyOverrideIds.sql, dbchanges2/Client_Nychh/2026-08-27a - TransferOrderCustomFieldWritePermission.sql, dbchanges2/Client_Nychh/2026-08-27b - TransferOrderStageStatusIdentifier.sql |
8
+ | [NYC Health & Hospitals](profile.md) | 2.0 | NYC Health & Hospitals (NYCHH) is a TOGA 2.0 client on the `_underscore` platform, prod schema `Client_Nychh`. | dbchanges2/Client_Nychh/2026-08-18 - InventoryUnitsItemColumns.sql, dbchanges2/Client_Nychh/2026-08-24 - FixInventoryGroupingsUnitsTopologyOverrideIds.sql, dbchanges2/Client_Nychh/2026-08-27a - TransferOrderCustomFieldWritePermission.sql, dbchanges2/Client_Nychh/2026-08-27b - TransferOrderStageStatusIdentifier.sql, dbchanges2/Client_Nychh/2026-08-28a - TransferOrdersTableView.sql, dbchanges2/Client_Nychh/2026-08-28b - TransferOrdersNavigationEnable.sql |
@@ -6,7 +6,7 @@ project: _Underscore
6
6
  client: nychh
7
7
  type: client-feature
8
8
  status: active
9
- updated: 2026-08-26
9
+ updated: 2026-08-28
10
10
  owners: [apeterson, bala]
11
11
  files:
12
12
  - _underscore/Model/Client/SalesOrder.php
@@ -70,10 +70,19 @@ the **upstream** table.
70
70
  safe **only** because NYCHH's upstream bridge is coincidentally 1:1 (823 rows / 823 distinct sales
71
71
  orders). Copying that join into a shared single-record fetch breaks Compass (up to 6,440 POs on one
72
72
  order), Compass Canada (empty upstream bridge) and Prudential (1,868 of 26,843 upstream).
73
+ - **The transfer-order items table inherits the same blank.** `TransferOrderItems` has no
74
+ line-level PO, so that column binds the **parent order's** `purchaseOrder.number` and repeats on
75
+ every row — and for NYCHH it resolves NULL, because their PO links are upstream and
76
+ `TransferOrders.purchaseOrderId` is not populated for this tenant. The column is deliberately left
77
+ visible in the Core surface (neutral default; other tenants do populate it). See
78
+ [Transfer Orders page](../../../2.0/apps/toga25-supply/features/transfer-orders-page.md).
73
79
  - Do not "fix" this by adding downstream rows. The direction is correct for NYCHH's business model;
74
80
  the shared field is what was incomplete.
75
81
 
76
82
  ## Change history
83
+ - 2026-08-28 — Noted that the new Transfer Orders items table shows the **order-level** PO
84
+ (`TransferOrderItems` has no line-level PO), so it repeats per row and resolves **NULL for NYCHH**
85
+ for the same upstream-direction reason — left visible in Core as the neutral default. (apeterson)
77
86
  - 2026-08-26 — Closed the open `_purchaseOrders` gap: fixed in the **base** field as a
78
87
  downstream-then-upstream `COALESCE` (not a NYCHH override), taking NYCHH from 64 to **819 of 819**
79
88
  orders with a PO and changing no existing value; currently on `_beta`, not `_production`. Refined
@@ -15,13 +15,15 @@ project: _Underscore
15
15
  client: nychh
16
16
  type: profile
17
17
  status: active
18
- updated: 2026-08-27
18
+ updated: 2026-08-28
19
19
  owners: ["jcardinal", "apeterson", "bala"]
20
20
  files:
21
21
  - dbchanges2/Client_Nychh/2026-08-18 - InventoryUnitsItemColumns.sql
22
22
  - dbchanges2/Client_Nychh/2026-08-24 - FixInventoryGroupingsUnitsTopologyOverrideIds.sql
23
23
  - dbchanges2/Client_Nychh/2026-08-27a - TransferOrderCustomFieldWritePermission.sql
24
24
  - dbchanges2/Client_Nychh/2026-08-27b - TransferOrderStageStatusIdentifier.sql
25
+ - dbchanges2/Client_Nychh/2026-08-28a - TransferOrdersTableView.sql
26
+ - dbchanges2/Client_Nychh/2026-08-28b - TransferOrdersNavigationEnable.sql
25
27
  related:
26
28
  - ../../2.0/apps/_underscore/features/tracking-number-bridges.md
27
29
  - ../../2.0/apps/_underscore/features/tableview-joins.md
@@ -29,6 +31,7 @@ related:
29
31
  - ./features/netsuite-transfer-order-import.md
30
32
  - ./features/transfer-order-inventory-quantities.md
31
33
  - ../../2.0/apps/_underscore/features/sales-order-purchase-order-bridge-direction.md
34
+ - ../../2.0/apps/toga25-supply/features/transfer-orders-page.md
32
35
  ---
33
36
 
34
37
  ## Summary
@@ -61,6 +64,15 @@ table views. Client-specific DB change-sets live in `dbchanges2/Client_Nychh/`.
61
64
  arrive as sales orders; the 1.0 importer routes them by the `custbody_stocking_order` flag (not the
62
65
  dollar amount), bridges the PO, and resolves origin/destination locations. See
63
66
  [NYCHH NetSuite → TransferOrders import](./features/netsuite-transfer-order-import.md).
67
+ - **Transfer Orders is an NYCHH-only screen (2026-08-28, local only).** NYCHH is the first — and
68
+ today the only — tenant with a `transfer-orders` TableView (`Client_Nychh/2026-08-28a`, which also
69
+ seeds the ACL chain for record 351 that the Status column silently depends on) and the one
70
+ `SurfaceOverrides` row that reveals the nav item (`2026-08-28b`, client-wide, matching how this
71
+ tenant already grants Sales Orders and Inventory — NYCHH does not scope navigation by role). The
72
+ Core surfaces and the stage colour tokens are **shared/neutral**, hidden for every other client
73
+ until they opt in. Not yet run on sandbox-client or production; **beta is blocked** because it
74
+ lacks the `TransferOrderStages` table. See
75
+ [Transfer Orders page](../../2.0/apps/toga25-supply/features/transfer-orders-page.md).
64
76
  - **Two-branch inventory quantities + TransferOrder V2 enablement** — NYCHH-only on-hand/available/
65
77
  fulfilled/backordered model on `_Model_Nychh_Item`, plus the client-override models + ACL rows that
66
78
  let a NetSuite TransferOrder POST succeed. See
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.683",
3
+ "version": "1.0.685",
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",