toga-ai 1.0.1050 → 1.0.1052
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.
- package/knowledge/1.0/apps/library/features/elite-freshservice-sync.md +9 -1
- package/knowledge/2.0/apps/worker2/features/oneuptime-worker2-monitoring.md +9 -1
- package/knowledge/INDEX.md +1 -1
- package/knowledge/clients/elite/profile.md +2 -1
- package/knowledge/clients/nychh/INDEX.md +1 -0
- package/knowledge/clients/nychh/features/oneuptime-transfer-order-emails-owed-monitor.md +50 -0
- package/knowledge/clients/nychh/features/transfer-order-notification-emails.md +5 -2
- package/knowledge/clients/nychh/profile.md +5 -2
- package/package.json +1 -1
|
@@ -6,10 +6,11 @@ project: Library
|
|
|
6
6
|
client: elite
|
|
7
7
|
type: client-feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-
|
|
9
|
+
updated: 2026-10-16
|
|
10
10
|
owners: ["snaredla"]
|
|
11
11
|
files:
|
|
12
12
|
- library/app/api/toga2.php
|
|
13
|
+
- worker/crons/toga2/elite/import_supporting_records.php
|
|
13
14
|
related:
|
|
14
15
|
- clients/elite/profile.md
|
|
15
16
|
- 2.0/apps/worker2/features/elite-freshservice-sync.md
|
|
@@ -102,6 +103,8 @@ WHERE tickets.clientid = ? AND tickets.departmentId IN (?)
|
|
|
102
103
|
AND GREATEST(...) > '$dtTogaLastTicketIntegration'
|
|
103
104
|
```
|
|
104
105
|
|
|
106
|
+
**Elite only (2026-10-16):** GREATEST also includes the latest `tickets_history.dtStamp` (join scoped to client + departments). Field-only edits (status/department/group/category/priority, no reply/comment) write only `tickets_history`, and `tickets.timestamp` is creation time — without this they were never picked (e.g. #14182 close on 8/26 never reached Freshservice). Non-Elite SQL unchanged.
|
|
107
|
+
|
|
105
108
|
**Per ticket:** calls `syncTogaDesk1TicketIntoToga2Ticket($togadeskTicketId)`.
|
|
106
109
|
|
|
107
110
|
**Inside that method (replies loop):**
|
|
@@ -184,6 +187,11 @@ Nothing is written to Freshservice unless TOGaDesk is strictly newer. Safe to re
|
|
|
184
187
|
- **`throwExceptionOnApiError` (8th param of `App_Api_Toga2::send()`).** Pass `true` for the dedup GET — errors must not silently empty the dedup array.
|
|
185
188
|
- **Reply status `case 2` was previously mapped to `STATUS__NEW_TICKET` (wrong) — fixed 2026-07-10.** Replies from Freshservice with status "Open" were showing "New Ticket" badge in TOGaDesk.
|
|
186
189
|
- **Variable name pollution.** The Elite team lookup block inside `syncTogaDesk1TicketIntoToga2Ticket` must use its own dedicated options variable (`$eliteTeamLookupOptions`) — never reuse `$method`, `$route`, `$payload`, or `$options`. Those are consumed by the `send()` call immediately after the block; reusing them calls the wrong endpoint → Sentry crash `Undefined property: stdClass::$tickets`.
|
|
190
|
+
- **⚠ OPEN — TOGA 2 → TOGaDesk copy-in reverts agent edits.** Each run copies TOGA 2 into TOGaDesk first; `syncToga2TicketIntoTogadesk1Ticket` overwrites departmentid/status/priority/subject/adminid/notes/dueBy + group/category/type custom fields unconditionally. Freshservice webhooks (incl. echoes of our own reply/note pushes) bump TOGA 2 `_updated` seconds after an agent edit, so the edit is reverted before it is sent (proved in `Logs_Elite.Api`: #14842/283454 on 10/6, 285070 on 10/15). A guarded fix was built and rejected as too risky — needs its own ticket. Decided: the "TogaDesk is newer" guard keeps counting sync-written history rows (`Ticket replied from` / `Comment Added from`).
|
|
191
|
+
- **People email 1062 (`syncToga2ContactIntoTogadesk1People`, shared Elite/WJE/Startech; Sentry WORKER1-454, fixed 2026-10-16).** `people.email` is globally UNIQUE, so a contact whose email already exists crashed the run after the ticket steps (contacts/assets/replies/categories skipped, watermarks not saved). Now: original lookup, then a lookup by email; same TogaDesk client → reuse that row (update referenceId); other client → do not touch it, return its id. Decided: email stays globally unique — per-client uniqueness needs login/password reset/SSO/email intake made client-aware first (~100 files across togadesk/rumcsi/togaview query people by email alone).
|
|
192
|
+
- **Requester id on new tickets (Elite + WJE, fixed 2026-10-16).** `people.referenceId` can point to another client's TOGA 2 contact (shared person, e.g. PC Matic). The Freshservice requester id now comes from the contact found by email in this client's TOGA 2; `GET /contacts/{referenceId}` is a non-throwing backup. `requester_id` is always sent.
|
|
193
|
+
- **Supporting-records import 1062 (`worker/crons/toga2/elite/import_supporting_records.php`, Sentry WORKER1-4DN, fixed 2026-10-16).** Unit PUT with a nested contact without uuid made api2 INSERT a duplicate → `Contacts_UNIQUE (c_eliteUserId)`, killing the import before groups/categories. Now links the contact by `{uuid}` looked up via `c_eliteUserId`; old nested payload is the fallback.
|
|
194
|
+
- **Debugging.** Freshservice API calls are not logged. `Logs_Elite.Api` logs TOGA 2 calls: TogaDesk → TOGA 2 PUTs start with `{"urgency"...}`, Freshservice webhook PUTs (worker2) with `{"number"...}`. Freshservice `/tickets/{id}/activities` shows who changed what (UTC). WORKER1-3TZ ("All child tickets should be Closed / Resolved") is a Freshservice parent/child rule, caught per ticket — no fix needed.
|
|
187
195
|
- **Pending DB migration** — `c_togadeskDepartmentId INT NULL` must be added to `Client_Elite.TicketTeams` with team→dept mappings before the department-assignment lookup works.
|
|
188
196
|
|
|
189
197
|
## Related
|
|
@@ -6,7 +6,7 @@ project: Worker
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-10-
|
|
9
|
+
updated: 2026-10-16
|
|
10
10
|
owners: ["jcardinal", "mhammontree", "bala", "rgirish"]
|
|
11
11
|
files:
|
|
12
12
|
- worker2/Worker/Monitor/Compass.php
|
|
@@ -39,6 +39,7 @@ related:
|
|
|
39
39
|
- ../../../clients/compass-canada/features/oneuptime-po-transmissions-to-vendors-monitor.md
|
|
40
40
|
- ../../../../clients/nychh/features/oneuptime-asset-tag-backfill-monitor.md
|
|
41
41
|
- ../../../../clients/compass-usa/features/oneuptime-office-depot-inbound-files-monitor.md
|
|
42
|
+
- ../../../clients/nychh/features/oneuptime-transfer-order-emails-owed-monitor.md
|
|
42
43
|
---
|
|
43
44
|
|
|
44
45
|
OneUptime push-metric monitor pattern for worker2 (2.0): a self-contained cron action decides pass/fail and POSTs a string token to a OneUptime Incoming Request monitor; open when building/tuning a worker2 monitor, its thresholds, or the OneUptime import JSON.
|
|
@@ -595,6 +596,12 @@ production deploy.**
|
|
|
595
596
|
- `_Query::fetchRow()` returns an object, not an array — access `$row->field`.
|
|
596
597
|
- Keep the metric POST non-fatal (`throwExceptionsOnFailure` off) so a monitoring outage never breaks the
|
|
597
598
|
worker job it rides in.
|
|
599
|
+
- **Two branches adding a monitor to the same `Monitor/<Client>.php` conflict if both insert at the
|
|
600
|
+
same spot.** Blank-line padding does not help — git merges by surrounding context. Put the new
|
|
601
|
+
method somewhere else (e.g. after the last helper) so the hunks sit far apart. Check with
|
|
602
|
+
`git merge-file` on base/ours/theirs, but normalize line endings first: `git show` gives LF, so a
|
|
603
|
+
CRLF working copy turns the whole file into one conflict. (Seen on `Monitor/Nychh.php`, TRUE-82760 +
|
|
604
|
+
TRUE-82758.)
|
|
598
605
|
- The `agilant-as2` S3 bucket is in **us-west-2**, not the config-default us-east-1 — S3 monitors must
|
|
599
606
|
pass the region (see [Cloud S3 helpers](../../_underscore/features/cloud-s3-helpers.md)).
|
|
600
607
|
|
|
@@ -606,6 +613,7 @@ production deploy.**
|
|
|
606
613
|
- [OneUptime 1.0 worker uptime monitoring](../../../1.0/apps/worker/features/oneuptime-worker-uptime-monitoring.md) — the 1.0 push-heartbeat predecessor
|
|
607
614
|
|
|
608
615
|
## Change history
|
|
616
|
+
- 2026-10-16 — Added same-class merge-conflict gotcha; linked NYCHH `TransferOrderEmailsOwed` (TRUE-82758). (mhammontree)
|
|
609
617
|
- 2026-10-15 — Absence rule must exceed the longest gap between pushes for non-`*/5` monitors; linked NYCHH `AssetTagBackfill` (twice daily, 960 min). (mhammontree)
|
|
610
618
|
- 2026-10-13 — Added `OfficeDepotInboundFiles` (cron 93, CloudWatch + S3) after `OfficeDepotEdiImportQueue` stayed green through the 2026-10-10 AS2 outage; import JSONs are never committed to worker2. (bala)
|
|
611
619
|
- 2026-10-05 — Added `CompassCanadaPurchaseOrderTransmissionsToVendors` (cron 87), the first monitor reading `Client_CompassCanada`. (bala)
|
package/knowledge/INDEX.md
CHANGED
|
@@ -22,7 +22,7 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
|
|
|
22
22
|
## 2.0 framework
|
|
23
23
|
|
|
24
24
|
- **_underscore** (_Underscore) _(framework core)_ — 101 doc(s) → [2.0/apps/_underscore/INDEX.md](2.0/apps/_underscore/INDEX.md)
|
|
25
|
-
- **worker2** (Worker) —
|
|
25
|
+
- **worker2** (Worker) — 88 doc(s) → [2.0/apps/worker2/INDEX.md](2.0/apps/worker2/INDEX.md)
|
|
26
26
|
- **api2** (API) — 26 doc(s) → [2.0/apps/api2/INDEX.md](2.0/apps/api2/INDEX.md)
|
|
27
27
|
- **dbchanges2** (Database Changes) _(framework core)_ — 22 doc(s) → [2.0/apps/dbchanges2/INDEX.md](2.0/apps/dbchanges2/INDEX.md)
|
|
28
28
|
- **toga2-supply** (TOGa Supply) — 9 doc(s) → [2.0/apps/toga2-supply/INDEX.md](2.0/apps/toga2-supply/INDEX.md)
|
|
@@ -18,7 +18,7 @@ project: Worker
|
|
|
18
18
|
client: elite
|
|
19
19
|
type: profile
|
|
20
20
|
status: active
|
|
21
|
-
updated: 2026-10-
|
|
21
|
+
updated: 2026-10-16
|
|
22
22
|
owners: [snaredla, apeterson, tcox, bala, rgirish, jcardinal]
|
|
23
23
|
files:
|
|
24
24
|
- worker2/Worker/Elite.php
|
|
@@ -197,6 +197,7 @@ parameters — they are not constants there.
|
|
|
197
197
|
- Configured in `_underscore` framework via `_Component_Api_Elite`
|
|
198
198
|
- API logs written to the `ClientLogs` database (`ClientLogs.Api` table) — this DB must
|
|
199
199
|
exist locally when running worker2 scripts against production Freshservice
|
|
200
|
+
- **⚠ Open (2026-10-16):** TogaDesk agent edits can be reverted by the TOGA 2 → TogaDesk copy-in before they reach Freshservice — see [library sync gotchas](../../1.0/apps/library/features/elite-freshservice-sync.md).
|
|
200
201
|
|
|
201
202
|
## Key custom fields
|
|
202
203
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
| [NYCHH inventory-adjustment → item-fulfillment linking (many bridges, REST)](features/netsuite-inventory-adjustment-fulfillment-link.md) | 1.0 | NYCHH import of the NetSuite inventory-adjustment→item-fulfillment link (direct FK, REST); open when a NYCHH adjustment's FK link is missing or the INVENTORY_AD |
|
|
7
7
|
| [NYCHH NetSuite → TransferOrders import (stocking-flag routing, PO bridges, origin location)](features/netsuite-transfer-order-import.md) | 1.0 | The 1.0 NetSuite→`Client_Nychh.TransferOrders` importer (stocking-flag routing, PO bridge links, origin/destination resolution, status map); open for any NYCHH |
|
|
8
8
|
| [NYCHH: asset-tag backfill monitor (Monitor/Nychh/AssetTagBackfill)](features/oneuptime-asset-tag-backfill-monitor.md) | 2.0 | worker2 OneUptime push monitor that alarms when new `Client_Nychh` units stay blank on asset tag while NetSuite has a tag for their serial; open when it fires o |
|
|
9
|
+
| [NYCHH: transfer-order emails owed monitor (Monitor/Nychh/TransferOrderEmailsOwed)](features/oneuptime-transfer-order-emails-owed-monitor.md) | 2.0 | worker2 OneUptime push monitor that alarms when a NYCHH Packed/Shipped transfer-order email has been owed too long; open when it fires or when changing the owed |
|
|
9
10
|
| [NYCHH: transfer-order NetSuite push monitor (Monitor/Nychh/TransferOrderNetsuitePush)](features/oneuptime-transfer-order-netsuite-push-monitor.md) | 2.0 | worker2 OneUptime push monitor that alarms when a `Client_Nychh` transfer order has no NetSuite id 15+ minutes after creation; open when it fires, or when chang |
|
|
10
11
|
| [NYCHH PO links are UPSTREAM — the downstream SO→PO route returns empty](features/po-number-upstream-direction.md) | 2.0 | Why NYCHH PO Number is empty on the downstream SO→PO route/`_purchaseOrders` field (links are upstream); open when a NYCHH SO shows a PO in the list but not the |
|
|
11
12
|
| [NYCHH Talos Assistant Enablement](features/talos-assistant-enablement.md) | 2.0 | NYCHH enables the shared Talos Supply panel through its Surface overrides and independent backend grants; open for suggestion configuration, exact tenant identi |
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "NYCHH: transfer-order emails owed monitor (Monitor/Nychh/TransferOrderEmailsOwed)"
|
|
3
|
+
framework: "2.0"
|
|
4
|
+
repo: worker2
|
|
5
|
+
project: Worker
|
|
6
|
+
client: nychh
|
|
7
|
+
type: client-feature
|
|
8
|
+
status: active
|
|
9
|
+
updated: 2026-10-16
|
|
10
|
+
owners: ["mhammontree"]
|
|
11
|
+
files:
|
|
12
|
+
- worker2/Worker/Monitor/Nychh.php
|
|
13
|
+
- dbchanges2/Core/2026-10-15b - NYCHH Transfer Order Emails Owed Monitor.sql
|
|
14
|
+
related:
|
|
15
|
+
- ../../../2.0/apps/worker2/features/oneuptime-worker2-monitoring.md
|
|
16
|
+
- ./transfer-order-notification-emails.md
|
|
17
|
+
- ./oneuptime-asset-tag-backfill-monitor.md
|
|
18
|
+
- ../profile.md
|
|
19
|
+
---
|
|
20
|
+
worker2 OneUptime push monitor that alarms when a NYCHH Packed/Shipped transfer-order email has been owed too long; open when it fires or when changing the owed test in `TransferOrderEmails.php`.
|
|
21
|
+
|
|
22
|
+
## Summary
|
|
23
|
+
`Monitor/Nychh/TransferOrderEmailsOwed` (`_Worker_Monitor_Nychh::TransferOrderEmailsOwed(?int $owedHours = null)`) watches the [transfer-order emails](./transfer-order-notification-emails.md) backstop cron. Built on TRUE-82758. Follows the shared [OneUptime push-metric pattern](../../../2.0/apps/worker2/features/oneuptime-worker2-monitoring.md).
|
|
24
|
+
|
|
25
|
+
- `Core.CronJobs` uuid `5648dc93-5ad7-4a17-a552-ef1a37917161`, `17 * * * *`, `maxExecutionTime` 300, `parameters` `{"owedHours": 24}`, shipped `isActive = 0`.
|
|
26
|
+
- Push URL = in-method `$ONEUPTIME_URL` local (credential; never record the value).
|
|
27
|
+
- Committed worker2 `c26186b` + `972d231`, dbchanges2 `61f7c6b`; pushed, not deployed as of 2026-10-16.
|
|
28
|
+
|
|
29
|
+
## How it works
|
|
30
|
+
1. "Owed" = the same test as `TransferOrderEmails::sendPendingFulfillmentEmails()` + `buildHasTrackingNumberSql()`, plus `ItemFulfillments.dtCreated >= 2026-10-15` (new data only).
|
|
31
|
+
2. Owed-since = `c_dtTransferOrderPackedExceptionSent` only while still held (`c_transferOrderEmailStageSent` blank); else `ItemFulfillments.dtUpdated`.
|
|
32
|
+
3. Any row owed longer than `owedHours` → `"alarm":"HIGH"`; none → `"alarm":"OK"`; missing `owedHours` or DB failure → `"status":"error"`.
|
|
33
|
+
4. Payload: `owedCount`, `heldForAssetTagsCount`, `owedFulfillments` (`TO/IF`, ` (held)` suffix, first 25), `oldestOwedSince`, `owedHours`, `cutoffDate`.
|
|
34
|
+
|
|
35
|
+
OneUptime: Incoming Request monitor "Monitor - NYCHH Transfer Order Emails Owed". `"alarm":"HIGH"` or `"status":"error"` → Offline + incident; `"alarm":"OK"` → Online. Not Received In Minutes **90** — add only after the first scheduled push.
|
|
36
|
+
|
|
37
|
+
## Decisions
|
|
38
|
+
- `owedHours` 24 to start; cutoff 2026-10-15 (developer).
|
|
39
|
+
- **Held-for-asset-tag rows still alarm HIGH** (ticket asked for it); payload counts them apart so the incident shows which kind.
|
|
40
|
+
- **Dropped "NetSuite stage shipped but no tracking"** — never seen (Skyler). The reverse (tracking set, stage not shipped) is already covered by the tracking-based Shipped email.
|
|
41
|
+
- Owed test is **copied, not shared** with `TransferOrderEmails.php`. Change both together.
|
|
42
|
+
|
|
43
|
+
## Gotchas
|
|
44
|
+
- **Do not use the exception stamp after packed is sent.** `c_dtTransferOrderPackedExceptionSent` is never cleared, so once tracking makes Shipped owed it would false-alarm at once (CTO review). `ItemFulfillments_TrackingNumbers` has no timestamp, hence `dtUpdated`.
|
|
45
|
+
- Accepted risk: tracking that lands without bumping the IF row leaves an old `dtUpdated`; the row can flap HIGH once if the hourly run beats the `*/5` backstop.
|
|
46
|
+
- Local test 2026-10-16 (POST to local worker2 vhost): OK, HIGH, HIGH-held and error all reached OneUptime; incident opened and auto-resolved.
|
|
47
|
+
- Shares `Monitor/Nychh.php` with TRUE-82760 (`AssetTagBackfill`) — merge TRUE-82760 first. See the merge gotcha in the [monitor pattern doc](../../../2.0/apps/worker2/features/oneuptime-worker2-monitoring.md).
|
|
48
|
+
|
|
49
|
+
## Change history
|
|
50
|
+
- 2026-10-16 — Created (TRUE-82758); pushed, not deployed. (mhammontree)
|
|
@@ -6,8 +6,8 @@ project: Worker
|
|
|
6
6
|
client: nychh
|
|
7
7
|
type: client-feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-10-
|
|
10
|
-
owners: ["bala", "rgirish", "jcardinal"]
|
|
9
|
+
updated: 2026-10-16
|
|
10
|
+
owners: ["bala", "rgirish", "jcardinal", "mhammontree"]
|
|
11
11
|
files:
|
|
12
12
|
- worker2/Worker/Client/Nychh/TransferOrderEmails.php
|
|
13
13
|
- _underscore/Model/Nychh/TransferOrder.php
|
|
@@ -31,6 +31,7 @@ related:
|
|
|
31
31
|
- ../../../2.0/apps/worker2/features/sandbox-dev-worker-environments.md
|
|
32
32
|
- ../profile.md
|
|
33
33
|
- ../../../1.0/apps/library/features/carrier-detection-from-tracking-number.md
|
|
34
|
+
- ./oneuptime-transfer-order-emails-owed-monitor.md
|
|
34
35
|
---
|
|
35
36
|
|
|
36
37
|
## Summary
|
|
@@ -160,6 +161,7 @@ PUT follows.** Fulfillment **2704** in production: header row at 20:33:09, lines
|
|
|
160
161
|
- It also picks up any send that threw (the marker was never written).
|
|
161
162
|
- Caps at **25 of each kind per run** (`MAXIMUM_EMAILS_PER_RUN`).
|
|
162
163
|
- **It is the real sender of Shipped** — see below.
|
|
164
|
+
- Alarm when a Packed/Shipped email stays owed > 24h: [emails owed monitor](./oneuptime-transfer-order-emails-owed-monitor.md). It copies this cron's owed test — change both together.
|
|
163
165
|
|
|
164
166
|
## ⚠ Shipped = tracking number, not the NetSuite stage (2026-10-05)
|
|
165
167
|
|
|
@@ -415,6 +417,7 @@ loaded out of the dbchanges2 file so an unresolved `{placeholder}` fails a test.
|
|
|
415
417
|
unescaped values and both detail-box defects were all found there, not in production.
|
|
416
418
|
|
|
417
419
|
## Change history
|
|
420
|
+
- 2026-10-16 — Linked the emails-owed monitor (TRUE-82758). (mhammontree)
|
|
418
421
|
- 2026-10-09 — **New York Minute shows its logo, and NON_SERIALIZED lines are ignored by the asset-tag
|
|
419
422
|
reads** (TRUE-82527). `CARRIER_LOGO_URL_BY_CARRIER_NAME` gained `NEW YORK MINUTE` (no tracking site,
|
|
420
423
|
so logo + plain number, no link), paired with `Client_Nychh/2026-10-09 - NewYorkMinuteShippingCarrier.sql`
|
|
@@ -19,7 +19,7 @@ project: _Underscore
|
|
|
19
19
|
client: nychh
|
|
20
20
|
type: profile
|
|
21
21
|
status: active
|
|
22
|
-
updated: 2026-10-
|
|
22
|
+
updated: 2026-10-16
|
|
23
23
|
owners: [jcardinal, apeterson, bala, akhokhani, mhammontree]
|
|
24
24
|
files:
|
|
25
25
|
- dbchanges2/Client_Nychh/2026-09-02a - TransferOrderNetsuitePushInterceptor.sql
|
|
@@ -57,6 +57,8 @@ related:
|
|
|
57
57
|
- ../../2.0/apps/toga25-supply/features/transfer-orders-page.md
|
|
58
58
|
- ./features/location-shipping-addresses.md
|
|
59
59
|
- ./features/oneuptime-asset-tag-backfill-monitor.md
|
|
60
|
+
- ./features/oneuptime-transfer-order-emails-owed-monitor.md
|
|
61
|
+
- ./features/transfer-order-notification-emails.md
|
|
60
62
|
---
|
|
61
63
|
|
|
62
64
|
NYC Health & Hospitals (NYCHH) client profile — open for supply-chain / TransferOrder / NetSuite-sync work on prod schema `Client_Nychh`.
|
|
@@ -70,7 +72,7 @@ TOGA 2.0 client on `_underscore`, prod schema `Client_Nychh`. Supply-chain / ful
|
|
|
70
72
|
|
|
71
73
|
## Key features (this client)
|
|
72
74
|
- **ITEM_FULFILLMENTS froze `1-RUNNING` 2026-09-30 → 2026-10-06 (Event issue 483) — fixed + prod-verified 2026-10-06 (library).** NS order 4512137 (#165198, stocking) existed twice: stale TransferOrder 508 (pre-2026-09-03 stocking rule) + SalesOrder 168. IF reconcile tried to delete TO line 7409 that an IA line linked to → FK 1451. New reverse retire (TO→SO) + IA-link move before IF-line deletes; TO 508 retired, cursor past `4605943`. Remaining doubles: #233366 (SO 172 / TO 1811 — retires when its IF 2392 syncs), #290752 (SO 167 / TO 1958, no IFs — waits for SALES_ORDERS feed). See [per-client sync](../../1.0/apps/worker/features/netsuite-togasupply-per-client-sync.md).
|
|
73
|
-
- **Transfer-order "Order Shipped" email fires on the first tracking number, not the NetSuite shipped stage (2026-10-05, prod).** Warehouse marks shipped after delivery. NYCHH is the only client emailing off the NS shipped stage. See [TO notification emails](./features/transfer-order-notification-emails.md).
|
|
75
|
+
- **Transfer-order "Order Shipped" email fires on the first tracking number, not the NetSuite shipped stage (2026-10-05, prod).** Warehouse marks shipped after delivery. NYCHH is the only client emailing off the NS shipped stage. See [TO notification emails](./features/transfer-order-notification-emails.md). Alarm when one stays owed > 24h: [emails owed monitor](./features/oneuptime-transfer-order-emails-owed-monitor.md) (TRUE-82758, not deployed 2026-10-16).
|
|
74
76
|
- **Prod NetSuite feeds (2026-10-02):** only ITEM_FULFILLMENTS + INVENTORY_ADJUSTMENTS run (worker `511a7fd9`, 2026-09-30), cursors rewound to 2022/2023.
|
|
75
77
|
- **TO destination + own ship-to (2026-10-02, library `8f974d93`, _underscore `6839dd3e`).** NetSuite-entered TOs landed on catch-all Location 2 (text match failed on Queens hyphens + multi-address sites). Destination now = mapped NetSuite address-book entry → text match → Location 2; TOs own `shipToAddressId`; Location auto-create uses default shipping. Mapping: 61 entries → 18 sites. See [TO import](./features/netsuite-transfer-order-import.md), [address-book mapping](../../1.0/apps/worker/workflows/netsuite-addressbook-location-mapping.md).
|
|
76
78
|
- **TO↔customer-PO line matching fixed (2026-10-02, `1bc4de52`).** Old matcher picked unstocked duplicate PO lines and created empty PO lines; now ranks stocked lines and allows reuse. 161 TOs re-processed; 86 bad links over 62 TOs remained at last measure (re-process result pending). See [reconcile](../../1.0/apps/library/features/transfer-order-purchase-order-link-reconcile.md).
|
|
@@ -122,6 +124,7 @@ TOGA 2.0 client on `_underscore`, prod schema `Client_Nychh`. Supply-chain / ful
|
|
|
122
124
|
- **PO links are UPSTREAM (`PurchaseOrders_SalesOrders`), not downstream.** The downstream `sales-order-purchase-orders` route returns an empty array for NYCHH by design, and the shared `_purchaseOrders` field (downstream-only) resolves to `null` for this tenant — open gap. See [PO Number direction](./features/po-number-upstream-direction.md).
|
|
123
125
|
|
|
124
126
|
## Notes
|
|
127
|
+
- **1.0 cron "Send NYCHH Sales Orders" sends nothing (2026-10-15, TRUE-82761, parked).** `worker/crons/toga2/nychh/send_sales_order.php` (`*/5`) emails each `SalesOrders` row with `c_dtTransmittedToNYCHH IS NULL` as an xlsx to the warehouse. In prod all 125 rows have it NULL and none has `createdByUserId` (all NetSuite-imported), so its `INNER JOIN Users ON createdByUserId` drops every row. Supply orders are now `TransferOrders`. A monitor on that column would be always HIGH or always OK — don't build one. Open: ask Jelena if the transmission is still used.
|
|
125
128
|
- **`Items.title` is NULL on most NYCHH rows — `description` is the populated label field.** Confirmed 2026-09-03 on client-sandbox (a `transfer-order-items` line returned `"title": null` with a real `partNumber`). Every screen that labels an item for this tenant needs the `title || description` chain — the Transfer Order record modal and the Create modal's item picker both carry it. The real fix is populating `Items.title`.
|
|
126
129
|
- **Role ids in `Client_Nychh` (verified 2026-09-01):** `1 = Base`, `2 = Developer`, `3 = API`. Role ids differ per client DB — resolve by **name** in migrations, never hard-code these.
|
|
127
130
|
- **The Agilant API (`Client_Nychh.Apis` id 1) holds BOTH Base (1) and API (3) via `Apis_Roles` (2026-10-06).** Record ACL = union, so checking only the API role misleads. Base grants full CRUD on 28/312/313 (ItemFulfillments, TransferOrders, TransferOrderItems); API role has no DELETE on 312/313 and no row for 28. Interceptors: record 312 has POST/POST + POST/PUT only (none on DELETE).
|
package/package.json
CHANGED