From 749a472089df42ef1301b7e835db4e4e8d40e217 Mon Sep 17 00:00:00 2001 From: Mike Swanson Date: Mon, 20 Apr 2026 15:41:59 -0700 Subject: [PATCH] Session log: BG Builders billing fix + OITVOIP API research Co-Authored-By: Claude Sonnet 4.6 --- session-logs/2026-04-20-session.md | 70 ++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/session-logs/2026-04-20-session.md b/session-logs/2026-04-20-session.md index da43289..e86c4f6 100644 --- a/session-logs/2026-04-20-session.md +++ b/session-logs/2026-04-20-session.md @@ -332,6 +332,76 @@ Added `feedback_python_windows.md` to `.claude/memory/`: use `py` not `python3`, --- +--- + +## Update: 15:40 — BG Builders Billing + OITVOIP API Research + +### BG Builders — Ticket #109212872 + +**Ticket:** Remote - Set brother printer up on wifi +**Customer:** BG Builders (Shelly Dooley) — shelly@bgbuildersllc.com | (480) 495-4511 +**Customer ID:** 32622062 + +**Resolution:** Cleared ARP cache on the Verizon router at BG Builders. Shelly confirmed printer working. + +**Billing:** +- 30 min Labor - Remote Business (product_id 1190473) +- Timer entry ID: 38717330 +- Invoice #67431 (ID: 1649993619) — $0.00 (BG Builders is on prepaid block hours — correct behavior) +- Line item: "Business Remote Service - Applied 0.5 Prepay Hours" +- Ticket status: Invoiced + +**Issues encountered + resolutions:** +1. Duplicate comment posted — two "Resolution" comments at 15:09:02 and 15:09:11. DELETE endpoint (`/tickets/{id}/comments/{id}` and `/ticket_comments/{id}`) both return 404. **Must be deleted manually in Syncro GUI.** +2. Timer entry didn't show via `ticket_timers?ticket_id=` API query (returns all timers globally, not filtered by ticket). Screenshot from Winter confirmed it IS on the ticket. +3. Invoice created blank — `POST /invoices` does NOT auto-convert timer entries like the GUI. Deleted blank invoice #67430, recreated #67431, manually added line item via `POST /invoices/{id}/line_items`. +4. "Not Charged" + $0.00 is correct for block hours customers. + +**Syncro API finding to document:** `POST /invoices` does not auto-pull timer entries. Must manually `POST /invoices/{id}/line_items` after creating invoice. + +--- + +### OITVOIP / NetSapiens API Research + +**Context:** OIT VOIP (Darwin Escaro) pointed to https://voipdocs.io/oitvoip-access-platform-apis. Goal: integrate with ClaudeTools + Syncro + build provisioning tool. + +**Server:** +- Portal: https://pbx.packetdial.com +- API base: `https://pbx.packetdial.com/ns-api/v2` +- Version: 44.4.7 | Host: portal2-phx.ucaas.network +- Platform: NetSapiens SNAPsolution v44.4 + +**Docs:** +- https://docs.ns-api.com/ (login required for full detail) +- Live OpenAPI spec: `https://pbx.packetdial.com/ns-api/webroot/openapi/openapi.json` +- Live Swagger UI: `https://pbx.packetdial.com/ns-api/openapi` +- Dev sandbox: https://ns-api.com/ + +**Auth:** +- API Key (preferred M2M): `nsr_` prefix = reseller scope, `Authorization: Bearer nsr_` +- OAuth 2.0: client_id + client_secret + portal creds → `POST /ns-api/oauth2/token` +- JWT: auto-returned from OAuth on v44+ + +**Credentials:** None created yet. +- Next: check pbx.packetdial.com portal for Admin > API Keys, OR reply to Darwin for OAuth client credentials +- Reseller name: unknown — confirm from portal + +**Planned provisioning flow:** +1. `POST /domains` → create domain (auto-generates dial plan) +2. `POST /domains/{domain}/users` → users + extensions +3. `POST /domains/{domain}/devices` → SIP devices +4. `POST /domains/{domain}/users/{user}/phonenumbers` → DIDs +5. Log back to Syncro ticket + +**Pending:** +- [ ] Log into pbx.packetdial.com → check for API Keys section +- [ ] If no self-service: reply to Darwin for reseller-scoped OAuth credentials +- [ ] Store in SOPS vault: `msp-tools/oitvoip.sops.yaml` +- [ ] Confirm reseller name +- [ ] Design provisioning tool spec + Syncro integration + +--- + ## Key Infrastructure Reference | Resource | Details |