Загрузка данных
<?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', 'Заказ-наряд удалён!');
}
}