Разработка платформы для аренды автомобилей

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка платформы для аренды автомобилей
Средняя
от 2 недель до 3 месяцев
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Разработка платформы для аренды автомобилей

Прокат автомобилей отличается от аренды жилья в нескольких принципиальных вещах: короткие периоды (часы, не дни), строгий учёт страховки и водительского удостоверения, обязательная проверка состояния автомобиля до и после аренды, топливная политика. Это меняет архитектуру значительно.

Модель данных

Автомобиль — это конкретная единица с историей, а не просто «тип авто»:

CREATE TABLE vehicles (
    id              BIGSERIAL PRIMARY KEY,
    owner_id        BIGINT NOT NULL REFERENCES users(id),
    make            VARCHAR(50) NOT NULL,   -- Toyota
    model           VARCHAR(50) NOT NULL,  -- Camry
    year            SMALLINT NOT NULL,
    plate_number    VARCHAR(20) UNIQUE NOT NULL,
    vin             VARCHAR(17) UNIQUE NOT NULL,
    transmission    VARCHAR(10) NOT NULL,  -- auto, manual
    fuel_type       VARCHAR(15) NOT NULL,  -- petrol, diesel, electric, hybrid
    seats           SMALLINT NOT NULL DEFAULT 5,
    mileage_km      INT NOT NULL DEFAULT 0,
    location        GEOGRAPHY(POINT, 4326),
    insurance_expiry DATE NOT NULL,
    inspection_expiry DATE NOT NULL,
    status          VARCHAR(20) NOT NULL DEFAULT 'available'
);

CREATE TABLE rental_bookings (
    id              BIGSERIAL PRIMARY KEY,
    vehicle_id      BIGINT NOT NULL REFERENCES vehicles(id),
    renter_id       BIGINT NOT NULL REFERENCES users(id),
    pickup_datetime TIMESTAMPTZ NOT NULL,
    return_datetime TIMESTAMPTZ NOT NULL,
    pickup_location GEOGRAPHY(POINT, 4326),
    return_location GEOGRAPHY(POINT, 4326),
    status          VARCHAR(20) NOT NULL DEFAULT 'pending',
    total_amount    NUMERIC(10,2) NOT NULL,
    security_deposit NUMERIC(10,2) NOT NULL,
    fuel_policy     VARCHAR(20) NOT NULL  -- 'full_to_full', 'prepaid'
);

Верификация водителя

Это обязательный блок — без проверки документов платформа несёт юридическую ответственность. Интеграция с Stripe Identity или Jumio:

class DriverVerificationService
{
    public function initiateVerification(User $user): string
    {
        // Stripe Identity
        $session = $this->stripe->identity->verificationSessions->create([
            'type' => 'document',
            'options' => [
                'document' => [
                    'allowed_types'            => ['driving_license'],
                    'require_id_number'        => true,
                    'require_live_capture'     => true,
                    'require_matching_selfie'  => true,
                ],
            ],
            'metadata' => ['user_id' => $user->id],
        ]);

        $user->update([
            'stripe_verification_session_id' => $session->id,
            'verification_status'            => 'pending',
        ]);

        return $session->url;
    }

    public function handleWebhook(array $payload): void
    {
        $session = $payload['data']['object'];

        $user = User::where(
            'stripe_verification_session_id',
            $session['id']
        )->firstOrFail();

        match ($session['status']) {
            'verified'  => $user->update([
                'verification_status'     => 'verified',
                'verified_at'             => now(),
                'license_expiry'          => $session['last_verification_report']['document']['expiration_date'] ?? null,
            ]),
            'requires_input' => $user->update(['verification_status' => 'failed']),
            default => null,
        };
    }
}

Ценообразование: почасовая и посуточная модели

Прокат может быть почасовым, посуточным или комбинированным. Нужен гибкий расчёт:

class PricingCalculator
{
    public function calculate(
        Vehicle $vehicle,
        Carbon $pickup,
        Carbon $return
    ): PricingResult {
        $hours = $pickup->diffInHours($return);
        $days  = $pickup->diffInDays($return);

        // Если меньше суток — считаем почасово
        if ($hours <= 24 && $vehicle->hourly_rate) {
            $base = $vehicle->hourly_rate * $hours;
        } else {
            // Посуточно + доплата за неполные сутки
            $fullDays     = floor($hours / 24);
            $remainHours  = $hours % 24;

            $base = $vehicle->daily_rate * $fullDays;

            if ($remainHours > 0) {
                // Если остаток > половины суток — считать как сутки
                $base += $remainHours > 12
                    ? $vehicle->daily_rate
                    : $vehicle->hourly_rate * $remainHours;
            }
        }

        // Сезонный коэффициент
        $multiplier = $this->getSeasonMultiplier($pickup, $vehicle->vehicle_class);

        // Скидка за длительную аренду
        $discount = match(true) {
            $days >= 30 => 0.20,
            $days >= 14 => 0.15,
            $days >= 7  => 0.10,
            default     => 0.0,
        };

        $subtotal = $base * $multiplier * (1 - $discount);
        $deposit  = $vehicle->deposit_amount;
        $fee      = $subtotal * $this->platformFeeRate;

        return new PricingResult(
            base: $base,
            multiplier: $multiplier,
            discount: $discount,
            subtotal: $subtotal,
            platform_fee: $fee,
            security_deposit: $deposit,
            total: $subtotal + $fee,
        );
    }
}

Акт приёма-передачи с фото

Перед выдачей и после возврата — обязательная фиксация состояния. Это снимает споры:

Schema::create('vehicle_inspections', function (Blueprint $table) {
    $table->id();
    $table->foreignId('booking_id')->constrained();
    $table->enum('type', ['pre_rental', 'post_rental']);
    $table->json('damage_map');      // координаты повреждений на схеме авто
    $table->json('photo_urls');      // S3 URLs фотографий
    $table->integer('fuel_level');   // 0-100%
    $table->integer('mileage_km');
    $table->text('notes')->nullable();
    $table->string('renter_signature_url')->nullable();
    $table->string('owner_signature_url')->nullable();
    $table->timestamp('signed_at')->nullable();
});

Подпись реализуется через canvas на фронте (signature_pad.js), изображение base64 → S3. После подписания обеими сторонами статус переходит в signed и документ становится юридически значимым.

GPS-трекинг и телематика

Для парков от 20+ автомобилей часто нужен live-трекинг. Интеграция с GPS-трекерами через MQTT:

// Обработчик MQTT-сообщений от трекеров
class VehicleTelematicsHandler
{
    public function handle(string $topic, string $payload): void
    {
        // topic: vehicles/{plate}/location
        preg_match('/vehicles\/(.+)\/location/', $topic, $matches);
        $plate = $matches[1];

        $data = json_decode($payload, true);

        DB::transaction(function () use ($plate, $data) {
            $vehicle = Vehicle::where('plate_number', $plate)->firstOrFail();

            $vehicle->update([
                'location'    => DB::raw(
                    "ST_MakePoint({$data['lng']}, {$data['lat']})"
                ),
                'mileage_km'  => $data['odometer'] ?? $vehicle->mileage_km,
                'last_seen_at' => now(),
            ]);

            // Геозонирование — проверка выхода за пределы разрешённой зоны
            if (isset($vehicle->activeRental)) {
                $this->checkGeofence($vehicle, $data);
            }
        });
    }
}

Страховой депозит и удержания

Депозит блокируется на карте при бронировании, списывается только при повреждениях:

// Создание hold (authorization hold) без списания
$paymentIntent = $stripe->paymentIntents->create([
    'amount'         => $booking->security_deposit_cents,
    'currency'       => 'eur',
    'capture_method' => 'manual',
    'confirm'        => false,
    'description'    => "Security deposit for booking #{$booking->id}",
]);

// Если повреждений нет — отменяем hold
$stripe->paymentIntents->cancel($paymentIntent->id);

// Если есть повреждения — захватываем нужную сумму
$stripe->paymentIntents->capture($paymentIntent->id, [
    'amount_to_capture' => $damageAmount,
]);

Сроки разработки

MVP с поиском авто, бронированием, верификацией водителя и базовым кабинетом владельца: 8–10 недель.

Добавление актов осмотра, GPS-интеграции, гибкого ценообразования, депозитной логики: ещё 4–5 недель.

Полный запуск с корпоративными аккаунтами, fleet management и аналитикой: 16–18 недель суммарно.