File: /var/www/html/spion/app/Http/Controllers/BackendUserController.php
<?php
namespace App\Http\Controllers;
use App\Models\City;
use App\Models\Country;
use App\Models\State;
use App\Models\User;
use App\Models\UserSubscription;
use App\Models\UserWebsite;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Yajra\DataTables\Facades\DataTables;
class BackendUserController extends Controller
{
public function user_index()
{
return view('admin.user.user-index');
}
public function getUsers(Request $request)
{
if ($request->ajax()) {
$query = User::query();
// dd($query->get());
if ($request->search_keyword) {
$query->where(function ($q) use ($request) {
$q->where('first_name', 'like', '%' . $request->search_keyword . '%')
->orWhere('last_name', 'like', '%' . $request->search_keyword . '%');
});
}
if ($request->status_filter !== 'all') {
$query->where('status', $request->status_filter);
}
$query->orderBy('id', "desc");
return DataTables::eloquent($query)
->addColumn('name', function ($row) {
return $row->first_name . ' ' . $row->last_name;
})
->addColumn('status', function ($row) {
return $row->status ? 'Active' : 'Disabled';
})
->rawColumns(['name'])
->make(true);
}
}
public function website()
{
return view('admin.user.website');
}
public function getUsersWebsite(Request $request)
{
if ($request->ajax()) {
$query = UserWebsite::with('userSubscription');
if ($request->search_keyword) {
$query->where(function ($q) use ($request) {
$q->where('first_name', 'like', '%' . $request->search_keyword . '%')
->orWhere('last_name', 'like', '%' . $request->search_keyword . '%');
});
}
if ($request->status_filter !== 'all') {
$query->where('status', $request->status_filter);
}
$query->orderBy('id', "asc");
// Pagination
$perPage = $request->input('per_page', 5);
$websites = $query->paginate($perPage);
// Modify response manually
$websites->getCollection()->transform(function ($row) {
return [
'id' => $row->id,
'name' => $row->first_name . ' ' . $row->last_name,
'status_text' => match ($row->status) {
1 => 'Draft',
2 => 'Submitted',
3 => 'Unpublished',
4 => 'Published',
default => 'Unknown'
},
'last_saved' => $row->updated_at ? $row->updated_at->format('d/m/Y') : 'N/A',
'renewal_date' => optional($row->userSubscription->first())->charge_at
? \Carbon\Carbon::createFromTimestamp($row->userSubscription->first()->charge_at)->format('d/m/Y')
: 'N/A',
'email' => $row->email,
'logo' => $row->logo,
'domain_name' => $row->domain_name,
'subdomain_preference' => $row->subdomain_preference,
];
});
return response()->json($websites);
}
}
public function userswebsiteEdit(Request $request)
{
$websiteId = $request->website_id;
$userWebsite = UserWebsite::find($websiteId);
if (!$userWebsite) {
return redirect()->back()->with('error', 'Website not found.');
}
$countries = Country::all();
// dd($userWebsite->country_id);
$states = State::where('country_id', $userWebsite->country)->get();
$cities = City::where('state_id', $userWebsite->state)->get();
return view('admin.user.edit-website', compact('userWebsite','countries','states','cities'));
}
public function userswebsiteUpdate(Request $request, $id)
{
$userWebsite = UserWebsite::find($id);
if (!$userWebsite) {
return response()->json(['success' => false, 'message' => 'User website not found.']);
}
// Validate data
$request->validate([
'first_name' => 'required|string|max:255',
'last_name' => 'required|string|max:255',
'email' => 'required|email|max:255',
'business_name' => 'nullable|string|max:255',
'business_email' => 'nullable|email|max:255',
'business_phone' => 'nullable|string|max:20',
'business_address_1' => 'nullable|string|max:255',
'business_address_2' => 'nullable|string|max:255',
'street' => 'nullable|string|max:255',
'city' => 'nullable|string|max:100',
'state' => 'nullable|string|max:100',
'zip_code' => 'nullable|string|max:20',
'country' => 'nullable|string|max:100',
'domain_name' => 'nullable|string|max:255',
'subdomain_preference' => 'nullable|string|max:255',
'social_urls' => 'nullable|array',
'logo' => 'nullable|string|max:255',
'media' => 'nullable|array',
'pages' => 'nullable|array',
'business_paragraph' => 'nullable|string',
'services_name' => 'nullable|array',
'services_description' => 'nullable|array',
'primary_color' => 'nullable|string|max:20',
'secondary_color' => 'nullable|string|max:20',
'highlight_color' => 'nullable|string|max:20',
'instructions' => 'nullable|string',
'status' => 'nullable|string|max:50',
]);
try {
// Update the data
$userWebsite->update([
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'email' => $request->email,
'business_name' => $request->business_name,
'business_email' => $request->business_email,
'business_phone' => $request->business_phone,
'business_address_1' => $request->business_address_1,
'business_address_2' => $request->business_address_2,
'street' => $request->street,
'city' => $request->city,
'state' => $request->state,
'zip_code' => $request->zip_code,
'country' => $request->country,
'domain_name' => $request->domain_name,
'subdomain_preference' => $request->subdomain_preference,
'business_paragraph' => $request->business_paragraph,
'primary_color' => $request->primary_color,
'secondary_color' => $request->secondary_color,
'highlight_color' => $request->highlight_color,
'instructions' => $request->instructions,
'status' => $request->status,
]);
$userWebsite->update([
'social_urls' => json_encode($request->social_urls ?? []),
'pages' => json_encode($request->pages ?? []),
'services_name' => json_encode($request->services_name ?? []),
'services_description' => json_encode($request->services_description ?? []),
]);
if ($request->hasFile('logo')) {
$userWebsite->logo = $request->file('logo')->store('logos', 'public');
}
if ($request->hasFile('media')) {
$mediaFiles = [];
foreach ($request->file('media') as $mediaFile) {
$mediaFiles[] = $mediaFile->store('media', 'public');
}
$userWebsite->media = json_encode($mediaFiles);
}
$userWebsite->save();
return response()->json(['success' => true, 'message' => 'Website updated successfully.']);
} catch (\Exception $e) {
return response()->json(['success' => false, 'message' => 'Error updating website: ' . $e->getMessage()]);
}
}
public function transactions_index(Request $request)
{
if ($request->has('website_id')) {
$websiteId = $request->website_id;
} else {
$websiteId = null;
}
return view('admin.user.transaction', compact('websiteId'));
}
public function transactions_view(Request $request)
{
$subscriptions = UserSubscription::with(['website', 'plan', 'transactions']);
if ($request->website_id) {
$subscriptions->where('website_id', $request->website_id);
}
if ($request->search_keyword) {
$subscriptions->whereHas('website', function ($query) use ($request) {
$query->where('first_name', 'like', '%' . $request->search_keyword . '%')
->orWhere('last_name', 'like', '%' . $request->search_keyword . '%')
->orWhere(DB::raw("CONCAT(first_name, ' ', last_name)"), 'like', '%' . $request->search_keyword . '%');
})->orWhereHas('plan', function ($query) use ($request) {
$query->where('name', 'like', '%' . $request->search_keyword . '%')
->orWhere('price', 'like', '%' . $request->search_keyword . '%');
})->orWhereHas('transactions', function ($query) use ($request) {
$query->where('transaction_id', 'like', '%' . $request->search_keyword . '%');
});
}
// Apply filtering by status if not 'all'
if ($request->status_filter && $request->status_filter != 'all') {
$subscriptions->whereHas('transactions', function ($query) use ($request) {
$query->where('pay_status', $request->status_filter);
});
}
// Return data for DataTables
return DataTables::eloquent($subscriptions)
->addColumn('name', function ($row) {
return $row->website->first_name . ' ' . $row->website->last_name;
})
->addColumn('plan_name', function ($row) {
return $row->plan->name;
})
->addColumn('price', function ($row) {
return $row->plan->price;
})
->addColumn('transaction_id', function ($row) {
return $row->transactions->pluck('transaction_id')->implode(', ');
})
->addColumn('start_date', function ($row) {
return \Carbon\Carbon::parse($row->start_at)->format('Y-m-d');
})
->addColumn('status', function ($row) {
$latestTransaction = $row->transactions->last();
$statusLabels = [
'1' => 'Pending',
'2' => 'Unpaid',
'3' => 'Paid',
'4' => 'Failed',
];
$status = $latestTransaction ? ($statusLabels[$latestTransaction->pay_status] ?? 'Unknown') : 'No Transaction';
// Add a button based on the status
$buttonClass = 'btn btn-secondary'; // Default class for "No Transaction"
switch ($latestTransaction ? $latestTransaction->pay_status : null) {
case 1:
$buttonClass = 'btn btn-warning'; // Pending
break;
case 2:
$buttonClass = 'btn btn-danger'; // Unpaid
break;
case 3:
$buttonClass = 'btn btn-success'; // Paid
break;
case 4:
$buttonClass = 'btn btn-dark'; // Failed
break;
default:
$buttonClass = 'btn btn-secondary'; // Default class
break;
}
return "<button class='{$buttonClass}'>{$status}</button>";
})
->rawColumns(['status'])
->make(true);
}
public function subscription_index(Request $request)
{
return view('admin.user.subscription');
}
public function subscription_view(Request $request)
{
$subscriptions = UserSubscription::with(['website', 'plan'])
->select('user_subscriptions.*');
if ($request->has('search_keyword') && $request->search_keyword != '') {
$subscriptions = $subscriptions->where(function ($query) use ($request) {
$query->where('plan_name', 'like', '%' . $request->search_keyword . '%')
->orWhere('user_id', 'like', '%' . $request->search_keyword . '%')
->orWhereHas('website', function ($q) use ($request) {
$q->where('first_name', 'like', '%' . $request->search_keyword . '%')
->orWhere('last_name', 'like', '%' . $request->search_keyword . '%');
});
});
}
if ($request->has('status_filter') && $request->status_filter != 'all') {
$subscriptions = $subscriptions->where('rz_status', $request->status_filter);
}
return DataTables::of($subscriptions)
->addColumn('name', function ($row) {
return $row->website->first_name . ' ' . $row->website->last_name;
})
->addColumn('price', function ($row) {
return $row->plan->price;
})
// ->addColumn('action', function ($subscription) {
// return '<a href="' . route('admin.subscription.view', $subscription->id) . '" class="btn btn-info">View</a>';
// })
->addColumn('rz_subscription_id', function ($row) {
return $row->rz_subscription_id;
})
->addColumn('plan_name', function ($row) {
return $row->plan_name;
})
->addColumn('charge_at', function ($row) {
return date('d-m-Y', $row->charge_at);
})
->addColumn('start_at', function ($row) {
return date('d-m-Y', $row->start_at);
})
->addColumn('rz_status', function ($row) {
$statuses = [
1 => ['label' => 'Pending', 'class' => 'btn btn-warning'],
2 => ['label' => 'Active', 'class' => 'btn btn-success'],
3 => ['label' => 'Active', 'class' => 'btn btn-success'],
4 => ['label' => 'Failed', 'class' => 'btn btn-danger'],
5 => ['label' => 'Cancelled', 'class' => 'btn btn-secondary'],
6 => ['label' => 'Paused', 'class' => 'btn btn-info'],
7 => ['label' => 'Resumed', 'class' => 'btn btn-info'],
8 => ['label' => 'Charged', 'class' => 'btn btn-primary'],
9 => ['label' => 'Completed', 'class' => 'btn btn-dark'],
10 => ['label' => 'Updated', 'class' => 'btn btn-light'],
];
if (isset($statuses[$row->rz_status])) {
$status = $statuses[$row->rz_status];
return '<button class="' . $status['class'] . '">' . $status['label'] . '</button>';
}
return '<button class="btn btn-secondary">Unknown</button>';
})
->rawColumns(['rz_status', 'action'])
->make(true);
}
public function getStates(Request $request)
{
$states = State::where('country_id', $request->country_id)->get(['id', 'name']);
return response()->json($states);
}
public function getCities(Request $request)
{
$cities = City::where('state_id', $request->state_id)->get(['id', 'name']);
return response()->json($cities);
}
}