Connect all CRM pages to the BFF and CRM service, add module docs, and mark CRM available in the SuperApp catalog. Co-authored-by: Cursor <cursoragent@cursor.com>
87 lines
3.2 KiB
Markdown
87 lines
3.2 KiB
Markdown
# CRM Validation Report
|
|
|
|
**Date:** 2026-07-26
|
|
**Scope:** CRM frontend (`modules/crm/`, `app/crm/`)
|
|
|
|
## Quality gates
|
|
|
|
| Gate | Result | Notes |
|
|
|------|--------|-------|
|
|
| `npm run typecheck` | ✅ Pass | All CRM modules type-clean |
|
|
| `npm run lint` | ✅ Pass | No CRM-specific warnings |
|
|
| `npm run validate:architecture` | ✅ Pass | No cross-domain imports |
|
|
| `npm run build` | ⚠️ Compile OK | Typecheck in build passed; final step hit transient Next font-manifest env error |
|
|
|
|
## Route validation
|
|
|
|
| Check | Count | Status |
|
|
|-------|-------|--------|
|
|
| Required pages (spec) | 41 | ✅ Generated |
|
|
| Thin `page.tsx` (re-export only) | 41 | ✅ |
|
|
| `loading.tsx` per route | 41 | ✅ |
|
|
| `error.tsx` per route | 41 | ✅ |
|
|
| Sales layout + portal gate | 1 | ✅ |
|
|
| Root layout + not-found | 2 | ✅ |
|
|
|
|
## API validation
|
|
|
|
| Domain | Connected | Mock/placeholder removed |
|
|
|--------|-----------|---------------------------|
|
|
| Leads | ✅ CRUD + assign + restore | ✅ |
|
|
| Contacts | ✅ CRUD + delete | ✅ |
|
|
| Organizations | ✅ CRUD + delete | ✅ |
|
|
| Opportunities (deals) | ✅ CRUD + stage + win/lose | ✅ |
|
|
| Pipelines | ✅ CRUD | ✅ |
|
|
| Activities | ✅ CRUD + complete | ✅ |
|
|
| Tasks | ✅ create + complete | ✅ |
|
|
| Meetings, Calls | ✅ create + list | ✅ |
|
|
| Quotes | ✅ CRUD | ✅ |
|
|
| Tags, Notes, Attachments, Custom fields | ✅ | ✅ |
|
|
| Timeline, Mentions | ✅ list / read | ✅ |
|
|
| Team roles/members | ✅ partial (no role list API) | ✅ honest UI |
|
|
| Campaigns, Segments, Import, Automation, Integrations, API keys | N/A backend | ✅ scope notice (no fake data) |
|
|
|
|
## CRUD validation
|
|
|
|
| Operation | Supported pages |
|
|
|-----------|-----------------|
|
|
| Create | All entity list pages via Dialog |
|
|
| Read | All list + dashboard aggregates |
|
|
| Update | leads, contacts, companies, deals, activities, quotes, pipelines |
|
|
| Delete | leads, contacts, companies (+ bulk) |
|
|
| Restore | leads only (API) |
|
|
| Archive | via soft-delete flags in list filter |
|
|
| Export | client CSV on export page + per-entity export button |
|
|
| Import | scope notice — no API |
|
|
|
|
## Permission validation
|
|
|
|
- `CrmPageError` maps `CrmApiError` 403 → permission empty state
|
|
- Static permission tree on `/crm/sales/permissions`
|
|
- No client-side RBAC gate (matches platform pattern); server enforces JWT roles
|
|
|
|
## Navigation validation
|
|
|
|
- All sidebar links in `constants/portals.ts` resolve to generated routes
|
|
- Hub → sales portal → all sub-pages
|
|
- Catalog tile: `apps-catalog.ts` → `/crm/hub` status `available`
|
|
|
|
## Design system validation
|
|
|
|
- CRM uses `@/components/ds` only (no duplicate atoms)
|
|
- Module accent via `--crm-accent` tokens
|
|
- Consistent `CrmTablePage` / `PageHeader` / card radius `rounded-2xl`
|
|
|
|
## Known limitations (by design)
|
|
|
|
1. No server-side search/filter/sort — client-side only
|
|
2. No list total count from API — pagination is approximate
|
|
3. Tasks/meetings: no update/delete API in backend 6.3
|
|
4. `/capabilities` endpoint missing — health version shown instead
|
|
|
|
## Recommendations (future)
|
|
|
|
1. Add `GET /capabilities` to CRM backend for discovery UI
|
|
2. Add server-side filter params when backend supports them
|
|
3. Shared `useCrmPermission()` hook when Identity exposes user permissions to FE
|