sync: auto-sync from GURU-BEAST-ROG at 2026-05-22 14:57:57

Author: Mike Swanson
Machine: GURU-BEAST-ROG
Timestamp: 2026-05-22 14:57:57
This commit is contained in:
2026-05-22 14:57:58 -07:00
parent 66c65fa9bb
commit 68e523388a
2 changed files with 116 additions and 0 deletions

View File

@@ -16,6 +16,9 @@ Options:
--settle-ms N Extra wait after load for JS to render (default 1500)
--timeout-ms N Navigation timeout (default 25000)
--wait-until STATE domcontentloaded | load | networkidle (default: load)
--zip CODE Set delivery/location zip code for supported retailers
(Amazon, Best Buy). Defaults to 85715 (Tucson, AZ).
Pass empty string to skip: --zip ""
Exit codes: 0 ok, 2 navigation/render error, 3 bad usage.
Errors go to stderr; page content goes to stdout.
@@ -36,6 +39,8 @@ def main() -> int:
ap.add_argument("--timeout-ms", type=int, default=25000)
ap.add_argument("--wait-until", default="load",
choices=["domcontentloaded", "load", "networkidle"])
ap.add_argument("--zip", default="85715",
help="Delivery zip for Amazon/Best Buy (default: 85715). Pass empty to skip.")
args = ap.parse_args()
if not args.url.lower().startswith(("http://", "https://")):
@@ -70,6 +75,38 @@ def main() -> int:
)
page = ctx.new_page()
try:
# Pre-set delivery zip for supported retailers before loading the target URL.
if args.zip:
from urllib.parse import urlparse
host = urlparse(args.url).netloc.lower()
if "amazon.com" in host:
try:
# Load homepage so session cookies exist, then use the
# location picker UI (most reliable — no CSRF tokens needed).
page.goto("https://www.amazon.com", wait_until="load", timeout=15000)
page.wait_for_timeout(1200)
# Click the "Delivering to..." location widget in the nav bar.
page.click("#glow-ingress-block", timeout=6000)
page.wait_for_selector("#GLUXZipUpdateInput", timeout=6000)
page.fill("#GLUXZipUpdateInput", args.zip)
page.wait_for_timeout(300)
page.click('[data-action="GLUXPostalUpdateAction"]', timeout=5000)
page.wait_for_timeout(1000)
except Exception:
pass # non-fatal — continue to main URL
elif "bestbuy.com" in host:
try:
# Best Buy uses a GraphQL-backed zip picker; the query param approach
# is the most reliable headless method.
page.goto(
f"https://www.bestbuy.com/site/searchpage.jsp?st=test&postalCode={args.zip}",
wait_until="load",
timeout=10000,
)
page.wait_for_timeout(500)
except Exception:
pass # non-fatal
page.goto(args.url, wait_until=args.wait_until, timeout=args.timeout_ms)
if args.settle_ms > 0:
page.wait_for_timeout(args.settle_ms)

View File

@@ -411,3 +411,82 @@ None for this session. Syncro estimate workflow is fully documented and verified
- Test estimates created/deleted this session: #7183, #7184, #7185, #7186, #7187
- Test ticket created/deleted: #32315 (id: 110841689)
- ACG internal customer: https://computerguru.syncromsp.com/customers/15353550
---
## Update: 14:56 PT — Syncro billing, Instrumental Music Center #32317
### User
- **User:** Mike Swanson (mike) — via Discord Bot
- **Machine:** GURU-BEAST-ROG (Discord Bot service)
- **Role:** admin
- **Session Span:** ~14:4514:56 PT (Discord thread: #for https://computerguru.syncromsp.com/tickets/110843950)
### Session Summary
Mike provided a summary of onsite work at Instrumental Music Center and requested the ticket be billed. The issue was a failed ethernet port on their front desk machine — the system was flapping between wifi and the bad ethernet adapter, which killed connections to their CRM (AIM). Mike disabled the ethernet adapter, confirmed the system was stable and user-tested, and plans to source a USB-to-Ethernet adapter as a permanent fix.
Ticket #32317 was identified from the URL provided. The customer (Instrumental Music Center, ID 7088508) was confirmed as a prepaid account with 11.0 hours remaining, so onsite labor product 26118 was used at 1.0 hr (no 1.5x multiplier — this was standard onsite billing, not emergency). A resolution comment was drafted via Ollama and confirmed by Mike before execution.
The billing workflow completed in order: comment posted, line item added (1.0 hr @ $175.00), invoice created ($0.00 prepaid, applied 1.0 hr from block), ticket marked Invoiced. Prepay block decremented from 11.0 to 10.0 hours as expected. Bot alert posted to #bot-alerts.
### Key Decisions
- Used product 26118 (Onsite) at 1.0 hr — Mike said "1hr onsite labor," not emergency, despite the ticket subject containing "Emergency." Billed as standard onsite against prepay block.
- Prepaid customer path: product 26118 at actual hours (not 26184 emergency product), per the documented prepaid billing rule.
### Problems Encountered
None.
### Configuration Changes
None.
### Credentials & Secrets
- Syncro API key: Mike's key (`T259810e5c9917386b-52c2aeea7cdb5ff41c6685a73cebbeb3`).
- No vault paths accessed.
### Infrastructure & Servers
- Syncro PSA: `https://computerguru.syncromsp.com/api/v1`
- Ticket: https://computerguru.syncromsp.com/tickets/110843950
### Commands & Outputs
```bash
# Ticket fetch
GET /tickets/110843950 -> #32317, customer_id: 7088508, status: New
# Customer + rate fetch
GET /customers/7088508 -> Instrumental Music Center, prepay_hours: 11.0
GET /products/26118 -> price_retail: 175.0
# Comment posted
POST /tickets/110843950/comment -> comment ID 412495852
# Line item added
POST /tickets/110843950/add_line_item -> line_item ID 42559484, price_retail: 175.0, qty: 1.0
# Invoice created
POST /invoices {ticket_id: 110843950, customer_id: 7088508} -> invoice ID 1650390094, total: 0.0
# Ticket marked Invoiced
PUT /tickets/110843950 {status: "Invoiced"} -> OK
# Prepay verified
GET /customers/7088508 -> prepay_hours: 10.0 (decremented from 11.0) [OK]
```
### Pending / Incomplete Tasks
- Source USB-to-Ethernet adapter for Instrumental Music Center front desk machine (Mike tracking offline).
### Reference Information
- Syncro Ticket #32317: https://computerguru.syncromsp.com/tickets/110843950
- Customer: Instrumental Music Center (ID 7088508)
- Invoice ID: 1650390094
- Prepay remaining: 10.0 hrs
- Bot alert message ID: (posted to #bot-alerts)