File: /var/www/html/orbidirectory.com/app/Http/Controllers/Admin/UserController.php
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\City;
use App\Models\CitySelection;
use App\Models\Languages;
use App\Models\State;
use App\Models\Transporter;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Yajra\DataTables\Facades\DataTables;
use Illuminate\Support\Facades\Log;
use Symfony\Component\Mailer\Transport;
class UserController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
if ($request->ajax()) {
$search_keyword = $request->search_keyword ?? '';
// $search_keyword = $request->search['value'] ?? '';
$status = $request->status_filter ?? 'all';
$start_date = '';
$end_date = '';
$sort_column_key = '';
$sort_column_dir = 'desc';
if ($request->has('order') && $request->order[0]['column'] != 0) {
$sort_column_number = $request->order[0]['column'];
$sort_column_dir = $request->order[0]['dir'];
$sort_column_key = $request->columns[$sort_column_number]['data'];
}
$query = User::where('type', '=', 2);
if (!empty($search_keyword)) {
$query = $query->where(function ($q) use ($search_keyword) {
$q->whereRaw("CONCAT(name, ' ', last_name) LIKE ?", ['%' . $search_keyword . '%'])
->orWhere('name', 'LIKE', '%' . $search_keyword . '%')
->orWhere('last_name', 'LIKE', '%' . $search_keyword . '%')
->orWhere('email', 'LIKE', '%' . $search_keyword . '%')
->orWhereHas('transporters', function ($tq) use ($search_keyword) {
$tq->whereExists(function ($subQuery) use ($search_keyword) {
$subQuery->select(DB::raw(1))
->from('city_selections as c')
->whereRaw('FIND_IN_SET(c.id, transporters.service_city)')
->where('c.name', 'LIKE', '%' . $search_keyword . '%');
});
});
});
}
if ($status != 'all' && $status !== '') {
$query->whereHas('transporters', function ($q) use ($status) {
$q->where('status', $status);
});
}
if ($request->filled('date_range_filter')) {
$date_range = explode(' - ', $request->date_range_filter);
if (count($date_range) === 2) {
$start_date = trim($date_range[0]);
$end_date = trim($date_range[1]);
$query->whereDate('created_at', '>=', $start_date)
->whereDate('created_at', '<=', $end_date);
}
}
if (!empty($sort_column_key)) {
$query = $query->orderBy($sort_column_key, $sort_column_dir);
} else {
$query = $query->latest();
}
if ($start_date != '' && $end_date != '') {
$query = $query->whereDate('created_at', '>=', $start_date)->whereDate('created_at', '<=', $end_date);
}
$data = $query;
return DataTables::of($data)
->addColumn('name', function ($row) {
return $row->name . ' ' . $row->last_name;
})
->addColumn('email', function ($row) {
return $row->email;
})
->editColumn('status', function ($row) {
$transporter = $row->transporters->first();
if ($transporter) {
$transporterStatus = $transporter->status;
if ($transporterStatus == Transporter::STATUS_ACTIVE) {
$status = 'Active';
$badgeClass = 'badge bg-success';
} elseif ($transporterStatus == Transporter::STATUS_INACTIVE) {
$status = 'Inactive';
$badgeClass = 'badge bg-warning';
} elseif ($transporterStatus == Transporter::STATUS_BANNED) {
$status = 'Banned';
$badgeClass = 'badge bg-danger';
}
return "<span class='status-label {$badgeClass}'>{$status}</span>";
}
return "<span class='badge bg-secondary'>No Transporter</span>";
})
->editColumn('verification', function ($row) {
$transporter = $row->transporters->first();
if ($transporter) {
$transporterStatus = $transporter->is_verified;
if ($transporterStatus == Transporter::VERIFIED_YES) {
$verification = 'Verified';
$badgeClass = 'badge bg-primary';
} elseif ($transporterStatus == Transporter::VERIFIED_NO) {
$verification = 'Unverified';
$badgeClass = 'badge bg-secondary';
}
return "<span class='status-label {$badgeClass}'>{$verification}</span>";
}
return "<span class='badge bg-danger'>N/A</span>";
})
->editColumn('city', function ($row) {
$transporter = $row->transporters->first();
if ($transporter && $transporter->cities && $transporter->cities->count() > 0) {
$cityNames = $transporter->cities->pluck('name');
$totalCities = $cityNames->count();
$firstTwo = $cityNames->take(2)->join(', ');
if ($totalCities > 2) {
return $firstTwo . ' <a href="' . url('/admin/users/' . $row->id) . '" class="badge bg-dark" style="text-decoration: none; color: white;">Show More</a>';
}
return $firstTwo; // Only 1 or 2 cities
}
return '-';
})
->editColumn('created_at', function ($row) {
return $row->created_at
? $row->created_at->timezone('Asia/Kolkata')->format('d-m-Y h:i A')
: '';
})
->addColumn('action', function ($row) {
if ($row->is_admin !== 1) {
return view('admin.users.partially.delete', compact('row'));
}
})
->rawColumns(['action', 'status','city','created_at','name','email','verification'])
->make(true);
}
return view('admin.users.index');
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$cities = CitySelection::get();
return view('admin.users.create',compact('cities'));
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
// dd($request->all());
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'last_name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email,NULL,id,phone_number,' . $request->input('phone_number'),
'phone_number' => 'required|regex:/^[0-9]{10}$/',
'business_name' => 'required|string|max:255',
'whatsapp_number' => 'required|regex:/^[0-9]{10}$/',
'address' => 'required|string|max:255',
'service_type' => 'required|string|max:255',
'cities' => 'required',
'cities.*' => 'required|string|max:255',
'service_area' => 'required|string|max:255',
'languages' => 'required|array',
'transporter_image' => 'required|image|mimes:jpeg,png,jpg|max:2048',
// 'languages.*.language' => 'required|string|max:255',
// 'languages.*.proficient' => 'required|integer|min:0|max:100',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
DB::beginTransaction();
try {
$user = new User();
$user->name = $request->name;
$user->last_name = $request->last_name;
$user->email = $request->email;
$user->phone_number = $request->phone_number;
$user->status = $request->has('is_active') ? 1 : 0;
$user->type = 2;
$user->save();
$transporter = new Transporter();
$transporter->user_id = $user->id;
$transporter->business_name = $request->business_name;
$transporter->whatsapp_number = $request->whatsapp_number;
$transporter->is_verified = $request->has('is_verified') ? 1 : 0;
$transporter->service_type = $request->service_type;
$transporter->service_city = implode(',', $request->cities);
$transporter->service_area = $request->service_area;
$transporter->status = $request->status;
$transporter->inactive_reason = $request->inactive_reason;
$transporter->address = $request->address;
$transporter->save();
if ($request->hasFile('transporter_image')) {
$transporter->addMediaFromRequest('transporter_image')->toMediaCollection('transporter_image');
}
$allLanguages = [];
foreach ($request->languages as $languageJson) {
$decoded = json_decode($languageJson, true);
if (!is_array($decoded)) {
return back()->with('error', 'Invalid language data format.');
}
foreach ($decoded as $languageData) {
if (!empty($languageData['value'])) {
$allLanguages[] = $languageData['value'];
}
}
}
foreach ($allLanguages as $languageData) {
$language = new Languages();
$language->transporter_id = $user->id;
$language->name = $languageData;
$language->Proficient = 0;
$language->save();
}
// Commit the transaction
DB::commit();
return redirect()->route('users.index')->with('success', 'Transporter has been added successfully.');
} catch (\Exception $e) {
DB::rollback();
Log::error('Error creating user and transporter: ' . $e->getMessage());
return back()->with('error', 'An error occurred: ' . $e->getMessage());
}
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
$user = User::find($id);
$transporter = Transporter::with('vehicle','vehicle.get_make','vehicle.get_model','vehicle.Vehicle_type')->where('user_id', $id)->first();
if ($transporter) {
$languages = Languages::where('transporter_id', $user->id)->get();
} else {
$languages = collect();
}
return view('admin.users.show', compact('user', 'transporter', 'languages'));
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
$user = User::find($id);
$transporter = Transporter::where('user_id', $id)->first();
$cities = CitySelection::get();
if ($transporter) {
$languages = Languages::where('transporter_id', $user->id)->get();
$languageValues = $languages->pluck('name')->toArray();
$selectedCityIds = explode(',', $transporter->service_city); // get selected cities
} else {
$languages = collect();
$selectedCityIds = [];
}
// $languages = $transporter ? $transporter->languages : collect();
if (isset($user)) {
return view('admin.users.edit', compact('user', 'transporter', 'cities', 'languages','selectedCityIds','languageValues'));
} else {
return back()->with('error', 'Transporter does not exist');
}
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'last_name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email,' . $id . ',id,phone_number,' . $request->input('phone_number'),
'phone_number' => 'required|regex:/^[0-9]{10}$/',
'business_name' => 'required|string|max:255',
'whatsapp_number' => 'required|regex:/^[0-9]{10}$/',
// 'inactive_reason' => 'required|string|max:255',
'address' => 'required|string|max:255',
'service_type' => 'required|string|max:255',
'cities' => 'required|array',
'cities.*' => 'required|string|max:255',
'service_area' => 'required|string|max:255',
'languages' => 'required|array',
'transporter_image' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
// 'languages.*.language' => 'required|string|max:255',
// 'languages.*.proficient' => 'required|integer|min:0|max:100',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
DB::beginTransaction();
try {
$user = User::find($id);
if ($user) {
$user->name = $request->name;
$user->last_name = $request->last_name;
$user->email = $request->email;
$user->phone_number = $request->phone_number;
$user->status = $request->has('is_active') ? 1 : 0;
$user->type = 2;
$user->save();
$transporter = Transporter::where('user_id', $user->id)->first();
if ($transporter) {
$transporter->business_name = $request->business_name;
$transporter->whatsapp_number = $request->whatsapp_number;
$transporter->is_verified = $request->has('is_verified') ? Transporter::VERIFIED_YES : Transporter::VERIFIED_NO;
$transporter->service_type = $request->service_type;
$transporter->service_city = implode(',', $request->cities);
$transporter->service_area = $request->service_area;
$transporter->status = (int) $request->status;
$transporter->inactive_reason = $request->inactive_reason;
$transporter->address = $request->address;
} else {
$transporter = new Transporter();
$transporter->user_id = $user->id;
$transporter->business_name = $request->business_name;
$transporter->whatsapp_number = $request->whatsapp_number;
$transporter->is_verified = $request->has('is_verified') ? Transporter::VERIFIED_YES : Transporter::VERIFIED_NO;
$transporter->service_type = $request->service_type;
$transporter->service_city = implode(',', $request->city);
$transporter->service_area = $request->service_area;
$transporter->status = $request->status;
$transporter->inactive_reason = $request->inactive_reason;
$transporter->address = $request->address;
}
$transporter->save();
if ($request->hasFile('transporter_image')) {
$transporter->clearMediaCollection('transporter_image');
$transporter->addMediaFromRequest('transporter_image')->toMediaCollection('transporter_image');
}
// $transporter->languages()->delete();
$languages = Languages::where('transporter_id', $user->id)->delete();
$allLanguages = [];
foreach ($request->languages as $languageJson) {
$decoded = json_decode($languageJson, true);
if (!is_array($decoded)) {
continue; // skip invalid
}
foreach ($decoded as $languageData) {
if (!empty($languageData['value'])) {
$allLanguages[] = $languageData['value'];
}
}
}
foreach ($allLanguages as $languageData) {
$language = new Languages();
$language->transporter_id = $user->id;
$language->name = $languageData;
$language->Proficient = 0;
$language->save();
}
DB::commit();
return redirect()->route('users.index')->with('success', 'Transporter has been updated successfully');
} else {
DB::rollback();
return back()->with('error', 'Transporter does not exist');
}
} catch (\Exception $e) {
DB::rollback();
Log::error('Error updating user and transporter: ' . $e->getMessage());
return back()->with('error', 'An error occurred: ' . $e->getMessage());
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
$user = User::find($id);
if (isset($user)) {
$user->forceDelete();
$transporter = Transporter::where('user_id', $id)->delete();
return redirect()->back()->with('success', 'Transporter has been deleted successfully.');
} else {
return back()->with('error', 'Transporter not found.');
}
}
public function bulkDelete(Request $request)
{
$ids = $request->ids;
if (!$ids || !is_array($ids)) {
return response()->json(['message' => 'No users selected.'], 400);
}
try {
foreach ($ids as $id) {
$user = User::find($id);
if ($user) {
$user->forceDelete();
Transporter::where('user_id', $id)->delete();
}
}
return response()->json(['message' => 'Selected users deleted successfully.']);
} catch (\Exception $e) {
return response()->json(['message' => 'Error: ' . $e->getMessage()], 500);
}
}
public function getCities($countryId)
{
try {
// Fetch all states in the specified country
$states = State::where('country_id', $countryId)->pluck('id');
// Fetch cities that belong to these states
$cities = City::whereIn('state_id', $states)->get(['id', 'name']);
return response()->json($cities);
} catch (\Exception $e) {
// Log the exception message for debugging
\Log::error('Error fetching cities: ' . $e->getMessage());
return response()->json(['error' => 'Failed to fetch cities.'], 500);
}
}
}