175 lines
6.6 KiB
PHP
175 lines
6.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\NetworkOperator;
|
|
use App\Models\NetworkOperatorConnection;
|
|
|
|
class NetworkOperatorsController extends Controller
|
|
{
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$query = NetworkOperator::query();
|
|
|
|
if ($request->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.');
|
|
}
|
|
|
|
|
|
} |