toga-ai 1.0.76 → 1.0.77

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.
@@ -4,7 +4,7 @@
4
4
  |-----|---------|-------|
5
5
  | [TOGa Desk Architecture](architecture.md) | TOGa Desk is the staff-facing support desk **and field-service platform** (analysts work at `/desk/`). | desk/index.php, desk/includes/loader.php, desk/config.php, desk/includes/controllers/actions.php, desk/includes/controllers/data.php, desk/includes/controllers/modals.php, desk/includes/classes/class.app.php, desk/includes/classes/class.ticket.php, desk/api/index.php, desk/api/resources/tickets.php, crons/tickets.php |
6
6
  | [Email-to-Ticket Intake (crons/tickets.php)](features/email-to-ticket-intake.md) | TOGa Desk ingests support email into tickets through a cron-driven IMAP poller (`crons/tickets.php`) plus a postfix pipe variant (`crons/pipe.php`). | crons/tickets.php, crons/tickets_prod.php, crons/pipe.php, desk/includes/classes/class.ticket.php |
7
- | [Field-Service Dispatch (central / repair orders)](features/field-service-dispatch.md) | The **central** subsystem is TOGa Desk's field-service dispatch domain: repair-order lifecycle, technician scheduling, onsite vs depot service, parts, and shipm | desk/includes/controllers/actions/central/, desk/includes/classes/class.repair.php, desk/includes/classes/class.repairhistory.php, desk/_/browser/datatable/central.php, desk/template/pages/central.php, desk/template/pages/central/view.php |
7
+ | [Field-Service Dispatch (central / repair orders)](features/field-service-dispatch.md) | The **central** subsystem is TOGa Desk's field-service dispatch domain: repair-order lifecycle, technician scheduling, onsite vs depot service, parts, and shipm | desk/includes/controllers/actions/central/, desk/includes/classes/class.repair.php, desk/includes/classes/class.repairhistory.php, desk/_/browser/datatable/central.php, desk/template/pages/central.php, desk/template/pages/central/view.php, desk/template/modals/central/addTracking.php, library/app/model/togadesk/repairordertracking.php, library/app/api/carrier/ups.php |
8
8
  | [REST API (RPC-over-POST) & API-Key Auth](features/rest-api.md) | TOGa Desk exposes a programmatic API at `desk/api/`. | desk/api/index.php, desk/api/resources/tickets.php, desk/api/resources/assets.php, desk/api/resources/authenticate.php, desk/includes/classes/class.apikey.php, desk/includes/functions.php |
9
9
  | [SMB Contract Editing & the clientMspId Corruption Trap](features/smb-contract-editing.md) | The SMB contracts page (`/desk/?route=toga/smbcontracts&togaClientId=<id>`) edits `TOGA_*.SMBContracts` rows via a modal. | desk/template/modals/toga/smbcontracts/smbContract.php, desk/includes/controllers/modals/toga/smbcontracts/smbContract.php, desk/includes/controllers/actions/toga/smbcontracts/smbContract.php, desk/includes/controllers/actions/toga/smbcontracts/edit.php |
10
10
  | [Ticket Lifecycle (class.ticket.php)](features/ticket-lifecycle.md) | All TOGa Desk ticket creation and reply handling funnels through `Ticket` in `desk/includes/classes/class.ticket.php`. | desk/includes/classes/class.ticket.php, desk/includes/controllers/actions.php, desk/api/resources/tickets.php, crons/tickets.php, desk/includes/controllers/actions/tickets/merge.php |
@@ -7,7 +7,7 @@ client: shared
7
7
  type: feature
8
8
  status: active
9
9
  updated: 2026-06-15
10
- owners: ["jcardinal"]
10
+ owners: ["jcardinal", "mhammontree"]
11
11
  files:
12
12
  - desk/includes/controllers/actions/central/
13
13
  - desk/includes/classes/class.repair.php
@@ -15,6 +15,9 @@ files:
15
15
  - desk/_/browser/datatable/central.php
16
16
  - desk/template/pages/central.php
17
17
  - desk/template/pages/central/view.php
18
+ - desk/template/modals/central/addTracking.php
19
+ - library/app/model/togadesk/repairordertracking.php
20
+ - library/app/api/carrier/ups.php
18
21
  related:
19
22
  - 1.0/apps/togadesk/architecture.md
20
23
  - 1.0/apps/togadesk/features/ticket-lifecycle.md
@@ -53,6 +56,25 @@ the originating page. Status changes are audited through `RepairHistory` (`repai
53
56
  onsite/install started → review → closed; depot repairs add parts/tracking steps. Bulk actions
54
57
  exist for closing installs and editing onsite tickets.
55
58
 
59
+ ## UPS shipment / carrier-account billing (Prepare Shipment flow)
60
+ The "PREPARE SHIPMENT" button opens modal `desk/template/modals/central/addTracking.php`,
61
+ whose carrier/account dropdown is built from the constant
62
+ `App_Model_TogaDesk_RepairOrderTracking::CARRIER_ACCOUNTS`
63
+ (`library/app/model/togadesk/repairordertracking.php`) — a display⇒value list of multiple
64
+ carrier accounts (Agilant `8696XA`, ODP Veyer `H4Y167`, Compass `33951W`, Advance Auto
65
+ `2V1Y10`, Vision Precision `87161X`, plus FedEx accounts). Submit calls
66
+ `Repair::addTracking($_POST)` (~L600 in `class.repair.php`), which builds an
67
+ `App_Api_Carrier_ShipmentRequest` and calls `App_Api_Carrier_UPS::submitShipmentRequest()`.
68
+
69
+ **The displayed account and the billed account come from different places.** The dropdown is
70
+ just `CARRIER_ACCOUNTS`; the account that actually ships/bills is the hardcoded
71
+ `const SHIPPER_NUMBER` in `library/app/api/carrier/ups.php`, injected into the UPS payload as
72
+ *both* `Shipment.Shipper.ShipperNumber` and `BillShipper.AccountNumber`. `SHIPPER_NUMBER` is
73
+ shared **library core** consumed by every 1.0 app (togadesk, togaview, worker); a separate
74
+ synced copy lives in `_underscore` for 2.0 apps, plus a hardcoded `<ShipAccount>` in
75
+ `library/app/api/essls.php`. Full account-location map:
76
+ `C:\WWW\shipping_carrier_ups_account_location.md`.
77
+
56
78
  ## Data model
57
79
  `repair_orders`, `repair_order_customers`, `repair_order_addresses`, `repair_order_technicians`,
58
80
  `repair_history` (in `db_togadesk`), joined to TOGA `ServiceRequests` for managed-service-order
@@ -70,7 +92,21 @@ always confirm the client arm before changing shared central logic.
70
92
  an order in an inconsistent state.
71
93
  - Cross-database context: some central data controllers switch the DB link to a client database
72
94
  (`App_Model_Client::changeDbLinkToClientDatabase()`).
95
+ - **UPS carrier-account dropdown is NOT honored by the shipment API call.** In
96
+ `Repair::addTracking()` the selected `carrierAccount` is only saved onto the tracking record
97
+ (`$track->carrierAccount = $data['carrierAccount']`, ~L932/949/966); it is never passed into
98
+ the `ShipmentRequest`. `submitShipmentRequest()` therefore always bills the hardcoded
99
+ `SHIPPER_NUMBER` (Agilant), so picking ODP Veyer / Compass / etc. has no billing effect. True
100
+ third-party billing would require passing the chosen account into the request via a UPS
101
+ `BillThirdParty` / `BillReceiver` payment block instead of `BillShipper`.
102
+ - The Agilant UPS account is **hardcoded in core, not config/DB** — changing it means editing
103
+ `SHIPPER_NUMBER` in both framework cores (`library` and `_underscore`), the ESSLS
104
+ `<ShipAccount>` XML, the `CARRIER_ACCOUNTS` Agilant entry, and test fallbacks. See the
105
+ account-location map noted under *UPS shipment / carrier-account billing*.
73
106
 
74
107
  ## Change history
108
+ - 2026-06-15 — documented UPS Prepare Shipment flow: CARRIER_ACCOUNTS dropdown vs hardcoded
109
+ SHIPPER_NUMBER, and the gotcha that the dropdown selection is never forwarded to the UPS API
110
+ (always bills Agilant). Agilant account migrated 135FV5 → 8696XA. (mhammontree)
75
111
  - 2026-06-15 — documented from a source read of `controllers/actions/central/` and
76
112
  `class.repair.php` (jcardinal)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.76",
3
+ "version": "1.0.77",
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",