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/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);
    }
}