Загрузка данных


<?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. Роли
        if (Role::count() === 0) {
            Role::factory()->create(['name' => 'user']);
            Role::factory()->create(['name' => 'admin']);
        }

        $userRole = Role::where('name', 'user')->first();
        $adminRole = Role::where('name', 'admin')->first();

        // 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();
            $cars = Car::all();
            $services = Service::all();
            $parts = Part::all();
            $admins = User::where('role_id', $adminRole->id)->get();

            RepairOrder::factory(50)
                ->make()
                ->each(function ($repairOrder) use ($users, $cars, $admins, $services, $parts) {
                    
                    $repairOrder->user_id = $users->random()->id;
                    
                    $userCars = Car::where('user_id', $repairOrder->user_id)->get();
                    $repairOrder->car_id = $userCars->isNotEmpty() ? $userCars->random()->id : $cars->random()->id;
                    $repairOrder->admin_id = (rand(0, 1) == 1) ? $admins->random()->id : null;
                    $repairOrder->save();

                    // Добавляем услуги
                    $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('✅ База данных заполнена!');
    }
}