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


<?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::factory()->create(['name' => 'user']);
        $adminRole = Role::factory()->create(['name' => 'admin']);

        // ========== 2. СОЗДАНИЕ УСЛУГ через фабрику ==========
        Service::factory(10)->create();

        // ========== 3. СОЗДАНИЕ ЗАПЧАСТЕЙ через фабрику ==========
        Part::factory(15)->create();

        // ========== 4. СОЗДАНИЕ ПОЛЬЗОВАТЕЛЕЙ через фабрику ==========
        // Создаём 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. СОЗДАНИЕ ЗАКАЗ-НАРЯДОВ через фабрику ==========
        $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();

        // Создаём 50 заказ-нарядов
        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;
                
                // Назначаем случайного администратора (50% вероятность)
                $repairOrder->admin_id = (rand(0, 1) == 1) ? $admins->random()->id : null;
                
                $repairOrder->save();

                // Добавляем от 1 до 4 услуг в заказ
                $selectedServices = $services->random(rand(1, 4));
                $laborCost = 0;
                
                foreach ($selectedServices as $service) {
                    $quantity = rand(1, 2);
                    $priceAtTime = $service->price;
                    $repairOrder->services()->attach($service->id, [
                        'quantity' => $quantity,
                        'price_at_time' => $priceAtTime,
                    ]);
                    $laborCost += $quantity * $priceAtTime;
                }

                // Добавляем от 0 до 5 запчастей в заказ
                $selectedParts = $parts->random(rand(0, 5));
                $partsCost = 0;
                
                foreach ($selectedParts as $part) {
                    $quantity = rand(1, 3);
                    $priceAtTime = $part->price;
                    $repairOrder->parts()->attach($part->id, [
                        'quantity' => $quantity,
                        'price_at_time' => $priceAtTime,
                    ]);
                    $partsCost += $quantity * $priceAtTime;
                }

                // Обновляем итоговые суммы
                $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());
    }
}