HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
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);
        }
    }
}