# Roleplay-voertuigen

Roleplay Core 0.10.0 voegt `platform-vehicles` toe als zelfstandige,
server-authoritative resource. De resource is offline-first: de lokale
transactionele game-database blijft de bron van waarheid wanneer de cloud of
bridge niet bereikbaar is.

## Functionele flow

- `/dealership` toont de lokaal gecachte dealerconfiguratie en voorraad.
- Een aankoop vergrendelt het voertuigmodel, de voorraad en de betrokken
  economyaccounts en schrijft betaling, eigendom, eerste sleutel, audit en
  outboxevent atomisch.
- `/garage` toont uitsluitend voertuigen waarvoor het actieve character
  eigenaar of sleutelhouder is.
- Spawnen, opslaan, sleuteluitgifte, eigendomsoverdracht en impoundvrijgave
  worden opnieuw server-side geautoriseerd.
- Brandstof, motorstatus, carrosseriestatus, schade en kilometerstand uit de
  gameclient worden begrensd en pas na bezit-/sleutelcontrole opgeslagen.
- Een herstart behoudt bezit, locaties, schade en iedere auditregel.

## Control-plane

De voertuigentab in Operations toont de catalogus, eigendom, kenteken,
eigenaar, server, garage, actuele status en begrensde telemetrie. Catalogus-CRUD
loopt via modals; meldingen verschijnen als toasts. Inbeslagname vereist:

1. `servers.vehicles.impound`;
2. een reden van minimaal vijf tekens;
3. een gekozen impoundgarage en vrijgavebedrag;
4. de exacte bevestigingszin `IMPOUND`.

De cloud verstuurt alleen allowlisted `VEHICLE_MANAGE`-commando's naar een
bridge die `vehicles-v1` heeft onderhandeld. Er bestaat geen generieke remote
shell, SQL- of code-executionroute.

## Realtime en conflictgedrag

De lokale outbox verstuurt `vehicle.purchased`, `vehicle.state.changed`,
`vehicle.transferred`, `vehicle.impounded` en `vehicle.impound.released`.
De API projecteert deze idempotent op `(serverId, vehicleId)` en negeert oudere
of gelijke aggregateversies, zodat late events de nieuwere voertuigstatus niet
terugdraaien. Socket.IO-event `vehicles.updated` ververst alleen de
geautoriseerde organisatieroom.

## Contracten

- Roleplay Core: `0.10.0`
- lokaal voertuigschema: `2`
- bridge: `0.14.0`
- capability: `vehicles-v1`
- control-planecommando: `VEHICLE_MANAGE`
- FiveM-artifactdoel: `3258`

De Lua-wrappers exporteren `GetOwnedVehicles`, `HasVehicleKey`,
`ImpoundVehicle` en `GetVehiclesContract`. Alleen expliciet vertrouwde
serverresources mogen de impoundexport gebruiken; paneelcommando's worden
uitsluitend geaccepteerd wanneer `fivem-bridge` de aanroepende resource is.

## Acceptatie

De automatische suites controleren TypeScript, Lua-syntaxis, startupvolgorde,
migratiechecksums, lokale voertuigschema's, bridgecapabilities, catalogus-
validatie, realtime projectie, inbeslagname en command delivery. De laatste
acceptatie op een echte FiveM-server met oxmysql blijft een expliciete externe
installatiestap.
