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


<?php

namespace App\Http\Controllers;

use App\Models\RepairOrder;
use App\Models\User;
use App\Models\Car;
use App\Models\Service;
use App\Models\Part;
use Illuminate\Http\Request;

class OrderController extends Controller
{
    // Список всех заказ-нарядов
    public function index()
    {
        // Загружаем связанные данные (пользователь = клиент, администратор, автомобиль)
        $orders = RepairOrder::with(['user', 'admin', 'car'])->get();
        
        return view('orders.index', compact('orders'));
    }

    // Форма создания заказ-наряда
    public function create()
    {
        // Клиенты - это пользователи с ролью 'user' (role_id = 1)
        $clients = User::where('role_id', 1)->get();
        
        // Администраторы - пользователи с ролью 'admin' (role_id = 2)
        $admins = User::where('role_id', 2)->get();
        
        $cars = Car::all();
        $services = Service::all();
        $parts = Part::all();
        
        return view('orders.create', compact('clients', 'admins', 'cars', 'services', 'parts'));
    }

    // Сохранение нового заказ-наряда
    public function store(Request $request)
    {
        $validated = $request->validate([
            'user_id' => 'required|exists:users,id',
            'car_id' => 'required|exists:cars,id',
            'admin_id' => 'nullable|exists:users,id',
            'status' => 'required|in:pending,in_progress,completed,cancelled',
            'order_date' => 'required|date',
            'completion_date' => 'nullable|date',
            'problem_description' => 'nullable|string',
            'admin_notes' => 'nullable|string',
            'services' => 'nullable|array',
            'parts' => 'nullable|array',
        ]);

        // Генерируем уникальный номер заказа
        $orderNumber = 'ORD-' . strtoupper(uniqid());

        $order = RepairOrder::create([
            'order_number' => $orderNumber,
            'user_id' => $validated['user_id'],
            'car_id' => $validated['car_id'],
            'admin_id' => $validated['admin_id'] ?? null,
            'status' => $validated['status'],
            'order_date' => $validated['order_date'],
            'completion_date' => $validated['completion_date'] ?? null,
            'problem_description' => $validated['problem_description'] ?? null,
            'admin_notes' => $validated['admin_notes'] ?? null,
            'total_labor_cost' => 0,
            'total_parts_cost' => 0,
            'total_amount' => 0,
        ]);

        // Добавляем услуги
        $laborCost = 0;
        if (!empty($validated['services'])) {
            foreach ($validated['services'] as $serviceId => $quantity) {
                if ($quantity > 0) {
                    $service = Service::find($serviceId);
                    $priceAtTime = $service->price;
                    
                    $order->services()->attach($serviceId, [
                        'quantity' => $quantity,
                        'price_at_time' => $priceAtTime,
                    ]);
                    
                    $laborCost += $quantity * $priceAtTime;
                }
            }
        }

        // Добавляем запчасти
        $partsCost = 0;
        if (!empty($validated['parts'])) {
            foreach ($validated['parts'] as $partId => $quantity) {
                if ($quantity > 0) {
                    $part = Part::find($partId);
                    $priceAtTime = $part->price;
                    
                    $order->parts()->attach($partId, [
                        'quantity' => $quantity,
                        'price_at_time' => $priceAtTime,
                    ]);
                    
                    $partsCost += $quantity * $priceAtTime;
                }
            }
        }

        // Обновляем суммы
        $order->update([
            'total_labor_cost' => $laborCost,
            'total_parts_cost' => $partsCost,
            'total_amount' => $laborCost + $partsCost,
        ]);

        return redirect()->route('orders.index')->with('success', 'Заказ-наряд успешно создан!');
    }

    // Просмотр конкретного заказ-наряда
    public function show($id)
    {
        $order = RepairOrder::with(['user', 'admin', 'car', 'services', 'parts'])->findOrFail($id);
        
        return view('orders.show', compact('order'));
    }

    // Форма редактирования заказ-наряда
    public function edit($id)
    {
        $order = RepairOrder::with(['services', 'parts'])->findOrFail($id);
        
        // Клиенты - пользователи с ролью 'user'
        $clients = User::where('role_id', 1)->get();
        
        // Администраторы
        $admins = User::where('role_id', 2)->get();
        
        $cars = Car::all();
        $services = Service::all();
        $parts = Part::all();
        
        return view('orders.edit', compact('order', 'clients', 'admins', 'cars', 'services', 'parts'));
    }

    // Обновление заказ-наряда
    public function update(Request $request, $id)
    {
        $order = RepairOrder::findOrFail($id);

        $validated = $request->validate([
            'user_id' => 'required|exists:users,id',
            'car_id' => 'required|exists:cars,id',
            'admin_id' => 'nullable|exists:users,id',
            'status' => 'required|in:pending,in_progress,completed,cancelled',
            'order_date' => 'required|date',
            'completion_date' => 'nullable|date',
            'problem_description' => 'nullable|string',
            'admin_notes' => 'nullable|string',
        ]);

        $order->update($validated);

        return redirect()->route('orders.index')->with('success', 'Заказ-наряд обновлён!');
    }

    // Удаление заказ-наряда
    public function destroy($id)
    {
        $order = RepairOrder::findOrFail($id);
        
        // Удаляем связанные услуги и запчасти
        $order->services()->detach();
        $order->parts()->detach();
        
        $order->delete();

        return redirect()->route('orders.index')->with('success', 'Заказ-наряд удалён!');
    }
}