user()->can('qms.calibration.view')) { abort(403); } $business_id = $request->session()->get('user.business_id'); $assets = CalibrationAsset::forBusiness($business_id)->orderBy('next_due_at')->paginate(20); return view('qualitymanagement::calibration.index', compact('assets')); } public function storeAsset(Request $request) { if (! auth()->user()->can('qms.calibration.create')) { abort(403); } $business_id = $request->session()->get('user.business_id'); $validated = $request->validate([ 'asset_tag' => 'required|string|max:50', 'name' => 'required|string|max:255', 'calibration_interval_days' => 'required|integer|min:1', 'maintenance_equipment_id' => 'nullable|integer', ]); CalibrationAsset::create(array_merge($validated, [ 'business_id' => $business_id, 'next_due_at' => now()->addDays((int) $validated['calibration_interval_days'])->toDateString(), ])); return redirect()->back()->with('status', ['success' => 1, 'msg' => __('qualitymanagement::lang.calibration_asset_created')]); } public function recordCalibration($id, Request $request) { if (! auth()->user()->can('qms.calibration.update')) { abort(403); } $business_id = $request->session()->get('user.business_id'); $asset = CalibrationAsset::forBusiness($business_id)->findOrFail($id); $validated = $request->validate([ 'result' => 'required|in:pass,fail,adjusted', 'certificate_no' => 'nullable|string|max:100', 'performed_by' => 'nullable|string|max:255', 'notes' => 'nullable|string', ]); $nextDue = now()->addDays($asset->calibration_interval_days)->toDateString(); CalibrationRecord::create([ 'business_id' => $business_id, 'calibration_asset_id' => $asset->id, 'calibrated_at' => now()->toDateString(), 'next_due_at' => $nextDue, ...$validated, ]); $asset->update([ 'last_calibrated_at' => now()->toDateString(), 'next_due_at' => $nextDue, 'status' => $validated['result'] === 'fail' ? 'overdue' : 'active', ]); return redirect()->back()->with('status', ['success' => 1, 'msg' => __('qualitymanagement::lang.calibration_recorded')]); } }