sync: auto-sync from GURU-BEAST-ROG at 2026-05-27 16:11:22
Author: Mike Swanson Machine: GURU-BEAST-ROG Timestamp: 2026-05-27 16:11:22
This commit is contained in:
@@ -119,14 +119,16 @@ Content-Type: application/json
|
|||||||
"name": "Labor - Remote Business",
|
"name": "Labor - Remote Business",
|
||||||
"description": "Work performed description",
|
"description": "Work performed description",
|
||||||
"quantity": 2.0,
|
"quantity": 2.0,
|
||||||
"price": 0.0,
|
"price_retail": 0.0,
|
||||||
"taxable": false
|
"taxable": false
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- `price`: use `0.0` for block customers; for non-block, fetch live rate first: `GET /api/v1/products/{product_id}` → `.product.price_retail`
|
- `price_retail`: **CRITICAL — use `price_retail`, NOT `price`.** Using `price` silently discards the value and bills $0.00 even though the API returns HTTP 200. Confirmed broken 2026-05-27 (ticket #32335).
|
||||||
|
- Block customers: `"price_retail": 0.0`
|
||||||
|
- Non-block customers: fetch live rate first (`GET /api/v1/products/{product_id}` → `.product.price_retail`), then pass that value
|
||||||
- `taxable`: always `false` for labor (Arizona labor is never taxable)
|
- `taxable`: always `false` for labor (Arizona labor is never taxable)
|
||||||
- Success response: HTTP 200 with the new line item's `id`
|
- Success response: HTTP 200 with the new line item's `id` — verify `price_retail` in the response matches what you sent
|
||||||
|
|
||||||
**Pre-billing check** — before adding line items, verify the ticket has no existing labor to avoid duplicates:
|
**Pre-billing check** — before adding line items, verify the ticket has no existing labor to avoid duplicates:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -316,3 +316,110 @@ That cascade produced several **rule changes** (all encoded in memory + the rele
|
|||||||
- Tickets: #32329 (id 111214431, Michael Johnson), #32332 (id 111233015, Cascades), #32323 (id 111056440, Quantum).
|
- Tickets: #32329 (id 111214431, Michael Johnson), #32332 (id 111233015, Cascades), #32323 (id 111056440, Quantum).
|
||||||
- IX `172.16.3.10`; mail.acghosting.com `67.206.163.124`. Products: hosting `45869`, emergency `26184`, onsite `26118`, remote `1190473`. Tech user_ids: Mike 1735, Howard 1750, Winter 1737.
|
- IX `172.16.3.10`; mail.acghosting.com `67.206.163.124`. Products: hosting `45869`, emergency `26184`, onsite `26118`, remote `1190473`. Tech user_ids: Mike 1735, Howard 1750, Winter 1737.
|
||||||
- Quantum tenant `2fd0092b`; detail in `clients/quantumwms/session-logs/2026-05-27-session.md`.
|
- Quantum tenant `2fd0092b`; detail in `clients/quantumwms/session-logs/2026-05-27-session.md`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Update: 16:06 PT — BEAST Discord bot: emergency billing test ticket
|
||||||
|
|
||||||
|
|
||||||
|
## User
|
||||||
|
- **User:** Mike Swanson (mike)
|
||||||
|
- **Machine:** GURU-BEAST-ROG
|
||||||
|
- **Role:** admin
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Session Summary
|
||||||
|
|
||||||
|
Mike requested a 1.5-hour emergency ticket be created in Syncro against the internal test client (Arizona Computer Guru, customer ID 15353550). The description and resolution were to be fabricated. The scenario chosen was an emergency NAS outage: a Synology DS923+ went offline after a UPS power event, causing all SMB shares to become inaccessible. Resolution involved SSH access to the NAS, fsck on the volume group, and re-enabling SMB service after the dirty-volume flag was cleared.
|
||||||
|
|
||||||
|
Ticket #32335 was created via the Syncro API with subject "Emergency - NAS device offline, share access lost for all workstations," status Resolved, and two comment blocks (description and resolution). A 1.5-hr emergency labor line item was then added using product 26184 (Labor - Emergency or After Hours Business) at the live rate of $262.50/hr, for a ticket total of $393.75.
|
||||||
|
|
||||||
|
During line item creation, a bug was discovered in the billing process documentation: the `add_line_item` API endpoint requires the field name `price_retail`, not `price`. Passing `price` silently succeeds (HTTP 200) but discards the value, billing $0.00. This required multiple attempts to isolate — a test line item and a zero-price line item were left on the ticket as artifacts of the troubleshooting. Both are zero-value and do not affect the total, but should be manually deleted in the Syncro UI.
|
||||||
|
|
||||||
|
The billing skill documentation at `.claude/commands/syncro-emergency-billing.md` was patched to replace `price` with `price_retail` in the example JSON body, add an explicit warning about the silent-discard behavior, and reference ticket #32335 as the discovery event. The corrected line item (ID 42611396) confirmed the fix works: `price_retail: 262.5` in the response and correct total on the ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Decisions
|
||||||
|
|
||||||
|
- Used "Arizona Computer Guru" (customer 15353550) as the internal test client — the only ACG-named customer in Syncro, the obvious choice for internal test billing.
|
||||||
|
- Fabricated a NAS outage scenario rather than a server/workstation scenario — NAS emergencies are common, the resolution steps are plausible and concise, and it doesn't reference any real client infrastructure.
|
||||||
|
- Applied the emergency premium (product 26184) directly rather than suggesting it, because Mike explicitly requested an "emergency ticket" — per billing rules, explicit request = apply the premium.
|
||||||
|
- Non-block customer path: single line item at $262.50/hr, no prepay split needed.
|
||||||
|
- Kept the two zero-value artifact line items on the ticket rather than pursuing further API workarounds — they net zero, the correct line item is present, and manual UI deletion is straightforward.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problems Encountered
|
||||||
|
|
||||||
|
- **`price` field silently discarded by add_line_item API.** Passing `"price": 262.5` returned HTTP 200 but the line item was billed at $0.00. Isolated through iterative testing: trying `update_line_item` (404), `PUT /tickets/{id}` with `line_items_attributes` (no-op on price), direct `PUT/PATCH` on line item (404), and finally re-adding with `"price_retail": 262.5` which succeeded. The `price_retail` field both set the value correctly and returned it in the response. **Resolution:** patched billing skill doc; added correct line item via `price_retail`.
|
||||||
|
- **`delete_line_item` endpoint returned 404.** Both `DELETE` with query param and `POST` with JSON body returned 404. The `_destroy` flag in `line_items_attributes` PUT also had no effect. No working delete path found via API — manual UI deletion is required for the two artifact line items.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Configuration Changes
|
||||||
|
|
||||||
|
- **Modified:** `.claude/commands/syncro-emergency-billing.md`
|
||||||
|
- Changed `"price": 0.0` to `"price_retail": 0.0` in the example JSON body
|
||||||
|
- Added warning: "`price_retail` CRITICAL — use `price_retail`, NOT `price`. Using `price` silently discards the value and bills $0.00 even though the API returns HTTP 200. Confirmed broken 2026-05-27 (ticket #32335)."
|
||||||
|
- Updated the `price` annotation to explain block vs non-block behavior using `price_retail`
|
||||||
|
- Added instruction to verify `price_retail` in the response after adding a line item
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Credentials & Secrets
|
||||||
|
|
||||||
|
- **Syncro API key:** retrieved from vault path `msp-tools/syncro.sops.yaml` → `credentials.credential` (not logged here)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Infrastructure & Servers
|
||||||
|
|
||||||
|
- **Syncro tenant:** computerguru.syncromsp.com
|
||||||
|
- **Syncro customer:** Arizona Computer Guru | ID: 15353550
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Commands & Outputs
|
||||||
|
|
||||||
|
```
|
||||||
|
# Customer search
|
||||||
|
GET /api/v1/customers?query=Arizona+Computer+Guru
|
||||||
|
→ ID 15353550, "Arizona Computer Guru", Michael Swanson
|
||||||
|
|
||||||
|
# Live rate check
|
||||||
|
GET /api/v1/products/26184
|
||||||
|
→ price_retail: 262.5
|
||||||
|
|
||||||
|
# Ticket creation
|
||||||
|
POST /api/v1/tickets
|
||||||
|
→ ticket id: 111265518, number: 32335, status: Resolved
|
||||||
|
|
||||||
|
# Correct line item (working)
|
||||||
|
POST /api/v1/tickets/111265518/add_line_item
|
||||||
|
{"product_id": 26184, "name": "Labor - Emergency or After Hours Business",
|
||||||
|
"description": "Emergency remote - NAS offline...",
|
||||||
|
"quantity": 1.5, "price_retail": 262.5, "taxable": false}
|
||||||
|
→ id: 42611396, price_retail: 262.5, qty: 1.5
|
||||||
|
|
||||||
|
# Final ticket total: $393.75 (1.5 hrs x $262.50)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pending / Incomplete Tasks
|
||||||
|
|
||||||
|
- **Manual cleanup needed:** Delete two zero-value line items from ticket #32335 in the Syncro UI:
|
||||||
|
- ID 42611371 — qty 1.5, price $0.00 (artifact from `price` field bug)
|
||||||
|
- ID 42611384 — qty 0.0, price $262.50 (artifact from price field test)
|
||||||
|
- Correct line item to keep: ID 42611396 — qty 1.5, price $262.50
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Reference Information
|
||||||
|
|
||||||
|
- **Syncro ticket:** #32335 | https://computerguru.syncromsp.com/tickets/111265518
|
||||||
|
- **Product 26184:** Labor - Emergency or After Hours Business | $262.50/hr
|
||||||
|
- **Billing skill doc:** `.claude/commands/syncro-emergency-billing.md`
|
||||||
|
- **Vault path accessed:** `msp-tools/syncro.sops.yaml`
|
||||||
|
|||||||
Reference in New Issue
Block a user