SaaS-CRM для сети автосалонов на Laravel + Livewire.
Репозиторий: github.com/verusdev/WheelDeal
WheelDeal — мультитенантная CRM-система для сети автосалонов. Покрывает весь цикл работы салона: автопарк, клиентская база, сделки-воронка, счета и коммерческие предложения с PDF, сервис и запчасти, задачи, отчёты, bulk-действия, импорт/экспорт CSV, а также встроенная AI-функциональность.
Возможности:
- 📊 Dashboard со статистикой, конверсией и графиками (Chart.js)
- 🚗 Автопарк: карточки авто с фото, фильтры, статусы (в наличии / зарезервирован / продан)
- 👥 Клиенты: база с источниками лидов, тегами и историей
- 🔄 Сделки-воронка:
lead → call → test_drive → quote → negotiation → deal → finished → lost, Kanban-доска с drag-n-drop - 💰 Счета / коммерческие предложения с генерацией PDF (DomPDF), а также ДКП, ПТС, СТС, ОСАГО
- 🧰 Сервис: записи на обслуживание и ремонт, склад запчастей
- ✅ Задачи: доска, приоритеты, дедлайны
- 📈 Отчёты и аналитика по менеджерам и воронке
- 📧 Bulk-действия: массовая SMS-рассылка, массовое обновление цен
- 📥 Импорт/экспорт CSV (клиенты, авто, сделки)
- 🗓 Расписание тест-драйвов
- 🏢 Мультитенантность: одна БД с
company_idна каждой сущности, отдельные storage-диски и автоматические scopes - ✨ AI-анализ фото и генерация описаний (см. ниже)
Встроенный AI-слой работает с любым OpenAI-совместимым API — OpenAI, YandexGPT, GigaChat, OpenRouter и т.п.
Кнопка «AI-анализ фото» в форме автомобиля: vision-модель распознаёт по фотографиям:
- марку, модель, год выпуска, цвет;
- тип кузова, двигателя, коробки передач и привода;
- оценку состояния, описание видимых повреждений, комплектацию.
Распознанные характеристики автоматически заполняют пустые поля формы (уже введённые значения не перетираются).
Кнопка «AI-описание» в форме автомобиля и на странице карточки авто: генерирует продающее описание на русском языке на основе данных автомобиля + результатов анализа фото.
Результаты AI сохраняются в поле cars.meta (JSON): meta.ai_analysis — структурированный результат анализа, meta.ai_description — флаг сгенерированного описания.
Добавьте в .env:
AI_ENABLED=true
AI_BASE_URL=https://api.openai.com/v1 # или совместимый endpoint (YandexGPT, GigaChat, OpenRouter)
AI_API_KEY=ваш_ключ
AI_VISION_MODEL=gpt-4o-mini
AI_TEXT_MODEL=gpt-4o-mini
AI_TIMEOUT=120
AI_MAX_PHOTOS=3
AI_JSON_RESPONSE_FORMAT=trueПосле этого в форме авто появится кнопка «AI-анализ фото», в описании — «AI-описание». Пока AI_ENABLED=false, кнопки показывают понятное сообщение об ошибке «AI не настроен».
Требования: PHP 8.3+, Composer, Node.js + npm.
# 1. Установка зависимостей
composer install
# 2. Создать .env из шаблона и настроить БД (SQLite по умолчанию)
copy .env.example .env
# для SQLite также создайте пустой файл базы:
# type nul > database\database.sqlite
# 3. Сгенерировать ключ приложения
php artisan key:generate
# 4. Миграции + демо-данные (сидер)
php artisan migrate --seed
# 5. Фронтенд
npm install
npm run build # для продакшена
# npm run dev # для разработки
# 6. Запуск
php artisan serve
php artisan queue:listenОчередь (
QUEUE_CONNECTION=databaseв.env.example) обязательна для фоновых задач — держите её запущенной.
| Команда | Что делает |
|---|---|
composer setup |
Полная первичная установка: composer install → создание .env → key:generate → migrate --force → npm install → npm run build |
composer dev |
Запускает одной командой php artisan serve, очередь, логи (pail) и Vite через concurrently |
composer test |
Прогон тестов (config:clear + php artisan test) |
Первый вход: сидер создаёт учётную запись администратора admin@wheeldeal.ru. Точные учётные данные и логику обработки пароля смотрите в database/seeders/DatabaseSeeder.php.
php artisan testСейчас 25 зелёных тестов. Новые тесты AI-слоя — tests\Feature\CarAiServiceTest.php: анализ фото, генерация описания, парсинг JSON, обработка ошибок; HTTP-запросы мокаются через Http::fake.
app/
├── Livewire/ # Livewire-компоненты (страницы и формы)
│ ├── Dashboard.php # дашборд
│ ├── CarList / CarForm / CarDetail
│ ├── ClientList / ClientForm / ClientDetail
│ ├── KanbanBoard / DealForm / DealDetail
│ ├── TaskBoard
│ ├── InvoiceList / InvoiceForm
│ ├── ServiceList / ServiceForm
│ ├── PartList / PartForm
│ ├── CompanySettings / UserManagement
│ ├── SellCar / Reports / TestDriveCalendar
│ ├── BulkSms / BulkPriceUpdate / CsvImportExport
│ └── Auth/Login, Auth/Register
├── Services/
│ └── Ai/ # AI-слой
│ ├── AiClient.php # клиент OpenAI-совместимого chat/completions API
│ ├── CarAiService.php # анализ фото + генерация описания
│ └── AiException.php
├── Models/ # Eloquent-модели (с глобальным scope по company_id)
└── Http/
├── Controllers/
└── Middleware/ # проверка ролей, активности компании
config/
├── ai.php # конфигурация AI (читает AI_* из .env)
└── filesystems.php # отдельные storage-диски для файлов компаний
database/
└── migrations/ # миграции (company_id на всех сущностях)
resources/views/
└── livewire/ # blade-шаблоны компонентов
routes/
└── web.php # маршруты
Детальное описание архитектуры, доменных моделей и компонентов — в ARCHITECTURE.md.
| Роль | Описание |
|---|---|
admin |
Владелец / администратор компании. Полный доступ. |
manager |
Менеджер по продажам. Авто, клиенты, сделки, задачи. |
consultant |
Консультант. Только клиенты и сделки (создание/чтение). |
viewer |
Только чтение. Дашборд и отчёты. |
Проект распространяется под лицензией MIT (см. composer.json).
- ARCHITECTURE.md — архитектура, стек, доменные модели, Livewire-компоненты
- FEATURES.md — реализованный функционал и план развития
- AI_IDEAS.md — идеи и статус AI-функциональности
- DEVELOPER_GUIDE.md — подробное руководство для начинающих разработчиков