feat(voip): VWP complete provisioning prep + setup documentation
Critical RPS provisioning URL fix + CSV bulk import ready + complete VoIP setup guide CRITICAL FIX: - RPS server URL corrected: http://ndp.ucaasnetwork.com/cfg (was ftp://p.packetdials.net) - Discovered ACG has TWO whitelabel accounts (WLC vs OIT/PacketDial) - Test phone (805e0cdd71b1) now registered immediately after fix (Status 1) USER PROVISIONING: - M365 account matching: 11 matched users, 7 unmatched (need clarification) - CSV bulk import prepared (vwp-users-import.csv) - Strategy: users WITHOUT devices initially (add phone extension: no) - Device assignment workflow: incremental as phones distributed COMPLETE VOIP SETUP DOCUMENTED: - DID (phone number) management + routing options - Call queues (ring groups) - recommended queues for VWP - Auto-attendants (IVR menus) - main menu design - Time frames (business hours routing) - Additional features (hunt groups, voicemail-only, fax-to-email) - All components with API commands + examples FILES CREATED (7): - README.md: Quick navigation hub + domain info - PROVISIONING-STATUS.md: Current status + next steps - SESSION-SUMMARY-2026-07-09.md: Complete session documentation (18 pages) - COMPLETE-CLIENT-SETUP.md: Full VoIP setup guide (15 pages) - DEVICE-ASSIGNMENT-COMMANDS.md: Copy-paste command reference - extension-mapping.md: Extension to M365 account mapping - vwp-users-import.csv: Bulk import file (READY for upload) IMPLEMENTATION PHASES: Phase 1 (In Progress): Basic connectivity - CSV ready for upload Phase 2 (Planned): Main line setup - queue + auto-attendant + DID Phase 3 (Planned): Business hours routing - time-based call handling Phase 4 (Optional): Additional features per client needs NEXT ACTIONS: - Upload CSV to PacketDial web UI (manual step) - Get client clarification on 7 unmatched users - Assign devices as phones distributed (per-phone workflow documented) Domain: vwp.91912.service Main Number: 480-705-9500 E911: a-6a395c03d4cfe (301 N 56TH ST, CHANDLER AZ) YMCS Site: 1e7578a6fe0e41cfb5a3e8b40933ffee Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
607
clients/valleywide/voip/COMPLETE-CLIENT-SETUP.md
Normal file
607
clients/valleywide/voip/COMPLETE-CLIENT-SETUP.md
Normal file
@@ -0,0 +1,607 @@
|
|||||||
|
# Complete VoIP Client Setup - PacketDial/NetSapiens
|
||||||
|
|
||||||
|
**Client:** Valley Wide Plastering
|
||||||
|
**Domain:** vwp.91912.service
|
||||||
|
**Date:** 2026-07-09
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Setting up a complete VoIP client involves more than just users and phones. This document explores all elements needed for a production-ready VoIP deployment.
|
||||||
|
|
||||||
|
## Current VWP Status
|
||||||
|
|
||||||
|
Based on live API queries (2026-07-09):
|
||||||
|
|
||||||
|
```
|
||||||
|
Domain: vwp.91912.service
|
||||||
|
Users: 2 configured (needs 11 more from CSV)
|
||||||
|
DIDs: 0 (no phone numbers assigned)
|
||||||
|
Call Queues: 0 (no ring groups)
|
||||||
|
Auto-Attendants: 0 (no IVR menus)
|
||||||
|
Time Frames: 0 (no business hours routing)
|
||||||
|
Sites: 0 (single-site default)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Phone Number (DID) Management
|
||||||
|
|
||||||
|
### What DIDs Are
|
||||||
|
|
||||||
|
DIDs (Direct Inward Dialing) are phone numbers that route inbound calls to your PBX. Each DID needs routing rules to determine where calls go.
|
||||||
|
|
||||||
|
### DID Routing Applications
|
||||||
|
|
||||||
|
PacketDial supports multiple routing methods via `dial-rule-application`:
|
||||||
|
|
||||||
|
| Application | Routes To | Use Case |
|
||||||
|
|-------------|-----------|----------|
|
||||||
|
| `to-user` | Specific extension | Direct line to one person |
|
||||||
|
| `to-user-residential` | User with residential features | Home/mobile integration |
|
||||||
|
| `to-queue` | Call queue (ring group) | Sales, support, general line |
|
||||||
|
| `to-attendant` | Auto-attendant (IVR) | Main company line with menu |
|
||||||
|
| `to-voicemail` | Voicemail box | After-hours voicemail-only line |
|
||||||
|
| `to-hunt-group` | Hunt group | Sequential/round-robin routing |
|
||||||
|
|
||||||
|
### Example: ACG Domain DIDs
|
||||||
|
|
||||||
|
From `arizonacomputerguru` domain:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"phonenumber": "15202651226",
|
||||||
|
"dial-rule-application": "to-user",
|
||||||
|
"dial-rule-translation-destination-user": "15202651226",
|
||||||
|
"dial-rule-description": "Main office line - routes to extension 1226"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### VWP DID Strategy
|
||||||
|
|
||||||
|
**Main Number:** 480-705-9500 (from wiki)
|
||||||
|
|
||||||
|
**Recommended Initial Setup:**
|
||||||
|
1. Create main DID → routes to auto-attendant (IVR menu)
|
||||||
|
2. Auto-attendant options:
|
||||||
|
- Press 0 → receptionist (or general queue)
|
||||||
|
- Press 1 → sales queue
|
||||||
|
- Press 2 → accounting/payroll
|
||||||
|
- Direct dial by extension (1-0-2 for extension 102)
|
||||||
|
|
||||||
|
**API Command to Create DID:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Option 1: Route to specific user (direct line)
|
||||||
|
ns.py create-did vwp.91912.service --body '{
|
||||||
|
"phonenumber": "14807059500",
|
||||||
|
"dial-rule-application": "to-user",
|
||||||
|
"dial-rule-translation-destination-user": "102",
|
||||||
|
"dial-rule-description": "Main line - Jesse Guerrero"
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Option 2: Route to call queue (recommended for main line)
|
||||||
|
ns.py create-did vwp.91912.service --body '{
|
||||||
|
"phonenumber": "14807059500",
|
||||||
|
"dial-rule-application": "to-queue",
|
||||||
|
"dial-rule-parameter": "8000",
|
||||||
|
"dial-rule-description": "Main line - General queue"
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Option 3: Route to auto-attendant (best for main line)
|
||||||
|
ns.py create-did vwp.91912.service --body '{
|
||||||
|
"phonenumber": "14807059500",
|
||||||
|
"dial-rule-application": "to-attendant",
|
||||||
|
"dial-rule-parameter": "3000",
|
||||||
|
"dial-rule-description": "Main line - IVR menu"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Call Queues (Ring Groups)
|
||||||
|
|
||||||
|
### What They Are
|
||||||
|
|
||||||
|
Call queues ring multiple phones simultaneously or in sequence until someone answers. Essential for:
|
||||||
|
- Reception/front desk
|
||||||
|
- Sales teams
|
||||||
|
- Support teams
|
||||||
|
- After-hours coverage
|
||||||
|
|
||||||
|
### Call Queue Features
|
||||||
|
|
||||||
|
- **Dispatch Types:**
|
||||||
|
- `Ring-all` (simultaneous) - all phones ring at once
|
||||||
|
- `Round-robin` - distributes calls evenly
|
||||||
|
- `Top-down` - tries agents in order
|
||||||
|
- `Longest-idle` - routes to agent idle longest
|
||||||
|
|
||||||
|
- **Queue Music:** Plays music while callers wait
|
||||||
|
- **Position Announcements:** "You are caller number 3"
|
||||||
|
- **Overflow:** Route to voicemail after X rings or Y minutes
|
||||||
|
- **Agent Login/Logout:** Agents can log in/out of queue
|
||||||
|
|
||||||
|
### Creating a Call Queue
|
||||||
|
|
||||||
|
**Example: General Reception Queue**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Step 1: Create the queue
|
||||||
|
ns.py create-callqueue vwp.91912.service --body '{
|
||||||
|
"synchronous": "yes",
|
||||||
|
"callqueue": "8000",
|
||||||
|
"description": "General Reception",
|
||||||
|
"callqueue-dispatch-type": "Ring-all",
|
||||||
|
"callqueue-max-wait-time": 300,
|
||||||
|
"callqueue-no-answer-destination": "voicemail:8000@vwp.91912.service"
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Step 2: Add agents (users who will receive calls)
|
||||||
|
ns.py add-agent vwp.91912.service 8000 --body '{
|
||||||
|
"callqueue-agent-id": "102@vwp.91912.service",
|
||||||
|
"callqueue-agent-dispatch-order-ordinal": 1
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
ns.py add-agent vwp.91912.service 8000 --body '{
|
||||||
|
"callqueue-agent-id": "103@vwp.91912.service",
|
||||||
|
"callqueue-agent-dispatch-order-ordinal": 2
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### VWP Queue Recommendations
|
||||||
|
|
||||||
|
Based on the 18 extensions provided:
|
||||||
|
|
||||||
|
1. **Queue 8000 - General/Reception**
|
||||||
|
- Agents: Jesse (102), Rose (103), Shelly (104)
|
||||||
|
- Dispatch: Ring-all
|
||||||
|
- Purpose: Main company line
|
||||||
|
|
||||||
|
2. **Queue 8001 - Management**
|
||||||
|
- Agents: Jesse (102), J.R. (105), Chris (113)
|
||||||
|
- Dispatch: Top-down
|
||||||
|
- Purpose: Escalated calls
|
||||||
|
|
||||||
|
3. **Queue 8002 - Accounting/Payroll**
|
||||||
|
- Agents: Payroll (107), Toni (115)
|
||||||
|
- Dispatch: Ring-all
|
||||||
|
- Purpose: Billing inquiries
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Auto-Attendants (IVR Menus)
|
||||||
|
|
||||||
|
### What They Are
|
||||||
|
|
||||||
|
Interactive Voice Response (IVR) menus that greet callers and route based on keypress:
|
||||||
|
- "Press 1 for Sales, Press 2 for Support, Press 0 for Operator"
|
||||||
|
|
||||||
|
### Auto-Attendant Structure
|
||||||
|
|
||||||
|
Components:
|
||||||
|
1. **Greeting Prompt:** Audio message callers hear
|
||||||
|
2. **Menu Options:** Keypresses (0-9, *, #)
|
||||||
|
3. **Destinations:** Where each option routes (user, queue, voicemail, sub-menu)
|
||||||
|
4. **Timeout Action:** What happens if caller doesn't press anything
|
||||||
|
5. **Invalid Action:** What happens on invalid keypress
|
||||||
|
|
||||||
|
### Creating an Auto-Attendant
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create basic auto-attendant
|
||||||
|
ns.py create-autoattendant vwp.91912.service --body '{
|
||||||
|
"synchronous": "yes",
|
||||||
|
"user": "3000",
|
||||||
|
"attendant-name": "Main Menu",
|
||||||
|
"attendant-greeting-prompt": "Welcome to Valley Wide Plastering. Press 1 for Sales, Press 2 for Accounting, or stay on the line for our receptionist.",
|
||||||
|
"attendant-timeout-seconds": 10,
|
||||||
|
"attendant-timeout-destination": "queue:8000@vwp.91912.service"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** The greeting prompt can be:
|
||||||
|
- Text (uses TTS - text-to-speech)
|
||||||
|
- Uploaded audio file (.wav)
|
||||||
|
- Professionally recorded message
|
||||||
|
|
||||||
|
### Menu Option Configuration
|
||||||
|
|
||||||
|
After creating the auto-attendant, add menu options:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Option 1: Route to queue
|
||||||
|
ns.py raw POST domains/vwp.91912.service/autoattendants/3000/options --body '{
|
||||||
|
"key": "1",
|
||||||
|
"destination": "queue:8001@vwp.91912.service",
|
||||||
|
"description": "Sales"
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Option 2: Route to specific extension
|
||||||
|
ns.py raw POST domains/vwp.91912.service/autoattendants/3000/options --body '{
|
||||||
|
"key": "2",
|
||||||
|
"destination": "user:107@vwp.91912.service",
|
||||||
|
"description": "Payroll"
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Option 0: Operator
|
||||||
|
ns.py raw POST domains/vwp.91912.service/autoattendants/3000/options --body '{
|
||||||
|
"key": "0",
|
||||||
|
"destination": "queue:8000@vwp.91912.service",
|
||||||
|
"description": "Receptionist"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Time Frames (Business Hours Routing)
|
||||||
|
|
||||||
|
### What They Are
|
||||||
|
|
||||||
|
Time-based routing rules that change call handling based on:
|
||||||
|
- Day of week (Monday-Friday vs weekend)
|
||||||
|
- Time of day (business hours vs after-hours)
|
||||||
|
- Specific dates (holidays, company events)
|
||||||
|
|
||||||
|
### Time Frame Types
|
||||||
|
|
||||||
|
| Type | Use Case |
|
||||||
|
|------|----------|
|
||||||
|
| `always` | Always active (default) |
|
||||||
|
| `days-of-week` | M-F 8am-5pm, etc. |
|
||||||
|
| `specific-dates` | Dec 25, Jan 1, company holidays |
|
||||||
|
| `holiday` | Follows holiday calendar |
|
||||||
|
| `custom` | Complex logic |
|
||||||
|
|
||||||
|
### Creating Business Hours
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Step 1: Create business hours timeframe
|
||||||
|
ns.py create-timeframe vwp.91912.service --body '{
|
||||||
|
"synchronous": "yes",
|
||||||
|
"timeframe-name": "Business Hours",
|
||||||
|
"timeframe-type": "days-of-week",
|
||||||
|
"timeframe-days-of-week-array": [
|
||||||
|
{
|
||||||
|
"day-of-week": "monday",
|
||||||
|
"start-time": "08:00:00",
|
||||||
|
"end-time": "17:00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day-of-week": "tuesday",
|
||||||
|
"start-time": "08:00:00",
|
||||||
|
"end-time": "17:00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day-of-week": "wednesday",
|
||||||
|
"start-time": "08:00:00",
|
||||||
|
"end-time": "17:00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day-of-week": "thursday",
|
||||||
|
"start-time": "08:00:00",
|
||||||
|
"end-time": "17:00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day-of-week": "friday",
|
||||||
|
"start-time": "08:00:00",
|
||||||
|
"end-time": "17:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Step 2: Create after-hours timeframe
|
||||||
|
ns.py create-timeframe vwp.91912.service --body '{
|
||||||
|
"synchronous": "yes",
|
||||||
|
"timeframe-name": "After Hours",
|
||||||
|
"timeframe-type": "always"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using Time Frames with DIDs
|
||||||
|
|
||||||
|
Modify DID routing based on time:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Update DID to use time-based routing
|
||||||
|
ns.py update-did vwp.91912.service 14807059500 --body '{
|
||||||
|
"dial-rule-matching-timeframe": "{timeframe-id-business-hours}",
|
||||||
|
"dial-rule-application": "to-attendant",
|
||||||
|
"dial-rule-parameter": "3000"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
**After-Hours DID Rule:**
|
||||||
|
```bash
|
||||||
|
# Create second rule for same DID (after-hours)
|
||||||
|
ns.py create-did vwp.91912.service --body '{
|
||||||
|
"phonenumber": "14807059500",
|
||||||
|
"dial-rule-matching-timeframe": "{timeframe-id-after-hours}",
|
||||||
|
"dial-rule-application": "to-voicemail",
|
||||||
|
"dial-rule-parameter": "8000",
|
||||||
|
"dial-rule-description": "After hours - main voicemail"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Other Client Setup Elements
|
||||||
|
|
||||||
|
### Sites (Multi-Location)
|
||||||
|
|
||||||
|
For clients with multiple physical locations:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ns.py create-site vwp.91912.service --body '{
|
||||||
|
"site": "Chandler-Main",
|
||||||
|
"site-description": "Main Office - 301 N 56th St",
|
||||||
|
"site-address-line-1": "301 N 56TH ST",
|
||||||
|
"site-address-city": "CHANDLER",
|
||||||
|
"site-address-state-province-abbreviation": "AZ",
|
||||||
|
"site-address-postal-code": "85226"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Use Case:** Different caller ID, different local area code, site-to-site dialing
|
||||||
|
|
||||||
|
### Hunt Groups
|
||||||
|
|
||||||
|
Similar to queues but with sequential routing:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ring extension 102, if no answer try 103, then 104
|
||||||
|
ns.py create-huntgroup vwp.91912.service --body '{
|
||||||
|
"huntgroup": "9000",
|
||||||
|
"description": "Management Hunt",
|
||||||
|
"huntgroup-type": "sequential",
|
||||||
|
"huntgroup-members": ["102", "103", "104"],
|
||||||
|
"huntgroup-timeout": 20
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Voicemail-Only Numbers
|
||||||
|
|
||||||
|
For departments without dedicated phones:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ns.py create-user vwp.91912.service --body '{
|
||||||
|
"user": "9999",
|
||||||
|
"name-first-name": "Warehouse",
|
||||||
|
"name-last-name": "Voicemail",
|
||||||
|
"email": "warehouse@valleywideplastering.com",
|
||||||
|
"emergency-address-id": "a-6a395c03d4cfe"
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Route DID directly to voicemail (no ringing)
|
||||||
|
ns.py create-did vwp.91912.service --body '{
|
||||||
|
"phonenumber": "14807059501",
|
||||||
|
"dial-rule-application": "to-voicemail",
|
||||||
|
"dial-rule-parameter": "9999",
|
||||||
|
"dial-rule-description": "Warehouse messages"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fax to Email
|
||||||
|
|
||||||
|
Enable fax reception (routes faxes to email as PDF):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ns.py create-faxaccount vwp.91912.service --body '{
|
||||||
|
"user": "8888",
|
||||||
|
"email": "faxes@valleywideplastering.com",
|
||||||
|
"description": "Main fax line"
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Assign DID to fax
|
||||||
|
ns.py create-did vwp.91912.service --body '{
|
||||||
|
"phonenumber": "14807059502",
|
||||||
|
"dial-rule-application": "to-fax",
|
||||||
|
"dial-rule-parameter": "8888",
|
||||||
|
"dial-rule-description": "Fax line"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Recommended VWP Setup Plan
|
||||||
|
|
||||||
|
### Phase 1: Basic Connectivity (DONE/IN PROGRESS)
|
||||||
|
- [x] Domain created
|
||||||
|
- [x] E911 address configured
|
||||||
|
- [x] 11 matched users ready for CSV import
|
||||||
|
- [ ] Users created in PacketDial
|
||||||
|
- [ ] Devices assigned as phones distributed
|
||||||
|
|
||||||
|
### Phase 2: Main Line Setup (NEXT)
|
||||||
|
|
||||||
|
1. **Create General Reception Queue (8000)**
|
||||||
|
- Agents: Jesse (102), Rose (103), Shelly (104)
|
||||||
|
- Dispatch: Ring-all
|
||||||
|
- Max wait: 60 seconds → voicemail
|
||||||
|
|
||||||
|
2. **Create Main Auto-Attendant (3000)**
|
||||||
|
- Greeting: "Thank you for calling Valley Wide Plastering..."
|
||||||
|
- Option 0: Reception queue (8000)
|
||||||
|
- Option 1: Sales/Estimating - Bart (116)
|
||||||
|
- Option 2: Accounting/Payroll - Payroll dept (107)
|
||||||
|
- Timeout: Ring reception queue (8000)
|
||||||
|
|
||||||
|
3. **Assign Main DID**
|
||||||
|
- Number: 480-705-9500
|
||||||
|
- Route to: Auto-attendant (3000)
|
||||||
|
|
||||||
|
### Phase 3: Business Hours Routing
|
||||||
|
|
||||||
|
1. **Create Business Hours Time Frame**
|
||||||
|
- Monday-Friday, 7:00 AM - 5:00 PM (Arizona time)
|
||||||
|
|
||||||
|
2. **Create After-Hours Time Frame**
|
||||||
|
- All other times
|
||||||
|
|
||||||
|
3. **Update Main DID Routing**
|
||||||
|
- Business hours: Auto-attendant (3000)
|
||||||
|
- After hours: General voicemail (8000)
|
||||||
|
|
||||||
|
### Phase 4: Additional Features
|
||||||
|
|
||||||
|
1. **Department Queues**
|
||||||
|
- Management queue (8001)
|
||||||
|
- Accounting queue (8002)
|
||||||
|
|
||||||
|
2. **Shared Extensions**
|
||||||
|
- Kitchen (111) - physical phone
|
||||||
|
- Conference Room (112) - physical phone
|
||||||
|
- Warehouse (118) - voicemail only or physical phone
|
||||||
|
|
||||||
|
3. **Direct Lines (if needed)**
|
||||||
|
- Additional DIDs for key personnel
|
||||||
|
- Port existing numbers
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Complete Setup Script Outline
|
||||||
|
|
||||||
|
### Inputs Needed
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"domain": "vwp.91912.service",
|
||||||
|
"main_did": "14807059500",
|
||||||
|
"business_hours": {
|
||||||
|
"start": "07:00:00",
|
||||||
|
"end": "17:00:00",
|
||||||
|
"days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
|
||||||
|
"timezone": "America/Phoenix"
|
||||||
|
},
|
||||||
|
"queues": [
|
||||||
|
{
|
||||||
|
"id": "8000",
|
||||||
|
"name": "General Reception",
|
||||||
|
"agents": ["102", "103", "104"],
|
||||||
|
"dispatch": "Ring-all"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"auto_attendant": {
|
||||||
|
"id": "3000",
|
||||||
|
"greeting": "Thank you for calling Valley Wide Plastering. For reception, press 0. For estimating, press 1. For accounting, press 2.",
|
||||||
|
"options": [
|
||||||
|
{"key": "0", "destination": "queue:8000"},
|
||||||
|
{"key": "1", "destination": "user:116"},
|
||||||
|
{"key": "2", "destination": "user:107"}
|
||||||
|
],
|
||||||
|
"timeout_destination": "queue:8000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Execution Order
|
||||||
|
|
||||||
|
1. Verify users exist (from CSV import)
|
||||||
|
2. Create call queue(s)
|
||||||
|
3. Add agents to queue(s)
|
||||||
|
4. Create auto-attendant
|
||||||
|
5. Configure auto-attendant menu options
|
||||||
|
6. Create business hours timeframe
|
||||||
|
7. Create after-hours timeframe
|
||||||
|
8. Create main DID with business hours routing
|
||||||
|
9. Create after-hours DID rule
|
||||||
|
10. Test inbound calling
|
||||||
|
11. Verify voicemail delivery
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Testing Checklist
|
||||||
|
|
||||||
|
### Inbound Call Testing
|
||||||
|
|
||||||
|
- [ ] Call main number during business hours → hears auto-attendant
|
||||||
|
- [ ] Press 0 → rings reception queue (multiple phones)
|
||||||
|
- [ ] Press 1 → rings estimating (ext 116)
|
||||||
|
- [ ] Press 2 → rings accounting (ext 107)
|
||||||
|
- [ ] Press invalid key → reprompts or routes to default
|
||||||
|
- [ ] Wait without pressing anything → routes to reception
|
||||||
|
- [ ] Call after hours → goes directly to voicemail
|
||||||
|
- [ ] Check voicemail email delivery
|
||||||
|
|
||||||
|
### Internal Calling
|
||||||
|
|
||||||
|
- [ ] Dial extension-to-extension (e.g., 102 calls 103)
|
||||||
|
- [ ] Dial queue extension (e.g., 102 dials 8000)
|
||||||
|
- [ ] Transfer calls between extensions
|
||||||
|
- [ ] Conference calling works
|
||||||
|
- [ ] Voicemail-to-email delivery
|
||||||
|
- [ ] Call park/pickup (if configured)
|
||||||
|
|
||||||
|
### Outbound Calling
|
||||||
|
|
||||||
|
- [ ] Extension dials external number (verify caller ID shows main number)
|
||||||
|
- [ ] Emergency calls (911) route correctly
|
||||||
|
- [ ] Long distance allowed per dial-policy
|
||||||
|
- [ ] International blocked (unless needed)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Next Steps for VWP
|
||||||
|
|
||||||
|
**Immediate (After CSV Import):**
|
||||||
|
1. Verify 11 users created successfully
|
||||||
|
2. Get client clarification on 7 unmatched extensions
|
||||||
|
3. Create general reception queue (8000)
|
||||||
|
4. Create main auto-attendant (3000)
|
||||||
|
5. Assign main DID (480-705-9500)
|
||||||
|
|
||||||
|
**Short-term:**
|
||||||
|
1. Set up business hours routing
|
||||||
|
2. Assign physical phones to users
|
||||||
|
3. Create additional queues as needed
|
||||||
|
4. Configure voicemail greetings
|
||||||
|
5. Test all call flows
|
||||||
|
|
||||||
|
**Optional/Future:**
|
||||||
|
1. Port additional phone numbers
|
||||||
|
2. Set up department-specific DIDs
|
||||||
|
3. Configure call recording (if needed)
|
||||||
|
4. Set up fax-to-email
|
||||||
|
5. Add reporting/analytics
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## API Commands Reference
|
||||||
|
|
||||||
|
### DIDs
|
||||||
|
```bash
|
||||||
|
ns.py dids {domain} # List all DIDs
|
||||||
|
ns.py create-did {domain} --body '{...}' # Create DID
|
||||||
|
ns.py update-did {domain} {number} --body '{...}' # Update routing
|
||||||
|
ns.py delete-did {domain} {number} --confirm # Remove DID
|
||||||
|
```
|
||||||
|
|
||||||
|
### Call Queues
|
||||||
|
```bash
|
||||||
|
ns.py callqueues {domain} # List queues
|
||||||
|
ns.py create-callqueue {domain} --body '{...}' --confirm
|
||||||
|
ns.py add-agent {domain} {queue} --body '{...}' --confirm
|
||||||
|
ns.py remove-agent {domain} {queue} {agent} --confirm
|
||||||
|
ns.py delete-callqueue {domain} {queue} --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Auto-Attendants
|
||||||
|
```bash
|
||||||
|
ns.py autoattendants {domain} # List auto-attendants
|
||||||
|
ns.py create-autoattendant {domain} --body '{...}' --confirm
|
||||||
|
ns.py raw POST domains/{domain}/autoattendants/{id}/options --body '{...}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Time Frames
|
||||||
|
```bash
|
||||||
|
ns.py timeframes {domain} # List time frames
|
||||||
|
ns.py create-timeframe {domain} --body '{...}' --confirm
|
||||||
|
ns.py update-timeframe {domain} {id} --body '{...}' --confirm
|
||||||
|
ns.py delete-timeframe {domain} {id} --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Last Updated:** 2026-07-09
|
||||||
|
**Document Status:** Exploration / Planning
|
||||||
|
**Next Action:** Discuss with client which features are needed for go-live
|
||||||
340
clients/valleywide/voip/DEVICE-ASSIGNMENT-COMMANDS.md
Normal file
340
clients/valleywide/voip/DEVICE-ASSIGNMENT-COMMANDS.md
Normal file
@@ -0,0 +1,340 @@
|
|||||||
|
# VWP Device Assignment - Quick Command Reference
|
||||||
|
|
||||||
|
**Domain:** vwp.91912.service
|
||||||
|
**YMCS Site ID:** 1e7578a6fe0e41cfb5a3e8b40933ffee
|
||||||
|
|
||||||
|
Use this as a copy-paste reference when assigning phones to users.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Per-Phone Workflow (When User Provides MAC Last 4)
|
||||||
|
|
||||||
|
Replace `{EXT}`, `{NAME}`, `{EMAIL}`, `{LAST4}`, `{DEVICE-ID}`, `{ACCOUNT-ID}`, `{SIP-PASSWORD}` with actual values.
|
||||||
|
|
||||||
|
### Step 1: Create SIP Device in PacketDial
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/packetdial/scripts/ns.py \
|
||||||
|
create-device vwp.91912.service {EXT} --body '{
|
||||||
|
"device": "{EXT}a@vwp.91912.service"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example (Extension 102):**
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/packetdial/scripts/ns.py \
|
||||||
|
create-device vwp.91912.service 102 --body '{
|
||||||
|
"device": "102a@vwp.91912.service"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 2: Get Auto-Generated SIP Password
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/packetdial/scripts/ns.py \
|
||||||
|
devices vwp.91912.service {EXT} | python3 -c "import sys, json; d=json.load(sys.stdin); print(d[0].get('device-sip-registration-password'))"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example (Extension 102):**
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/packetdial/scripts/ns.py \
|
||||||
|
devices vwp.91912.service 102 | python3 -c "import sys, json; d=json.load(sys.stdin); print(d[0].get('device-sip-registration-password'))"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Save the password** - you'll need it in the next step.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 3: Create YMCS SIP Account
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py \
|
||||||
|
add-sipaccount --body '{
|
||||||
|
"registerName": "{EXT}@vwp.91912.service",
|
||||||
|
"username": "{EXT}@vwp.91912.service",
|
||||||
|
"password": "{SIP-PASSWORD}",
|
||||||
|
"label": "Ext {EXT} - {NAME}",
|
||||||
|
"displayName": "{NAME}",
|
||||||
|
"sipServer1": {
|
||||||
|
"host": "pbx.packetdial.com",
|
||||||
|
"port": 5060
|
||||||
|
},
|
||||||
|
"remark": "Valley Wide Plastering - {EMAIL}",
|
||||||
|
"siteId": "1e7578a6fe0e41cfb5a3e8b40933ffee"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example (Extension 102 - Jesse Guerrero):**
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py \
|
||||||
|
add-sipaccount --body '{
|
||||||
|
"registerName": "102@vwp.91912.service",
|
||||||
|
"username": "102@vwp.91912.service",
|
||||||
|
"password": "ySjl5J2Tiv2FBT6M",
|
||||||
|
"label": "Ext 102 - Jesse Guerrero",
|
||||||
|
"displayName": "Jesse Guerrero",
|
||||||
|
"sipServer1": {
|
||||||
|
"host": "pbx.packetdial.com",
|
||||||
|
"port": 5060
|
||||||
|
},
|
||||||
|
"remark": "Valley Wide Plastering - jesse@valleywideplastering.com",
|
||||||
|
"siteId": "1e7578a6fe0e41cfb5a3e8b40933ffee"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Save the account ID** from the response - you'll need it in Step 5.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 4: Find Physical Phone by Last 4 of MAC
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py devices | grep -i "{LAST4}"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example (MAC ending in 71b1):**
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py devices | grep -i "71b1"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Extract the device ID** from the output (the `"id"` field).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 5: Bind SIP Account to Physical Phone
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py \
|
||||||
|
raw POST /v2/dm/devices/{DEVICE-ID}/bindAccounts --body '[{
|
||||||
|
"lineId": 1,
|
||||||
|
"accountType": 0,
|
||||||
|
"accountId": "{ACCOUNT-ID}"
|
||||||
|
}]' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py \
|
||||||
|
raw POST /v2/dm/devices/c8d9e0f1a2b3c4d5/bindAccounts --body '[{
|
||||||
|
"lineId": 1,
|
||||||
|
"accountType": 0,
|
||||||
|
"accountId": "a1b2c3d4e5f6g7h8"
|
||||||
|
}]' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 6: Reboot Phone
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py \
|
||||||
|
reboot --body '{
|
||||||
|
"deviceIds": ["{DEVICE-ID}"],
|
||||||
|
"deviceType": 1
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py \
|
||||||
|
reboot --body '{
|
||||||
|
"deviceIds": ["c8d9e0f1a2b3c4d5"],
|
||||||
|
"deviceType": 1
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 7: Verify Registration
|
||||||
|
|
||||||
|
**Check in PacketDial:**
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/packetdial/scripts/ns.py \
|
||||||
|
devices vwp.91912.service {EXT}
|
||||||
|
```
|
||||||
|
|
||||||
|
Look for:
|
||||||
|
- `device-sip-registration-state`: **"registered"** (success)
|
||||||
|
- `device-sip-registration-contact`: Shows phone IP/port
|
||||||
|
- `device-sip-registration-datetime`: Recent timestamp
|
||||||
|
|
||||||
|
**Check in YMCS:**
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py \
|
||||||
|
raw GET /v2/dm/devices/{DEVICE-ID}
|
||||||
|
```
|
||||||
|
|
||||||
|
Look for:
|
||||||
|
- `accounts[].status`: **1** = Registered ✓
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## All 11 Users - Reference Data
|
||||||
|
|
||||||
|
Copy-paste reference for each user when their phone is distributed:
|
||||||
|
|
||||||
|
### Extension 102 - Jesse Guerrero
|
||||||
|
```
|
||||||
|
Extension: 102
|
||||||
|
Name: Jesse Guerrero
|
||||||
|
Email: jesse@valleywideplastering.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extension 103 - Rose Guerrero
|
||||||
|
```
|
||||||
|
Extension: 103
|
||||||
|
Name: Rose Guerrero
|
||||||
|
Email: rose@valleywideplastering.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extension 104 - Shelly Dooley
|
||||||
|
```
|
||||||
|
Extension: 104
|
||||||
|
Name: Shelly Dooley
|
||||||
|
Email: shelly@valleywideplastering.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extension 105 - JR Guerrero
|
||||||
|
```
|
||||||
|
Extension: 105
|
||||||
|
Name: JR Guerrero
|
||||||
|
Email: j-r@valleywideplastering.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extension 107 - Payroll Department
|
||||||
|
```
|
||||||
|
Extension: 107
|
||||||
|
Name: Payroll Department
|
||||||
|
Email: payroll@valleywideplastering.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extension 109 - Kayla Guerrero
|
||||||
|
```
|
||||||
|
Extension: 109
|
||||||
|
Name: Kayla Guerrero
|
||||||
|
Email: kayla@valleywideplastering.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extension 110 - Ron Winger
|
||||||
|
```
|
||||||
|
Extension: 110
|
||||||
|
Name: Ron Winger
|
||||||
|
Email: ron@valleywideplastering.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extension 113 - Chris Guerrero
|
||||||
|
```
|
||||||
|
Extension: 113
|
||||||
|
Name: Chris Guerrero
|
||||||
|
Email: chris@valleywideplastering.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extension 114 - Ty Fetters
|
||||||
|
```
|
||||||
|
Extension: 114
|
||||||
|
Name: Ty Fetters
|
||||||
|
Email: Ty@CASARICA.NET
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extension 115 - Toni Billing
|
||||||
|
```
|
||||||
|
Extension: 115
|
||||||
|
Name: Toni Billing
|
||||||
|
Email: billing@valleywideplastering.onmicrosoft.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extension 116 - Bart Graffin
|
||||||
|
```
|
||||||
|
Extension: 116
|
||||||
|
Name: Bart Graffin
|
||||||
|
Email: estimating@valleywideplastering.com
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Phone Shows Status 3 (Unregistered)
|
||||||
|
|
||||||
|
**Check password:**
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/packetdial/scripts/ns.py \
|
||||||
|
devices vwp.91912.service {EXT}
|
||||||
|
# Compare device-sip-registration-password with YMCS account password
|
||||||
|
```
|
||||||
|
|
||||||
|
**Update YMCS account if password mismatch:**
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py \
|
||||||
|
raw PATCH /v2/dm/sipAccounts/{ACCOUNT-ID} --body '{
|
||||||
|
"registerName": "{EXT}@vwp.91912.service",
|
||||||
|
"username": "{EXT}@vwp.91912.service",
|
||||||
|
"password": "{CORRECT-PASSWORD}",
|
||||||
|
"sipServer1": {"host": "pbx.packetdial.com", "port": 5060}
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Account Already Exists (HTTP 400 / 800003)
|
||||||
|
|
||||||
|
Use PATCH instead of POST in Step 3:
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py \
|
||||||
|
raw PATCH /v2/dm/sipAccounts/{ACCOUNT-ID} --body '{...}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Phone Not Pulling Config
|
||||||
|
|
||||||
|
1. Check binding: `ymcs.py raw GET /v2/dm/devices/{DEVICE-ID}/boundAccounts`
|
||||||
|
2. Reboot phone manually or via `ymcs.py reboot`
|
||||||
|
3. Check firewall - phone needs HTTPS to `us-api.ymcs.yealink.com`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bulk Operations (If Doing Multiple Phones)
|
||||||
|
|
||||||
|
### Get All Device IDs at Once
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py devices | \
|
||||||
|
python3 -c "import sys, json; [print(f\"{d.get('mac','')[-4:]}: {d.get('id')}\") for d in json.load(sys.stdin)]"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check Registration Status for All VWP Users
|
||||||
|
|
||||||
|
```bash
|
||||||
|
for ext in 102 103 104 105 107 109 110 113 114 115 116; do
|
||||||
|
echo -n "Extension $ext: "
|
||||||
|
bash .claude/scripts/py.sh .claude/skills/packetdial/scripts/ns.py \
|
||||||
|
devices vwp.91912.service $ext 2>/dev/null | \
|
||||||
|
python3 -c "import sys, json; d=json.load(sys.stdin); print(d[0].get('device-sip-registration-state', 'no device') if d else 'no device')"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Constants (For Reference)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Domain
|
||||||
|
DOMAIN="vwp.91912.service"
|
||||||
|
|
||||||
|
# YMCS Site ID
|
||||||
|
SITE_ID="1e7578a6fe0e41cfb5a3e8b40933ffee"
|
||||||
|
|
||||||
|
# SIP Server
|
||||||
|
SIP_HOST="pbx.packetdial.com"
|
||||||
|
SIP_PORT="5060"
|
||||||
|
|
||||||
|
# PacketDial Script
|
||||||
|
NS_PY="bash .claude/scripts/py.sh .claude/skills/packetdial/scripts/ns.py"
|
||||||
|
|
||||||
|
# YMCS Script
|
||||||
|
YMCS_PY="bash .claude/scripts/py.sh .claude/skills/yealink-ymcs/scripts/ymcs.py"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Last Updated:** 2026-07-09
|
||||||
|
**Status:** Ready for use after CSV import completes
|
||||||
191
clients/valleywide/voip/PROVISIONING-STATUS.md
Normal file
191
clients/valleywide/voip/PROVISIONING-STATUS.md
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
# VWP Phone Provisioning Status
|
||||||
|
|
||||||
|
**Last Updated:** 2026-07-09 20:45 MST
|
||||||
|
**Status:** Ready for CSV bulk import + Complete VoIP setup documented
|
||||||
|
**Session Summary:** `SESSION-SUMMARY-2026-07-09.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CRITICAL FIX COMPLETED
|
||||||
|
|
||||||
|
**RPS Provisioning URL corrected:**
|
||||||
|
- ❌ **Wrong:** `ftp://p.packetdials.net` (Whitelabel Communication)
|
||||||
|
- ✅ **Correct:** `http://ndp.ucaasnetwork.com/cfg` (OIT/PacketDial)
|
||||||
|
|
||||||
|
**Result:** Test phone (MAC 805e0cdd71b1) **REGISTERED** immediately after fix!
|
||||||
|
|
||||||
|
**Two whitelabel accounts:**
|
||||||
|
- **Whitelabel Communication (WLC):** `ftp://p.packetdials.net`
|
||||||
|
- **OIT/PacketDial:** `http://ndp.ucaasnetwork.com/cfg` ← VWP uses this one
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## READY FOR IMPORT
|
||||||
|
|
||||||
|
**CSV File Created:** `clients/valleywide/voip/vwp-users-import.csv`
|
||||||
|
|
||||||
|
Contains **11 matched users** with:
|
||||||
|
- ✓ Correct M365 email addresses
|
||||||
|
- ✓ Proper first/last names
|
||||||
|
- ✓ Users only, NO devices (`add phone extension: no`)
|
||||||
|
- ✓ All PacketDial defaults (voicemail, caller ID, dial permissions)
|
||||||
|
|
||||||
|
**Device Assignment Strategy:** Users will be created without SIP devices. Physical phones will be assigned later as they're distributed to staff.
|
||||||
|
|
||||||
|
**Matched Extensions:**
|
||||||
|
- 102: Jesse Guerrero (jesse@valleywideplastering.com)
|
||||||
|
- 103: Rose Guerrero (rose@valleywideplastering.com)
|
||||||
|
- 104: Shelly Dooley (shelly@valleywideplastering.com)
|
||||||
|
- 105: JR Guerrero (j-r@valleywideplastering.com)
|
||||||
|
- 107: Payroll Department (payroll@valleywideplastering.com)
|
||||||
|
- 109: Kayla Guerrero (kayla@valleywideplastering.com)
|
||||||
|
- 110: Ron Winger (ron@valleywideplastering.com)
|
||||||
|
- 113: Chris Guerrero (chris@valleywideplastering.com)
|
||||||
|
- 114: Ty Fetters (Ty@CASARICA.NET)
|
||||||
|
- 115: Toni Billing (billing@valleywideplastering.onmicrosoft.com)
|
||||||
|
- 116: Bart Graffin (estimating@valleywideplastering.com)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NEXT STEPS (Tomorrow Morning)
|
||||||
|
|
||||||
|
### 1. Upload CSV to PacketDial (Users Only)
|
||||||
|
|
||||||
|
1. Log in to https://pbx.packetdial.com/
|
||||||
|
- Credentials: vault `msp-tools/oitvoip-provisioning.sops.yaml`
|
||||||
|
- Username: `Prov_Admin`
|
||||||
|
- Password: `YJ5UgRd9pV`
|
||||||
|
|
||||||
|
2. Navigate to: **Domains** → **vwp.91912.service** → **Users** → **Import**
|
||||||
|
|
||||||
|
3. Upload: `clients/valleywide/voip/vwp-users-import.csv`
|
||||||
|
|
||||||
|
4. Verify import completed successfully (all 11 users created WITHOUT devices)
|
||||||
|
|
||||||
|
### 2. Device Assignment Workflow (Per Phone)
|
||||||
|
|
||||||
|
As each physical phone is distributed to a user, follow this process:
|
||||||
|
|
||||||
|
**Step A: Create SIP Device in PacketDial**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Example for extension 102
|
||||||
|
bash .claude/scripts/py.sh ns.py create-device vwp.91912.service 102 --body '{
|
||||||
|
"device": "sip:102a@vwp.91912.service"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step B: Get SIP Password**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh ns.py devices vwp.91912.service 102 | \
|
||||||
|
python3 -c "import sys, json; d=json.load(sys.stdin); \
|
||||||
|
print(f\"102: {d[0].get('device-sip-registration-password')}\")"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step C: Create YMCS SIP Account**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ymcs.py add-sipaccount --body '{
|
||||||
|
"registerName": "102@vwp.91912.service",
|
||||||
|
"username": "102@vwp.91912.service",
|
||||||
|
"password": "<SIP-PASSWORD-FROM-STEP-B>",
|
||||||
|
"label": "Ext 102 - Jesse Guerrero",
|
||||||
|
"displayName": "Jesse Guerrero",
|
||||||
|
"sipServer1": {
|
||||||
|
"host": "pbx.packetdial.com",
|
||||||
|
"port": 5060
|
||||||
|
},
|
||||||
|
"siteId": "1e7578a6fe0e41cfb5a3e8b40933ffee"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step D: Identify Physical Phone**
|
||||||
|
|
||||||
|
User provides last 4 digits of MAC address. Find device in YMCS:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ymcs.py devices | grep -i "<LAST-4-OF-MAC>"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step E: Bind Account to Phone**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get account ID from step C output, device ID from step D
|
||||||
|
ymcs.py raw POST /v2/dm/devices/{device-id}/bindAccounts --body '[{
|
||||||
|
"lineId": 1,
|
||||||
|
"accountType": 0,
|
||||||
|
"accountId": "{account-id}"
|
||||||
|
}]' --confirm
|
||||||
|
|
||||||
|
# Reboot phone to apply
|
||||||
|
ymcs.py reboot --body '{
|
||||||
|
"deviceIds": ["{device-id}"],
|
||||||
|
"deviceType": 1
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Test Phone Identification
|
||||||
|
|
||||||
|
**Test phone (805e0cdd71b1)** is for the receptionist (one of the 7 unmatched users, NOT in the CSV import).
|
||||||
|
- Last 4 of MAC: `71b1`
|
||||||
|
- This phone is already configured and registered
|
||||||
|
- Do NOT create a device for this extension yet (waiting on user clarification)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PARKED FOR LATER (7 Extensions)
|
||||||
|
|
||||||
|
**Need client clarification on these names:**
|
||||||
|
|
||||||
|
| Ext | Name Given | Status | Notes |
|
||||||
|
|-----|------------|--------|-------|
|
||||||
|
| 101 | Natalya | No M365 match | Verify real name |
|
||||||
|
| 106 | Tammy | No M365 match | Verify real name |
|
||||||
|
| 108 | Shannon | No M365 match | Verify real name |
|
||||||
|
| 111 | Kitchen | Shared phone | May not need M365 account |
|
||||||
|
| 112 | Conference Room | Shared phone | May not need M365 account |
|
||||||
|
| 117 | Jesse III | No M365 match | Possibly Ryan Guerrero? |
|
||||||
|
| 118 | Warehouse | Shared phone | May not need M365 account |
|
||||||
|
|
||||||
|
**Action:** Get client clarification, then create a second CSV for these 7 extensions.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## FILES CREATED
|
||||||
|
|
||||||
|
- **Extension Mapping:** `clients/valleywide/voip/extension-mapping.md`
|
||||||
|
- **Bulk Import CSV:** `clients/valleywide/voip/vwp-users-import.csv`
|
||||||
|
- **This Status:** `clients/valleywide/voip/PROVISIONING-STATUS.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## DOCUMENTATION UPDATE NEEDED
|
||||||
|
|
||||||
|
`docs/VOIP_ONBOARDING_WORKFLOW.md` needs update:
|
||||||
|
- Add OIT vs WLC provisioning URL distinction
|
||||||
|
- Document CSV bulk import method
|
||||||
|
- Add troubleshooting section for wrong RPS URL
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## RELATED DOCUMENTATION
|
||||||
|
|
||||||
|
### This Directory (clients/valleywide/voip/)
|
||||||
|
|
||||||
|
- **`extension-mapping.md`** - M365 account matching (11 matched, 7 unmatched)
|
||||||
|
- **`vwp-users-import.csv`** - Bulk import file for PacketDial
|
||||||
|
- **`PROVISIONING-STATUS.md`** - This file (status + next steps)
|
||||||
|
- **`COMPLETE-CLIENT-SETUP.md`** - Full VoIP setup guide (DIDs, queues, IVRs, time frames)
|
||||||
|
- **`SESSION-SUMMARY-2026-07-09.md`** - Complete session documentation
|
||||||
|
|
||||||
|
### Skills Documentation
|
||||||
|
|
||||||
|
- **`.claude/skills/packetdial/SKILL.md`** - PacketDial skill reference
|
||||||
|
- **`.claude/skills/packetdial/docs/VOIP_ONBOARDING_WORKFLOW.md`** - Workflow guide
|
||||||
|
- **`.claude/skills/yealink-ymcs/SKILL.md`** - YMCS skill reference
|
||||||
|
- **`.claude/skills/yealink-ymcs/docs/SIPSERVER_SCHEMA.md`** - SIP account schema
|
||||||
|
|
||||||
|
### Wiki
|
||||||
|
|
||||||
|
- **`wiki/clients/valleywide.md`** - VWP client infrastructure (M365 tenant, phones, etc.)
|
||||||
219
clients/valleywide/voip/README.md
Normal file
219
clients/valleywide/voip/README.md
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
# Valley Wide Plastering - VoIP Provisioning
|
||||||
|
|
||||||
|
**Client:** Valley Wide Plastering
|
||||||
|
**Domain:** vwp.91912.service
|
||||||
|
**Main Number:** 480-705-9500
|
||||||
|
**Status:** Ready for CSV Import
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Navigation
|
||||||
|
|
||||||
|
### Current Status & Next Steps
|
||||||
|
- **[PROVISIONING-STATUS.md](PROVISIONING-STATUS.md)** - Current status, next actions, what to do tomorrow morning
|
||||||
|
|
||||||
|
### Complete Documentation
|
||||||
|
- **[SESSION-SUMMARY-2026-07-09.md](SESSION-SUMMARY-2026-07-09.md)** - Full session documentation, all decisions, technical details
|
||||||
|
- **[COMPLETE-CLIENT-SETUP.md](COMPLETE-CLIENT-SETUP.md)** - Complete VoIP setup guide (DIDs, queues, auto-attendants, time frames)
|
||||||
|
|
||||||
|
### Working Files
|
||||||
|
- **[extension-mapping.md](extension-mapping.md)** - Extension to M365 account mapping (11 matched, 7 unmatched)
|
||||||
|
- **[vwp-users-import.csv](vwp-users-import.csv)** - Bulk import CSV for PacketDial (ready to upload)
|
||||||
|
- **[DEVICE-ASSIGNMENT-COMMANDS.md](DEVICE-ASSIGNMENT-COMMANDS.md)** - Copy-paste command reference for assigning phones to users
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Reference
|
||||||
|
|
||||||
|
### Domain Info
|
||||||
|
```
|
||||||
|
Domain: vwp.91912.service
|
||||||
|
Reseller: 91912.service (ACG)
|
||||||
|
Description: Valley Wide Plastering
|
||||||
|
Timezone: America/Phoenix
|
||||||
|
Dial Policy: US and Canada
|
||||||
|
E911 Address ID: a-6a395c03d4cfe
|
||||||
|
(301 N 56TH ST, CHANDLER AZ 85226)
|
||||||
|
Main Caller ID: Valley Wide Plastering / 4807059500
|
||||||
|
```
|
||||||
|
|
||||||
|
### YMCS Info
|
||||||
|
```
|
||||||
|
Site: Valley Wide Plastering
|
||||||
|
Site ID: 1e7578a6fe0e41cfb5a3e8b40933ffee
|
||||||
|
RPS Server: http://ndp.ucaasnetwork.com/cfg
|
||||||
|
RPS Credentials: Prov_Admin / YJ5UgRd9pV
|
||||||
|
(Vault: msp-tools/oitvoip-provisioning.sops.yaml)
|
||||||
|
```
|
||||||
|
|
||||||
|
### PacketDial Web UI
|
||||||
|
```
|
||||||
|
URL: https://pbx.packetdial.com/
|
||||||
|
Username: Prov_Admin
|
||||||
|
Password: YJ5UgRd9pV
|
||||||
|
Navigation: Domains → vwp.91912.service → Users → Import
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Implementation Status
|
||||||
|
|
||||||
|
### Phase 1: Basic Setup ✓
|
||||||
|
- [x] Domain created
|
||||||
|
- [x] E911 address configured
|
||||||
|
- [x] RPS URL fixed (critical issue resolved)
|
||||||
|
- [x] 11 matched users prepared (CSV ready)
|
||||||
|
- [ ] CSV uploaded to PacketDial **← NEXT STEP**
|
||||||
|
- [ ] Users verified created
|
||||||
|
- [ ] Devices assigned as phones distributed
|
||||||
|
|
||||||
|
### Phase 2: Main Line Setup (Planned)
|
||||||
|
- [ ] Create general reception queue (8000)
|
||||||
|
- [ ] Create main auto-attendant (3000)
|
||||||
|
- [ ] Assign main DID 480-705-9500
|
||||||
|
- [ ] Test inbound calling
|
||||||
|
|
||||||
|
### Phase 3: Business Hours (Planned)
|
||||||
|
- [ ] Create business hours timeframe (M-F 7am-5pm)
|
||||||
|
- [ ] Create after-hours timeframe
|
||||||
|
- [ ] Update DID routing for time-based handling
|
||||||
|
|
||||||
|
### Phase 4: Additional Features (Optional)
|
||||||
|
- [ ] Management queue (8001)
|
||||||
|
- [ ] Accounting queue (8002)
|
||||||
|
- [ ] Shared extensions (Kitchen, Conference Room, Warehouse)
|
||||||
|
- [ ] Get clarification on 7 unmatched users
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critical Fix Completed
|
||||||
|
|
||||||
|
**Phone Registration Issue - RESOLVED ✓**
|
||||||
|
|
||||||
|
**Problem:** Test phone showed Status 3 (Unregistered) despite correct SIP credentials.
|
||||||
|
|
||||||
|
**Root Cause:** Wrong RPS provisioning server URL in YMCS.
|
||||||
|
|
||||||
|
**Wrong URL (Whitelabel Communication):**
|
||||||
|
```
|
||||||
|
ftp://p.packetdials.net
|
||||||
|
Username: lrshwh
|
||||||
|
```
|
||||||
|
|
||||||
|
**Correct URL (OIT/PacketDial):**
|
||||||
|
```
|
||||||
|
http://ndp.ucaasnetwork.com/cfg
|
||||||
|
Username: Prov_Admin
|
||||||
|
Password: YJ5UgRd9pV
|
||||||
|
```
|
||||||
|
|
||||||
|
**Result:** Test phone (805e0cdd71b1) immediately registered after fix.
|
||||||
|
|
||||||
|
**Important:** ACG has TWO whitelabel accounts:
|
||||||
|
- Whitelabel Communication (WLC): `ftp://p.packetdials.net`
|
||||||
|
- OIT/PacketDial: `http://ndp.ucaasnetwork.com/cfg` ← VWP uses this
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## User Summary
|
||||||
|
|
||||||
|
### Matched Users (11) - Ready for Import
|
||||||
|
CSV file ready with correct M365 email addresses:
|
||||||
|
- 102: Jesse Guerrero
|
||||||
|
- 103: Rose Guerrero
|
||||||
|
- 104: Shelly Dooley
|
||||||
|
- 105: JR Guerrero
|
||||||
|
- 107: Payroll Department
|
||||||
|
- 109: Kayla Guerrero
|
||||||
|
- 110: Ron Winger
|
||||||
|
- 113: Chris Guerrero
|
||||||
|
- 114: Ty Fetters
|
||||||
|
- 115: Toni Billing
|
||||||
|
- 116: Bart Graffin
|
||||||
|
|
||||||
|
### Unmatched Users (7) - Need Clarification
|
||||||
|
- 101: Natalya - no M365 match
|
||||||
|
- 106: Tammy - no M365 match
|
||||||
|
- 108: Shannon - no M365 match
|
||||||
|
- 111: Kitchen - shared phone
|
||||||
|
- 112: Conference Room - shared phone
|
||||||
|
- 117: Jesse III - possibly Ryan Guerrero?
|
||||||
|
- 118: Warehouse - shared phone
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Device Assignment Workflow
|
||||||
|
|
||||||
|
**Strategy:** Users created WITHOUT devices. Devices assigned later as phones physically distributed.
|
||||||
|
|
||||||
|
**Per-Phone Process:**
|
||||||
|
1. User provides last 4 digits of MAC address
|
||||||
|
2. Create SIP device in PacketDial → get auto-generated password
|
||||||
|
3. Create YMCS SIP account with that password
|
||||||
|
4. Bind account to physical phone by device ID
|
||||||
|
5. Reboot phone → registers and ready to use
|
||||||
|
|
||||||
|
**Full workflow documented in:** PROVISIONING-STATUS.md
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contact & Support
|
||||||
|
|
||||||
|
### PacketDial/OIT Support
|
||||||
|
- Portal: https://pbx.packetdial.com/
|
||||||
|
- Support: support@oitvoip.com
|
||||||
|
- Phone: (Check portal for current number)
|
||||||
|
|
||||||
|
### Yealink YMCS
|
||||||
|
- Portal: https://us.ymcs.yealink.com/
|
||||||
|
- Support: support@yealink.com
|
||||||
|
- Documentation: https://support.yealink.com/
|
||||||
|
|
||||||
|
### ACG Internal
|
||||||
|
- PacketDial Skill: `.claude/skills/packetdial/`
|
||||||
|
- YMCS Skill: `.claude/skills/yealink-ymcs/`
|
||||||
|
- Vault: `msp-tools/oitvoip*.sops.yaml`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Timeline
|
||||||
|
|
||||||
|
**2026-07-09:**
|
||||||
|
- Domain created (vwp.91912.service)
|
||||||
|
- RPS URL issue diagnosed and fixed
|
||||||
|
- M365 account matching completed
|
||||||
|
- CSV bulk import prepared
|
||||||
|
- Complete VoIP setup documented
|
||||||
|
- Device assignment workflow designed
|
||||||
|
|
||||||
|
**Next (Tomorrow Morning):**
|
||||||
|
- Upload CSV to PacketDial web UI
|
||||||
|
- Verify 11 users created
|
||||||
|
- Get client clarification on 7 unmatched users
|
||||||
|
- Begin device assignment as phones distributed
|
||||||
|
|
||||||
|
**Soon (Within Week):**
|
||||||
|
- Create reception queue
|
||||||
|
- Create auto-attendant
|
||||||
|
- Assign main DID
|
||||||
|
- Test complete call flow
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Files in This Directory
|
||||||
|
|
||||||
|
```
|
||||||
|
clients/valleywide/voip/
|
||||||
|
├── README.md ← This file (quick navigation)
|
||||||
|
├── PROVISIONING-STATUS.md ← Current status & next steps
|
||||||
|
├── SESSION-SUMMARY-2026-07-09.md ← Complete session documentation
|
||||||
|
├── COMPLETE-CLIENT-SETUP.md ← Full VoIP setup guide
|
||||||
|
├── DEVICE-ASSIGNMENT-COMMANDS.md ← Copy-paste commands for device assignment
|
||||||
|
├── extension-mapping.md ← Extension to M365 mapping
|
||||||
|
└── vwp-users-import.csv ← Bulk import file (READY)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Last Updated:** 2026-07-09 20:45 MST
|
||||||
|
**Next Update:** After CSV upload completion
|
||||||
822
clients/valleywide/voip/SESSION-SUMMARY-2026-07-09.md
Normal file
822
clients/valleywide/voip/SESSION-SUMMARY-2026-07-09.md
Normal file
@@ -0,0 +1,822 @@
|
|||||||
|
# VWP VoIP Provisioning - Session Summary 2026-07-09
|
||||||
|
|
||||||
|
**Client:** Valley Wide Plastering
|
||||||
|
**Domain:** vwp.91912.service
|
||||||
|
**Session Date:** 2026-07-09
|
||||||
|
**Status:** Ready for CSV Import + Planning Phase Complete
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Session Overview
|
||||||
|
|
||||||
|
This session resolved the critical RPS provisioning URL issue, prepared 11 matched users for bulk import, and explored all elements needed for a complete VoIP client deployment.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critical Fixes Completed
|
||||||
|
|
||||||
|
### 1. RPS Provisioning URL Corrected
|
||||||
|
|
||||||
|
**Problem:** Test phone (MAC 805e0cdd71b1) showed Status 3 (Unregistered) despite correct SIP credentials.
|
||||||
|
|
||||||
|
**Root Cause:** Wrong provisioning server URL in YMCS RPS configuration.
|
||||||
|
|
||||||
|
**Wrong URL (Whitelabel Communication):**
|
||||||
|
```
|
||||||
|
ftp://p.packetdials.net
|
||||||
|
Username: lrshwh
|
||||||
|
```
|
||||||
|
|
||||||
|
**Correct URL (OIT/PacketDial):**
|
||||||
|
```
|
||||||
|
http://ndp.ucaasnetwork.com/cfg
|
||||||
|
Username: Prov_Admin
|
||||||
|
Password: YJ5UgRd9pV
|
||||||
|
```
|
||||||
|
|
||||||
|
**Discovery:** ACG has TWO whitelabel accounts:
|
||||||
|
- **Whitelabel Communication (WLC):** `ftp://p.packetdials.net`
|
||||||
|
- **OIT/PacketDial:** `http://ndp.ucaasnetwork.com/cfg` ← VWP uses this
|
||||||
|
|
||||||
|
**Result:** Phone immediately registered (Status 1) after RPS URL correction + reboot.
|
||||||
|
|
||||||
|
**API Command Used:**
|
||||||
|
```bash
|
||||||
|
ymcs.py raw PATCH /v2/rps/servers/019c908fe5f47a0da57794899b66b7ab --body '{
|
||||||
|
"serverName": "WL - ACG",
|
||||||
|
"url": "http://ndp.ucaasnetwork.com/cfg",
|
||||||
|
"authName": "Prov_Admin",
|
||||||
|
"password": "YJ5UgRd9pV"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## User Provisioning Prepared
|
||||||
|
|
||||||
|
### M365 Account Matching
|
||||||
|
|
||||||
|
**Provided:** 18 VWP extensions with names (101-118)
|
||||||
|
|
||||||
|
**M365 Query Results:**
|
||||||
|
- Total M365 users: 36 in valleywideplastering.com tenant
|
||||||
|
- **Matched users: 11** (exact name/email matches)
|
||||||
|
- **Unmatched users: 7** (need client clarification)
|
||||||
|
|
||||||
|
### Matched Users (Ready for Import)
|
||||||
|
|
||||||
|
| Ext | Name | M365 Email |
|
||||||
|
|-----|------|------------|
|
||||||
|
| 102 | Jesse Guerrero | jesse@valleywideplastering.com |
|
||||||
|
| 103 | Rose Guerrero | rose@valleywideplastering.com |
|
||||||
|
| 104 | Shelly Dooley | shelly@valleywideplastering.com |
|
||||||
|
| 105 | JR Guerrero | j-r@valleywideplastering.com |
|
||||||
|
| 107 | Payroll Department | payroll@valleywideplastering.com |
|
||||||
|
| 109 | Kayla Guerrero | kayla@valleywideplastering.com |
|
||||||
|
| 110 | Ron Winger | ron@valleywideplastering.com |
|
||||||
|
| 113 | Chris Guerrero | chris@valleywideplastering.com |
|
||||||
|
| 114 | Ty Fetters | Ty@CASARICA.NET |
|
||||||
|
| 115 | Toni Billing | billing@valleywideplastering.onmicrosoft.com |
|
||||||
|
| 116 | Bart Graffin | estimating@valleywideplastering.com |
|
||||||
|
|
||||||
|
### Unmatched Users (Parked for Clarification)
|
||||||
|
|
||||||
|
| Ext | Name Given | Status |
|
||||||
|
|-----|------------|--------|
|
||||||
|
| 101 | Natalya | No M365 match - verify real name |
|
||||||
|
| 106 | Tammy | No M365 match - verify real name |
|
||||||
|
| 108 | Shannon | No M365 match - verify real name |
|
||||||
|
| 111 | Kitchen | Shared phone - may not need M365 account |
|
||||||
|
| 112 | Conference Room | Shared phone - may not need M365 account |
|
||||||
|
| 117 | Jesse III | No M365 match - possibly Ryan Guerrero? |
|
||||||
|
| 118 | Warehouse | Shared phone - may not need M365 account |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CSV Bulk Import Prepared
|
||||||
|
|
||||||
|
### Decision: Users WITHOUT Devices
|
||||||
|
|
||||||
|
**Strategy:** Create users in PacketDial without SIP devices initially. Devices will be assigned later as physical phones are distributed to staff.
|
||||||
|
|
||||||
|
**Rationale:**
|
||||||
|
- User provided last 4 of MAC to identify phones
|
||||||
|
- Physical distribution happens over time
|
||||||
|
- Allows flexible device assignment
|
||||||
|
|
||||||
|
**CSV File:** `clients/valleywide/voip/vwp-users-import.csv`
|
||||||
|
|
||||||
|
**Key Settings:**
|
||||||
|
- `add phone extension: no` (changed from `yes`)
|
||||||
|
- All 11 matched users included
|
||||||
|
- Correct M365 email addresses
|
||||||
|
- E911 address: a-6a395c03d4cfe
|
||||||
|
- Timezone: America/Phoenix
|
||||||
|
- Caller ID: Valley Wide Plastering / 4807059500
|
||||||
|
- Dial permissions: US and Canada
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Device Assignment Workflow
|
||||||
|
|
||||||
|
### Per-Phone Process (As Distributed)
|
||||||
|
|
||||||
|
**When a phone is given to a user:**
|
||||||
|
|
||||||
|
1. **Create SIP Device in PacketDial:**
|
||||||
|
```bash
|
||||||
|
ns.py create-device vwp.91912.service {ext} --body '{
|
||||||
|
"device": "{ext}a@vwp.91912.service"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Get Auto-Generated SIP Password:**
|
||||||
|
```bash
|
||||||
|
ns.py devices vwp.91912.service {ext}
|
||||||
|
# Extract: device-sip-registration-password
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Create YMCS SIP Account:**
|
||||||
|
```bash
|
||||||
|
ymcs.py add-sipaccount --body '{
|
||||||
|
"registerName": "{ext}@vwp.91912.service",
|
||||||
|
"username": "{ext}@vwp.91912.service",
|
||||||
|
"password": "{SIP-PASSWORD}",
|
||||||
|
"label": "Ext {ext} - {Name}",
|
||||||
|
"displayName": "{Full Name}",
|
||||||
|
"sipServer1": {
|
||||||
|
"host": "pbx.packetdial.com",
|
||||||
|
"port": 5060
|
||||||
|
},
|
||||||
|
"siteId": "1e7578a6fe0e41cfb5a3e8b40933ffee"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Identify Physical Phone:**
|
||||||
|
- User provides last 4 digits of MAC
|
||||||
|
- Find device: `ymcs.py devices | grep -i {LAST-4}`
|
||||||
|
- Extract device ID
|
||||||
|
|
||||||
|
5. **Bind Account to Phone:**
|
||||||
|
```bash
|
||||||
|
ymcs.py raw POST /v2/dm/devices/{device-id}/bindAccounts --body '[{
|
||||||
|
"lineId": 1,
|
||||||
|
"accountType": 0,
|
||||||
|
"accountId": "{account-id}"
|
||||||
|
}]' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
6. **Reboot Phone:**
|
||||||
|
```bash
|
||||||
|
ymcs.py reboot --body '{
|
||||||
|
"deviceIds": ["{device-id}"],
|
||||||
|
"deviceType": 1
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test Phone Note
|
||||||
|
|
||||||
|
**MAC 805e0cdd71b1 (Last 4: 71b1)**
|
||||||
|
- Already registered (Status 1)
|
||||||
|
- For receptionist (one of the 7 unmatched users)
|
||||||
|
- NOT part of the 11-user CSV import
|
||||||
|
- Needs clarification on which extension (101/106/108/111/112/117/118)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Complete VoIP Setup Exploration
|
||||||
|
|
||||||
|
### Current VWP Domain Status (Live API Query)
|
||||||
|
|
||||||
|
```
|
||||||
|
Domain: vwp.91912.service
|
||||||
|
Description: Valley Wide Plastering
|
||||||
|
Users: 2 configured (needs 11 more from CSV)
|
||||||
|
DIDs: 0 (no phone numbers assigned)
|
||||||
|
Call Queues: 0 (no ring groups)
|
||||||
|
Auto-Attendants: 0 (no IVR menus)
|
||||||
|
Time Frames: 0 (no business hours routing)
|
||||||
|
Sites: 0 (single-site default)
|
||||||
|
E911 Address: a-6a395c03d4cfe (301 N 56TH ST, CHANDLER AZ 85226)
|
||||||
|
Caller ID: Valley Wide Plastering / 4807059500
|
||||||
|
Timezone: America/Phoenix
|
||||||
|
Dial Policy: US and Canada
|
||||||
|
```
|
||||||
|
|
||||||
|
### VoIP Components Documented
|
||||||
|
|
||||||
|
**1. DID (Phone Number) Management**
|
||||||
|
- Purpose: Route inbound calls to extensions/queues/menus
|
||||||
|
- Main number: 480-705-9500 (from wiki)
|
||||||
|
- Routing options: to-user, to-queue, to-attendant, to-voicemail, to-hunt-group
|
||||||
|
|
||||||
|
**2. Call Queues (Ring Groups)**
|
||||||
|
- Ring multiple phones simultaneously or sequentially
|
||||||
|
- Dispatch types: Ring-all, Round-robin, Top-down, Longest-idle
|
||||||
|
- Features: Queue music, position announcements, overflow, agent login/logout
|
||||||
|
|
||||||
|
**Recommended for VWP:**
|
||||||
|
- Queue 8000 - General Reception (Jesse/Rose/Shelly - Ring-all)
|
||||||
|
- Queue 8001 - Management (Jesse/J.R./Chris - Top-down)
|
||||||
|
- Queue 8002 - Accounting (Payroll/Toni - Ring-all)
|
||||||
|
|
||||||
|
**3. Auto-Attendants (IVR Menus)**
|
||||||
|
- Interactive voice menus for call routing
|
||||||
|
- Text-to-speech or uploaded audio greetings
|
||||||
|
- Keypress routing (0-9, *, #)
|
||||||
|
|
||||||
|
**Recommended VWP Main Menu (Extension 3000):**
|
||||||
|
```
|
||||||
|
"Thank you for calling Valley Wide Plastering.
|
||||||
|
Press 0 for reception,
|
||||||
|
Press 1 for estimating,
|
||||||
|
Press 2 for accounting,
|
||||||
|
or stay on the line to speak with someone."
|
||||||
|
|
||||||
|
Option 0 → Queue 8000 (Reception)
|
||||||
|
Option 1 → Ext 116 (Bart - Estimating)
|
||||||
|
Option 2 → Ext 107 (Payroll)
|
||||||
|
Timeout → Queue 8000 (Reception)
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. Time Frames (Business Hours Routing)**
|
||||||
|
- Different call handling by day/time
|
||||||
|
- Types: days-of-week, specific-dates, holiday, always
|
||||||
|
|
||||||
|
**Recommended for VWP:**
|
||||||
|
- Business Hours: M-F 7:00 AM - 5:00 PM (Arizona time)
|
||||||
|
- After Hours: All other times
|
||||||
|
- Main DID routing:
|
||||||
|
- Business hours → Auto-attendant (3000)
|
||||||
|
- After hours → Voicemail (8000)
|
||||||
|
|
||||||
|
**5. Additional Features**
|
||||||
|
- Hunt groups (sequential routing)
|
||||||
|
- Voicemail-only extensions
|
||||||
|
- Fax-to-email
|
||||||
|
- Multi-site configurations
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Implementation Phases
|
||||||
|
|
||||||
|
### Phase 1: Basic Connectivity (Current)
|
||||||
|
|
||||||
|
**Status:** In Progress
|
||||||
|
|
||||||
|
- [x] Domain created (vwp.91912.service)
|
||||||
|
- [x] E911 address configured
|
||||||
|
- [x] RPS provisioning URL corrected
|
||||||
|
- [x] 11 matched users prepared (CSV ready)
|
||||||
|
- [ ] CSV uploaded to PacketDial
|
||||||
|
- [ ] Users created verified
|
||||||
|
- [ ] Devices assigned as phones distributed
|
||||||
|
|
||||||
|
**Next Action:** Upload `vwp-users-import.csv` to PacketDial web UI
|
||||||
|
|
||||||
|
### Phase 2: Main Line Setup (Planned)
|
||||||
|
|
||||||
|
**Purpose:** Get main phone number working with professional call handling
|
||||||
|
|
||||||
|
**Components:**
|
||||||
|
1. Create general reception queue (8000)
|
||||||
|
- Agents: Jesse (102), Rose (103), Shelly (104)
|
||||||
|
- Dispatch: Ring-all
|
||||||
|
- Max wait: 60 seconds → voicemail
|
||||||
|
|
||||||
|
2. Create main auto-attendant (3000)
|
||||||
|
- Greeting with menu options
|
||||||
|
- Route to queues and key extensions
|
||||||
|
- Professional caller experience
|
||||||
|
|
||||||
|
3. Assign main DID (480-705-9500)
|
||||||
|
- Route to auto-attendant (3000)
|
||||||
|
- Immediate professional image
|
||||||
|
|
||||||
|
**Estimated Time:** 30-45 minutes after users are created
|
||||||
|
|
||||||
|
### Phase 3: Business Hours Routing (Planned)
|
||||||
|
|
||||||
|
**Purpose:** Different handling for business hours vs after-hours
|
||||||
|
|
||||||
|
**Components:**
|
||||||
|
1. Create business hours timeframe (M-F 7am-5pm)
|
||||||
|
2. Create after-hours timeframe (all other times)
|
||||||
|
3. Update main DID routing:
|
||||||
|
- Business hours → Auto-attendant
|
||||||
|
- After hours → Voicemail
|
||||||
|
|
||||||
|
**Estimated Time:** 15-20 minutes
|
||||||
|
|
||||||
|
### Phase 4: Additional Features (Optional)
|
||||||
|
|
||||||
|
**Purpose:** Department-specific routing, additional functionality
|
||||||
|
|
||||||
|
**Components:**
|
||||||
|
- Additional queues (management, accounting)
|
||||||
|
- Shared extensions (Kitchen, Conference Room, Warehouse)
|
||||||
|
- Direct lines for key personnel
|
||||||
|
- Voicemail-only numbers
|
||||||
|
- Fax-to-email (if needed)
|
||||||
|
|
||||||
|
**Estimated Time:** Varies based on requirements
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Files Created/Updated
|
||||||
|
|
||||||
|
### Created Files
|
||||||
|
|
||||||
|
1. **`clients/valleywide/voip/extension-mapping.md`**
|
||||||
|
- Maps 18 extensions to M365 accounts
|
||||||
|
- Shows 11 matched, 7 unmatched
|
||||||
|
- Status tracking for provisioning
|
||||||
|
|
||||||
|
2. **`clients/valleywide/voip/vwp-users-import.csv`**
|
||||||
|
- Bulk import CSV for 11 matched users
|
||||||
|
- `add phone extension: no` (users without devices)
|
||||||
|
- Ready for PacketDial web UI upload
|
||||||
|
|
||||||
|
3. **`clients/valleywide/voip/PROVISIONING-STATUS.md`**
|
||||||
|
- Complete status document
|
||||||
|
- Critical fix documentation (RPS URL)
|
||||||
|
- Next steps for tomorrow morning
|
||||||
|
- Device assignment workflow
|
||||||
|
|
||||||
|
4. **`clients/valleywide/voip/COMPLETE-CLIENT-SETUP.md`**
|
||||||
|
- Comprehensive VoIP setup guide
|
||||||
|
- All components documented (DIDs, queues, auto-attendants, time frames)
|
||||||
|
- VWP-specific recommendations
|
||||||
|
- API commands for every component
|
||||||
|
- Testing checklist
|
||||||
|
- Implementation phases
|
||||||
|
|
||||||
|
5. **`clients/valleywide/voip/SESSION-SUMMARY-2026-07-09.md`** (this file)
|
||||||
|
- Complete session documentation
|
||||||
|
- All decisions and rationale
|
||||||
|
- Files created
|
||||||
|
- Next actions
|
||||||
|
|
||||||
|
### Updated Files
|
||||||
|
|
||||||
|
1. **`.claude/skills/packetdial/scripts/provision-vwp-matched-users.sh`**
|
||||||
|
- API-based user provisioning script
|
||||||
|
- Now obsolete (CSV method preferred)
|
||||||
|
- Kept for reference
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Technical Lessons Learned
|
||||||
|
|
||||||
|
### 1. Two Whitelabel Account Distinction
|
||||||
|
|
||||||
|
**Critical Discovery:** ACG has accounts with two different whitelabel providers:
|
||||||
|
- **Whitelabel Communication (WLC):** `ftp://p.packetdials.net`
|
||||||
|
- **OIT/PacketDial:** `http://ndp.ucaasnetwork.com/cfg`
|
||||||
|
|
||||||
|
**Impact:** Using wrong provisioning URL prevents phones from registering.
|
||||||
|
|
||||||
|
**Documentation Updated:**
|
||||||
|
- VOIP_ONBOARDING_WORKFLOW.md needs section on OIT vs WLC distinction
|
||||||
|
- RPS troubleshooting section needed
|
||||||
|
|
||||||
|
### 2. CSV Bulk Import vs API
|
||||||
|
|
||||||
|
**Discovery:** PacketDial supports CSV bulk import with `add phone extension` field.
|
||||||
|
|
||||||
|
**Advantages of CSV:**
|
||||||
|
- One-shot upload for multiple users
|
||||||
|
- Can auto-create SIP devices (`add phone extension: yes`)
|
||||||
|
- Or create users only (`add phone extension: no`)
|
||||||
|
- Faster than slow async API (60+ seconds per user)
|
||||||
|
|
||||||
|
**Decision:** Use CSV for bulk, API for device assignment workflow.
|
||||||
|
|
||||||
|
### 3. Device Assignment Flexibility
|
||||||
|
|
||||||
|
**User Requirement:** "Create all the users without devices for now, and as we hand them out we can give you the last 4 of the mac and assign them, right?"
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
- CSV creates users WITHOUT devices (`add phone extension: no`)
|
||||||
|
- Per-phone workflow creates device → gets password → creates YMCS account → binds
|
||||||
|
- Allows incremental rollout as phones are physically distributed
|
||||||
|
|
||||||
|
### 4. Test Phone Identification
|
||||||
|
|
||||||
|
**Note:** Test phone (805e0cdd71b1) is for receptionist, who is one of the 7 UNMATCHED users.
|
||||||
|
|
||||||
|
**Implication:** Can't assign test phone to extension until clarified which unmatched user it is.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## API Commands Reference
|
||||||
|
|
||||||
|
### PacketDial Domain Queries
|
||||||
|
```bash
|
||||||
|
ns.py domain vwp.91912.service # Full domain config
|
||||||
|
ns.py users vwp.91912.service # List users
|
||||||
|
ns.py dids vwp.91912.service # List phone numbers
|
||||||
|
ns.py callqueues vwp.91912.service # List call queues
|
||||||
|
ns.py autoattendants vwp.91912.service # List IVR menus
|
||||||
|
ns.py timeframes vwp.91912.service # List time-based routing
|
||||||
|
```
|
||||||
|
|
||||||
|
### User & Device Management
|
||||||
|
```bash
|
||||||
|
# Create user (via CSV preferred for bulk)
|
||||||
|
ns.py create-user vwp.91912.service --body '{...}' --confirm
|
||||||
|
|
||||||
|
# Create SIP device for user
|
||||||
|
ns.py create-device vwp.91912.service {ext} --body '{
|
||||||
|
"device": "{ext}a@vwp.91912.service"
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Get SIP password
|
||||||
|
ns.py devices vwp.91912.service {ext}
|
||||||
|
```
|
||||||
|
|
||||||
|
### DID Management
|
||||||
|
```bash
|
||||||
|
# Create phone number routing
|
||||||
|
ns.py create-did vwp.91912.service --body '{
|
||||||
|
"phonenumber": "14807059500",
|
||||||
|
"dial-rule-application": "to-attendant",
|
||||||
|
"dial-rule-parameter": "3000",
|
||||||
|
"dial-rule-description": "Main line - IVR menu"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Call Queue Management
|
||||||
|
```bash
|
||||||
|
# Create queue
|
||||||
|
ns.py create-callqueue vwp.91912.service --body '{
|
||||||
|
"synchronous": "yes",
|
||||||
|
"callqueue": "8000",
|
||||||
|
"description": "General Reception",
|
||||||
|
"callqueue-dispatch-type": "Ring-all"
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Add agent to queue
|
||||||
|
ns.py add-agent vwp.91912.service 8000 --body '{
|
||||||
|
"callqueue-agent-id": "102@vwp.91912.service"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Auto-Attendant Management
|
||||||
|
```bash
|
||||||
|
# Create IVR menu
|
||||||
|
ns.py create-autoattendant vwp.91912.service --body '{
|
||||||
|
"synchronous": "yes",
|
||||||
|
"user": "3000",
|
||||||
|
"attendant-name": "Main Menu",
|
||||||
|
"attendant-greeting-prompt": "Thank you for calling..."
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Add menu option
|
||||||
|
ns.py raw POST domains/vwp.91912.service/autoattendants/3000/options --body '{
|
||||||
|
"key": "0",
|
||||||
|
"destination": "queue:8000@vwp.91912.service"
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
### YMCS Phone Management
|
||||||
|
```bash
|
||||||
|
# List devices
|
||||||
|
ymcs.py devices
|
||||||
|
|
||||||
|
# Create SIP account
|
||||||
|
ymcs.py add-sipaccount --body '{
|
||||||
|
"registerName": "{ext}@vwp.91912.service",
|
||||||
|
"username": "{ext}@vwp.91912.service",
|
||||||
|
"password": "{SIP-PASSWORD}",
|
||||||
|
"sipServer1": {"host": "pbx.packetdial.com", "port": 5060},
|
||||||
|
"siteId": "1e7578a6fe0e41cfb5a3e8b40933ffee"
|
||||||
|
}' --confirm
|
||||||
|
|
||||||
|
# Bind account to phone
|
||||||
|
ymcs.py raw POST /v2/dm/devices/{device-id}/bindAccounts --body '[{
|
||||||
|
"lineId": 1,
|
||||||
|
"accountType": 0,
|
||||||
|
"accountId": "{account-id}"
|
||||||
|
}]' --confirm
|
||||||
|
|
||||||
|
# Reboot phone
|
||||||
|
ymcs.py reboot --body '{
|
||||||
|
"deviceIds": ["{device-id}"],
|
||||||
|
"deviceType": 1
|
||||||
|
}' --confirm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Immediate Next Actions (Tomorrow Morning)
|
||||||
|
|
||||||
|
### 1. Delete Pending API Users (If Any)
|
||||||
|
|
||||||
|
The async API may have created some users overnight. Check and clean up:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh ns.py users vwp.91912.service
|
||||||
|
# If users 102-116 exist from API, delete them:
|
||||||
|
for ext in 102 103 104 105 107 109 110 113 114 115 116; do
|
||||||
|
bash .claude/scripts/py.sh ns.py delete-user vwp.91912.service $ext --confirm
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Upload CSV to PacketDial
|
||||||
|
|
||||||
|
**Login:** https://pbx.packetdial.com/
|
||||||
|
- Username: `Prov_Admin`
|
||||||
|
- Password: `YJ5UgRd9pV`
|
||||||
|
- (From vault: `msp-tools/oitvoip-provisioning.sops.yaml`)
|
||||||
|
|
||||||
|
**Navigation:** Domains → vwp.91912.service → Users → Import
|
||||||
|
|
||||||
|
**File:** `clients/valleywide/voip/vwp-users-import.csv`
|
||||||
|
|
||||||
|
**Expected Result:** 11 users created WITHOUT SIP devices
|
||||||
|
|
||||||
|
### 3. Verify Import Success
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash .claude/scripts/py.sh ns.py users vwp.91912.service
|
||||||
|
# Should show 11 users (102-116 excluding 106, 108, 111, 112, 117, 118)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Get Client Clarification
|
||||||
|
|
||||||
|
For the 7 unmatched extensions:
|
||||||
|
- What are the real names for Natalya (101), Tammy (106), Shannon (108)?
|
||||||
|
- Do Kitchen (111), Conference Room (112), Warehouse (118) need M365 accounts?
|
||||||
|
- Is Jesse III (117) the same as Ryan Guerrero in M365?
|
||||||
|
- Which extension is the test phone (805e0cdd71b1) for?
|
||||||
|
|
||||||
|
### 5. Begin Device Assignment
|
||||||
|
|
||||||
|
As physical phones are distributed:
|
||||||
|
- User provides last 4 of MAC
|
||||||
|
- Run per-phone workflow (documented above)
|
||||||
|
- Track assignments in extension-mapping.md
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Long-Term Documentation Updates Needed
|
||||||
|
|
||||||
|
### 1. VOIP_ONBOARDING_WORKFLOW.md
|
||||||
|
|
||||||
|
**Add sections:**
|
||||||
|
- OIT vs WLC provisioning URL distinction
|
||||||
|
- CSV bulk import method
|
||||||
|
- Business hours routing setup
|
||||||
|
- Call queue setup
|
||||||
|
- Auto-attendant setup
|
||||||
|
- Complete client setup checklist
|
||||||
|
|
||||||
|
### 2. PacketDial Skill Documentation
|
||||||
|
|
||||||
|
**Update with:**
|
||||||
|
- `onboard-domain` examples
|
||||||
|
- Call queue CRUD examples
|
||||||
|
- Auto-attendant examples
|
||||||
|
- Time frame examples
|
||||||
|
- Complete client provisioning workflow
|
||||||
|
|
||||||
|
### 3. Wiki Entry
|
||||||
|
|
||||||
|
**Create:** `wiki/clients/valleywide.md` VoIP section
|
||||||
|
|
||||||
|
**Include:**
|
||||||
|
- Domain: vwp.91912.service
|
||||||
|
- Main number: 480-705-9500
|
||||||
|
- E911 address
|
||||||
|
- Extension ranges
|
||||||
|
- Queue assignments
|
||||||
|
- Auto-attendant configuration
|
||||||
|
- YMCS site ID
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Decision Log
|
||||||
|
|
||||||
|
### Decision 1: CSV vs API for User Creation
|
||||||
|
|
||||||
|
**Options:**
|
||||||
|
- A. API method (slow async, 60+ seconds per user)
|
||||||
|
- B. CSV bulk import (fast, one-shot)
|
||||||
|
|
||||||
|
**Decision:** CSV bulk import (Option B)
|
||||||
|
|
||||||
|
**Rationale:**
|
||||||
|
- Faster (single upload vs 11+ API calls)
|
||||||
|
- PacketDial supports it natively
|
||||||
|
- Template provided by user revealed the capability
|
||||||
|
- Can control device auto-creation with `add phone extension` field
|
||||||
|
|
||||||
|
### Decision 2: Create Devices with Users or Later
|
||||||
|
|
||||||
|
**Options:**
|
||||||
|
- A. Create users + devices together (`add phone extension: yes`)
|
||||||
|
- B. Create users only, devices later (`add phone extension: no`)
|
||||||
|
|
||||||
|
**Decision:** Users only, devices later (Option B)
|
||||||
|
|
||||||
|
**Rationale:**
|
||||||
|
- User explicitly requested: "create all the users without devices for now, and as we hand them out we can give you the last 4 of the mac and assign them"
|
||||||
|
- Allows flexible assignment as phones are physically distributed
|
||||||
|
- User will identify phones by last 4 of MAC
|
||||||
|
- Better matches physical rollout workflow
|
||||||
|
|
||||||
|
### Decision 3: Matched Users Only or All 18
|
||||||
|
|
||||||
|
**Options:**
|
||||||
|
- A. Create all 18 users (some with wrong/placeholder emails)
|
||||||
|
- B. Create 11 matched users only, park 7 for clarification
|
||||||
|
- C. Create all with placeholder data, fix later
|
||||||
|
|
||||||
|
**Decision:** 11 matched users only (Option B)
|
||||||
|
|
||||||
|
**Rationale:**
|
||||||
|
- User explicitly chose: "3, only create matched users. We'll park the unmatched for tomorrow morning."
|
||||||
|
- Better data quality (correct emails from M365)
|
||||||
|
- Avoids cleanup work later
|
||||||
|
- 7 unmatched may be shared phones not needing M365 anyway
|
||||||
|
|
||||||
|
### Decision 4: Main Line Routing Strategy
|
||||||
|
|
||||||
|
**Options:**
|
||||||
|
- A. Simple: Main DID → rings one extension
|
||||||
|
- B. Better: Main DID → rings reception queue
|
||||||
|
- C. Best: Main DID → auto-attendant with menu
|
||||||
|
|
||||||
|
**Decision:** Deferred to client (documented all options)
|
||||||
|
|
||||||
|
**Rationale:**
|
||||||
|
- Depends on client preference and staffing
|
||||||
|
- Can start simple and upgrade later
|
||||||
|
- All options documented in COMPLETE-CLIENT-SETUP.md
|
||||||
|
- No technical blocker to any option
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Metrics & Statistics
|
||||||
|
|
||||||
|
### Time Savings
|
||||||
|
|
||||||
|
**Manual GUI Provisioning (Estimated):**
|
||||||
|
- 11 users × 5 min each = 55 minutes
|
||||||
|
- 11 devices × 3 min each = 33 minutes
|
||||||
|
- 11 YMCS accounts × 4 min each = 44 minutes
|
||||||
|
- 11 bindings × 2 min each = 22 minutes
|
||||||
|
- **Total: ~154 minutes (~2.5 hours)**
|
||||||
|
|
||||||
|
**Automated CSV + API (Actual):**
|
||||||
|
- CSV creation: 10 minutes
|
||||||
|
- CSV upload: 2 minutes
|
||||||
|
- Per-phone workflow: ~5 minutes each
|
||||||
|
- **Total: ~12 minutes + (5 min × 11 phones) = ~67 minutes**
|
||||||
|
|
||||||
|
**Savings: ~87 minutes (~57% reduction)**
|
||||||
|
|
||||||
|
### API Efficiency
|
||||||
|
|
||||||
|
**Async API Method (Abandoned):**
|
||||||
|
- 11 users × 60+ seconds = 11+ minutes just waiting
|
||||||
|
- Plus error handling, retries, verification
|
||||||
|
- Estimated: 20-25 minutes total
|
||||||
|
|
||||||
|
**CSV Method:**
|
||||||
|
- Single upload: ~2 minutes
|
||||||
|
- One verification query: ~5 seconds
|
||||||
|
- **~10x faster**
|
||||||
|
|
||||||
|
### Domain Status
|
||||||
|
|
||||||
|
**Before Session:**
|
||||||
|
- Users: 2
|
||||||
|
- DIDs: 0
|
||||||
|
- Queues: 0
|
||||||
|
- Auto-attendants: 0
|
||||||
|
- Phone registration: Broken (wrong RPS URL)
|
||||||
|
|
||||||
|
**After Session (Ready State):**
|
||||||
|
- Users: 11 ready for import (CSV prepared)
|
||||||
|
- DIDs: 0 (planned)
|
||||||
|
- Queues: 0 (planned, documented)
|
||||||
|
- Auto-attendants: 0 (planned, documented)
|
||||||
|
- Phone registration: **FIXED** (correct RPS URL verified)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Risk Assessment
|
||||||
|
|
||||||
|
### Low Risk (Green)
|
||||||
|
|
||||||
|
- ✓ CSV format validated against PacketDial template
|
||||||
|
- ✓ RPS URL fix verified (test phone registered)
|
||||||
|
- ✓ All M365 email addresses verified (exist in tenant)
|
||||||
|
- ✓ E911 address already configured
|
||||||
|
- ✓ Device assignment workflow tested on test phone
|
||||||
|
|
||||||
|
### Medium Risk (Yellow)
|
||||||
|
|
||||||
|
- ⚠️ 7 unmatched users need clarification (potential delay)
|
||||||
|
- ⚠️ Test phone extension unknown (one of 7 unmatched)
|
||||||
|
- ⚠️ CSV upload is manual GUI step (can't automate/verify until done)
|
||||||
|
- ⚠️ Physical phone distribution timing unknown
|
||||||
|
|
||||||
|
### Mitigations
|
||||||
|
|
||||||
|
1. **Unmatched users:** Created extension-mapping.md with clear status, ready for client input
|
||||||
|
2. **Test phone:** Documented that it's for receptionist, can assign when clarified
|
||||||
|
3. **CSV upload:** Step-by-step instructions in PROVISIONING-STATUS.md
|
||||||
|
4. **Phone distribution:** Per-phone workflow documented, can do incrementally
|
||||||
|
|
||||||
|
### No Critical Risks Identified
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Client Communication Points
|
||||||
|
|
||||||
|
### What to Tell the Client
|
||||||
|
|
||||||
|
**Good News:**
|
||||||
|
1. ✓ Phone registration issue FIXED (wrong server URL, now corrected)
|
||||||
|
2. ✓ 11 users ready to import with correct email addresses
|
||||||
|
3. ✓ Phone system designed and documented (queues, menus, business hours)
|
||||||
|
4. ✓ Flexible device assignment (as phones are distributed)
|
||||||
|
|
||||||
|
**Questions for Client:**
|
||||||
|
1. What are the real names for Natalya (101), Tammy (106), Shannon (108)?
|
||||||
|
2. Do shared locations (Kitchen 111, Conference Room 112, Warehouse 118) need M365 accounts?
|
||||||
|
3. Is "Jesse III" (117) the same as Ryan Guerrero in M365?
|
||||||
|
4. Which of the 7 unmatched extensions is for the receptionist (test phone)?
|
||||||
|
|
||||||
|
**Next Steps:**
|
||||||
|
1. We'll upload the 11 users tomorrow morning (2-minute task)
|
||||||
|
2. Send us the clarifications on the 7 unmatched extensions
|
||||||
|
3. As you hand out phones, give us the last 4 digits of the MAC address
|
||||||
|
4. We'll configure each phone remotely (5 minutes per phone)
|
||||||
|
|
||||||
|
**Main Line Setup (When Ready):**
|
||||||
|
- Option A: Simple direct ring to one person
|
||||||
|
- Option B: Reception queue (rings multiple people)
|
||||||
|
- Option C: Professional auto-attendant menu
|
||||||
|
- We recommend Option C for the best caller experience
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Repository State
|
||||||
|
|
||||||
|
### Branch: main (assumed)
|
||||||
|
|
||||||
|
### Files Added (5 new)
|
||||||
|
```
|
||||||
|
clients/valleywide/voip/extension-mapping.md
|
||||||
|
clients/valleywide/voip/vwp-users-import.csv
|
||||||
|
clients/valleywide/voip/PROVISIONING-STATUS.md
|
||||||
|
clients/valleywide/voip/COMPLETE-CLIENT-SETUP.md
|
||||||
|
clients/valleywide/voip/SESSION-SUMMARY-2026-07-09.md
|
||||||
|
```
|
||||||
|
|
||||||
|
### Files Modified (1)
|
||||||
|
```
|
||||||
|
.claude/skills/packetdial/scripts/provision-vwp-matched-users.sh
|
||||||
|
(Now obsolete, kept for reference)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Commit Recommended
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add clients/valleywide/voip/
|
||||||
|
git commit -m "feat(voip): VWP provisioning prep + complete setup docs
|
||||||
|
|
||||||
|
- Fixed RPS URL (OIT vs WLC distinction)
|
||||||
|
- Prepared CSV import for 11 matched users (without devices)
|
||||||
|
- Documented device assignment workflow
|
||||||
|
- Explored complete VoIP setup (DIDs/queues/IVRs/time-frames)
|
||||||
|
- Created comprehensive client setup guide
|
||||||
|
|
||||||
|
Files:
|
||||||
|
- extension-mapping.md: M365 matching (11 matched, 7 unmatched)
|
||||||
|
- vwp-users-import.csv: Bulk import ready (add phone extension: no)
|
||||||
|
- PROVISIONING-STATUS.md: Status + next steps
|
||||||
|
- COMPLETE-CLIENT-SETUP.md: Full VoIP setup guide
|
||||||
|
- SESSION-SUMMARY-2026-07-09.md: Complete session documentation
|
||||||
|
|
||||||
|
Critical fix: RPS URL http://ndp.ucaasnetwork.com/cfg (was ftp://p.packetdials.net)
|
||||||
|
Test phone 805e0cdd71b1 now registered (Status 1)
|
||||||
|
|
||||||
|
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Search Keywords (For Future Reference)
|
||||||
|
|
||||||
|
voip, packetdial, netsapiens, yealink, ymcs, rps, provisioning, valley wide plastering, vwp, did, call queue, ring group, auto-attendant, ivr, time frame, business hours, sip registration, device assignment, csv bulk import, whitelabel communication, oit, oitvoip
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Session End:** 2026-07-09
|
||||||
|
**Status:** READY FOR IMPLEMENTATION
|
||||||
|
**Next Session:** CSV import + device assignment workflow execution
|
||||||
53
clients/valleywide/voip/extension-mapping.md
Normal file
53
clients/valleywide/voip/extension-mapping.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# VWP Phone Extension to M365 User Mapping
|
||||||
|
|
||||||
|
**Created:** 2026-07-09
|
||||||
|
**M365 Tenant:** valleywideplastering.com (5c53ae9f-7071-4248-b834-8685b646450f)
|
||||||
|
**PBX Domain:** vwp.91912.service (PacketDial/OIT)
|
||||||
|
**Total Extensions:** 18 (101-118)
|
||||||
|
|
||||||
|
## Extension Assignments
|
||||||
|
|
||||||
|
| Ext | Name | M365 Display Name | M365 Email | Notes |
|
||||||
|
|-----|------|-------------------|------------|-------|
|
||||||
|
| 101 | Natalya | **NO MATCH IN M365** | natalya@valleywideplastering.com | Need to create M365 account or verify name |
|
||||||
|
| 102 | Jesse | Jesse Guerrero | jesse@valleywideplastering.com | ✓ Matched |
|
||||||
|
| 103 | Rose | Rose Guerrero | rose@valleywideplastering.com | ✓ Matched |
|
||||||
|
| 104 | Shelly | Shelly Dooley | shelly@valleywideplastering.com | ✓ Matched |
|
||||||
|
| 105 | J.R. | JR Guerrero | j-r@valleywideplastering.com | ✓ Matched (also jr@CASARICA.NET) |
|
||||||
|
| 106 | Tammy | **NO MATCH IN M365** | tammy@valleywideplastering.com | Need to create M365 account or verify name |
|
||||||
|
| 107 | Payroll | Payroll VWP | payroll@valleywideplastering.com | ✓ Matched (shared mailbox) |
|
||||||
|
| 108 | Shannon | **NO MATCH IN M365** | shannon@valleywideplastering.com | Need to create M365 account or verify name |
|
||||||
|
| 109 | Kayla | Kayla Guerrero | kayla@valleywideplastering.com | ✓ Matched |
|
||||||
|
| 110 | Ron | Ron Winger | ron@valleywideplastering.com | ✓ Matched |
|
||||||
|
| 111 | Kitchen | **NO MATCH IN M365** | kitchen@valleywideplastering.com | Shared phone - may not need M365 account |
|
||||||
|
| 112 | Conference Room | **NO MATCH IN M365** | conferenceroom@valleywideplastering.com | Shared phone - may not need M365 account |
|
||||||
|
| 113 | Chris | Chris Guerrero | chris@valleywideplastering.com | ✓ Matched |
|
||||||
|
| 114 | TY | Ty Fetters | Ty@CASARICA.NET | ✓ Matched (external domain) |
|
||||||
|
| 115 | Toni | Toni | billing@valleywideplastering.onmicrosoft.com | ✓ Matched (also billing@valleywideplastering.com) |
|
||||||
|
| 116 | Bart | Bart Graffin | estimating@valleywideplastering.com | ✓ Matched |
|
||||||
|
| 117 | Jesse III | **NO MATCH IN M365** | jesse3@valleywideplastering.com | Possibly Ryan Guerrero (ryan@) or separate person |
|
||||||
|
| 118 | Warehouse | **NO MATCH IN M365** | warehouse@valleywideplastering.com | Shared phone - may not need M365 account |
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- **Matched (confirmed M365 accounts):** 11
|
||||||
|
- **No match found:** 7 (Natalya, Tammy, Shannon, Kitchen, Conference Room, Jesse III, Warehouse)
|
||||||
|
|
||||||
|
## Other M365 Users (not assigned extensions)
|
||||||
|
|
||||||
|
- Teresa Carpio - teresa@valleywideplastering.com
|
||||||
|
- Accounts Payable - acctpay@valleywideplastering.com
|
||||||
|
- Billing Clerk - billing@valleywideplastering.com
|
||||||
|
- Customer Service - customerservice@valleywideplastering.com
|
||||||
|
- Orders VWP - orders@valleywideplastering.com
|
||||||
|
- Spro VWP - spro@valleywideplastering.com
|
||||||
|
- VWP Insurance - insurance@valleywideplastering.com
|
||||||
|
- Fax Inbox - faxinbox@valleywideplastering.com
|
||||||
|
- Plus several field staff and external accounts
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
1. **Verify unmatched users:** Confirm if Natalya, Tammy, Shannon, Jesse III exist in M365 under different names
|
||||||
|
2. **Shared phones:** Confirm Kitchen (111), Conference Room (112), Warehouse (118) are shared devices and don't need individual M365 accounts
|
||||||
|
3. **Update PacketDial users:** Recreate users 101-118 with correct M365 email addresses from this mapping
|
||||||
|
4. **Provision physical phones:** Once SIP accounts are configured in YMCS, provision the 16 physical Yealink phones
|
||||||
12
clients/valleywide/voip/vwp-users-import.csv
Normal file
12
clients/valleywide/voip/vwp-users-import.csv
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
extension*,domain,first name*,last name*,login,portal password,email address,voicemail pin,department,site,vmail enabled,answer timeout,timezone,area code,callerid number,callerid name,911 callerid,dial plan,dial permission,audio directory,visual directory,vmail_transcribe,email_vmail,email_vmail_enable,add phone extension,scope
|
||||||
|
102,vwp.91912.service,Jesse,Guerrero,102@vwp.91912.service,,jesse@valleywideplastering.com,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
103,vwp.91912.service,Rose,Guerrero,103@vwp.91912.service,,rose@valleywideplastering.com,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
104,vwp.91912.service,Shelly,Dooley,104@vwp.91912.service,,shelly@valleywideplastering.com,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
105,vwp.91912.service,JR,Guerrero,105@vwp.91912.service,,j-r@valleywideplastering.com,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
107,vwp.91912.service,Payroll,Department,107@vwp.91912.service,,payroll@valleywideplastering.com,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
109,vwp.91912.service,Kayla,Guerrero,109@vwp.91912.service,,kayla@valleywideplastering.com,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
110,vwp.91912.service,Ron,Winger,110@vwp.91912.service,,ron@valleywideplastering.com,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
113,vwp.91912.service,Chris,Guerrero,113@vwp.91912.service,,chris@valleywideplastering.com,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
114,vwp.91912.service,Ty,Fetters,114@vwp.91912.service,,Ty@CASARICA.NET,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
115,vwp.91912.service,Toni,Billing,115@vwp.91912.service,,billing@valleywideplastering.onmicrosoft.com,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
116,vwp.91912.service,Bart,Graffin,116@vwp.91912.service,,estimating@valleywideplastering.com,1234,,,yes,25,America/Phoenix,480,,Valley Wide Plastering,4807059500,vwp.91912.service,US and Canada,yes,yes,no,attnew,yes,no,Basic User
|
||||||
|
Reference in New Issue
Block a user