toga-ai 1.0.128 → 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.
- package/knowledge/1.0/apps/togaview/INDEX.md +1 -0
- package/knowledge/1.0/apps/togaview/workflows/route53-cross-account-zone-migration.md +97 -0
- package/knowledge/INDEX.md +1 -1
- package/knowledge/clients/compass-usa/INDEX.md +1 -1
- package/knowledge/clients/compass-usa/features/asn-to-item-fulfillment.md +28 -1
- package/package.json +1 -1
|
@@ -7,3 +7,4 @@
|
|
|
7
7
|
| [MSP Dashboard & Ticket Visibility Rules](features/msp-dashboard.md) | Why tickets "disappear" in the TOGa View client portal: different pages scope tickets **differently**, and the MSP pages depend on `tickets.customerid` and `SMB | common/togaview/msp_dashboard.php, mvc/msp_client_dashboard, mvc/enterprise_dashboard, mvc/support/support.php |
|
|
8
8
|
| [Retail Commerce Lifecycle (winback, purchase, claims, activation)](features/retail-commerce-lifecycle.md) | Beyond support, TOGa View hosts the **retail tech-support commerce flows**: subscription purchase/renewal (with payment), service activation, and insurance-styl | mvc/winback_landing/get.php, mvc/winback_payment/get.php, mvc/winback_payment/post.php, mvc/purchase/get.php, mvc/service_activation/get.php, mvc/claims/get.php, mvc/techsupport_app/get.php |
|
|
9
9
|
| [Ticket Detail Page Security (common/togaview/ticket.php)](features/ticket-detail-page.md) | `common/togaview/ticket.php` is the ticket detail page for nearly ALL hosts — only towfoundation/newcenturyholdingsllc have their own variants; every other clie | common/togaview/ticket.php |
|
|
10
|
+
| [Route 53 Hosted Zone Migration Between AWS Accounts](workflows/route53-cross-account-zone-migration.md) | How to move a domain's DNS records (a Route 53 hosted zone) from one AWS account to another. | |
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Route 53 Hosted Zone Migration Between AWS Accounts
|
|
3
|
+
framework: "1.0"
|
|
4
|
+
repo: togaview
|
|
5
|
+
project: TOGa View
|
|
6
|
+
client: shared
|
|
7
|
+
type: workflow
|
|
8
|
+
status: active
|
|
9
|
+
updated: 2026-06-18
|
|
10
|
+
owners: ["jcardinal"]
|
|
11
|
+
files: []
|
|
12
|
+
related: []
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Summary
|
|
16
|
+
How to move a domain's DNS records (a Route 53 hosted zone) from one AWS account to
|
|
17
|
+
another. This is the playbook used to migrate `togaview.com`. The trigger is any time a
|
|
18
|
+
domain's DNS needs to live in a different AWS account (account consolidation, client
|
|
19
|
+
hand-off, separating environments).
|
|
20
|
+
|
|
21
|
+
**Key fact that drives the whole process:** a Route 53 hosted zone **cannot be moved or
|
|
22
|
+
transferred between accounts** — there is no transfer API. You must **export the records,
|
|
23
|
+
create a new zone in the target account, re-import the records, and repoint the domain's
|
|
24
|
+
name servers.** This is a DNS-records move only; it is separate from moving a *domain
|
|
25
|
+
registration* (Route 53 Domains), which is its own transfer process.
|
|
26
|
+
|
|
27
|
+
## Steps
|
|
28
|
+
|
|
29
|
+
CloudShell is per-account, so you run the export in the **source** account's CloudShell and
|
|
30
|
+
the import in the **target** account's CloudShell, transferring one small file between them.
|
|
31
|
+
|
|
32
|
+
1. **SOURCE CloudShell — export records.**
|
|
33
|
+
```bash
|
|
34
|
+
ZONE_ID=$(aws route53 list-hosted-zones-by-name --dns-name togaview.com. \
|
|
35
|
+
--query "HostedZones[?Name=='togaview.com.'].Id | [0]" --output text)
|
|
36
|
+
aws route53 list-resource-record-sets --hosted-zone-id "$ZONE_ID" \
|
|
37
|
+
--output json > togaview-records.json
|
|
38
|
+
```
|
|
39
|
+
(If the zone has more than ~300 records, `list-resource-record-sets` paginates — add
|
|
40
|
+
pagination handling.)
|
|
41
|
+
|
|
42
|
+
2. **SOURCE CloudShell — build the import batch.** Strip the apex `SOA` and apex `NS`
|
|
43
|
+
records; the new zone generates its own. Delegated-subdomain NS records are preserved.
|
|
44
|
+
```bash
|
|
45
|
+
jq --arg z "togaview.com." '{
|
|
46
|
+
Changes: [ .ResourceRecordSets[]
|
|
47
|
+
| select( ((.Type=="SOA") or (.Type=="NS" and .Name==$z)) | not )
|
|
48
|
+
| {Action:"UPSERT", ResourceRecordSet:.} ]
|
|
49
|
+
}' togaview-records.json > change-batch.json
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
3. **Move `change-batch.json` to the target account.** CloudShell can't see across
|
|
53
|
+
accounts — use **Actions → Download file** in the source shell, then **Actions → Upload
|
|
54
|
+
file** in the target shell (or copy/paste the contents).
|
|
55
|
+
|
|
56
|
+
4. **TARGET CloudShell — create zone and import.**
|
|
57
|
+
```bash
|
|
58
|
+
NEW_ZONE_ID=$(aws route53 create-hosted-zone --name togaview.com \
|
|
59
|
+
--caller-reference "togaview-migration-$(date +%s)" \
|
|
60
|
+
--query 'HostedZone.Id' --output text)
|
|
61
|
+
aws route53 change-resource-record-sets --hosted-zone-id "$NEW_ZONE_ID" \
|
|
62
|
+
--change-batch file://change-batch.json
|
|
63
|
+
aws route53 get-hosted-zone --id "$NEW_ZONE_ID" \
|
|
64
|
+
--query 'DelegationSet.NameServers' --output table
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
5. **Verify before cutover** by querying the new zone's name servers directly — this tests
|
|
68
|
+
the new zone without touching live traffic, since the registrar still points at the old
|
|
69
|
+
one. Compare against the live records:
|
|
70
|
+
```bash
|
|
71
|
+
dig @ns-xxx.awsdns-xx.com togaview.com SOA +short
|
|
72
|
+
dig @ns-xxx.awsdns-xx.com www.togaview.com +short
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
6. **Cutover** — at the domain's registrar, replace the NS records with the 4 from step 4.
|
|
76
|
+
Propagation is bounded by the NS record TTL at the registrar.
|
|
77
|
+
|
|
78
|
+
7. **Cleanup (after propagation confirmed)** — leave the old zone as a fallback for a day or
|
|
79
|
+
two. Once public resolvers (`dig NS togaview.com +short`) return the new name servers,
|
|
80
|
+
empty the old zone of custom records and delete it.
|
|
81
|
+
|
|
82
|
+
## Systems involved
|
|
83
|
+
AWS Route 53 (hosted zones), AWS CloudShell (per-account CLI), the domain registrar (where
|
|
84
|
+
NS records are set — external for `togaview.com`).
|
|
85
|
+
|
|
86
|
+
## Edge cases & escalation
|
|
87
|
+
- **Alias / ACM-validation records** that point to AWS resources (CloudFront, ELB/ALB, S3,
|
|
88
|
+
API Gateway) in the **source** account reference account-specific resources that may not
|
|
89
|
+
exist in the target account. Inspect the record dump first; these need special handling or
|
|
90
|
+
recreation. (`togaview.com` had none — plain records only.)
|
|
91
|
+
- **`UPSERT` is idempotent** — if a step fails midway, just re-run it; no duplicates.
|
|
92
|
+
- **Nothing in steps 1–5 touches live DNS.** The only user-visible change is the NS switch in
|
|
93
|
+
step 6.
|
|
94
|
+
- **Domain registration** moving (Route 53 Domains) is a separate transfer, not covered here.
|
|
95
|
+
|
|
96
|
+
## Change history
|
|
97
|
+
- 2026-06-18 — Initial playbook from the togaview.com hosted-zone migration (jcardinal)
|
package/knowledge/INDEX.md
CHANGED
|
@@ -7,7 +7,7 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
|
|
|
7
7
|
- **library** (Library) _(framework core)_ — 4 doc(s) → [1.0/apps/library/INDEX.md](1.0/apps/library/INDEX.md)
|
|
8
8
|
- **worker** (Worker) — 9 doc(s) → [1.0/apps/worker/INDEX.md](1.0/apps/worker/INDEX.md)
|
|
9
9
|
- **togadesk** (TOGa Desk) — 7 doc(s) → [1.0/apps/togadesk/INDEX.md](1.0/apps/togadesk/INDEX.md)
|
|
10
|
-
- **togaview** (TOGa View) —
|
|
10
|
+
- **togaview** (TOGa View) — 6 doc(s) → [1.0/apps/togaview/INDEX.md](1.0/apps/togaview/INDEX.md)
|
|
11
11
|
- **webhook** (Webhook) — 1 doc(s) → [1.0/apps/webhook/INDEX.md](1.0/apps/webhook/INDEX.md)
|
|
12
12
|
- **walmarttechservices** (Walmart Tech Services) — 1 doc(s) → [1.0/apps/walmarttechservices/INDEX.md](1.0/apps/walmarttechservices/INDEX.md)
|
|
13
13
|
- **test** (Test) — 10 doc(s) → [1.0/apps/test/INDEX.md](1.0/apps/test/INDEX.md)
|
|
@@ -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-
|
|
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