root 0c9f3f8635 fix: resolve TS18046 errors for React 19 element props type
React 19 types React.ReactElement props as unknown instead of any. Test
helper functions that access element.props.children, .className, or .href
need explicit props type parameters on React.ReactElement and isValidElement.

Changes:
- admin/PublicShell.test.ts: add WithChildren type, use React.ReactElement<WithChildren>
- dashboard/PublicShell.test.ts: same pattern for childTypes and contentWrapper
- dashboard/StatCard.test.ts: add ElementWithClass type for className access
- dashboard/public-auth-pages.test.ts: add ElementWithHref type for href access

No any, @ts-ignore, or type assertion bypass used.
2026-06-28 01:21:36 -04:00
2026-06-28 00:05:39 -04:00
2026-05-21 12:35:49 -04:00
2026-06-20 17:13:07 -04:00
2026-05-25 00:58:10 -04:00
2026-05-10 19:19:56 -04:00
2026-06-28 00:05:39 -04:00
2026-06-27 22:55:24 -04:00
2026-06-24 02:00:31 -04:00
2026-05-27 02:13:49 -04:00
2026-05-21 12:35:49 -04:00
2026-06-28 00:05:39 -04:00
2026-05-21 12:35:49 -04:00
2026-06-27 22:55:24 -04:00
2026-06-02 23:35:25 -04:00
2026-04-30 14:59:57 -04:00
2026-06-28 00:05:39 -04:00

🚗 RentalDriveGo— Multi-Tenant Car Rental SaaS + Storefront

Platform Model

Rental Companies (B2B) — pay RentalDriveGoa subscription (AmanPay or PayPal), get:

  • A fully private dashboard (zero data overlap with any other company)
  • Fleet management with vehicle photo upload (photos auto-appear on global storefront)
  • Promotional offers management
  • A white-label site at company.RentalDriveGo.com where renters book and pay

Renters (B2C) — free account, can:

  • Browse ALL companies' vehicles and offers on RentalDriveGo.com/explore
  • Click a vehicle → redirected to the company's site to book and pay
  • Receive full notifications (Email + SMS + WhatsApp + Push + In-App)
  • Track all bookings across companies in one account

⚠️ Payment Providers — Stripe Has Been Removed

Provider Purpose
AmanPay (amanpay.net) Primary. National/international cards, cash (3000+ points), e-wallet. Moroccan PCI-DSS Level-1 PSP.
PayPal Secondary. Global coverage.

Two payment contexts:

  1. Company pays RentalDriveGosubscription → RentalDriveGo's own AmanPay/PayPal account
  2. Renter pays company for rental → Company's own AmanPay merchant + PayPal account (direct, no intermediary)

🌐 Storefront is Discovery Only — No Booking on RentalDriveGo.com/explore

The global storefront shows all vehicles with photos from all companies. When a renter clicks "Book this vehicle", they are redirected to the company's branded site ({slug}.RentalDriveGo.com/book?vehicleId=X&from=Y&to=Z&ref=storefront). The booking form is pre-filled. All payment happens on the company site using the company's own payment accounts.


📸 Vehicle Photos → Storefront Visibility

Company uploads photos in /dashboard/fleet
  → Stored in Cloudinary
  → Vehicle.photos[] holds the URLs
  → First photo = cover image on storefront cards
  → All photos shown in storefront vehicle gallery
  → isPublished=true makes vehicle appear on storefront

🏗 Five-Layer Architecture

Layer 1A: RentalDriveGo.com              — B2B marketing site
Layer 1B: RentalDriveGo.com/explore      — B2C storefront (discovery + redirect only)
Layer 2:  app.RentalDriveGo.com          — Company dashboard (private, subscription-gated)
Layer 3:  {slug}.RentalDriveGo.com       — Company branded site (booking + payment here)
Layer 4:  api.RentalDriveGo.com          — REST API

📁 Project Structure

rental-car-site/
├── README.md
├── docs/
│   ├── ARCHITECTURE.md       ← Payment providers, storefront redirect model, photo flow
│   ├── DESIGN_SYSTEM.md
│   ├── PAGES.md              ← All pages. Storefront = discovery only. Booking = company site.
│   ├── FEATURES.md
│   └── DEPLOYMENT.md
└── skills/
    ├── rental-car-website/
    ├── rental-car-components/
    ├── rental-car-backend/
    │   └── references/
    │       ├── schema.md               ← AmanPay/PayPal fields, no Stripe
    │       ├── api-routes.md           ← All routes
    │       ├── payment-service.md      ← AmanPay + PayPal implementation ← KEY FILE
    │       ├── subscription-service.md ← Manual renewal, plan prices in MAD/USD/EUR
    │       ├── subdomain-service.md    ← Storefront redirect + company site
    │       └── notification-service.md ← All 5 channels
    └── rental-car-i18n/

🛠 Tech Stack

Concern Technology
Subscription payment AmanPay (primary) + PayPal (secondary)
Rental payment Company's own AmanPay merchant + PayPal
PDF generation @react-pdf/renderer — server-side, on-demand, never stored
Damage diagrams SVG top-down car map (22 zones, React interactive + PDF static render)
Insurance Per-company configurable policies with per-day/flat/% charge types
Pricing rules Age/experience-based surcharges & discounts (configurable per company)
Email Resend
SMS + WhatsApp Twilio
Push Firebase FCM
Real-time in-app Socket.io + Redis
Images Cloudinary
Company auth Clerk
Renter auth JWT (custom)
API Node.js + Express + Prisma + PostgreSQL
Frontend Next.js 14 + React 18 + Vite
Deployment Vercel + Railway
S
Description
Car Management System
Readme 196 MiB
Languages
TypeScript 93.6%
CSS 3%
Shell 2.3%
JavaScript 1%