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


<?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)];
    }
}