filled('search')) { $search = $request->input('search'); $query->where('name', 'like', "%{$search}%") ->orWhere('contact_person_email', 'like', "%{$search}%") ->orWhere('support_phones', 'like', "%{$search}%"); } if ($request->filled('country')) { $query->where('country', $request->input('country')); } if ($request->filled('connection_status')) { $query->where('connection_status', 'like', "%{$request->input('connection_status')}%"); } // $operators = $query->latest('id')->paginate(10)->withQueryString(); $operators = $query->orderBy('country', 'asc') ->orderBy('name', 'asc') ->paginate(10) ->withQueryString(); $totalActive = NetworkOperator::where('connection_status', 'Active')->count(); $totalSipLinks = NetworkOperator::where('connection_type', 'like', '%VPN%')->count(); $uniqueCountries = $uniqueCountriesCount = NetworkOperator::distinct('country')->count('country'); $totalOperators = NetworkOperator::count(); return view('network_operators.index', compact('operators', 'totalActive', 'uniqueCountries', 'totalOperators')); } public function store(Request $request) { $request->validate([ 'name' => 'required|string|max:200', 'country' => 'required|string', ]); NetworkOperator::create([ 'name' => $request->name, 'country' => $request->country, 'connection_status' => $request->connection_status ?? 'Online', 'contact_person' => $request->contact_person, 'contact_person_phone' => $request->contact_person_phone, 'contact_person_email' => $request->contact_person_email, 'technical_support_person' => $request->technical_support_person, 'support_skype' => $request->support_skype, 'mno_account_manager' => $request->mno_account_manager, 'services' => $request->services, 'support_emails' => $request->support_emails, 'finance_emails' => $request->finance_emails, 'buying_rate' => $request->buying_rate ?? 0, 'rate_type' => $request->rate_type, 'payment_terms' => $request->payment_terms, 'connection_type' => $request->connection_type, ]); return response()->json(['message' => 'MNO Partner created successfully!']); } public function update(Request $request, $id) { $operator = NetworkOperator::findOrFail($id); $request->validate([ 'name' => 'required|string|max:200', 'country' => 'required|string', ]); $operator->update([ 'name' => $request->name, 'country' => $request->country, 'connection_status' => $request->connection_status, 'contact_person' => $request->contact_person, 'contact_person_phone' => $request->contact_person_phone, 'contact_person_email' => $request->contact_person_email, 'technical_support_person' => $request->technical_support_person, 'support_skype' => $request->support_skype, 'mno_account_manager' => $request->mno_account_manager, 'services' => $request->services, 'support_emails' => $request->support_emails, 'finance_emails' => $request->finance_emails, 'buying_rate' => $request->buying_rate ?? 0, 'rate_type' => $request->rate_type, 'payment_terms' => $request->payment_terms, 'connection_type' => $request->connection_type, ]); return response()->json(['message' => 'MNO Partner updated successfully!']); } // Fetch single record JSON for editing modal public function getJson($id) { $operator = NetworkOperator::findOrFail($id); return response()->json($operator); } public function show($id) { $operator = NetworkOperator::findOrFail($id); return view('network_operators.show', compact('operator')); } public function storeConnection(Request $request, $operatorId) { $request->validate([ 'connection_mode' => 'required|string', 'identifier' => [ 'required', 'string', function ($attribute, $value, $fail) { // 1. Check if valid IP Address (IPv4 or IPv6) $isIp = filter_var($value, FILTER_VALIDATE_IP); // 2. Check if valid Domain Name (e.g., smpp.operator.com) $isDomain = preg_match('/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i', $value); // 3. Check if valid CIDR Subnet (e.g., 196.200.15.0/24) $isSubnet = preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}\/([0-9]|[1-2][0-9]|3[0-2])$/', $value); if (!$isIp && !$isDomain && !$isSubnet) { $fail('The identifier must be a valid IP address, CIDR subnet, or Domain Name.'); } }, ], 'port' => 'nullable|integer|min:1|max:65535', 'vpn_file' => 'nullable|file|mimes:pdf,doc,docx|max:5120', ]); $filePath = null; if ($request->hasFile('vpn_file')) { $filePath = $request->file('vpn_file')->store('vpn_forms', 'public'); } $connection = NetworkOperatorConnection::create([ 'network_operator_id' => $operatorId, 'connection_mode' => $request->connection_mode, 'identifier' => $request->identifier, 'port' => $request->port, 'status' => $request->status ?? 'Active', 'notes' => $request->notes, 'vpn_file_path' => $filePath, ]); return response()->json([ 'success' => true, 'message' => 'Connection detail added successfully!', 'connection' => $connection ]); } public function destroyConnection($id) { $connection = NetworkOperatorConnection::findOrFail($id); $connection->delete(); return redirect()->back()->with('success', 'Connection detail removed.'); } }