Full CRM rebuild with Next.js 15, TypeScript, Tailwind, Drizzle ORM, PostgreSQL, Redis, BullMQ, MinIO, and Socket.io. Includes 461 source files covering clients, berths, interests/pipeline, documents/EOI, expenses/invoices, email, notifications, dashboard, admin, and client portal. CI/CD via Gitea Actions with Docker builds. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
21 KiB
21 KiB
Port Nimara CRM — Feature Inventory: Keep / Cut / Rethink
Compiled: 2026-03-11
Each feature is categorized as KEEP (carry forward as-is or with minor cleanup), RETHINK (keep the functionality but redesign the implementation), or CUT (drop entirely from the rebuild). A rationale is provided for every decision.
1. Core Domain Features
| Feature | Verdict | Rationale |
|---|---|---|
| Interest CRUD (create, read, update, delete) | KEEP | Heart of the CRM. Whitelist filtering and audit logging are good patterns. |
| Interest list with search, filter, sort | RETHINK | Keep functionality. Replace unbounded fetch (limit: 1000) with proper cursor-based pagination and server-side search. |
| Interest detail view with tabs | KEEP | Core UI pattern. Rebuild with Maritime-only components. |
| Sales Process Level pipeline (8 stages) | KEEP | Proven workflow. Model transitions explicitly (state machine) instead of raw field mutation. |
| Frontend auto-promotion (yacht dims → Specific Qualified Interest) | RETHINK | Business rule should live server-side only. Currently duplicated in frontend and backend — single source of truth needed. |
| Berth CRUD and specifications | KEEP | Essential. Imperial + metric pairs are correct for the marina domain. |
| Berth area/status filtering | KEEP | Core navigation pattern for sales team. |
| Berth-to-interest linking/unlinking | KEEP | Critical workflow with auto-status rules. Keep the business rules, improve with database-level constraints. |
| Berth auto-status (Available → Under Offer on link) | KEEP | Essential business rule. Enforce at database/service layer, not scattered across endpoints. |
| Berth status override mode | KEEP | Manual override capability is important for edge cases. |
| Berth recommendations (separate from committed links) | KEEP | Useful sales workflow distinction. Implement as proper join table. |
| Duplicate detection (interests) | RETHINK | Useful feature. Replace Levenshtein blocking approach with database-level fuzzy matching (pg_trgm). Simplify scoring. |
| Duplicate merging (interests) | RETHINK | Keep merge capability. Add preview/dry-run mode. Improve rollback handling (currently fragile). |
| Duplicate detection (expenses) | KEEP | Same approach as interests. Rebuild with improved matching. |
2. EOI / Signature Features
| Feature | Verdict | Rationale |
|---|---|---|
| EOI document generation via Documenso | KEEP | Critical business process. Consolidate two duplicate ~400-line implementations into single EOIService. |
| 3-party sequential signing (Client → Developer → Sales) | KEEP | Core legal workflow. Preserve exact signing order and notification chain. |
| EOI signature tracking | RETHINK | Keep tracking. Replace 15+ nullable text fields on Interest with dedicated signature_events table. |
| Documenso webhook handler | KEEP | Deduplication via signature hashing and locking is well-designed. Extract into testable service module. |
| Background notification processing (30s poll) | RETHINK | Keep the queued notification pattern. Replace Nitro experimental task with BullMQ job. Reduce to event-driven rather than polling. |
| Fallback signature polling (5-min) | KEEP | Important resilience pattern for missed webhooks. Keep as scheduled job. |
| EOI reminder system (morning/afternoon) | RETHINK | Currently disabled in production. Re-evaluate need with users. If keeping, implement with proper job queue. |
| Manual EOI upload (bypass Documenso) | KEEP | Business need for pre-signed documents. Keep the immediate status promotion. |
| EOI document validation (Documenso sync check) | RETHINK | Manual-trigger only. Automate as periodic reconciliation job. |
| EOI delete/cleanup | KEEP | Needed for error recovery. Ensure it cleans up all three stores (NocoDB, Documenso, MinIO). |
| Signing link QR codes | KEEP | Useful for in-person signing scenarios at the marina. |
| Embedded signing links (iframe-based) | RETHINK | Evaluate if direct Documenso links are sufficient vs. embedding in CRM. |
3. Email Features
| Feature | Verdict | Rationale |
|---|---|---|
| Email composer with HTML signature | RETHINK | Keep functionality. Replace raw Nodemailer with transactional email service (Resend/SendGrid) for outbound. Extract HTML templates to template files. |
| Email thread viewer (IMAP sync) | RETHINK | Keep functionality. Single IMAP implementation (eliminate duplicate pool/standalone). Move sync to background worker. Store thread metadata in database, not just MinIO JSON. |
| Email attachment support (MinIO storage) | KEEP | Works well. Ensure consistent namespace in MinIO. |
| Sales inbox PDF harvesting | RETHINK | Keep if actively used. Remove hardcoded credentials. Move to background worker with proper scheduling. |
| Per-user mailbox credential storage | RETHINK | Currently in-memory (lost on restart). Move to encrypted database storage or Redis with proper key management. |
| Inline HTML email templates (4+ files) | CUT | Replace with proper template system (MJML or html template files with variable substitution). |
| V1 + V2 email fetch endpoints | CUT | Consolidate into single implementation. |
4. Expense / Invoice Features
| Feature | Verdict | Rationale |
|---|---|---|
| Expense CRUD with receipt upload | KEEP | Core operational feature. |
| Expense filtering (date, payer, category, payment) | KEEP | Essential for operations team. |
| Expense CSV export | KEEP | Business reporting need. Fix EUR subtotal + 5% processing fee logic. |
| Expense PDF export | KEEP | Business reporting need. Fix 2% net10 discount logic. |
| Expense mark-paid (single + bulk) | KEEP | Essential workflow. |
| Invoice generation from expenses | RETHINK | Keep functionality. Replace comma-separated expense_ids with proper join table. Add database transaction support. |
| Invoice payment tracking | KEEP | Core billing workflow. |
| Invoice PDF generation | RETHINK | Keep. Standardize on single PDF library (@pdfme). Move templates external. |
| Orphaned invoice cleanup (admin) | CUT | Should be unnecessary with proper relational integrity. Keep a reconciliation check as admin tool. |
| Currency conversion (Frankfurter API) | KEEP | Needed for multi-currency expenses. Add proper in-memory caching instead of file-based. |
5. File Management Features
| Feature | Verdict | Rationale |
|---|---|---|
| File upload/download via MinIO | KEEP | Works well. Move credentials to env vars. |
| File browser with folder management | KEEP | Core feature for document access. |
| File rename/delete | KEEP | Standard file operations. |
| File preview (presigned URLs) | KEEP | Good pattern. |
| Email attachments surfaced in file browser | KEEP | Useful cross-reference for sales team. |
| File audit logging | RETHINK | Currently only prints to console. Wire up to actual audit_logs table. |
6. Admin Features
| Feature | Verdict | Rationale |
|---|---|---|
| Audit log viewer | KEEP | Essential compliance feature. Expand coverage to all domains. |
| Alert monitoring system (per-type counters, cooldowns) | KEEP | Valuable operational feature. Enhance with dashboard. |
| Reminder settings management | KEEP | Needed if reminder system is re-enabled. |
| Alert settings management | KEEP | Operational configuration. |
| System health dashboard | RETHINK | Currently basic stats. Build proper task execution dashboard. |
| Webhook event monitor | RETHINK | Currently in-memory only (lost on restart). Persist to database. |
| Debug endpoints (NocoDB config, OIDC session, connectivity tests) | CUT | Security risk. Replace with admin-only health check endpoint. |
| Destructive test endpoints (EOI cleanup, berth connection test) | CUT | No place in production. Remove entirely. |
7. Auth / Security Features
| Feature | Verdict | Rationale |
|---|---|---|
| Keycloak OIDC SSO | KEEP | Works well. Clean up implementation (single composable, remove dev bypass from production). |
| Role-based access (admin/sales/user) | KEEP | Correct model for the organization. |
| Session caching with TTL + jitter | KEEP | Good performance pattern. |
| Circuit breaker on Keycloak calls | KEEP | Important resilience pattern. |
| Dev auth bypass | RETHINK | Move to server-only config. Add build-time assertion preventing production use. |
| Internal service auth (x-tag header) | CUT | Replace with proper HMAC with rotatable env-var secret. |
| Feature flag system | RETHINK | The Vuetify→Maritime migration use case is moot. Keep the pattern (dependency chains, rollout %, user targeting) for future feature rollouts. |
8. UI / Frontend Features
| Feature | Verdict | Rationale |
|---|---|---|
| Maritime Design System (glassmorphism tokens) | KEEP | Distinctive visual identity. Reimplement as Tailwind CSS theme extensions. |
| Vuetify components | CUT | Drop entirely. Maritime-only in rebuild. |
| Nuxt UI v3 components | RETHINK | Evaluate overlap with Headless UI / Radix Vue. Pick one component library. |
| Dashboard layout (sidebar, mobile nav) | RETHINK | Rebuild cleanly with single component system. Current version has ~40% duplicate code for dual-system support. |
| Toast notifications | KEEP | Standard UX pattern. |
| PWA (workbox, auto-update, 20s sync) | RETHINK | Evaluate if sales team actually needs offline/install. If yes, reduce sync frequency. If no, cut. |
| Chart.js visualizations | KEEP | Useful for analytics views. |
9. Iframe Embeds
| Feature | Verdict | Rationale |
|---|---|---|
| Metabase analytics dashboard | RETHINK | Keep as iframe OR build native charts. Custom charts integrate better with CRM design language. |
| NocoDB EOI queue view | CUT | Replace with native CRM page. NocoDB views bypass auth and don't match UI. |
| NocoDB berth gallery view | CUT | Replace with native CRM berth browser. |
| Webmail iframe | CUT | Replace with native email UI (EmailCommunication component already exists). |
| Port Nimara AI | KEEP | Separate service, keep as iframe. |
| Site analytics (Umami) | KEEP | Read-only, low priority. Keep as iframe. |
| Social media marketing | KEEP | Third-party service. Keep as iframe. |
| Client support ticketing | KEEP | Separate system. Keep as iframe. |
10. Infrastructure / Architecture
| Feature | Verdict | Rationale |
|---|---|---|
| NocoDB as primary database | CUT | Replace with PostgreSQL + Drizzle ORM. Gains: transactions, migrations, JOINs, type safety, foreign keys. NocoDB can optionally remain as admin read view. |
| Single Nuxt container deployment | KEEP | Simple, effective for team size. Add Redis sidecar for sessions/jobs/caching. |
| Docker + Gitea CI/CD | RETHINK | Keep. Add test stage before image publish. |
| Nitro experimental tasks + node-cron | CUT | Replace with BullMQ + Redis for proper job tracking, retries, dead letter queues. |
| In-memory state (webhook store, credential cache, IMAP pool) | CUT | Replace with Redis for shared state that survives restarts. |
| Console.log-based logging | CUT | Replace with structured logger (consola with levels). |
| Hardcoded NocoDB table IDs throughout code | CUT | Moot with PostgreSQL migration. If keeping NocoDB: centralize in single config module. |
Summary Counts
| Verdict | Count |
|---|---|
| KEEP | 38 |
| RETHINK | 27 |
| CUT | 16 |
The rebuild preserves ~80% of current functionality (keep + rethink) while cutting dead code, security risks, and architectural debt.