Files
voipsimplicity/PORTAL-GAP-ANALYSIS.md

334 lines
24 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).*