docs: define customer portal requirements

This commit is contained in:
root
2026-07-24 11:34:39 -04:00
parent d0acaf6a87
commit 0768622a52
3 changed files with 946 additions and 0 deletions
+333
View File
@@ -0,0 +1,333 @@
# my.voipsimplicity.com — Portal Gap Analysis
**Status:** Documentation-only analysis
**Version:** 2.0.0 (revised for owner requirement areas)
**Date:** July 24, 2026
**References:** [PORTAL-REQUIREMENTS.md](./PORTAL-REQUIREMENTS.md) — canonical requirements doc; Viirtue/ViiBE seller portal (`voipsimplicity.viibewithus.com`, v2.8.0) and Apollo/NetSapiens manager+user portals (`portal.voipsimplicity.com`, v44.5.1) — 22 screenshots provided by owner Germaine Brown; [Obsidian notes](#sources) from owner.
> **Purpose:** Map the 7 owner-specified requirement areas (Dashboard, Call History, Marketplace, Billing, My Info, Site Login, Screenshot Groups) against current portal state and identify what needs to be built, wired, or deferred.
---
## Table of Contents
1. [Sources](#sources)
2. [Gap Summary by Requirement Area](#gap-summary-by-requirement-area)
3. [Area 1: My Dashboard](#area-1-my-dashboard)
4. [Area 2: Call History](#area-2-call-history)
5. [Area 3: Marketplace](#area-3-marketplace)
6. [Area 4: Billing](#area-4-billing)
7. [Area 5: My Info](#area-5-my-info)
8. [Area 6: Site Login](#area-6-site-login)
9. [Area 7: Screenshot-Informed Features](#area-7-screenshot-informed-features)
10. [Source of Truth & Data Availability](#source-of-truth--data-availability)
11. [Technical Architecture Gaps](#technical-architecture-gaps)
12. [Implementation Priority Matrix](#implementation-priority-matrix)
---
## Sources
| Source | Type | Provider | Date |
|---|---|---|---|
| ViiBE/Viirtue seller portal | Screenshots (Accounts, Quotes, Products, LNP, Number Orders, CNAM, Mobile Connect, Reports) | Owner | July 2026 |
| Apollo/NetSapiens customer + manager portals | Screenshots (Home/Statistics, Domains, SIP Trunks, Phone Inventory, E911, Call History, Contacts, Answer Rules, Time Frames, Voicemail/Settings, Music/Messages, Call-Center Queues/Statistics, Auto Attendants) | Owner | July 2026 |
| Owner Obsidian notes | Design preferences, feature wishlist, operational constraints | Germaine Brown | July 2026 |
| Deployed portal | `/home/myvoip/htdocs/my.voipsimplicity.com/index.html` on app3 | Live system | July 2026 |
| `voip-portal-development` skill | 13 reference files covering API, patterns, deployment | Hermes skill repo | Ongoing |
---
## Gap Summary by Requirement Area
| # | Requirement Area | Current State | Gap Severity | Priority |
|---|---|---|---|---|
| 1 | **My Dashboard** | Stats + basic lists. No topology, MoH, or time frames. | Medium | Phase 13 |
| 2 | **Call History** | Unified search + export implemented. No recordings, no CDR data. | **High** | Phase 13 |
| 3 | **Marketplace** | Catalog + add-on request flow exists. No cart, no provisioning, no order tracking. | Medium | Phase 2 |
| 4 | **Billing** | Plan card + CC form (sessionStorage). No invoices, no gateway. | **High** | Phase 2 |
| 5 | **My Info** | Contact editing + CC form. No authorized users, no RBAC. | Medium | Phase 2 |
| 6 | **Site Login** | Split-half page + session restore. No MFA, no password reset, no contact form. | Medium | Phase 13 |
| 7 | **Screenshot Features** | 12+ feature sections visible in screenshots, 0 implemented. | **High** | Phase 14 |
**Overall gap severity:** High. The portal is a functional skeleton — login, nav, dashboard stats, call history search, and marketplace add-on requests work. Everything beyond these (MFA, billing invoices, authorized users, device lists, answering rules, time frames, contacts, music on hold, quotes/orders, reports) is absent or placeholder. Refer to [PORTAL-REQUIREMENTS.md](./PORTAL-REQUIREMENTS.md) for the complete phased plan.
---
## Area 1: My Dashboard
### Legend
| Symbol | Meaning |
|---|---|
| ✅ | Exists in current portal |
| 🟡 | Partially exists (skeleton, needs wiring) |
| ❌ | Missing entirely |
| ⬜ | Deferred (Phase 3+) |
### Dashboard Feature Gap
| Feature | Current | Required By | Gap Detail |
|---|---|---|---|
| Per-customer aggregate stats (extensions, queues, DIDs, attendants) | ✅ | Phase 1 | Wired via RingLogix API. Filter to 100399 for real extensions. |
| Extension list (name, email, voicemail badge) | ✅ | Phase 1 | Implemented. System routes hidden by toggle. |
| DID inventory list | 🟡 | Phase 1 | `phonenumber/read` returns ALL DIDs — filter client-side by `dialrule_domain`. |
| Call queue list (name, strategy, members) | 🟡 | Phase 1 | `callqueue/read` wired. Members count not yet displayed. |
| Auto attendant list (name, schedule, prompt) | ✅ | Phase 1 | `attendant/read` wired. Menu options NOT available via API. |
| Subscribed plan display | 🟡 | Phase 1 | Hardcoded in billing card. Needs RingLogix catalog integration. |
| Music on Hold display | ❌ | Phase 3 | No confirmed RingLogix endpoint. Apollo screenshots show MoH UI. |
| Time Frames list | ❌ | Phase 1 (Apollo ref) | `timeframe/read` endpoint confirmed; not yet wired in portal. Apollo shows Name, Owner, When, Recurrence, Ends On columns. |
| Graphical phone-system topology | ❌ | Phase 3 | No current implementation. Requires Canvas/SVG rendering of DID→TF→AA→Queue→Ext routing graph. |
**Dashboard gap assessment:** Current dashboard covers Phase 1 aggregate stats and basic lists. Missing: time frames (Phase 1 wiring needed), music on hold (blocked on API), topology graph (Phase 3 build), and plan display integration.
---
## Area 2: Call History
### Call History Feature Gap
| Feature | Current | Required By | Gap Detail |
|---|---|---|---|
| Unified search (name + phone, single input) | ✅ | Phase 1 | `oninput` handler, real-time filtering, `data-search` attributes. |
| Direction indicators (↓ incoming, ↑ outgoing) | ✅ | Phase 1 | Teal/gold color scheme implemented. |
| Date/Time, Direction, Name, Phone, Destination, Duration columns | ✅ | Phase 1 | All implemented in call-history-pattern. |
| Status badges (Answered/Missed/Voicemail) | ✅ | Phase 1 | Color-coded badges implemented. |
| Date range filter (Today/Week/Month/All) | 🟡 | Phase 1 | Time period filter in skill; Apollo shows calendar date picker. Enhance to date-range picker. |
| CSV Export (All + Current View) | ✅ | Phase 1 | Both export buttons implemented. Arrow character cleanup. |
| Recording playback (inline, conditional on enabled) | 🟡 | Phase 3 | Play button UI exists. Blocked on Wasabi S3 signed-URL generation and per-domain recording-enabled check. |
| Voicemail transcript (inline modal) | 🟡 | Phase 3 | Transcript button + modal UI implemented. Blocked on CDR/vmail data availability. |
| **CDR data availability** | ❌ | Phase 1 | **CRITICAL BLOCKER.** `cdr`, `call_detail_record`, `callhistory` all return 404 from RingLogix API. All Call History features are placeholder until an alternative data source is found (NetSapiens CDR export, RingLogix reseller-level reporting, or direct PBX collection). |
**Call History gap assessment:** The strongest area in the current portal — search, export, and rendering are well-implemented. The single critical blocker is CDR data availability. Without it, Call History can only show mock/placeholder data. Secondary gaps: recording playback (Wasabi integration), voicemail transcripts (data source), and date-range picker enhancement.
---
## Area 3: Marketplace
### Marketplace Feature Gap
| Feature | Current | Required By | Gap Detail |
|---|---|---|---|
| Plans/features catalog browsing | ✅ | Phase 2 | Cards with name, description, price, perLine flag. 10 hardcoded items. |
| Per-extension vs per-account distinction | ✅ | Phase 2 | `perLine: true/false/'did'` flags. Event delegation pattern. |
| Extension selector modal (single extension) | ✅ | Phase 2 | Modal with dropdown (100-399). |
| **Multiple/all extensions selection** | ❌ | Phase 2 | Only single extension selection implemented. Need checkboxes + "Select All" for multi-extension add-ons. |
| Per-DID selector (SMS/Text Messaging) | ✅ | Phase 2 | DID dropdown from `extension_list` filtered by 10+ digit regex. |
| Cart metaphor | ❌ | Phase 2 | No cart — items processed one at a time. Need running cart before submission. |
| Immediate provisioning vs request-discussion choice | ❌ | Phase 2 | Only "Request Discussion" flow implemented. Immediate provisioning requires RingLogix write API (unconfirmed). |
| Audit log entries for all changes | ✅ | Phase 2 | `auditLog.push()` on every add-on request. |
| Staff-visible ticket/notification | 🟡 | Phase 2 | Audit entries logged; no separate ticket UI or email notification pipeline. |
| Approval boundaries / staff review workflow | ❌ | Phase 2 | No approval workflow. All requests go to manual review. |
**Marketplace gap assessment:** Add-on request flow is functional. Missing: multiple/all extensions selection, cart metaphor, provisioning choice (blocked on write API), and formal approval/ticket workflow. The catalog is hardcoded — no confirmed RingLogix product catalog API.
---
## Area 4: Billing
### Billing Feature Gap
| Feature | Current | Required By | Gap Detail |
|---|---|---|---|
| Plan/price summary card | 🟡 | Phase 2 | Hardcoded domain name + pricing. Needs RingLogix plan integration. |
| Included features display | 🟡 | Phase 2 | Not implemented. Teal "Active" badges for plan features. |
| Available but unsubscribed options | ❌ | Phase 2 | Not implemented. Gray "Available" badges with Marketplace link. |
| Prior invoices list (date, number, amount, status) | ❌ | Phase 2 | **BLOCKED.** No confirmed RingLogix billing API. RingOS billing "coming soon." |
| Inline framed invoice viewer (closeable) | ❌ | Phase 2 | **BLOCKED** on invoice data source. |
| Download individual/multiple/all invoices | ❌ | Phase 2 | **BLOCKED** on invoice data source. |
| Separate secure card update path | 🟡 | Phase 2 | CC form exists in billing view but uses `sessionStorage`**NOT PCI-compliant.** Needs Stripe Elements or equivalent gateway. |
| Card data never in browser storage | ❌ | Phase 2 | Current implementation stores last-4 in sessionStorage. Must migrate to tokenized gateway. |
| Payment history | ❌ | Phase 2 | Viirtue shows Payments & Credits, Late Payers. Not in current portal. |
| Tax exemption / tax reports | ❌ | Phase 4 | Viirtue shows Tax Exemptions, Tax Liability, Tax Summary. Deferred. |
| Auto-pay toggle | ❌ | Phase 3 | Not in current portal. Requires payment gateway integration. |
**Billing gap assessment:** The billing view is a skeleton. The critical blocker is RingLogix RingOS billing API availability ("coming soon"). Without it, invoices must be manually uploaded or sourced from Stripe. Payment method needs a full PCI-compliant overhaul (Stripe Elements). Viirtue's Revenue/Billing/Compliance reports are the target model.
---
## Area 5: My Info
### My Info Feature Gap
| Feature | Current | Required By | Gap Detail |
|---|---|---|---|
| View/update account name | ✅ | Phase 2 | Editable contact form with toggle. |
| View/update account email | ✅ | Phase 2 | Editable. |
| View/update phone | ✅ | Phase 2 | Editable. |
| View/update address | ❌ | Phase 2 | Not in current form. Needs street/city/state/ZIP fields. |
| Company name (read-only) | 🟡 | Phase 2 | Displayed in billing but not in My Info view. |
| Domain ID (read-only) | ❌ | Phase 2 | Not displayed. |
| Separately update payment method | 🟡 | Phase 2 | CC form in same billing view, not isolated. Needs separate secure path. |
| Add/manage authorized users | ❌ | Phase 2 | Not implemented. Viirtue shows multiple accounts per seller; Apollo shows multi-user domains. |
| RBAC for authorized users | ❌ | Phase 2 | Need roles: Customer Admin, Authorized User, View-Only. |
| Invitation flow | ❌ | Phase 2 | No invitation email flow. |
| Audit trail for user management | ❌ | Phase 2 | No audit entries for user add/remove/role-change. |
| Password change (self-service) | ❌ | Phase 1 | Not implemented. Viirtue and Apollo both imply password management. |
| Notification preferences | ❌ | Phase 4 | Apollo shows voicemail email, missed call, mailbox full notifications. |
**My Info gap assessment:** Basic contact editing exists. Major gaps: authorized user management with RBAC (entirely absent), address fields, payment method isolation, password self-service, and notification preferences. The Viirtue Account Detail page (with tabs: Details, Quotes, Number Orders, Notes, Storage) is the primary model for Phase 2+.
---
## Area 6: Site Login
### Site Login Feature Gap
| Feature | Current | Required By | Gap Detail |
|---|---|---|---|
| Split-half login page (login left, help right) | ✅ | Phase 1 | Implemented. Navy gradient left, white right. Mobile stacks vertically. |
| Authenticate by domain ID | ✅ | Phase 1 | Domain ID → password. Customer→domain mapping hardcoded for demo. |
| Authenticate by account email | ✅ | Phase 1 | Email → password. |
| Authenticate by authorized-user email | ❌ | Phase 2 | Requires authorized user table + per-user credentials. |
| Staff login (`info@voipsimplicity.com`) | ✅ | Phase 1 | Hardcoded. Staff badge + domain selector on success. |
| Session persistence (refresh/back button) | ✅ | Phase 1 | `sessionStorage` — cleared on logout. |
| Password reset | ❌ | Phase 1 | Not implemented. Needs email-based token flow with rate limiting. |
| MFA / one-time token (email/SMS) | ❌ | Phase 3 | Not implemented. Exploration target: Twilio Verify, email OTP, TOTP apps. |
| Rate limiting on login attempts | ❌ | Phase 1 | No rate limiting in current implementation. |
| MFA recovery codes | ❌ | Phase 3 | Generated on enrollment, shown once. |
| Order-services contact form | ❌ | Phase 3 | Not implemented. Needs Name/Email/Phone/Company/Interest/Message fields on login page. |
**Site Login gap assessment:** Core authentication (split-half page, domain ID/email login, staff login, session persistence) is solid. Missing: authorized-user email auth, password reset, MFA, rate limiting, and the order-services contact form. MFA is a Phase 3 exploration target due to SMS dependency on Twilio provisioning and A2P 10DLC registration.
---
## Area 7: Screenshot-Informed Features
The owner provided 22+ screenshots from Viirtue/ViiBE (seller-side) and Apollo/NetSapiens (customer + manager). These reveal 12+ feature sections not in the current portal. **Staff-only views are marked.** Provider/API data availability is noted — this document does NOT claim RingLogix supports endpoints that are unverified.
### 7.1 ViiBE/Viirtue Seller-Side Screenshots (Staff-Only)
| Screenshot Feature | Current Portal | Required By | API Availability | Gap Detail |
|---|---|---|---|---|
| **Accounts** (account list, tabs) | 🟡 | Phase 1 | `domain/read` ✅ | Admin Panel shows 14-domain roster. Missing: per-account detail with Details/Quotes/Number Orders/Notes/Storage tabs. |
| **Quotes** (Quote Name, Company, Owner, Status; create/edit) | ❌ | Phase 2 | ❌ No RingLogix quoting API | Need portal DB for quotes. Model: Viirtue table + line-item creation from product catalog. |
| **Products** (product catalog, per-seat/per-account pricing) | ❌ | Phase 2 | ❌ Unknown | Marketplace has hardcoded catalog. Staff need catalog management UI. |
| **LNP** (Port Date, Customer, Port Type, BTN, Status) | ❌ | Phase 4 | ❌ Unknown | Viirtue LNP integration. RingLogix porting API TBD. |
| **Number Orders** (Order No., Customer, Date, Description, Status) | ❌ | Phase 4 | ❌ Unknown | Viirtue number ordering. |
| **CNAM** (Order No., CNAM Value, Telephone No., Status) | ❌ | Phase 4 | ❌ Unknown | Viirtue CNAM tab. |
| **Mobile Connect** | ❌ | Deferred | ❌ Not available | Future: softphone/mobile app pairing. |
| **Reports** (Monthly Revenue, Recurring Revenue Growth, Revenue Projection) | ❌ | Phase 4 | ⚠️ Partial (stats available; CDR not) | Staff revenue dashboard. Viirtue Reports landing model. |
| **Account Notes** (staff-only timeline per account) | ❌ | Phase 4 | N/A (portal DB) | Staff notes per customer account. |
| **Document Storage** (file upload per account: LOAs, agreements) | ❌ | Phase 4 | N/A (portal DB + S3) | File upload/download per account. |
### 7.2 Apollo/NetSapiens Customer + Manager Views
| Screenshot Feature | Current | Required By | API Availability | Customer/Staff? |
|---|---|---|---|---|
| **Home / Statistics** | ✅ | Phase 1 | `subscriber/read`, `callqueue/read`, etc. ✅ | Customer + Staff |
| **Domains** | ✅ | Phase 1 | `domain/read` ✅ | Staff (domain selector) |
| **SIP Trunks** | ❌ | Phase 4 | ❌ Unknown — no confirmed endpoint | Customer/Staff |
| **Phone Inventory / Devices** | ❌ | Phase 4 | ⚠️ `mac/read` may exist — unverified | Customer |
| **E911 Inventory** | ❌ | Phase 4 | ❌ Unknown — no confirmed endpoint | Customer/Staff |
| **Call History** (date picker, recordings, blocked numbers) | 🟡 | Phase 1 | ❌ CDR endpoints return 404 | Customer |
| **Contacts** (Name, Number, Status, Department, Email; add/import/export) | ❌ | Phase 4 | ❌ Not available via RingLogix API | Customer |
| **Answer Rules** (Time Frame, Ring targets, Allow/Block, fallback) | ❌ | Phase 4 | ❌ Unknown | Customer |
| **Time Frames** (Name, Owner, When, Recurrence, Ends On; drag-to-reorder) | ❌ | Phase 1 | `timeframe/read` ✅ | Customer |
| **User Voicemail / Settings** (inbox, greetings, notifications, transcription) | 🟡 | Phase 3 | ⚠️ `vmail/read` may exist — unverified | Customer |
| **Music / Messages** (Add Music, Add Introduction, Add Message) | ❌ | Phase 3 | ❌ Unknown | Customer/Staff |
| **Call-Center Queues / Statistics** | 🟡 | Phase 1 | `callqueue/read` ✅ (list; real-time stats unknown) | Customer/Staff |
| **Auto Attendants** | ✅ | Phase 1 | `attendant/read` ✅ (menu detail NOT available) | Customer/Staff |
### 7.3 Design & UX Comparison (from Screenshots)
| Aspect | Current Portal | Reference Portals | Verdict |
|---|---|---|---|
| Theme | Light/neutral (teal, gold, navy) | Viirtue: dark sidebar, light content; Apollo: light all | Current matches owner intent. No dark mode needed. |
| Navigation | Vertical sidebar | Viirtue: sidebar; Apollo: horizontal icon bar | Sidebar is canonical — keep it. |
| Card layout | Stat cards, billing cards | Apollo: two-column card layout on Home | Consistent. |
| Data tables | Call logs, extensions | Both: tables with sort, search, pagination | Consistent. |
| Empty states | ✅ Canonical "No data available." | Viirtue: "Nothing to see here!"; Apollo: "No new messages." | Current canonical state is correct per skill rules. |
| Mobile | ✅ Hamburger menu, viewport meta | Reference portals appear desktop-only in screenshots | Current portal is *more* mobile-ready than references. |
---
## Source of Truth & Data Availability
| Data Category | Current Source | Required Source | Status |
|---|---|---|---|
| Extensions | RingLogix `subscriber/read` | Same | ✅ Wired |
| Domains | RingLogix `domain/read` | Same | ✅ Wired |
| DIDs | RingLogix `phonenumber/read` | Same (filter client-side) | ✅ Wired |
| Call Queues | RingLogix `callqueue/read` | Same | ✅ Wired |
| Auto Attendants | RingLogix `attendant/read` | Same | ✅ Wired |
| Time Frames | RingLogix `timeframe/read` | Same | ❌ Not yet wired |
| Call History (CDRs) | RingLogix | RingLogix / NetSapiens / alternative | ❌ **BLOCKED**`cdr`, `call_detail_record`, `callhistory` all return 404 |
| Call Recordings | Wasabi S3 (RingLogix writes to it) | Wasabi S3 signed URLs | 🟡 Storage confirmed; signed-URL generation TBD |
| Voicemail | Not wired | RingLogix `vmail/read` (unverified) | ❌ Need API verification |
| Device Registration | Not wired | RingLogix `mac/read` (unverified) | ❌ Need API verification |
| Billing / Invoices | Not applicable | RingLogix RingOS (future) or Stripe | ❌ **BLOCKED** — RingOS billing "coming soon" |
| Payment Methods | `sessionStorage` only | Stripe Elements or equivalent | ❌ Need gateway integration |
| Quotes / Orders | Not applicable | Portal DB (new) or Viirtue API | ❌ Need backend DB |
| Notes / Documents | Not applicable | Portal DB + S3/disk | ❌ Need backend storage |
| Products Catalog | Hardcoded in portal JS | Portal DB or RingLogix catalog API | 🟡 Hardcoded works for MVP; need management UI |
| Customer Profiles | `sessionStorage` only | Portal DB | ❌ Need persistent storage |
| SIP Trunks | Not applicable | RingLogix (unverified) | ❌ Unknown endpoint |
| E911 | Not applicable | RingLogix (unverified) | ❌ Unknown endpoint |
| Answer Rules | Not applicable | RingLogix (unverified) | ❌ Unknown endpoint |
| CNAM | Not applicable | Viirtue (unverified) | ❌ Unknown endpoint |
---
## Technical Architecture Gaps
| Aspect | Current | Needed | Gap |
|---|---|---|---|
| **Architecture** | Single-file HTML SPA (no backend) | Backend for portal DB, payment gateway, file storage, API proxying | ❌ Major gap |
| **Data persistence** | `sessionStorage` only (volatile) | Server-side DB for quotes, orders, notes, products, customer profiles, authorized users | ❌ Need database |
| **API key protection** | Unknown — may be client-side | Server-side proxy to protect RingLogix credentials | 🟡 Needs audit |
| **File upload** | Not supported | Document storage (LOAs, agreements, MoH audio) | ❌ Need upload + storage |
| **Payment processing** | Not integrated | Tokenized payment gateway (Stripe Elements) | ❌ Need gateway |
| **Multi-user per domain** | Not supported | Authorized user management per customer account | ❌ Need user management |
| **PDF generation** | Not supported | Invoice PDF download | ❌ Need PDF gen or stored PDFs |
| **File size** | ~1,500 lines (July 2026) | Could grow to 5,000+ with full feature set | 🟡 Monitor; consider module splitting |
| **Build step** | None (single file) | May need build step if file grows too large | 🟡 Monitor |
---
## Implementation Priority Matrix
| Priority | What | Effort | Depends On |
|---|---|---|---|
| **P0 — Immediate (blocks everything)** | | | |
| P0 | CDR data source for Call History | Investigation | RingLogix support / NetSapiens CDR / alternative |
| P0 | Data isolation enforcement for all views | Low | RBAC infrastructure (exists) |
| **P1 — Phase 1: Foundation** | | | |
| P1 | Time Frames wiring (`timeframe/read` → portal) | Low | RingLogix API |
| P1 | Password reset flow | Medium | Email infrastructure |
| P1 | Call History date range filter (calendar picker) | Low | CDR data |
| P1 | Dashboard plan display integration | Low | RingLogix catalog or hardcoded |
| **P2 — Phase 2: Self-Service** | | | |
| P2 | Contact info (address fields, read-only domain ID) | Low | None |
| P2 | Authorized user management (add/remove/RBAC/invitation) | High | Backend DB + email |
| P2 | Marketplace: multi-extension selection + cart | Medium | None (frontend only) |
| P2 | Marketplace: provisioning choice UI | Low | Write API (for immediate; request-discussion needs no API) |
| P2 | Billing: invoice list + viewer (placeholder until API available) | Medium | Backend DB or manual invoice storage |
| P2 | Payment method: Stripe Elements integration | High | Stripe account + backend |
| P2 | Login: rate limiting | Medium | Backend auth |
| P2 | Login: authorized-user email authentication | Medium | Authorized user DB |
| **P3 — Phase 3: Advanced** | | | |
| P3 | Phone-system topology graph | High | All system objects wired |
| P3 | MFA / one-time token (email/SMS) | High | Backend auth + email/SMS infrastructure |
| P3 | Call recording playback (Wasabi S3) | Medium | Signed URL generation |
| P3 | Voicemail settings/inbox | Medium | `vmail/read` API verification |
| P3 | Music on Hold display | Medium | File upload + storage |
| P3 | Order-services contact form | Low | Email infrastructure |
| P3 | Auto-pay toggle | Medium | Payment gateway |
| **P4 — Phase 4: Feature Parity** | | | |
| P4 | Phones/Devices list | Medium | `mac/read` API verification |
| P4 | Contacts (CRUD + import/export) | High | Backend DB |
| P4 | Answering Rules | High | Backend DB or unverified API |
| P4 | E911 inventory | Medium | Unknown API |
| P4 | SIP trunk status | Medium | Unknown API |
| P4 | Quotes + Orders pipeline | High | Backend DB |
| P4 | Staff Reports | High | All data sources |
| P4 | CNAM management | Medium | Unknown API |
| P4 | LNP / Number Orders | High | Backend DB |
| P4 | Account Notes (staff) | Low | Backend DB |
| P4 | Document Storage | Medium | File storage |
| P4 | Notification preferences | Medium | Backend DB + email |
---
*Gap analysis maintained in `/root/projects/voipsimplicity/PORTAL-GAP-ANALYSIS.md`. Companion requirements at [PORTAL-REQUIREMENTS.md](./PORTAL-REQUIREMENTS.md).*