311 lines
16 KiB
Markdown
311 lines
16 KiB
Markdown
# Features & Priorities — RentalDriveGo
|
||
|
||
## MVP (Phase 1) — Must Ship Before Launch
|
||
|
||
### Subscription & Billing
|
||
- [x] Company signup → plan selection → payment via AmanPay or PayPal
|
||
- [x] 14-day free trial (no payment required until trial ends)
|
||
- [x] Company status: PENDING → TRIALING → ACTIVE / PAST_DUE / SUSPENDED
|
||
- [x] Subscription gate middleware on all dashboard API routes
|
||
- [x] Trial / past-due banners in dashboard
|
||
- [x] Suspended account blocks dashboard; public site stays up
|
||
- [x] Manual renewal flow: company pays via AmanPay (card/cash/e-wallet) or PayPal
|
||
- [x] Invoice history (AmanPay transaction IDs or PayPal capture IDs)
|
||
- [x] Supported currencies: MAD, USD, EUR
|
||
|
||
### Tenant Isolation (Fleet Management)
|
||
- [x] Every Prisma query scoped by `companyId`
|
||
- [x] `requireTenant` middleware attaches `companyId` from authenticated employee
|
||
- [x] Vehicle, customer, reservation IDs validated against `companyId` before any operation
|
||
- [x] No cross-company data exposure — enforced at API level, not just UI
|
||
- [x] Add / edit / archive vehicles
|
||
- [x] Vehicle photos (Cloudinary)
|
||
- [x] Published / unpublished toggle (controls marketplace + public site visibility)
|
||
- [x] Vehicle categories, specs, features list
|
||
|
||
### Offers / Promotions System
|
||
- [x] Create offer (%, fixed amount, free day, special rate)
|
||
- [x] Valid from / until dates
|
||
- [x] Applicable to: all vehicles / by category / specific vehicles
|
||
- [x] Optional promo code + max redemptions
|
||
- [x] Minimum rental days
|
||
- [x] `isPublic` flag — show on global marketplace
|
||
- [x] `isFeatured` flag — featured carousel placement (plan-gated: GROWTH+)
|
||
- [x] Offer applied at booking (discount calculated, stored on Reservation)
|
||
- [x] Offer performance stats (redemptions, revenue impact)
|
||
- [x] Offer banner image upload
|
||
|
||
### Global Marketplace (RentalDriveGo.com/explore)
|
||
- [x] Featured offers carousel on /explore home
|
||
- [x] Search vehicles by city, dates, category, price range
|
||
- [x] Company cards (logo, rating, offer badge)
|
||
- [x] Company marketplace profile page (vehicles + offers + reviews)
|
||
- [x] Vehicle detail page (photos, specs, redirect CTA to company site)
|
||
- [x] Cross-company availability check
|
||
- [x] Filter by category, transmission, price, features
|
||
- [x] Marketplace listing toggle per company (opt out)
|
||
|
||
### Renter Account System
|
||
- [x] Renter signup / login (own auth, separate from Employee/Clerk)
|
||
- [x] Email verification
|
||
- [x] Renter profile (name, phone, locale, currency)
|
||
- [x] Cross-company reservation history in /renter/dashboard
|
||
- [x] Save / unsave companies
|
||
- [x] Guest booking (no account required, but prompted to sign up after)
|
||
- [x] When renter books, auto-create Customer record in that company's CRM
|
||
|
||
### Online Reservations (all sources)
|
||
- [x] Booking from dashboard (employee creates manually)
|
||
- [x] Booking from company public site (BookingSource: PUBLIC_SITE)
|
||
- [x] Booking from global marketplace (BookingSource: MARKETPLACE)
|
||
- [x] Reservation lifecycle: DRAFT → CONFIRMED → ACTIVE → COMPLETED
|
||
- [x] Offer / promo code applied at booking step
|
||
- [x] Availability check before confirming
|
||
- [x] Booking confirmation (number, summary, company contact)
|
||
- [x] Cancel with reason + `cancelledBy` (COMPANY / RENTER / SYSTEM)
|
||
|
||
### Branding & White-Label Public Site
|
||
- [x] Company display name, logo, tagline, hero image
|
||
- [x] Primary brand color picker
|
||
- [x] Subdomain: `{slug}.RentalDriveGo.com` (claimed during onboarding)
|
||
- [x] Real-time subdomain availability check
|
||
- [x] Vercel wildcard domain routing (`*.RentalDriveGo.com`)
|
||
- [x] Company public site: home with offers, vehicle listing, vehicle detail, booking, confirmation
|
||
- [x] Offers page on public site
|
||
- [x] "Powered by RentalDriveGo" badge (removable on Pro)
|
||
- [x] Site language + currency preference
|
||
|
||
### Payments — Rental (AmanPay + PayPal)
|
||
- [x] Company connects their own AmanPay merchant account (Merchant ID + Secret Key)
|
||
- [x] Company connects their own PayPal business account
|
||
- [x] Collect payment at booking (marketplace redirect + public site)
|
||
- [x] AmanPay widget: national card, international card, cash (3000+ points), e-wallet
|
||
- [x] PayPal buttons component (standard checkout)
|
||
- [x] If no payment method configured: "Contact to reserve" + pay on pickup flow
|
||
- [x] Payment status per reservation
|
||
- [x] Refund on cancellation (via AmanPay or PayPal API)
|
||
- [x] Guest checkout (no renter account required)
|
||
|
||
### Notifications — Full System
|
||
- [x] **Email** (Resend) — all notification types, rich HTML templates
|
||
- [x] **SMS** (Twilio) — confirmations, reminders, payment alerts
|
||
- [x] **WhatsApp** (Twilio WhatsApp API) — confirmations, reminders (key for AR/FR)
|
||
- [x] **In-App** (Socket.io + Redis) — real-time bell icon in dashboard + renter site
|
||
- [x] **Push** (Firebase FCM) — renter PWA push notifications
|
||
- [x] `Notification` table — logs every delivery attempt per channel
|
||
- [x] `NotificationPreference` table — per-user opt-in/out per type + channel
|
||
- [x] Preferences UI: matrix toggle (notification type × channel)
|
||
- [x] All company events: new booking, cancelled, payment received, trial ending, maintenance due, offer expiring, new review
|
||
- [x] All renter events: confirmed, 24h reminder, 2h reminder, vehicle ready, return reminder, cancelled, refund, new offer from saved company, review request
|
||
- [x] Scheduled notifications via cron (reminders, trial ending, maintenance due)
|
||
|
||
### Reviews
|
||
- [x] Renter submits review (only after reservation COMPLETED)
|
||
- [x] 1–5 stars overall + vehicle + service
|
||
- [x] Text comment
|
||
- [x] Company can reply to review
|
||
- [x] Reviews shown on marketplace company profile
|
||
- [x] Average rating on company card + brand settings
|
||
|
||
### Customer CRM
|
||
- [x] Auto-created from any booking source
|
||
- [x] Company-scoped view (never cross-company)
|
||
- [x] Linked to global Renter account (if booked as logged-in renter)
|
||
- [x] Rental history, notes, flag/blacklist
|
||
|
||
### Auth & Onboarding
|
||
- [x] Company employee auth via Clerk
|
||
- [x] Renter auth via own JWT (separate)
|
||
- [x] Onboarding step 2: branding + subdomain
|
||
- [x] Onboarding step 4: "Your vehicles now appear on the RentalDriveGo marketplace"
|
||
- [x] Role system: OWNER / MANAGER / AGENT
|
||
|
||
|
||
### Platform Admin Panel
|
||
- [x] `AdminUser` model: email, password (bcrypt), role (SUPER_ADMIN/ADMIN/SUPPORT/FINANCE/VIEWER), 2FA (TOTP), last login tracking
|
||
- [x] `AdminPermission` model: per-admin resource+action overrides on top of role defaults
|
||
- [x] `AuditLog` model: every admin action logged (action, resource, before/after JSON, IP, note)
|
||
- [x] Admin JWT auth (separate from Clerk and renter JWT) — 8h expiry
|
||
- [x] TOTP 2FA: setup with QR code, verify, enforce for ADMIN+ roles
|
||
- [x] Role hierarchy: VIEWER < FINANCE < SUPPORT < ADMIN < SUPER_ADMIN
|
||
- [x] Admin role access matrix: 17 dashboard features × 5 roles
|
||
- [x] `admin.RentalDriveGo.com` separate app (Next.js)
|
||
- [x] **Company management**: list, search/filter, create, edit, suspend, reactivate, delete
|
||
- [x] **Company staff management**: list employees per company, add employee, edit (name/email/role), deactivate/reactivate, reset password
|
||
- [x] **Impersonation**: ADMIN+ can log in as any company employee (Clerk impersonation session), with dashboard banner
|
||
- [x] **Subscription override**: force status, change plan, add free period with auto-revert
|
||
- [x] Manual invoice mark-as-paid
|
||
- [x] **Renter management**: list, search, view history, block/unblock
|
||
- [x] **Audit log UI**: searchable, filterable by admin/action/company, CSV export
|
||
- [x] Admin user management (SUPER_ADMIN only): create/edit/deactivate admins, set roles
|
||
- [x] Platform metrics: MRR, churn, active companies, marketplace stats, notification delivery rates
|
||
- [x] Prisma seed creates first SUPER_ADMIN from env vars
|
||
- [x] Employee role control matrix (OWNER/MANAGER/AGENT) with 17 feature permissions documented
|
||
|
||
---
|
||
|
||
|
||
### Advanced Rental Operations (Phase 1)
|
||
|
||
#### Vehicle Damage Inspection
|
||
- [x] Interactive top-down SVG damage map in check-in/check-out workflow
|
||
- [x] 22 clickable zones (hood, roof, doors, fenders, bumpers, wheels, windshield, mirrors, interior, undercarriage)
|
||
- [x] 5 severity levels per zone: SCRATCH, DENT, CRACK, MISSING, OTHER — each shown in distinct color
|
||
- [x] Optional note per damaged zone
|
||
- [x] Optional damage photos upload (Cloudinary)
|
||
- [x] `DamageReport` model — one per check-in, one per check-out (`@@unique([reservationId, type])`)
|
||
- [x] Fuel level and odometer recorded at each inspection
|
||
- [x] Customer acknowledgement timestamp + name
|
||
- [x] Damage map rendered in PDF contract (static SVG with color markers) — CHECKIN + CHECKOUT side by side
|
||
|
||
#### Insurance Policies
|
||
- [x] `InsurancePolicy` model: name, type (CDW, SCDW, THEFT, THIRD_PARTY, FULL, BASIC, ROADSIDE, PERSONAL, CUSTOM)
|
||
- [x] Three charge types: PER_DAY, PER_RENTAL (flat), PERCENTAGE_OF_RENTAL
|
||
- [x] Required vs optional flag — required policies auto-apply, cannot be opted out
|
||
- [x] `ReservationInsurance` junction: snapshot of policy terms locked at booking time
|
||
- [x] `insuranceTotal` cached on Reservation for fast invoice generation
|
||
- [x] Insurance line items in customer invoice with charge type label
|
||
- [x] Insurance shown on rental contract
|
||
|
||
#### Second / Additional Driver
|
||
- [x] `AdditionalDriver` model: full personal details + license info
|
||
- [x] Charge types: FREE, PER_DAY, FLAT
|
||
- [x] Company configures default charge in `ContractSettings`
|
||
- [x] License validation applied to additional drivers (same 3-month rule)
|
||
- [x] Additional driver(s) listed on contract + invoice line item (if charged)
|
||
- [x] Employee can approve/deny flagged additional driver license
|
||
|
||
#### Driver License Validation
|
||
- [x] `licenseExpiry`, `licenseIssuedAt`, `licenseCountry`, `licenseNumber`, `licenseCategory` fields on Customer
|
||
- [x] `LicenseStatus` enum: PENDING, VALID, EXPIRING, APPROVED, DENIED, EXPIRED
|
||
- [x] **3-month rule**: if license expires within 90 days → status=EXPIRING → requires employee approval
|
||
- [x] **Expired**: status=EXPIRED → automatic flag → employee must explicitly approve or deny before confirmation
|
||
- [x] License validation badge on customer record (green/amber/red)
|
||
- [x] Warning banner on reservation detail when customer has EXPIRING or EXPIRED license
|
||
- [x] Approve / Deny buttons for OWNER and MANAGER roles only
|
||
- [x] Approval logged: who approved, when, and note
|
||
|
||
#### Age-Based & Experience-Based Pricing Rules
|
||
- [x] `PricingRule` model: configurable per company
|
||
- [x] Conditions: AGE_LESS_THAN, AGE_GREATER_THAN, LICENSE_YEARS_LESS_THAN, LICENSE_YEARS_GREATER_THAN
|
||
- [x] **Default rule: Under-25 surcharge** (+15% of base rental, configurable)
|
||
- [x] **Default rule: 5+ years experience discount** (−5%, configurable)
|
||
- [x] Adjustment types: PERCENTAGE, FLAT_PER_DAY, FLAT_TOTAL
|
||
- [x] Rules applied to primary driver AND all additional drivers (each rule applied once even if multiple drivers qualify)
|
||
- [x] Rules shown as line items on invoice (surcharges positive, discounts negative)
|
||
- [x] Snapshot of applied rules stored in `Reservation.pricingRulesApplied` JSON
|
||
|
||
#### Fuel / Gasoline Policy (Structured)
|
||
- [x] `FuelPolicyType` enum: FULL_TO_FULL, FULL_TO_EMPTY, SAME_TO_SAME, PREPAID, FREE
|
||
- [x] Multilingual policy description auto-generated from type (EN/FR/AR)
|
||
- [x] Optional custom note added by company
|
||
- [x] Fuel level recorded at check-in AND check-out via `DamageReport.fuelLevel`
|
||
- [x] Policy printed on contract in customer's language
|
||
|
||
#### Full Invoice Price Breakdown
|
||
- [x] Line items: base rental × days, per insurance policy, additional driver (if charged), pricing rule surcharges, pricing rule discounts, security deposit (refundable label)
|
||
- [x] Category labels per line: RENTAL, INSURANCE, ADDITIONAL_DRIVER, SURCHARGE, DISCOUNT, DEPOSIT
|
||
- [x] Tax/VAT line (if `ContractSettings.showTax = true`)
|
||
- [x] Subtotal → discounts → surcharges → insurance → tax → deposit → GRAND TOTAL
|
||
- [x] All amounts formatted in company's currency and locale
|
||
|
||
#### Billing Period Reporting (Accountant Export)
|
||
- [x] Reports page at `/dashboard/reports`
|
||
- [x] Preset periods: This Week, This Month, This Year, Custom range
|
||
- [x] Summary cards: total bookings, base revenue, discounts given, insurance collected, additional driver revenue, net collected
|
||
- [x] Full reservations table: contract#, invoice#, customer, vehicle, plate, dates, days, base, discount, insurance, additional driver, pricing adjustments, total, payment status, source
|
||
- [x] Export as CSV (one click) — for import into accounting software (QuickBooks, Sage, etc.)
|
||
- [x] Report generated on-demand from DB — no pre-computed tables
|
||
|
||
---
|
||
|
||
## Phase 2 — Post-Launch
|
||
|
||
### Fleet Enhancements
|
||
- [ ] Maintenance log with cost tracking
|
||
- [ ] Maintenance due alerts (date + mileage)
|
||
- [ ] Vehicle availability calendar view in dashboard
|
||
|
||
### CRM Enhancements
|
||
- [ ] Repeat customer detection + discount
|
||
- [ ] Customer communication log (emails sent)
|
||
- [ ] Customer lifetime value stat
|
||
|
||
### Analytics
|
||
- [ ] Revenue chart (day/week/month)
|
||
- [ ] Fleet utilization rate + underperforming vehicles alert
|
||
- [ ] Offer ROI analysis (revenue gained vs discounted)
|
||
- [ ] Marketplace impressions per vehicle
|
||
- [ ] CSV export
|
||
|
||
### Renter Experience
|
||
- [ ] Renter "Continue with Google" auth
|
||
- [ ] Favorite vehicles across companies
|
||
- [ ] Renter profile completion % indicator
|
||
- [ ] Booking modification request (change dates)
|
||
|
||
### Public Site Enhancements
|
||
- [ ] About page with company description + team photo
|
||
- [ ] Google Maps embed for pickup location
|
||
- [ ] "Request to book" mode (no immediate payment)
|
||
- [ ] WhatsApp floating button
|
||
|
||
---
|
||
|
||
## Phase 3 — Growth
|
||
|
||
### Custom Domain (Pro)
|
||
- [ ] Company enters `cars.acme.com` in /dashboard/brand
|
||
- [ ] Vercel API auto-provisions domain
|
||
- [ ] DNS instructions shown
|
||
- [ ] SSL automatic
|
||
|
||
### Marketplace Enhancements
|
||
- [ ] City/region pages (`/explore/cities/paris`)
|
||
- [ ] Renter 2FA
|
||
- [ ] Sponsored listing (pay-per-click for marketplace placement)
|
||
- [ ] AI-powered vehicle recommendations based on renter history
|
||
|
||
### Advanced Offers
|
||
- [ ] Flash sales (limited time countdown timer)
|
||
- [ ] Loyalty program (repeat renter discounts)
|
||
- [ ] Bundle offers (car + extras)
|
||
|
||
### Integrations
|
||
- [ ] Google Calendar sync
|
||
- [ ] QuickBooks export
|
||
- [ ] Zapier webhooks
|
||
|
||
### Documents — Rental Contracts & Customer Bills
|
||
- [x] `ContractSettings` model: per-company legal name, RC/ICE number, tax ID, custom terms, fuel/deposit/damage policies, additional clauses, signature block, footer notes, invoice tax settings, numbering prefixes
|
||
- [x] `contractNumber` + `invoiceNumber` fields on Reservation — assigned once via atomic DB transaction, never reset
|
||
- [x] `checkInFuelLevel` / `checkOutFuelLevel` fields for contract accuracy
|
||
- [x] **Rental Contract PDF** — branded with company logo + name + primary color, contains: customer details, vehicle data + cover photo, rental dates/locations, financial table (rate × days − discount + deposit), all policy clauses, full T&Cs, signature lines (company + customer)
|
||
- [x] **Customer Invoice PDF** — branded, contains: company legal info + tax ID, bill-to block, line items table (vehicle, deposit, tax if configured), totals (subtotal, discount, tax, grand total), payment details (AmanPay/PayPal transaction ID, paid date), PAID/PENDING stamp
|
||
- [x] **Both documents support EN / FR / AR** — all labels, date formats, and currency format per company locale
|
||
- [x] **On-demand generation** — PDFs are NEVER stored. Generated fresh from DB data on every request. No Cloudinary PDF upload.
|
||
- [x] **Streaming PDF response** — `Content-Type: application/pdf`, `Content-Disposition: inline` (view in browser tab) or `attachment` (download)
|
||
- [x] **Print from browser** — user opens PDF in new tab and prints via native browser print dialog
|
||
- [x] **Email with PDF attachment** — Resend sends email with both documents as attached PDFs
|
||
- [x] **Send contract + invoice together** — single API call generates both and attaches both to one email
|
||
- [x] **Custom recipient email** — override the customer's email address when sending (for forwarding)
|
||
- [x] **Renter self-download** — renter can download their own contract/invoice from `/renter/dashboard`
|
||
- [x] **Settings preview** — preview contract/invoice PDF with real company branding + sample data before finalizing settings
|
||
- [x] **Automatic triggers**: invoice sent on payment confirmed; contract sent on check-in completed
|
||
|
||
### Multi-location per company
|
||
- [ ] Multiple pickup/return locations
|
||
- [ ] Location-aware vehicle assignment
|
||
- [ ] Distance filter on marketplace
|
||
|
||
---
|
||
|
||
## Out of Scope
|
||
|
||
- GPS / telematics
|
||
- Driver license OCR / ID verification
|
||
- Insurance products
|
||
- Fuel management
|
||
- Peer-to-peer (this is B2B SaaS + B2C marketplace, not P2P)
|
||
- Native mobile app (PWA covers push notifications)
|