Module: RideMate / Cab & Bike (cab_bike / rides)
Status: ๐ก Partially implemented (rides work; commission not recorded to the ledger) ยท Last validated: 2026-09-06 ยท Priority: P0
On-demand cab/bike rides: partner/driver onboarding, fare estimation, booking, driver dispatch, live location, cancellation. Validated against classs/VehicleModule.php (~6,200 lines) + schema.
A. Purpose
Customers book rides; vehicle owners onboard vehicles + drivers; drivers accept and fulfil. Revenue = 5% (rule active) but not wired into the commission ledger (see gap).
B. Actors
Customer/rider; vehicle owner (company); driver (assigned to vehicle); admin. Enrollment type rides.
C. Entry points
Consumer: /ride.php, /rideriquestnow.php. Partner: management/partner onboarding (vehicle_partner_signup.php, hopin_vehicle_signup.php). Driver: driver app surfaces.
D. Onboarding
registerPartner(userId, data) (:565) โ ensureOwnerCompany (:831) โ addOrUpdateVehicle (:1054) โ addOrUpdateDriver (:1382) โ assignDriverToVehicle (:1485). Module cab_bike on; owner enrolled.
E. Feature registry (prefix RIDE-)
| ID | Feature | Actor | Method | Tables | Status |
|---|---|---|---|---|---|
| RIDE-001 | Onboard partner/company | owner | registerPartner :565 | company + owner profile | ๐ข |
| RIDE-002 | Add/edit vehicle | owner | addOrUpdateVehicle :1054 | vehicles_master | ๐ข |
| RIDE-003 | Add/assign driver | owner | addOrUpdateDriver :1382, assignDriverToVehicle :1485 | driver + assignment | ๐ข |
| RIDE-004 | Toggle availability | owner/driver | toggleVehicleAvailability :1353, setDriverAvailability :4481 | vehicle/driver flags | ๐ข |
| RIDE-005 | Estimate fare | customer | estimateFare :3086 | โ | ๐ข |
| RIDE-006 | Create booking | customer | createBooking :3301 | vehicle_bookings | ๐ข (money) |
| RIDE-007 | Driver: list open, arrive | driver | listOpenBookingsForDriver :4509, driverMarkArrived :4582 | vehicle_bookings | ๐ข |
| RIDE-008 | Live driver location | driver | updateDriverLocation :4433 | location store | ๐ข |
| RIDE-009 | Booking status (rider) | customer | getBookingStatusForUser :4618 | vehicle_bookings | ๐ข |
| RIDE-010 | Cancel (rider/driver) | both | userCancelBooking :4726, driverCancelBooking :4791 | vehicle_bookings | ๐ข |
F. Booking flow (RIDE-006)
ride.php โ estimateFare(userId, data) :3086 (distance ร rate)
โ createBooking(userId, data) :3301 โ INSERT vehicle_bookings
โ dispatch: listOpenBookingsForDriver (radius) โ driver accepts โ driverMarkArrived
โ ride โ completion โ fare settled via wallet_ledger (see gap)
G. Data model (2026-09-06)
| Table | Rows | Role |
|---|---|---|
vehicles_master | 9 | onboarded vehicles |
vehicle_bookings | 9 | ride bookings |
Driver/status-history/ride-request tables exist under different names than guessed (vehicle_booking_status_history,ride_requests,driver_masterare not the live names) โ re-derive with_tools/before documenting those; drivers are stored via the owner/driver methods above, not adriver_mastertable.
H. Financial impact โ the gap (validated)
5% commission rule is active and VehicleModule computes it, but no ride file calls CommissionEngineModule โ settlement goes to wallet_ledger instead, so 0 commission rows are recorded for rides. Platform take on rides is invisible to finance. To fix: call computeAndRecord('cab_bike', โฆ, 'vehicle_bookings', bookingId, โฆ) in the completion path. See ../../40-financial/commission.md.
K. State machine (vehicle_bookings)
Correction (2026-09-06): the previous transition list used names that don't exist in the live code โ code wins. vehicle_bookings actually carries two parallel status columns:
booking_status:requested โ broadcasted โ accepted (VehicleModule.php:5313`) โ arrived
(:4594) โ started (:5461) โ completed (:6097), or terminal no_driver (unmatched โ set at :113, reachable via archiveUnmatchedBooking :77) / cancelled`.
status: set tocancelled_by_user(not "cancelled_by_rider" โuserCancelBooking:4756) or
cancelled_by_driver (driverCancelBooking :4821) on cancellation; also carries cancelled_by_owner, no_show, pending, offered_to_driver, completed elsewhere in the class. There is no expired value on the live path โ an unmatched booking becomes no_driver, not expired. A code comment at VehicleModule.php:5167-5174 itself flags this two-column status/booking_status vocabulary as a known source of confusion.
L. Errors (prefix RIDE-E)
RIDE-E001no driver found โ no open driver in radius (listOpenBookingsForDriver); booking may
be archived unmatched.
RIDE-E002ride commission not in ledger โ see the financial gap.
M / N. Dependencies & change-impact
Wallet, wallet_ledger (settlement), location/geo, notifications. Wiring commission changes the finance ledger โ re-test the completion โ settlement path and add exactly one commission row.