authorizeMaintenanceAccess('maintenance.spare_parts.view'); $business_id = $this->maintenanceUtil->getBusinessId(); if ($request->ajax()) { $query = SparePart::where('business_id', $business_id) ->with(['supplier:id,name']) ->orderBy('name'); if ($request->boolean('low_stock')) { $query->whereColumn('quantity', '<=', 'min_stock'); } return DataTables::of($query) ->addColumn('supplier_name', fn ($row) => $row->supplier?->name ?? '—') ->addColumn('stock_status', function ($row) { if ($row->quantity <= $row->min_stock) { return 'کمبود موجودی'; } return 'کافی'; }) ->addColumn('action', function ($row) { $html = '
'; if (auth()->user()->can('maintenance.spare_parts.update')) { $html .= ''; } if (auth()->user()->can('maintenance.spare_parts.delete')) { $html .= ' '; } $html .= '
'; return $html; }) ->editColumn('purchase_price', fn ($row) => $this->maintenanceUtil->formatMoney($row->purchase_price)) ->rawColumns(['stock_status', 'action']) ->make(true); } return view('maintenance::spare_parts.index'); } public function create() { $this->authorizeMaintenanceAccess('maintenance.spare_parts.create'); $business_id = $this->maintenanceUtil->getBusinessId(); return view('maintenance::spare_parts.create', [ 'customers' => $this->maintenanceUtil->getCustomersDropdown($business_id), 'products' => $this->maintenanceUtil->getProductsDropdown($business_id), 'locations' => $this->maintenanceUtil->getLocationsDropdown($business_id), ]); } public function store(Request $request) { $this->authorizeMaintenanceAccess('maintenance.spare_parts.create'); $business_id = $this->maintenanceUtil->getBusinessId(); $data = $request->validate([ 'part_number' => 'required|string|max:100', 'name' => 'required|string|max:255', 'warehouse_id' => 'nullable|integer', 'supplier_id' => 'nullable|exists:contacts,id', 'product_id' => 'nullable|exists:products,id', 'variation_id' => 'nullable|exists:variations,id', 'location_id' => 'nullable|integer', 'quantity' => 'sometimes|numeric|min:0', 'min_stock' => 'sometimes|numeric|min:0', 'max_stock' => 'nullable|numeric|min:0', 'purchase_price' => 'sometimes|integer|min:0', 'unit' => 'nullable|string|max:50', 'notes' => 'nullable|string', ]); $part = SparePart::create(array_merge($data, [ 'business_id' => $business_id, ])); $this->inventoryService->syncSparePartQuantityFromPos($part, $business_id); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'قطعه یدکی ایجاد شد.'); } public function edit($id) { $this->authorizeMaintenanceAccess('maintenance.spare_parts.update'); $business_id = $this->maintenanceUtil->getBusinessId(); $spare_part = SparePart::where('business_id', $business_id)->findOrFail($id); return view('maintenance::spare_parts.edit', [ 'spare_part' => $spare_part, 'customers' => $this->maintenanceUtil->getCustomersDropdown($business_id), 'products' => $this->maintenanceUtil->getProductsDropdown($business_id), 'locations' => $this->maintenanceUtil->getLocationsDropdown($business_id), ]); } public function update(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.spare_parts.update'); $business_id = $this->maintenanceUtil->getBusinessId(); $spare_part = SparePart::where('business_id', $business_id)->findOrFail($id); $data = $request->validate([ 'part_number' => 'required|string|max:100', 'name' => 'required|string|max:255', 'warehouse_id' => 'nullable|integer', 'supplier_id' => 'nullable|exists:contacts,id', 'product_id' => 'nullable|exists:products,id', 'variation_id' => 'nullable|exists:variations,id', 'location_id' => 'nullable|integer', 'quantity' => 'sometimes|numeric|min:0', 'min_stock' => 'sometimes|numeric|min:0', 'max_stock' => 'nullable|numeric|min:0', 'purchase_price' => 'sometimes|integer|min:0', 'unit' => 'nullable|string|max:50', 'notes' => 'nullable|string', ]); $spare_part->update($data); $this->inventoryService->syncSparePartQuantityFromPos($spare_part->fresh(), $business_id); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'قطعه یدکی به‌روزرسانی شد.'); } public function destroy(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.spare_parts.delete'); $business_id = $this->maintenanceUtil->getBusinessId(); $spare_part = SparePart::where('business_id', $business_id)->findOrFail($id); $spare_part->delete(); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'قطعه یدکی حذف شد.'); } }