Web-based booking schedule for Always Classic Cars.
- TypeScript 93.6%
- HTML 3.7%
- Shell 1.6%
- JavaScript 0.6%
- CSS 0.4%
| clientportal | ||
| docs | ||
| plans | ||
| prisma | ||
| public | ||
| scripts | ||
| src | ||
| .dockerignore | ||
| .gitignore | ||
| auth.config.ts | ||
| auth.ts | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| eslint.config.mjs | ||
| example.env | ||
| LICENSE | ||
| next-auth.d.ts | ||
| next.config.mjs | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.mjs | ||
| prisma.config.ts | ||
| README.md | ||
| tailwind.config.ts | ||
| task.md | ||
| tsconfig.json | ||
| vitest.config.mts | ||
ACC System
Web-based booking schedule for Always Classic Cars, replacing the Excel-based wedding booking spreadsheet.
Features
- Schedule — bookings grouped by date with inline editing, search and filters (source/type/status), month/year navigation, VIC public holiday badges, date labels, "no more bookings" toggle, a print-ready date-range view, a Postponed toggle for bookings moved off their date (with or without a new date yet), and live updates across every open window when someone else edits a booking
- Bookings — multi-car jobs with per-car chauffeur, pickup time, duration, route, and night transfer flag; client, partner, wedding, and flight details; unsaved-changes protection
- Pricing — date-effective price lists (Settings → Pricing) with a 3-hour base per car, extra-hour rate, flat night rates, public holiday and after-midnight surcharges; Car Cost and Surcharge pre-fill automatically on the booking form and on website bookings, and each booking keeps the price list that applied when it was created
- Payments — Waiting Deposit / Deposit Paid / Cash on Day / PIF / Hold tracking, individual payment records with live balance, discount and surcharge, automatic status updates
- Fleet & chauffeurs — full CRUD with soft-delete protection (a chauffeur can only be deleted if they've never been given a job), availability calendars for cars and chauffeurs, double-booking and unavailability warnings, CPVV DC licence verification, portal access badges
- Chauffeur portal — phone first, with a tab bar on phones and a sidebar on wider screens: Today shows the next job with a countdown, route and one-tap Navigate and Call; offers are answered from My Jobs with the estimated pay; each job has a detail page with its stops, office notes, people and documents; overtime is recorded per job with client signature (cost auto-calculated); availability is set by tapping days on a month calendar; pay shows the month's estimate by week and per job; subscribe to a personal iCal feed
- Contract offers — send offers to chauffeurs by email with Accept/Decline buttons; responses update the schedule, notify the office and the chauffeur, and unassign on decline; chauffeurs are emailed again if an already-accepted job's details later change
- Emails — all system emails (chauffeur offer, portal welcome, password reset, accept/decline notifications, job-updated notifications) editable as branded templates in a WYSIWYG editor (Settings → Email Templates)
- PDF booking sheets — client and chauffeur PDFs generated on save and webhook import, stored via OneDrive sync; office signatures and T&C pages
- Attachments — documents such as a client's run sheet attached under Documents on Edit Booking, kept in the booking's OneDrive job folder, and shared per file with the booking's chauffeurs
- Website intake — WPForms webhooks auto-create priced bookings from the Wedding, General, Airport Transfer, and Transfer website forms
- Client booking portal: a separate booking website (
clientportal/) where clients book weddings, events and transfers themselves, pick cars that are free on their date, add stops, sign online, and later change details through a private link; see docs/client-portal.md - Admin — role-based section permissions with per-section read-only mode, reports dashboard (with or without money figures, chosen per account), full activity log with field-level diffs, Traccar GPS integration with day-limited share links
- Mobile friendly — responsive layout with card views throughout
Tech Stack
- Next.js 16 (App Router, TypeScript, sharp for image optimisation)
- Prisma 7 with
@prisma/adapter-better-sqlite3(SQLite) - NextAuth.js v5 (credentials provider, JWT sessions)
- Tailwind CSS
- React Hook Form + Zod
- TinyMCE (email template editor), nodemailer (SMTP)
- date-fns, lucide-react
- Vitest unit tests
- Docker + docker-compose or Node.js + PM2 (production)
Documentation
| Doc | What it covers |
|---|---|
| docs/installation.md | Production quick-install, Docker, and local development setup |
| docs/deployment.md | Full production deployment — Proxmox LXC, Node.js + PM2, Docker, Nginx, updating |
| docs/authentication.md | Office app and chauffeur portal logins: separate accounts, sessions and routes, and the same email on both |
| docs/environment-variables.md | Every environment variable the app reads, in one place |
| docs/email-smtp.md | SMTP setup, including the Microsoft 365 / Exchange Online OAuth2 guide |
| docs/database-schema.md | Entity relationships and what each Prisma model is for |
| docs/project-structure.md | Where things live in the codebase |
| docs/onedrive-sync.md | Syncing booking sheet PDFs from OneDrive to the server |
| docs/wpforms-webhooks.md | Website form → booking webhooks: setup and field mappings |
| docs/client-portal.md | Client booking portal: what clients can do, office setup, client links, security |
Version
v1.129.0 — see CHANGELOG.md for the full version history. The authoritative version number lives in package.json.
License
Proprietary. Copyright (c) 2026 Stewart Bennell (Bennell IT). All rights reserved. See LICENSE.