sync: auto-sync from DESKTOP-0O8A1RL at 2026-05-20 19:14:31
Author: Mike Swanson Machine: DESKTOP-0O8A1RL Timestamp: 2026-05-20 19:14:31
This commit is contained in:
@@ -134,7 +134,7 @@ fi
|
||||
- Ticket initial description during `/syncro create`
|
||||
|
||||
**When NOT to use Ollama:**
|
||||
- JSON field selection (product_id, quantity, price_retail) — Claude owns this using the local rate table and rules
|
||||
- JSON field selection (product_id, quantity, price_retail) — Claude owns this; always fetch price_retail live from Syncro
|
||||
- Read operations (GET)
|
||||
- Auth, credential, or security decisions
|
||||
|
||||
@@ -189,7 +189,7 @@ Return ONLY valid JSON:
|
||||
|
||||
Whether the draft came from Ollama or Claude wrote it directly:
|
||||
|
||||
1. `price_retail` matches the local rate table for the selected `product_id`
|
||||
1. `price_retail` was fetched live from `GET /products/<product_id>` → `.product.price_retail` and matches what will be shown to the user
|
||||
2. `quantity` = minutes ÷ 60 — verify the arithmetic (e.g. 45 min = 0.75, not 0.77)
|
||||
3. Computed total = `price_retail × quantity` — matches what was communicated to user
|
||||
4. If labor_type is `emergency` and `prepay_hours > 0`: product must be `26118`, qty must be actual_hours × 1.5
|
||||
@@ -624,21 +624,25 @@ JSON
|
||||
|
||||
**Do NOT remove ticket line items after invoicing.** Leave them on the ticket — the "Add/View Charges" button and billing verification by techs depends on seeing line items there.
|
||||
|
||||
**Labor product IDs and rates** (rates pulled from Syncro API 2026-04-24):
|
||||
**Labor product IDs** — always fetch `price_retail` live from Syncro before billing. Never hardcode rates; they vary by contract and change over time.
|
||||
|
||||
| product_id | Name | price_retail ($/hr) | Notes |
|
||||
|---|---|---|---|
|
||||
| `1190473` | Labor - Remote Business | `150.00` | Standard remote work |
|
||||
| `26118` | Labor - Onsite Business | `175.00` | Base onsite rate |
|
||||
| `573881` | Labor - In Shop Business | `150.00` | Hardware brought into ACG's shop |
|
||||
| `26184` | Labor - Emergency or After Hours Business | `262.50` | **1.5× onsite; time-and-a-half baked into the rate.** Non-prepaid customers only. Do NOT stack with `26118` for the same hours. |
|
||||
| `1049360` | **Labor- Warranty work** | `0.00` | **Use this for ANY warranty / no-charge work.** Do NOT use a billable labor product + `billable: false` or a patched price. See `feedback_syncro_warranty_product.md`. |
|
||||
| `9269129` | Labor - Prepaid Project Labor | `0.00` | **DO NOT USE for normal or prepaid work.** Exempt Labor category — does NOT deduct from `prepay_hours` block despite the name. Billing a prepaid customer with this product gives a $0.00 invoice AND silently skips the block decrement. Verified 2026-05-04 (see `feedback_syncro_labor_type.md`). Only use if explicitly directed. |
|
||||
| `9269124` | Labor - Internal Labor | `0.00` | Non-billable internal ACG time (not customer-facing). |
|
||||
| `26117` | Fee - Travel Time | `40.00` | Per travel event (not hourly) |
|
||||
| `68055` | Labor - Website Labor | `150.00` | Website-related work |
|
||||
```bash
|
||||
RATE=$(curl -s "${BASE}/products/${PRODUCT_ID}?api_key=${API_KEY}" | jq -r '.product.price_retail')
|
||||
```
|
||||
|
||||
`price_retail` is the per-unit rate. Line item total = `price_retail × quantity`. **Rates are determined by the product selected** — never patch `price_retail` on a line item to convert one product into another (e.g. don't take Remote Labor at $150 and patch to $0 to mimic warranty). If a line's dollar amount is wrong, the wrong `product_id` was picked — undo, pick the correct product, redo. The only legitimate `update_line_item price_retail` use is the Syncro auto-gen-zero recovery (when an auto-generated line came in at $0 instead of the product's intended rate).
|
||||
| product_id | Name | Notes |
|
||||
|---|---|---|
|
||||
| `1190473` | Labor - Remote Business | Standard remote work |
|
||||
| `26118` | Labor - Onsite Business | Base onsite rate |
|
||||
| `573881` | Labor - In Shop Business | Hardware brought into ACG's shop |
|
||||
| `26184` | Labor - Emergency or After Hours Business | **1.5× onsite; time-and-a-half baked into the rate.** Non-prepaid customers only. Do NOT stack with `26118` for the same hours. |
|
||||
| `1049360` | **Labor- Warranty work** | **Use this for ANY warranty / no-charge work.** Do NOT use a billable labor product + `billable: false` or a patched price. See `feedback_syncro_warranty_product.md`. |
|
||||
| `9269129` | Labor - Prepaid Project Labor | **DO NOT USE for normal or prepaid work.** Exempt Labor category — does NOT deduct from `prepay_hours` block despite the name. Billing a prepaid customer with this product gives a $0.00 invoice AND silently skips the block decrement. Verified 2026-05-04 (see `feedback_syncro_labor_type.md`). Only use if explicitly directed. |
|
||||
| `9269124` | Labor - Internal Labor | Non-billable internal ACG time (not customer-facing). |
|
||||
| `26117` | Fee - Travel Time | Per travel event (not hourly) |
|
||||
| `68055` | Labor - Website Labor | Website-related work |
|
||||
|
||||
`price_retail` is the per-unit rate fetched from Syncro. Line item total = `price_retail × quantity`. **Never patch `price_retail` to convert one product into another** (e.g. don't take Remote Labor and patch to $0 to mimic warranty — pick the correct product). The only legitimate `update_line_item price_retail` use is the auto-gen-zero recovery (when `charge_timer_entry` creates a line at $0 instead of the product's rate).
|
||||
|
||||
**Emergency / after-hours billing branches by whether customer has prepaid labor:**
|
||||
|
||||
@@ -718,7 +722,7 @@ When `/syncro bill <number>` is called:
|
||||
- Prepaid + emergency → product `26118`, qty = actual hours × 1.5
|
||||
- Warranty / no-charge → product **`1049360` (Labor- Warranty work)**, `billable: true`, qty = actual hours. Do NOT pick a regular labor product with `billable: false` — Syncro silently overrides the flag and generates a billable line. (Verified 2026-05-06 on #32225 — see `feedback_syncro_warranty_product.md`.)
|
||||
- Otherwise → per `--labor` mapping below, qty = actual hours
|
||||
5. Look up `price_retail` from the local rate table (do NOT fetch live — rates are baked in)
|
||||
5. Fetch `price_retail` live: `GET /products/<product_id>` → `.product.price_retail` — never use the table below for rates, it may be stale
|
||||
6. Compute `start_at` and `end_at` for the timer (use ISO8601; the `end_at − start_at` interval should equal `quantity` hours so Syncro's reporting math matches what you bill)
|
||||
7. Send billing draft prompt to Ollama (or draft directly if `$OLLAMA` is empty) — see prompt template above
|
||||
8. Run Claude review checklist on the draft output
|
||||
|
||||
@@ -871,3 +871,47 @@ Winter reported task complete via Discord bot. She indicated no additional work
|
||||
|
||||
### Syncro
|
||||
No ticket created (declined by requester).
|
||||
|
||||
---
|
||||
|
||||
## Update: 19:13 PT — Apple Developer email search
|
||||
|
||||
## User
|
||||
- **User:** Mike Swanson (mike)
|
||||
- **Machine:** DESKTOP-0O8A1RL
|
||||
- **Role:** admin
|
||||
|
||||
### Session Summary
|
||||
|
||||
Investigated whether an Apple Developer Program email had arrived at developer@azcomputerguru.com. Used the ComputerGuru Security Investigator app (investigator + investigator-exo tiers) against the ACG M365 tenant (ce61461e-81a0-4c84-bb4a-7b354a9a356d) to search for the mailbox and any messages from apple.com.
|
||||
|
||||
The address developer@azcomputerguru.com does not exist in Exchange Online. It is not a licensed user, shared mailbox, mail-enabled group, or proxy address on any existing account. The EXO v2.0 REST API returned a deprecation error during the initial search attempt; switched to Graph API, which confirmed the account is absent entirely from the tenant.
|
||||
|
||||
Conclusion: developer@azcomputerguru.com is a cPanel mailbox hosted on IX Web Hosting (the ACG web host), not an M365 mailbox. Apple Developer email would be accessible only via IX webmail or a configured mail client.
|
||||
|
||||
### Key Decisions
|
||||
|
||||
- Used investigator-exo token first (EXO REST), then fell back to investigator (Graph API) when EXO returned a deprecation error.
|
||||
- Checked users, shared mailboxes, mail-enabled groups, and proxyAddresses — all negative — before concluding the address is cPanel-hosted.
|
||||
|
||||
### Problems Encountered
|
||||
|
||||
- **EXO REST API v2.0 deprecated:** GET /api/v2.0/users/{}/messages returned {"code":"Gone","message":"The API version 'V2' has been deprecated."}. Switched to Graph API (graph.microsoft.com/v1.0) with investigator token. The investigator-exo token is still valid for EXO InvokeCommand payloads but not the legacy REST endpoint.
|
||||
|
||||
### Configuration Changes
|
||||
|
||||
None.
|
||||
|
||||
### Credentials & Secrets
|
||||
|
||||
None new.
|
||||
|
||||
### Infrastructure & Servers
|
||||
|
||||
- ACG tenant ID: ce61461e-81a0-4c84-bb4a-7b354a9a356d
|
||||
- developer@azcomputerguru.com: cPanel mailbox on IX Web Hosting — not in M365
|
||||
|
||||
### Pending / Incomplete Tasks
|
||||
|
||||
- Determine if developer@azcomputerguru.com needs to be created as an M365 mailbox so Apple Developer emails are accessible in Exchange, or check IX webmail for the Apple Developer email.
|
||||
- Plaintext Zoho backup codes file still at C:/Users/guru/Downloads/Zoho - BACKUP VERIFICATION CODES.txt — delete when convenient.
|
||||
|
||||
Reference in New Issue
Block a user