Загрузка данных
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Role;
use App\Models\User;
use App\Models\Car;
use App\Models\Service;
use App\Models\Part;
use App\Models\RepairOrder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
// ========== 1. РОЛИ (сначала создаём вручную, без фабрики) ==========
$userRole = Role::firstOrCreate(['name' => 'user']);
$adminRole = Role::firstOrCreate(['name' => 'admin']);
// ========== 2. УСЛУГИ ==========
if (Service::count() === 0) {
Service::factory(10)->create();
}
// ========== 3. ЗАПЧАСТИ ==========
if (Part::count() === 0) {
Part::factory(15)->create();
}
// ========== 4. ПОЛЬЗОВАТЕЛИ ==========
if (User::count() === 0) {
// Создаём 20 обычных пользователей с автомобилями
User::factory(20)
->has(Car::factory(rand(1, 3)), 'cars')
->create(['role_id' => $userRole->id]);
// Создаём 2 администраторов
User::factory(2)->create(['role_id' => $adminRole->id]);
}
// ========== 5. ЗАКАЗ-НАРЯДЫ ==========
if (RepairOrder::count() === 0) {
$users = User::where('role_id', $userRole->id)->get();
$services = Service::all();
$parts = Part::all();
$admins = User::where('role_id', $adminRole->id)->get();
for ($i = 1; $i <= 50; $i++) {
$user = $users->random();
$userCars = Car::where('user_id', $user->id)->get();
if ($userCars->isEmpty()) continue;
$car = $userCars->random();
$status = ['pending', 'in_progress', 'completed', 'cancelled'][array_rand(['pending', 'in_progress', 'completed', 'cancelled'])];
$orderDate = date('Y-m-d', strtotime('-' . rand(1, 180) . ' days'));
$completionDate = ($status === 'completed') ? date('Y-m-d', strtotime($orderDate . ' +' . rand(1, 30) . ' days')) : null;
$repairOrder = RepairOrder::create([
'order_number' => 'ORD-' . strtoupper(uniqid()),
'user_id' => $user->id,
'car_id' => $car->id,
'admin_id' => (rand(0, 1) == 1) ? $admins->random()->id : null,
'status' => $status,
'order_date' => $orderDate,
'completion_date' => $completionDate,
'problem_description' => $this->getRandomProblem(),
'admin_notes' => (rand(0, 1) == 1) ? $this->getRandomNote() : null,
'total_labor_cost' => 0,
'total_parts_cost' => 0,
'total_amount' => 0,
]);
// Добавляем услуги
$selectedServices = $services->random(rand(1, 4));
$laborCost = 0;
foreach ($selectedServices as $service) {
$quantity = rand(1, 2);
$repairOrder->services()->attach($service->id, [
'quantity' => $quantity,
'price_at_time' => $service->price,
]);
$laborCost += $quantity * $service->price;
}
// Добавляем запчасти
$selectedParts = $parts->random(rand(0, 5));
$partsCost = 0;
foreach ($selectedParts as $part) {
$quantity = rand(1, 3);
$repairOrder->parts()->attach($part->id, [
'quantity' => $quantity,
'price_at_time' => $part->price,
]);
$partsCost += $quantity * $part->price;
}
// Обновляем суммы
$repairOrder->update([
'total_labor_cost' => $laborCost,
'total_parts_cost' => $partsCost,
'total_amount' => $laborCost + $partsCost,
]);
}
}
$this->command->info('✅ База данных успешно заполнена!');
$this->command->info('Ролей: ' . Role::count());
$this->command->info('Услуг: ' . Service::count());
$this->command->info('Запчастей: ' . Part::count());
$this->command->info('Пользователей: ' . User::count());
$this->command->info('Автомобилей: ' . Car::count());
$this->command->info('Заказ-нарядов: ' . RepairOrder::count());
}
private function getRandomProblem(): string
{
$problems = [
'Стук в подвеске при проезде неровностей',
'Двигатель троит и плохо заводится',
'Скрипят тормоза при торможении',
'Машина уходит в сторону при движении',
'Не работает кондиционер',
'Течь масла под двигателем',
'Загорелась Check Engine',
'Плохой холостой ход',
];
return $problems[array_rand($problems)];
}
private function getRandomNote(): string
{
$notes = [
'Требуется дополнительная диагностика',
'Запчасти заказаны, ожидаем поставку',
'Клиент предупреждён о сроках',
];
return $notes[array_rand($notes)];
}
}