Files
claudetools/.claude/commands/syncro-emergency-billing.md
Mike Swanson 307bb8812b 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
2026-05-27 16:12:21 -07:00

176 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Syncro Emergency / After-Hours Billing
Rules for applying emergency or after-hours labor premiums in Syncro tickets.
---
## Definitions
| Term | Meaning |
|---|---|
| **Normal hours** | 9:00 AM 5:00 PM, MondayFriday |
| **After-hours** | Before 9 AM or after 5 PM on weekdays, or any time on weekends/holidays |
| **Emergency** | Customer explicitly requested emergency or same-day rates |
| **Same-day** | Work done same day it was requested, during normal hours — only billable as emergency if customer requests it |
---
## When to Apply the Premium
**Claude-created tickets:** Apply emergency premium **only if explicitly requested** by the customer or instructed by Mike/Howard.
**Suggest it** (do not apply automatically) when:
- Work is performed after-hours or on a weekend
- Ticket notes indicate the customer called in urgently outside normal hours
Do not apply for same-day work unless the customer asks for the emergency rate.
---
## Ticket Subject Prefix
| Condition | Prefix |
|---|---|
| Customer explicitly requested emergency rates | `Emergency -` |
| Work performed outside normal hours (not customer-requested) | `Afterhours -` |
| Normal hours, no emergency request | No prefix |
Examples:
- `Emergency - Servers down, HP ProLiant host powered off`
- `Afterhours - Printer not connecting after office hours`
---
## Billing Method — Two Scenarios
### Step 1: Determine if Customer is a Block Customer
Check customer notes in Syncro for "block hours," "prepay hours," or "prepaid." Block customers have invoices with $0.00 totals and line item descriptions containing "Prepay Hours."
Known block customers as of 2026-05-25: Valley Wide Plastering (VWP), Dataforth Corporation, Cascades Retirement Properties. Always verify — blocks can be exhausted or moved to QB tracking.
---
### Scenario A — Block / Prepaid Hours Customer
Use **two line items**, both using the same standard labor product as the non-emergency work:
| Line | Product | Qty | Description |
|---|---|---|---|
| 1 | Standard labor product (see table below) | Actual hours worked | Description of work performed |
| 2 | Same standard labor product | 0.5 × line 1 qty | `Emergency/Same day rate` |
**Example:** 1 hour of emergency remote business on a block account:
- Line 1: `Labor - Remote Business` (1190473) — 1.0 hr — "Emergency remote - Servers down, powered on via iLO"
- Line 2: `Labor - Remote Business` (1190473) — 0.5 hr — "Emergency/Same day rate"
Reference: Invoice 67594 (VWP, 2026-05-12), Ticket #32269.
---
### Scenario B — Non-Block / Direct Billing Customer
Use a **single emergency labor product** for the full hours worked:
| Customer type | Product | Product ID | Rate |
|---|---|---|---|
| Business | Labor - Emergency or After Hours Business | 26184 | $262.50/hr |
Residential rates are legacy — ACG no longer bills residential. Do not use product 42584.
**Example:** 4 hours of emergency business work, direct billing:
- Line 1: `Labor - Emergency or After Hours Business` (26184) — 4.0 hr
Reference: Ticket #32188 (VWP, direct billing, 2026-04-22).
---
## Standard Labor Products (Reference)
Emergency business rate is **$262.50/hr** (product 26184) — used for all emergency/afterhours business work regardless of remote vs onsite. Residential rates are legacy and not in use.
**Always fetch `price_retail` from `GET /api/v1/products/{id}` before billing non-block customers. Never use a hardcoded rate.**
| Service type | Product | Product ID | Live Rate | Notes |
|---|---|---|---|---|
| Remote Business | Labor - Remote Business | 1190473 | $150.00/hr | Non-block cash billing |
| Onsite Business | Labor - Onsite Business | 26118 | $175.00/hr | |
| In-Shop Business | Labor - In Shop Business | 573881 | $150.00/hr | |
| Block/Prepaid (any type) | Labor - Remote Business | 1190473 | $0.00 | Price = $0; draws from block in hours |
| Emergency/Afterhours Business | Labor - Emergency or After Hours Business | 26184 | $262.50/hr | All business emergency — remote and onsite |
---
## Adding Line Items to an Existing Ticket (API)
**Confirmed working endpoint** (tested 2026-05-25, ticket #32320 and test #32321):
```
POST https://computerguru.syncromsp.com/api/v1/tickets/{ticket_id}/add_line_item
Authorization: <api_key from vault: msp-tools/syncro.sops.yaml → credentials.credential>
Content-Type: application/json
```
**Required body fields** — both `name` and `description` are required; either missing returns 422:
```json
{
"product_id": 1190473,
"name": "Labor - Remote Business",
"description": "Work performed description",
"quantity": 2.0,
"price_retail": 0.0,
"taxable": false
}
```
- `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)
- 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:
```
GET https://computerguru.syncromsp.com/api/v1/tickets/{ticket_id}
```
Check `.ticket.line_items[]` in the response.
---
## Straddle (Mixed Normal + Emergency Hours)
If work begins during normal hours and continues into after-hours (or vice versa):
- Ask: "Does the after-hours portion warrant splitting the labor?" (brief overlap usually doesn't)
- If splitting: bill normal hours on standard product, after-hours/emergency portion on the appropriate emergency product or as a second prepay line
---
## Products NOT to Use
| Product | ID | Why not |
|---|---|---|
| LLF - Remote Labor (Emergency/Afterhours) | 145022 | Legacy contract product, no longer applicable |
| Fee - On-Site Business Emergenc | 45871 | Not in current use — do not add without explicit instruction |
| Fee - On-Site Residential Emerg | 45870 | Not in current use — do not add without explicit instruction |
| Labor - Emergency or After Hours Residential | 42584 | Residential rates are legacy — ACG no longer uses residential billing |
| Labor - Remote Residential | 1190471 | Residential rates are legacy — ACG no longer uses residential billing |
---
## Quick Decision Tree
```
Was emergency rate explicitly requested by customer?
YES → Apply premium (see billing method below)
NO → Is work happening after-hours or on a weekend?
YES → Suggest emergency rate to Mike/Howard; do not apply automatically
NO → Bill at standard rates, no prefix
```
```
Is customer a block/prepaid customer?
YES → Two line items: actual hrs (standard product) + 0.5x hrs (same product, "Emergency/Same day rate")
NO → One line item: emergency product 26184 (business) for full hours
```