authorizeMaintenanceAccess('maintenance.spare_parts.view'); $business_id = $this->maintenanceUtil->getBusinessId(); if ($request->ajax()) { $query = PartReplacement::where('business_id', $business_id) ->with(['equipment:id,name,code', 'equipmentPart:id,part_name', 'sparePart:id,part_number,name']) ->orderByDesc('replaced_at'); if ($equipment_id = $request->get('equipment_id')) { $query->where('equipment_id', $equipment_id); } return DataTables::of($query) ->addColumn('equipment_name', fn ($row) => $row->equipment?->name ?? '—') ->addColumn('part_name', fn ($row) => $row->equipmentPart?->part_name ?? $row->sparePart?->name ?? '—') ->editColumn('replaced_at', fn ($row) => $this->maintenanceUtil->formatDate($row->replaced_at)) ->addColumn('action', function ($row) { $html = ''; if (auth()->user()->can('maintenance.spare_parts.update')) { $html .= ' '; } if (auth()->user()->can('maintenance.spare_parts.delete')) { $html .= ''; } return $html ?: '—'; }) ->rawColumns(['action']) ->make(true); } return view('maintenance::part_replacements.index', [ 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), ]); } public function create() { $this->authorizeMaintenanceAccess('maintenance.spare_parts.create'); $business_id = $this->maintenanceUtil->getBusinessId(); return view('maintenance::part_replacements.create', [ 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), 'spare_parts' => $this->maintenanceUtil->getSparePartsDropdown($business_id), ]); } public function store(Request $request) { $this->authorizeMaintenanceAccess('maintenance.spare_parts.create'); $business_id = $this->maintenanceUtil->getBusinessId(); $data = $request->validate([ 'equipment_id' => ['required', 'exists:maintenance_equipment,id'], 'equipment_part_id' => ['nullable', 'exists:maintenance_equipment_parts,id'], 'spare_part_id' => ['nullable', 'exists:maintenance_spare_parts,id'], 'replaced_at' => ['required', 'string'], 'quantity' => ['nullable', 'numeric', 'min:0'], 'action' => ['sometimes', 'string', 'in:replaced,repaired'], 'health_before' => ['nullable', 'numeric', 'min:0', 'max:100'], 'health_after' => ['nullable', 'numeric', 'min:0', 'max:100'], 'replacement_quality_grade' => ['nullable', 'string', 'max:50'], 'notes' => ['nullable', 'string'], ]); $equipment = Equipment::where('business_id', $business_id)->findOrFail($data['equipment_id']); $data['replaced_at'] = $this->maintenanceUtil->parseInputDate($data['replaced_at']); PartReplacement::create(array_merge($data, [ 'business_id' => $business_id, 'performed_by' => auth()->id(), 'quantity' => $data['quantity'] ?? 1, 'action' => $data['action'] ?? 'replaced', ])); if (isset($data['health_after'])) { $equipment->update(['health_percentage' => $data['health_after']]); } return $this->maintenanceUtil->jsonOrRedirect( $request, true, 'تعویض قطعه ثبت شد.', action([self::class, 'index']) ); } public function edit($id) { $this->authorizeMaintenanceAccess('maintenance.spare_parts.update'); $business_id = $this->maintenanceUtil->getBusinessId(); $replacement = PartReplacement::where('business_id', $business_id)->findOrFail($id); return view('maintenance::part_replacements.edit', [ 'replacement' => $replacement, 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), 'spare_parts' => $this->maintenanceUtil->getSparePartsDropdown($business_id), 'equipment_parts' => $this->maintenanceUtil->getEquipmentPartsDropdown($replacement->equipment_id), ]); } public function update(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.spare_parts.update'); $business_id = $this->maintenanceUtil->getBusinessId(); $replacement = PartReplacement::where('business_id', $business_id)->findOrFail($id); $data = $request->validate([ 'equipment_id' => ['sometimes', 'exists:maintenance_equipment,id'], 'equipment_part_id' => ['nullable', 'exists:maintenance_equipment_parts,id'], 'spare_part_id' => ['nullable', 'exists:maintenance_spare_parts,id'], 'replaced_at' => ['sometimes', 'string'], 'quantity' => ['nullable', 'numeric', 'min:0'], 'action' => ['sometimes', 'string', 'in:replaced,repaired'], 'health_before' => ['nullable', 'numeric', 'min:0', 'max:100'], 'health_after' => ['nullable', 'numeric', 'min:0', 'max:100'], 'replacement_quality_grade' => ['nullable', 'string', 'max:50'], 'notes' => ['nullable', 'string'], ]); if (isset($data['replaced_at'])) { $data['replaced_at'] = $this->maintenanceUtil->parseInputDate($data['replaced_at']); } $replacement->update($data); if (isset($data['health_after']) && $replacement->equipment) { $replacement->equipment->update(['health_percentage' => $data['health_after']]); } return $this->maintenanceUtil->jsonOrRedirect( $request, true, 'تعویض قطعه به‌روزرسانی شد.', action([self::class, 'index']) ); } public function destroy(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.spare_parts.delete'); $business_id = $this->maintenanceUtil->getBusinessId(); PartReplacement::where('business_id', $business_id)->findOrFail($id)->delete(); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'رکورد حذف شد.', action([self::class, 'index'])); } public function equipmentParts(Request $request, $equipment_id) { $this->authorizeMaintenanceAccess('maintenance.spare_parts.view'); $business_id = $this->maintenanceUtil->getBusinessId(); Equipment::where('business_id', $business_id)->findOrFail($equipment_id); return response()->json([ 'parts' => $this->maintenanceUtil->getEquipmentPartsDropdown($equipment_id), ]); } }