Koovira Dev Docs
20-modules/ridemate/overview.md

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-)

IDFeatureActorMethodTablesStatus
RIDE-001Onboard partner/companyownerregisterPartner :565company + owner profile๐ŸŸข
RIDE-002Add/edit vehicleowneraddOrUpdateVehicle :1054vehicles_master๐ŸŸข
RIDE-003Add/assign driverowneraddOrUpdateDriver :1382, assignDriverToVehicle :1485driver + assignment๐ŸŸข
RIDE-004Toggle availabilityowner/drivertoggleVehicleAvailability :1353, setDriverAvailability :4481vehicle/driver flags๐ŸŸข
RIDE-005Estimate farecustomerestimateFare :3086โ€”๐ŸŸข
RIDE-006Create bookingcustomercreateBooking :3301vehicle_bookings๐ŸŸข (money)
RIDE-007Driver: list open, arrivedriverlistOpenBookingsForDriver :4509, driverMarkArrived :4582vehicle_bookings๐ŸŸข
RIDE-008Live driver locationdriverupdateDriverLocation :4433location store๐ŸŸข
RIDE-009Booking status (rider)customergetBookingStatusForUser :4618vehicle_bookings๐ŸŸข
RIDE-010Cancel (rider/driver)bothuserCancelBooking :4726, driverCancelBooking :4791vehicle_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)

TableRowsRole
vehicles_master9onboarded vehicles
vehicle_bookings9ride bookings
Driver/status-history/ride-request tables exist under different names than guessed (vehicle_booking_status_history, ride_requests, driver_master are not the live names) โ€” re-derive with _tools/ before documenting those; drivers are stored via the owner/driver methods above, not a driver_master table.

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 to cancelled_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-E001 no driver found โ€” no open driver in radius (listOpenBookingsForDriver); booking may

be archived unmatched.

  • RIDE-E002 ride 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.