authorizeMaintenanceAccess('maintenance.equipment.view'); $business_id = $this->maintenanceUtil->getBusinessId(); if ($request->ajax()) { if (! Schema::hasTable('maintenance_service_contracts')) { return DataTables::of(collect())->make(true); } $query = ServiceContract::where('business_id', $business_id) ->with(['equipment:id,name,code', 'customer:id,name']) ->orderByDesc('created_at'); return DataTables::of($query) ->addColumn('equipment_name', fn ($row) => $row->equipment?->name ?? '—') ->addColumn('customer_name', fn ($row) => $row->customer?->name ?? '—') ->editColumn('start_date', fn ($row) => $this->maintenanceUtil->formatDate($row->start_date)) ->editColumn('end_date', fn ($row) => $this->maintenanceUtil->formatDate($row->end_date)) ->addColumn('action', function ($row) { $html = ''; if (auth()->user()->can('maintenance.equipment.delete')) { $html .= ' '; } return $html; }) ->rawColumns(['action']) ->make(true); } return view('maintenance::service_contracts.index'); } public function create() { $this->authorizeMaintenanceAccess('maintenance.equipment.create'); $business_id = $this->maintenanceUtil->getBusinessId(); return view('maintenance::service_contracts.create', [ 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), 'customers' => $this->maintenanceUtil->getCustomersDropdown($business_id), ]); } public function store(Request $request) { $this->authorizeMaintenanceAccess('maintenance.equipment.create'); $business_id = $this->maintenanceUtil->getBusinessId(); $data = $request->validate([ 'contract_code' => 'required|string|max:50', 'title' => 'required|string|max:255', 'contract_type' => 'required|string|in:warranty,sla,amc', 'equipment_id' => 'nullable|exists:maintenance_equipment,id', 'customer_id' => 'nullable|exists:contacts,id', 'start_date' => 'nullable|string', 'end_date' => 'nullable|string', 'response_hours' => 'nullable|integer|min:0', 'resolution_hours' => 'nullable|integer|min:0', 'coverage_amount' => 'nullable|numeric|min:0', 'terms' => 'nullable|string', ]); ServiceContract::create([ 'business_id' => $business_id, 'contract_code' => $data['contract_code'], 'title' => $data['title'], 'contract_type' => $data['contract_type'], 'equipment_id' => $data['equipment_id'] ?? null, 'customer_id' => $data['customer_id'] ?? null, 'start_date' => $this->maintenanceUtil->parseInputDate($data['start_date'] ?? null), 'end_date' => $this->maintenanceUtil->parseInputDate($data['end_date'] ?? null), 'response_hours' => $data['response_hours'] ?? null, 'resolution_hours' => $data['resolution_hours'] ?? null, 'coverage_amount' => $data['coverage_amount'] ?? null, 'terms' => $data['terms'] ?? null, 'created_by' => auth()->id(), ]); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'قرارداد ثبت شد.', action([self::class, 'index'])); } public function edit($id) { $this->authorizeMaintenanceAccess('maintenance.equipment.update'); $business_id = $this->maintenanceUtil->getBusinessId(); $contract = ServiceContract::where('business_id', $business_id)->findOrFail($id); return view('maintenance::service_contracts.edit', [ 'contract' => $contract, 'equipment' => $this->maintenanceUtil->getEquipmentDropdown($business_id), 'customers' => $this->maintenanceUtil->getCustomersDropdown($business_id), ]); } public function update(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.equipment.update'); $business_id = $this->maintenanceUtil->getBusinessId(); $contract = ServiceContract::where('business_id', $business_id)->findOrFail($id); $data = $request->validate([ 'contract_code' => 'sometimes|string|max:50', 'title' => 'sometimes|string|max:255', 'contract_type' => 'sometimes|string|in:warranty,sla,amc', 'equipment_id' => 'nullable|exists:maintenance_equipment,id', 'customer_id' => 'nullable|exists:contacts,id', 'start_date' => 'nullable|string', 'end_date' => 'nullable|string', 'response_hours' => 'nullable|integer|min:0', 'resolution_hours' => 'nullable|integer|min:0', 'coverage_amount' => 'nullable|numeric|min:0', 'status' => 'sometimes|string|in:active,expired,cancelled', 'terms' => 'nullable|string', ]); if (isset($data['start_date'])) { $data['start_date'] = $this->maintenanceUtil->parseInputDate($data['start_date']); } if (isset($data['end_date'])) { $data['end_date'] = $this->maintenanceUtil->parseInputDate($data['end_date']); } $contract->update($data); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'قرارداد به‌روزرسانی شد.', action([self::class, 'index'])); } public function destroy(Request $request, $id) { $this->authorizeMaintenanceAccess('maintenance.equipment.delete'); $business_id = $this->maintenanceUtil->getBusinessId(); ServiceContract::where('business_id', $business_id)->findOrFail($id)->delete(); return $this->maintenanceUtil->jsonOrRedirect($request, true, 'قرارداد حذف شد.', action([self::class, 'index'])); } }