migrate to gtea from bistbucket

This commit is contained in:
2026-03-15 17:08:23 +07:00
commit 129ca2260c
3716 changed files with 566316 additions and 0 deletions

View File

@@ -0,0 +1,70 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Plan;
use App\Models\Gateway;
use App\Models\Business;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Modules\AffiliateAddon\App\Models\Affiliate;
class AcnooAffiliateController extends Controller
{
public function index()
{
$plans = Plan::latest()->get();
$gateways = Gateway::latest()->get();
$affiliates = Affiliate::with(['user:id,business_id,name,email','user.business:id,plan_subscribe_id,will_expire,companyName,phoneNumber,address,subscriptionDate,created_at,business_category_id:id,name','user.business.enrolled_plan:id,plan_id,business_id,plan_id','user.business.enrolled_plan.plan:id,subscriptionName'])->latest()->paginate(20);
return view('admin.affiliate-modules.affiliate.index', compact('affiliates','plans','gateways'));
}
public function acnooFilter(Request $request)
{
$search = $request->input('search');
$affiliates = Affiliate::with(['user:id,business_id,name,email','user.business:id,plan_subscribe_id,will_expire,companyName,phoneNumber,address,subscriptionDate,created_at,business_category_id:id,name','user.business.enrolled_plan:id,plan_id,business_id,plan_id','user.business.enrolled_plan.plan:id,subscriptionName'])->when($search, function ($q) use ($search) {
$q->where(function ($q) use ($search) {
$q->where('balance', 'like', '%' . $search . '%')
->orWhereHas('user', function ($q) use ($search) {
$q->where('name', 'like', '%' . $search . '%')
->orwhere('email', 'like', '%' . $search . '%');
})
->orWhereHas('user.business.enrolled_plan.plan', function ($q) use ($search) {
$q->where('subscriptionName', 'like', '%' . $search . '%');
});
});
})
->latest()
->paginate($request->per_page ?? 20);
if ($request->ajax()) {
return response()->json([
'data' => view('admin.affiliate-modules.affiliate.datas', compact('affiliates'))->render()
]);
}
return redirect(url()->previous());
}
public function destroy($id)
{
Affiliate::findOrFail($id)->delete();
return response()->json([
'message' => __('Affiliate deleted successfully'),
'redirect' => route('admin.affiliates.index')
]);
}
public function deleteAll(Request $request)
{
Affiliate::whereIn('id', $request->ids)->delete();
return response()->json([
'message' => __('Selected Affiliate deleted successfully'),
'redirect' => route('admin.affiliates.index')
]);
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Business;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AcnooAffiliateReportController extends Controller
{
public function index()
{
$items = Business::with(['enrolled_plan:id,plan_id', 'enrolled_plan.plan:id,subscriptionName', 'category:id,name'])->latest()->paginate(20);
return view('admin.affiliate-modules.reports.index', compact('items'));
}
public function acnooFilter(Request $request)
{
$search = $request->input('search');
$items = Business::with(['enrolled_plan:id,plan_id', 'enrolled_plan.plan:id,subscriptionName', 'category:id,name'])->when($search, function ($q) use ($search) {
$q->where(function ($q) use ($search) {
$q->where('companyName', 'like', '%' . $search . '%')
->orWhereHas('enrolled_plan.plan', function ($q) use ($search) {
$q->where('subscriptionName', 'like', '%' . $search . '%');
});
});
})
->latest()
->paginate($request->per_page ?? 20);
if ($request->ajax()) {
return response()->json([
'data' => view('admin.affiliate-modules.reports.datas', compact('items'))->render()
]);
}
return redirect(url()->previous());
}
}

View File

@@ -0,0 +1,137 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Banner;
use App\Helpers\HasUploader;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
class AcnooBannerController extends Controller
{
use HasUploader;
public function __construct()
{
$this->middleware('permission:banners-create')->only('create', 'store');
$this->middleware('permission:banners-read')->only('index');
$this->middleware('permission:banners-update')->only('edit', 'update','status');
$this->middleware('permission:banners-delete')->only('destroy','deleteAll');
}
public function index(Request $request)
{
$banners = Banner::latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.banners.search', compact('banners'))->render()
]);
}
return view('admin.banners.index', compact('banners'));
}
public function create()
{
return view('admin.banners.create');
}
public function store(Request $request)
{
$request->validate([
'status' => 'nullable|in:on',
'imageUrl' => 'required|image|mimes:jpeg,png,jpg,gif,svg',
]);
Banner::create([
'imageUrl' => $request->imageUrl ? $this->upload($request, 'imageUrl') : NULL,
'status' => $request->status ? 1 : 0,
]);
return response()->json([
'message' => __('Banner saved successfully'),
'redirect' => route('admin.banners.index')
]);
}
public function edit(string $id)
{
$banners = Banner::findOrFail($id);
return view('admin.banners.search',compact('banners'));
}
public function update(Request $request, string $id)
{
$request->validate([
'status' => 'nullable|in:on',
'imageUrl' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg',
]);
$banner = Banner::findOrFail($id);
$banner->update([
'imageUrl' => $request->imageUrl ? $this->upload($request, 'imageUrl', $banner->imageUrl) : $banner->imageUrl,
'status' => $request->status ? 1 : 0,
]);
return response()->json([
'message' => __('Banner updated successfully'),
'redirect' => route('admin.banners.index')
]);
}
public function destroy(string $id)
{
$banner = Banner::findOrFail($id);
if (file_exists($banner->imageUrl)) {
Storage::delete($banner->imageUrl);
}
$banner->delete();
return response()->json([
'message' => __('Banners deleted successfully'),
'redirect' => route('admin.banners.index')
]);
}
public function status(Request $request, $id)
{
$banner = Banner::findOrFail($id);
$banner->update(['status' => $request->status]);
return response()->json(['message' => 'Banner']);
}
public function deleteAll(Request $request)
{
$idsToDelete = $request->input('ids');
DB::beginTransaction();
try {
$banners = Banner::whereIn('id', $idsToDelete)->get();
foreach ($banners as $banner) {
if (file_exists($banner->imageUrl)) {
Storage::delete($banner->imageUrl);
}
}
Banner::whereIn('id', $idsToDelete)->delete();
DB::commit();
return response()->json([
'message' => __('Selected Banners deleted successfully'),
'redirect' => route('admin.banners.index')
]);
} catch (\Exception $e) {
DB::rollBack();
return response()->json(__('Something went wrong.'), 400);
}
}
}

View File

@@ -0,0 +1,140 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Blog;
use App\Models\Comment;
use App\Helpers\HasUploader;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
class AcnooBlogController extends Controller
{
use HasUploader;
public function index(Request $request)
{
$blogs = Blog::when($request->search, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('title', 'like', '%' . $request->search . '%');
});
})->latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.website-setting.blogs.datas', compact('blogs'))->render()
]);
}
return view('admin.website-setting.blogs.index', compact('blogs'));
}
public function create()
{
return view('admin.website-setting.blogs.create');
}
public function store(Request $request)
{
$request->validate([
'title' => 'required|unique:blogs,title',
'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg',
'status' => 'boolean',
'descriptions' => 'nullable|string',
'tags' => 'nullable|array',
'meta.title' => 'nullable|string',
'meta.description' => 'nullable|string',
]);
Blog::create($request->except('image') + [
'user_id' => Auth::id(),
'image' => $request->image ? $this->upload($request, 'image') : null,
]);
return response()->json([
'message' => __('BLog created successfully'),
'redirect' => route('admin.blogs.index')
]);
}
public function edit(Blog $blog)
{
return view('admin.website-setting.blogs.edit', compact('blog'));
}
public function update(Request $request, Blog $blog)
{
$request->validate([
'title' => 'required|unique:blogs,title,' . $blog->id,
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg',
'status' => 'boolean',
'descriptions' => 'nullable|string',
'tags' => 'nullable|array',
'meta.title' => 'nullable|string',
'meta.description' => 'nullable|string',
]);
$blog->update($request->except('image') + [
'user_id' => Auth::id(),
'image' => $request->image ? $this->upload($request, 'image', $blog->image) : $blog->image,
]);
return response()->json([
'message' => __('BLog updated successfully'),
'redirect' => route('admin.blogs.index')
]);
}
public function destroy(Blog $blog)
{
if (file_exists($blog->image)) {
Storage::delete($blog->image);
}
$blog->delete();
return response()->json([
'message' => __('Blog deleted successfully'),
'redirect' => route('admin.blogs.index')
]);
}
public function status(Request $request, $id)
{
$blog_status = Blog::findOrFail($id);
$blog_status->update(['status' => $request->status]);
return response()->json(['message' => 'Blog']);
}
public function deleteAll(Request $request)
{
Blog::whereIn('id', $request->ids)->delete();
return response()->json([
'message' => __('Selected Blog deleted successfully'),
'redirect' => route('admin.blogs.index')
]);
}
public function filterComment($id, Request $request)
{
$blog = Blog::findOrFail($id);
$comments = Comment::with('blog:id')->whereStatus(1)->where('blog_id', $blog->id)->when($request->search, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('name', 'like', '%' . $request->search . '%')
->orwhere('email', 'like', '%' . $request->search . '%')
->orwhere('comment', 'like', '%' . $request->search . '%');
});
})->latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.website-setting.blogs.comments.datas', compact('comments','blog'))->render()
]);
}
return view('admin.website-setting.blogs.comments.index', compact('comments','blog'));
}
}

View File

@@ -0,0 +1,105 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\BusinessCategory;
use Illuminate\Http\Request;
class AcnooBusinessCategoryController extends Controller
{
public function index(Request $request)
{
$categories = BusinessCategory::when($request->search, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('name', 'like', '%' . $request->search . '%')
->orWhere('description', 'like', '%' . $request->search . '%');
});
})->latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.business-categories.datas', compact('categories'))->render()
]);
}
return view('admin.business-categories.index', compact('categories'));
}
public function create()
{
return view('admin.business-categories.create');
}
public function store(Request $request)
{
$request->validate([
'status' => 'nullable|in:on',
'description' => 'nullable|string|max:255',
'name' => 'required|string|unique:business_categories|max:255',
]);
BusinessCategory::create($request->except('status') + [
'status' => $request->status ? 1 : 0,
]);
return response()->json([
'message' => __('Category saved successfully'),
'redirect' => route('admin.business-categories.index')
]);
}
public function edit($id)
{
$category = BusinessCategory::find($id);
return view('admin.business-categories.edit', compact('category'));
}
public function update(Request $request, $id)
{
$request->validate([
'status' => 'in:on',
'description' => 'nullable|string|max:255',
'name' => 'required|string|max:255|unique:business_categories,name,' . $id,
]);
$category = BusinessCategory::find($id);
$category->update($request->except('status') + [
'status' => $request->status ? 1 : 0,
]);
return response()->json([
'message' => __('Category updated successfully'),
'redirect' => route('admin.business-categories.index')
]);
}
public function destroy($id)
{
$category = BusinessCategory::findOrFail($id);
$category->delete();
return response()->json([
'message' => __('Category deleted successfully'),
'redirect' => route('admin.business-categories.index')
]);
}
public function deleteAll(Request $request)
{
BusinessCategory::whereIn('id', $request->ids)->delete();
return response()->json([
'message' => __('Category deleted successfully'),
'redirect' => route('admin.business-categories.index')
]);
}
public function status(Request $request, $id)
{
$category = BusinessCategory::findOrFail($id);
$category->update(['status' => $request->status]);
return response()->json(['message' => 'Business category']);
}
}

View File

@@ -0,0 +1,347 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Plan;
use App\Models\User;
use App\Models\Gateway;
use App\Models\Business;
use App\Models\PaymentType;
use App\Helpers\HasUploader;
use Illuminate\Http\Request;
use App\Models\PlanSubscribe;
use App\Models\BusinessCategory;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Cache;
use Modules\AffiliateAddon\App\Models\Affiliate;
use Modules\AffiliateAddon\App\Models\AffiliateTransaction;
use Illuminate\Validation\Rule;
class AcnooBusinessController extends Controller
{
use HasUploader;
public function __construct()
{
$this->middleware('permission:business-create')->only('create', 'store');
$this->middleware('permission:business-read')->only('index');
$this->middleware('permission:business-update')->only('edit', 'update', 'status');
$this->middleware('permission:business-delete')->only('destroy', 'deleteAll');
}
public function index(Request $request)
{
$plans = Plan::latest()->get();
$gateways = Gateway::latest()->get();
$search = $request->input('search');
$businesses = Business::with(['enrolled_plan:id,plan_id', 'enrolled_plan.plan:id,subscriptionName', 'category:id,name'])
->when($request->search, function ($q) use ($search) {
$q->where(function ($q) use ($search) {
$q->where('companyName', 'like', '%' . $search . '%')
->orWhere('phoneNumber', 'like', '%' . $search . '%')
->orWhereHas('category', function ($q) use ($search) {
$q->where('name', 'like', '%' . $search . '%');
})
->orWhereHas('user', function ($q) use ($search) {
$q->where('email', 'like', '%' . $search . '%');
})
->orWhereHas('enrolled_plan.plan', function ($q) use ($search) {
$q->where('subscriptionName', 'like', '%' . $search . '%');
});
});
})->latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.business.datas', compact('businesses'))->render()
]);
}
return view('admin.business.index', compact('businesses', 'gateways', 'plans'));
}
public function create()
{
$plans = Plan::where('status', 1)->latest()->get();
$categories = BusinessCategory::latest()->get();
return view('admin.business.create', compact('plans', 'categories'));
}
public function store(Request $request)
{
$request->validate([
'address' => 'nullable|max:250',
'companyName' => 'required|max:250',
'email' => 'required|email|unique:users',
'password' => 'required|string|min:4|confirmed',
'pictureUrl' => 'nullable|image',
'phoneNumber' => 'nullable',
'shopOpeningBalance' => 'nullable|numeric',
'business_category_id' => 'required|exists:business_categories,id',
'plan_subscribe_id' => 'nullable|exists:plans,id',
]);
DB::beginTransaction();
try {
$user = auth()->user();
$business = Business::create([
'companyName' => $request->companyName,
'address' => $request->address,
'email' => $request->email,
'phoneNumber' => $request->phoneNumber,
'shopOpeningBalance' => $request->shopOpeningBalance,
'business_category_id' => $request->business_category_id,
'pictureUrl' => $request->pictureUrl ? $this->upload($request, 'pictureUrl') : NULL,
'user_id' => $user->id,
]);
PaymentType::create([
'name' => "Cash",
'business_id' => $business->id
]);
User::create([
'business_id' => $business->id,
'name' => $request->companyName,
'email' => $request->email,
'phone' => $request->phoneNumber,
'image' => $request->pictureUrl ? $this->upload($request, 'pictureUrl') : NULL,
'password' => Hash::make($request->password),
'user_id' => $user->id,
]);
if ($request->plan_subscribe_id) {
$plan = Plan::findOrFail($request->plan_subscribe_id);
$subscribe = PlanSubscribe::create([
'plan_id' => $plan->id,
'notes' => $request->notes,
'duration' => $plan->duration,
'business_id' => $business->id,
'price' => $plan->subscriptionPrice,
'gateway_id' => $request->gateway_id,
'allow_multibranch' => $plan->allow_multibranch,
'addon_domain_limit' => $plan->addon_domain_limit ?? 0,
'subdomain_limit' => $plan->subdomain_limit ?? 0,
]);
$business->update([
'subscriptionDate' => now(),
'plan_subscribe_id' => $subscribe->id,
'will_expire' => now()->addDays($plan->duration),
]);
sendNotification($subscribe->id, route('admin.subscription-reports.index', ['id' => $subscribe->id]), __('Plan subscribed by ' . $user->name));
}
DB::commit();
return response()->json([
'message' => __('Business created successfully.'),
'redirect' => route('admin.business.index'),
]);
} catch (\Throwable $th) {
DB::rollback();
return response()->json(__('Something went wrong.'), 403);
}
}
public function edit(string $id)
{
$plans = Plan::latest()->get();
$business = Business::findOrFail($id);
$categories = BusinessCategory::latest()->get();
$user = User::where('business_id', $business->id)->firstOrFail();
return view('admin.business.edit', compact('business', 'plans', 'categories', 'user'));
}
public function update(Request $request, string $id)
{
$business = Business::findOrFail($id);
$user = User::where('business_id', $business->id)->firstOrFail();
$request->validate([
'address' => 'nullable|max:250',
'companyName' => 'required|max:250',
'email' => [
'required',
'email',
Rule::unique('users', 'email')->ignore($user->id),
],
'password' => 'nullable|string|min:4|confirmed',
'pictureUrl' => 'nullable|image',
'phoneNumber' => 'nullable',
'shopOpeningBalance' => 'nullable|numeric',
'business_category_id' => 'required|exists:business_categories,id',
'plan_subscribe_id' => 'nullable|exists:plans,id',
]);
DB::beginTransaction();
try {
$business->update([
'companyName' => $request->companyName,
'address' => $request->address,
'email' => $request->email,
'phoneNumber' => $request->phoneNumber,
'shopOpeningBalance' => $request->shopOpeningBalance,
'business_category_id' => $request->business_category_id,
'pictureUrl' => $request->pictureUrl ? $this->upload($request, 'pictureUrl', $business->pictureUrl) : $business->pictureUrl,
]);
$user->update([
'name' => $request->companyName,
'email' => $request->email,
'phone' => $request->phoneNumber,
'image' => $request->pictureUrl ? $this->upload($request, 'pictureUrl') : $user->image,
'password' => $request->password ? Hash::make($request->password) : $user->password,
]);
$prev_subscription = PlanSubscribe::where('business_id', $business->id)->latest()->first();
if ($request->plan_subscribe_id && ($prev_subscription->plan_id != $request->plan_subscribe_id)) {
$plan = Plan::findOrFail($request->plan_subscribe_id);
$subscribe = PlanSubscribe::create([
'plan_id' => $plan->id,
'notes' => $request->notes,
'duration' => $plan->duration,
'business_id' => $business->id,
'price' => $plan->subscriptionPrice,
'gateway_id' => $request->gateway_id,
'allow_multibranch' => $plan->allow_multibranch,
'addon_domain_limit' => $plan->addon_domain_limit ?? 0,
'subdomain_limit' => $plan->subdomain_limit ?? 0,
]);
$business->update([
'subscriptionDate' => now(),
'plan_subscribe_id' => $subscribe->id,
'will_expire' => now()->addDays($plan->duration),
]);
sendNotification($subscribe->id, route('admin.subscription-reports.index', ['id' => $subscribe->id]), __('Plan subscribed by ' . auth()->user()->name));
}
DB::commit();
return response()->json([
'message' => __('Business updated successfully.'),
'redirect' => route('admin.business.index'),
]);
} catch (\Throwable $th) {
DB::rollback();
return response()->json(__('Something went wrong.'), 403);
}
}
public function destroy($id)
{
$business = Business::findOrFail($id);
$business->delete();
return response()->json([
'message' => __('Business deleted successfully'),
'redirect' => route('admin.business.index')
]);
}
public function deleteAll(Request $request)
{
Business::whereIn('id', $request->ids)->delete();
return response()->json([
'message' => __('Selected Business deleted successfully'),
'redirect' => route('admin.business.index')
]);
}
// Upgrade plan code
public function upgradePlan(Request $request)
{
$request->validate([
'price' => 'required|string',
'notes' => 'required|string',
'plan_id' => 'required|exists:plans,id',
'business_id' => 'required|exists:businesses,id',
]);
DB::beginTransaction();
try {
$plan = Plan::findOrFail($request->plan_id);
$business = Business::findOrFail($request->business_id);
$subscribe = PlanSubscribe::create([
'plan_id' => $plan->id,
'payment_status' => 'paid',
'notes' => $request->notes,
'duration' => $plan->duration,
'business_id' => $business->id,
'price' => $plan->subscriptionPrice,
'gateway_id' => $request->gateway_id,
'allow_multibranch' => $plan->allow_multibranch,
'addon_domain_limit' => $plan->addon_domain_limit ?? 0,
'subdomain_limit' => $plan->subdomain_limit ?? 0
]);
Cache::forget('plan-data-' . $business->id);
$business->update([
'subscriptionDate' => now(),
'plan_subscribe_id' => $subscribe->id,
'will_expire' => now()->addDays($plan->duration),
]);
if (moduleCheck('AffiliateAddon') && $business->affiliator_id) {
$affiliateUser = User::find($business->affiliator_id);
if ($affiliateUser && $plan->affiliate_commission > 0) {
$commission = ($plan->subscriptionPrice * $plan->affiliate_commission) / 100;
Affiliate::where('user_id', $affiliateUser->id)->increment('balance', $commission);
AffiliateTransaction::create([
'user_id' => $affiliateUser->id,
'business_id' => $business->id,
'trx' => strtoupper(str()->random(10)),
'type' => 'credit',
'amount' => $commission,
'title' => 'Commission from Order #' . $subscribe->id,
'reference_id' => $subscribe->id,
'reference_type' => 'PlanSubscribe',
'note' => 'User purchased via your referral link',
]);
}
}
sendNotification($subscribe->id, route('admin.subscription-reports.index', ['id' => $subscribe->id]), __('Plan subscribed by ' . auth()->user()->name));
DB::commit();
return response()->json([
'message' => __('Subscription enrolled successfully.'),
'redirect' => route('admin.subscription-reports.index'),
]);
} catch (\Throwable $th) {
DB::rollback();
return response()->json(__('Something went wrong.'), 403);
}
}
public function status(Request $request, $id)
{
$business = Business::findOrFail($id);
$business->update(['status' => $request->status]);
return response()->json(['message' => 'Business']);
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Comment;
use Illuminate\Http\Request;
class AcnooCommentController extends Controller
{
public function destroy(Comment $comment)
{
$comment->delete();
return response()->json([
'message' => __('Comment deleted successfully.'),
'redirect' => route('admin.blogs.index')
]);
}
public function deleteAll(Request $request)
{
Comment::whereIn('id', $request->ids)->delete();
return response()->json([
'message' => __('Selected Comments deleted successfully'),
'redirect' => route('admin.blogs.index')
]);
}
}

View File

@@ -0,0 +1,150 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Currency;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AcnooCurrencyController extends Controller
{
public function __construct()
{
$this->middleware('permission:currencies-create')->only('create', 'store');
$this->middleware('permission:currencies-read')->only('index');
$this->middleware('permission:currencies-update')->only('edit', 'update', 'default');
$this->middleware('permission:currencies-delete')->only('destroy');
}
public function index(Request $request)
{
$currencies = Currency::orderBy('is_default', 'desc')->orderBy('status', 'desc')->when($request->search, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('name', 'like', '%' . $request->search . '%')
->orWhere('country_name', 'like', '%' . $request->search . '%')
->orWhere('code', 'like', '%' . $request->search . '%')
->orWhere('symbol', 'like', '%' . $request->search . '%');
});
})->latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.currencies.datas', compact('currencies'))->render()
]);
}
return view('admin.currencies.index', compact('currencies'));
}
public function create()
{
$countries = base_path('lang/countrylist.json');
$countries = json_decode(file_get_contents($countries), true);
return view('admin.currencies.create', compact('countries'));
}
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|unique:currencies',
'country_name' => 'nullable|string',
'code' => 'required|string|unique:currencies',
'rate' => 'nullable|numeric',
'symbol' => 'nullable|string',
'position' => 'nullable|string',
'status' => 'required|integer',
'is_default' => 'nullable|boolean',
]);
Currency::create($request->all());
return response()->json([
'message' => __('Currency Created successfully'),
'redirect' => route('admin.currencies.index')
]);
}
public function edit(Currency $currency)
{
$countries = base_path('lang/countrylist.json');
$countries = json_decode(file_get_contents($countries), true);
return view('admin.currencies.edit', compact('currency', 'countries'));
}
public function update(Request $request, Currency $currency)
{
$request->validate([
'name' => 'required|string|unique:currencies,name,' . $currency->id,
'country_name' => 'nullable|string',
'code' => 'required|string|unique:currencies,code,' . $currency->id,
'rate' => 'nullable|numeric',
'symbol' => 'nullable|string',
'position' => 'nullable|string',
'status' => 'required|integer',
'is_default' => 'nullable|boolean',
]);
$currency->update($request->all());
return response()->json([
'message' => __('Currency updated successfully'),
'redirect' => route('admin.currencies.index')
]);
}
public function default($id)
{
$currency = Currency::find($id);
if ($currency) {
Currency::where('id', '!=', $id)->update(['is_default' => 0]);
$currency->update(['is_default' => 1]);
cache()->forget('default_currency');
}
return redirect()->route('admin.currencies.index')->with('message', __('Default currency activated successfully'));
}
public function destroy(Currency $currency)
{
if ($currency->is_default) {
return response()->json([
'message' => __('You cannot delete it because it is default currency'),
'redirect' => route('admin.currencies.index')
], 400);
}
$currency->delete();
return response()->json([
'message' => __('Currency deleted successfully'),
'redirect' => route('admin.currencies.index')
], 200);
}
public function deleteAll(Request $request)
{
$default_currency_id = Currency::where('is_default', 1)->value('id');
if (count($request->ids) === 1 && in_array($default_currency_id, $request->ids)) {
return response()->json([
'message' => __('You cannot delete the default currency.'),
'redirect' => route('admin.currencies.index')
], 400);
}
$idsToDelete = array_filter($request->ids, function ($id) use ($default_currency_id) {
return $id != $default_currency_id;
});
Currency::whereIn('id', $idsToDelete)->delete();
return response()->json([
'message' => __('Selected currencies deleted successfully.'),
'redirect' => route('admin.currencies.index')
]);
}
}

View File

@@ -0,0 +1,117 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Feature;
use App\Helpers\HasUploader;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
class AcnooFeatureController extends Controller
{
use HasUploader;
public function index(Request $request)
{
$features = Feature::when($request->search, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('title', 'like', '%' . $request->search . '%');
});
})->latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.website-setting.features.datas', compact('features'))->render()
]);
}
return view('admin.website-setting.features.index', compact('features'));
}
public function create()
{
return view('admin.website-setting.features.create');
}
public function store(Request $request)
{
$request->validate([
'status' => 'required',
'title' => 'required',
'bg_color' => 'required',
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif',
]);
Feature::create($request->except('image') + [
'image' => $request->image ? $this->upload($request, 'image') : NULL
]);
return response()->json([
'message' => __('Feature created successfully'),
'redirect' => route('admin.features.index')
]);
}
public function edit(Feature $feature)
{
return view('admin.website-setting.features.edit', compact('feature'));
}
public function update(Request $request, Feature $feature)
{
$request->validate([
'status' => 'required',
'title' => 'required|string',
'bg_color' => 'required|string',
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif',
]);
$feature->update($request->except('image') + [
'image' => $request->image ? $this->upload($request, 'image', $feature->image) : $feature->image,
]);
return response()->json([
'message' => __('Feature updated successfully'),
'redirect' => route('admin.features.index')
]);
}
public function destroy(Feature $feature)
{
if (file_exists($feature->image)) {
Storage::delete($feature->image);
}
$feature->delete();
return response()->json([
'message' => __('Feature deleted successfully'),
'redirect' => route('admin.features.index')
]);
}
public function status(Request $request, $id)
{
$feature = Feature::findOrFail($id);
$feature->update(['status' => $request->status]);
return response()->json(['message' => 'Feature ']);
}
public function deleteAll(Request $request)
{
$features = Feature::whereIn('id', $request->ids)->get();
foreach ($features as $feature) {
if (file_exists($feature->image)) {
Storage::delete($feature->image);
}
}
$features->each->delete();
return response()->json([
'message' => __('Selected Feature deleted successfully'),
'redirect' => route('admin.features.index')
]);
}
}

View File

@@ -0,0 +1,111 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Helpers\HasUploader;
use Illuminate\Http\Request;
use App\Models\PosAppInterface;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
class AcnooInterfaceController extends Controller
{
use HasUploader;
public function index(Request $request)
{
$interfaces = PosAppInterface::latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.website-setting.interfaces.datas', compact('interfaces'))->render()
]);
}
return view('admin.website-setting.interfaces.index', compact('interfaces'));
}
public function create()
{
return view('admin.website-setting.interfaces.create');
}
public function store(Request $request)
{
$request->validate([
'status' => 'required',
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif',
]);
PosAppInterface::create($request->except('image') + [
'image' => $request->image ? $this->upload($request, 'image') : NULL
]);
return response()->json([
'message' => __('Interfaces created successfully'),
'redirect' => route('admin.interfaces.index')
]);
}
public function edit($id)
{
$interface = PosAppInterface::findOrFail($id);
return view('admin.website-setting.interfaces.edit', compact('interface'));
}
public function update(Request $request, $id)
{
$interface = PosAppInterface::findOrFail($id);
$request->validate([
'status' => 'required',
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif',
]);
$interface->update($request->except('image') + [
'image' => $request->image ? $this->upload($request, 'image', $interface->image) : $interface->image,
]);
return response()->json([
'message' => __('Interface updated successfully'),
'redirect' => route('admin.interfaces.index')
]);
}
public function destroy($id)
{
$posAppInterface = PosAppInterface::findOrFail($id);
if (file_exists($posAppInterface->image)) {
Storage::delete($posAppInterface->image);
}
$posAppInterface->delete();
return response()->json([
'message' => __('Interface deleted successfully'),
'redirect' => route('admin.interfaces.index')
]);
}
public function status(Request $request,$id)
{
$posAppInterface = PosAppInterface::findOrFail($id);
$posAppInterface->update(['status' => $request->status]);
return response()->json(['message' => 'Interface ']);
}
public function deleteAll(Request $request)
{
$posAppInterfaces = PosAppInterface::whereIn('id', $request->ids)->get();
foreach ($posAppInterfaces as $posAppInterface) {
if (file_exists($posAppInterface->image)) {
Storage::delete($posAppInterface->image);
}
}
$posAppInterfaces->each->delete();
return response()->json([
'message' => __('Selected Interface deleted successfully'),
'redirect' => route('admin.interfaces.index')
]);
}
}

View File

@@ -0,0 +1,118 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Language;
use App\Helpers\HasUploader;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
class AcnooLanguageController extends Controller
{
use HasUploader;
public function index(Request $request)
{
$languages = Language::when($request->has('search'), function ($q) use ($request) {
$q->where(function ($query) use ($request) {
$query->where('name', 'like', '%' . $request->search . '%');
});
})
->latest();
if ($request->ajax()) {
$languages = $languages->get();
return response()->json([
'data' => view('admin.website-setting.languages.datas', compact('languages'))->render()
]);
}
$languages = $languages->paginate(20);
return view('admin.website-setting.languages.index', compact('languages'));
}
public function create()
{
return view('admin.website-setting.languages.create');
}
public function store(Request $request)
{
$request->validate([
'status' => 'required',
'name' => 'required|string',
'icon' => 'nullable|image|mimes:jpeg,png,jpg,gif',
]);
Language::create($request->except('icon') + [
'icon' => $request->icon ? $this->upload($request, 'icon') : NULL
]);
return response()->json([
'message' => __('Laguage created successfully'),
'redirect' => route('admin.languages.index')
]);
}
public function edit(Language $language)
{
return view('admin.website-setting.languages.edit', compact('language'));
}
public function update(Request $request, Language $language)
{
$request->validate([
'status' => 'required',
'name' => 'required|string',
'icon' => 'nullable|image|mimes:jpeg,png,jpg,gif',
]);
$language->update($request->except('icon') + [
'icon' => $request->icon ? $this->upload($request, 'icon', $language->icon) : $language->icon,
]);
return response()->json([
'message' => __('Language updated successfully'),
'redirect' => route('admin.languages.index')
]);
}
public function destroy(Language $language)
{
if (file_exists($language->icon)) {
Storage::delete($language->icon);
}
$language->delete();
return response()->json([
'message' => __('Language deleted successfully'),
'redirect' => route('admin.languages.index')
]);
}
public function status(Request $request, $id)
{
$language = Language::findOrFail($id);
$language->update(['status' => $request->status]);
return response()->json(['message' => 'Language ']);
}
public function deleteAll(Request $request)
{
$languages = Language::whereIn('id', $request->ids)->get();
foreach ($languages as $language) {
if (file_exists($language->icon)) {
Storage::delete($language->icon);
}
}
$languages->each->delete();
return response()->json([
'message' => __('Selected Language deleted successfully'),
'redirect' => route('admin.languages.index')
]);
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Message;
use Illuminate\Http\Request;
class AcnooMessageController extends Controller
{
public function __construct()
{
$this->middleware('permission:messages-read')->only('index');
$this->middleware('permission:messages-delete')->only('destroy');
}
public function index(Request $request)
{
$messages = Message::when($request->search, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('name', 'like', '%' . $request->search . '%')
->orWhere('phone', 'like', '%' . $request->search . '%')
->orWhere('email', 'like', '%' . $request->search . '%')
->orWhere('company_name', 'like', '%' . $request->search . '%')
->orWhere('message', 'like', '%' . $request->search . '%');
});
})->latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.messages.datas', compact('messages'))->render()
]);
}
return view('admin.messages.index', compact('messages'));
}
public function destroy(Message $message)
{
$message->delete();
return response()->json([
'message' => __('Message deleted successfully'),
'redirect' => route('admin.messages.index')
]);
}
public function deleteAll(Request $request)
{
Message::whereIn('id', $request->ids)->delete();
return response()->json([
'message' => __('Selected Mesages deleted successfully'),
'redirect' => route('admin.messages.index')
]);
}
}

View File

@@ -0,0 +1,164 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Plan;
use App\Models\PlanSubscribe;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class AcnooPlanController extends Controller
{
public function __construct()
{
$this->middleware('permission:plans-create')->only('create', 'store');
$this->middleware('permission:plans-read')->only('index');
$this->middleware('permission:plans-update')->only('edit', 'update', 'status');
$this->middleware('permission:plans-delete')->only('destroy', 'deleteAll');
}
public function index(Request $request)
{
$search = $request->input('search');
$plans = Plan::when($request->search, function ($q) use ($search) {
$q->where(function ($q) use ($search) {
$q->where('subscriptionName', 'like', '%' . $search . '%')
->orWhere('duration', 'like', '%' . $search . '%')
->orWhere('subscriptionPrice', 'like', '%' . $search . '%');
});
})->latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.plans.datas', compact('plans'))->render()
]);
}
return view('admin.plans.index', compact('plans'));
}
public function create()
{
return view('admin.plans.create');
}
public function store(Request $request)
{
$request->validate([
'duration' => 'required|string',
'offerPrice' => 'nullable|numeric|min:0|max:9999999999999',
'subscriptionName' => 'required|string|max:255|unique:plans,subscriptionName',
'subscriptionPrice' => 'required|numeric|min:0|max:9999999999999',
'addon_domain_limit' => 'nullable|integer|min:0',
'subdomain_limit' => 'nullable|integer|min:0',
]);
Plan::create($request->except(['offerPrice', 'status', 'allow_multibranch']) + [
'offerPrice' => $request->offerPrice ?? NULL,
'status' => $request->status ? 1 : 0,
'allow_multibranch' => $request->allow_multibranch ? 1 : 0,
]);
return response()->json([
'message' => __('Subscription Plan created successfully'),
'redirect' => route('admin.plans.index')
]);
}
public function edit(Plan $plan)
{
return view('admin.plans.edit', compact('plan'));
}
public function update(Request $request, Plan $plan)
{
$request->validate([
'duration' => 'required|string',
'offerPrice' => 'nullable|numeric|min:0|max:9999999999999',
'subscriptionPrice' => 'required|numeric|min:0|max:9999999999999',
'subscriptionName' => 'required|string|max:255|unique:plans,subscriptionName,' . $plan->id,
'addon_domain_limit' => 'nullable|integer|min:0',
'subdomain_limit' => 'nullable|integer|min:0',
]);
if ($plan->subscriptionName == 'Free' && ($plan->subscriptionName != $request->subscriptionName || $plan->subscriptionPrice != $request->subscriptionPrice || $plan->offerPrice != $request->offerPrice)) {
return response()->json([
'message' => __('You can not change the package name & price of free plan.'),
], 406);
}
DB::beginTransaction();
try {
$plan->update($request->except(['offerPrice', 'status', 'allow_multibranch']) + [
'offerPrice' => $request->offerPrice ?? NULL,
'status' => $request->status ? 1 : 0,
'allow_multibranch' => $request->allow_multibranch ? 1 : 0,
]);
if ($request->allow_existing_subscriber){
$updateData = [
'allow_multibranch' => $request->allow_multibranch ? 1 : 0,
'addon_domain_limit' => $request->addon_domain_limit ?? 0,
'subdomain_limit' => $request->subdomain_limit ?? 0,
];
PlanSubscribe::where('plan_id', $plan->id)->update($updateData);
}
DB::commit();
return response()->json([
'message' => __('Subscription Plan updated successfully'),
'redirect' => route('admin.plans.index')
]);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'message' => 'Something went wrong.',
'error' => $e->getMessage()
], 500);
}
}
public function status(Request $request, $id)
{
$plan = Plan::findOrFail($id);
if ($plan->subscriptionName == 'Free') {
return response()->json([
'message' => __('You can not change the status for free plan.'),
], 406);
}
$plan->update(['status' => $request->status]);
return response()->json(['message' => 'Plan']);
}
public function destroy($id)
{
$plan = Plan::findOrFail($id);
if ($plan->subscriptionName == 'Free') {
return response()->json([
'message' => __('You can not delete free plan.'),
], 406);
}
$plan->delete();
return response()->json([
'message' => __('Subscription Plan deleted successfully'),
'redirect' => route('admin.plans.index')
]);
}
public function deleteAll(Request $request)
{
Plan::whereIn('id', $request->ids)->where('subscriptionName', '!=', 'Free')->delete();
return response()->json([
'message' => __('Subscription plan deleted successfully'),
'redirect' => route('admin.plans.index')
]);
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Option;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
class AcnooPrivacyPloicyController extends Controller
{
public function index()
{
$privacy_policy = Option::where('key', 'privacy-policy')->first();
return view('admin.settings.privacy-policy.index', compact('privacy_policy'));
}
public function store(Request $request)
{
$request->validate([
'privacy_title' => 'required|string',
'description_one' => 'required|string',
'description_two' => 'required|string',
]);
Option::updateOrCreate(
['key' => 'privacy-policy'],
['value' => [
'privacy_title' => $request->privacy_title,
'description_one' => $request->description_one,
'description_two' => $request->description_two
]]
);
Cache::forget('privacy-policy');
return response()->json(__('Privacy And Policy updated successfully.'));
}
}

View File

@@ -0,0 +1,63 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Option;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
class AcnooSettingsManagerController extends Controller
{
public function index()
{
$otp = Option::where('key', 'email-varification')->first();
$domain = Option::where('key', 'domain-setting')->first();
return view('admin.manage-settings.index', compact('otp', 'domain'));
}
public function store(Request $request)
{
$request->validate([
'otp_status' => 'required|string|max:100|in:on,off',
'otp_expiration_time' => 'nullable|string|max:100',
'otp_duration_type' => 'nullable|string|max:100|in:minute,second',
]);
$otpExpiration = $request->otp_status === 'on' ? $request->otp_expiration_time : null;
$otpDurationType = $request->otp_status === 'on' ? $request->otp_duration_type : null;
Option::updateOrCreate(
['key' => 'email-varification'],
['value' => [
'otp_status' => $request->otp_status,
'otp_expiration_time' => $otpExpiration,
'otp_duration_type' => $otpDurationType,
]]
);
Cache::forget('email-varification');
return response()->json(__('Otp setting updated successfully.'));
}
public function domain(Request $request)
{
$request->validate([
'ssl_required' => 'required|string|max:100|in:on,off',
'automatic_approve' => 'required|string|max:100|in:on,off',
]);
Option::updateOrCreate(
['key' => 'domain-setting'],
['value' => [
'ssl_required' => $request->ssl_required,
'automatic_approve' => $request->automatic_approve,
]]
);
Cache::forget('domain-setting');
return response()->json(__('Domain setting updated successfully.'));
}
}

View File

@@ -0,0 +1,144 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\PlanSubscribe;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Cache;
use Modules\AffiliateAddon\App\Models\Affiliate;
use Modules\AffiliateAddon\App\Models\AffiliateTransaction;
class AcnooSubscriptionController extends Controller
{
public function index(Request $request)
{
$search = $request->input('search');
$subscribers = PlanSubscribe::with(['plan:id,subscriptionName', 'business:id,companyName,business_category_id,pictureUrl', 'business.category:id,name', 'gateway:id,name'])
->when($request->search, function ($q) use ($search) {
$q->where(function ($q) use ($search) {
$q->where('duration', 'like', '%' . $search . '%')
->orWhereHas('plan', function ($q) use ($search) {
$q->where('subscriptionName', 'like', '%' . $search . '%');
})
->orWhereHas('gateway', function ($q) use ($search) {
$q->where('name', 'like', '%' . $search . '%');
})
->orWhereHas('business', function ($q) use ($search) {
$q->where('companyName', 'like', '%' . $search . '%')
->orWhereHas('category', function ($q) use ($search) {
$q->where('name', 'like', '%' . $search . '%');
});
});
});
})
->latest()
->paginate($request->per_page ?? 20)
->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.subscribe-order.datas', compact('subscribers'))->render()
]);
}
return view('admin.subscribe-order.index', compact('subscribers'));
}
public function reject(Request $request, string $id)
{
$request->validate([
'notes' => 'required|string|max:255',
]);
$reject = PlanSubscribe::findOrFail($id);
if ($reject) {
$reject->update([
'payment_status' => 'reject',
'notes' => $request->notes,
]);
return response()->json([
'message' => 'Status Unpaid',
'redirect' => route('admin.subscription-orders.index'),
]);
} else {
return response()->json(['message' => 'request not found'], 404);
}
}
public function paid(Request $request, string $id)
{
$request->validate([
'notes' => 'required|string|max:255',
]);
DB::beginTransaction();
try {
$subscribe = PlanSubscribe::findOrFail($id);
$existingNotes = $subscribe->notes ?? [];
$updatedNotes = array_merge($existingNotes, ['reason' => $request->notes]);
$subscribe->update($request->except('notes') + [
'payment_status' => 'paid',
'notes' => $updatedNotes,
]);
$subscribe->business->update([
'subscriptionDate' => now(),
'plan_subscribe_id' => $subscribe->id,
'will_expire' => now()->addDays($subscribe->plan->duration),
]);
$business = $subscribe->business;
$plan = $subscribe->plan;
if (moduleCheck('AffiliateAddon') && $business->affiliator_id) {
$affiliateUser = User::find($business->affiliator_id);
if ($affiliateUser && $plan->affiliate_commission > 0) {
$commission = ($plan->subscriptionPrice * $plan->affiliate_commission) / 100;
Affiliate::where('user_id', $affiliateUser->id)->increment('balance', $commission);
AffiliateTransaction::create([
'user_id' => $affiliateUser->id,
'business_id' => $business->id,
'trx' => strtoupper(str()->random(10)),
'type' => 'credit',
'amount' => $commission,
'title' => 'Commission from Order #' . $subscribe->id,
'reference_id' => $subscribe->id,
'reference_type' => 'PlanSubscribe',
'note' => 'User purchased via your referral link',
]);
}
}
DB::commit();
Cache::forget('plan-data-'. $subscribe->business_id);
return response()->json([
'message' => 'Status Paid',
'redirect' => route('admin.subscription-orders.index'),
]);
} catch (\Exception $e) {
DB::rollBack();
return response()->json(['message' => 'request not found'], 500);
}
}
public function getInvoice($invoice_id)
{
$subscriber = PlanSubscribe::with(['plan:id,subscriptionName', 'business:id,companyName,business_category_id,phoneNumber,address', 'business.category:id,name', 'gateway:id,name'])->findOrFail($invoice_id);
return view('admin.subscribe-order.invoice', compact('subscriber'));
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Option;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
class AcnooTermConditionController extends Controller
{
public function index()
{
$term_condition = Option::where('key', 'term-condition')->first();
return view('admin.settings.term-condition.index', compact('term_condition'));
}
public function store(Request $request)
{
$request->validate([
'term_title' => 'required|string',
'description_one' => 'required|string',
'description_two' => 'required|string',
]);
Option::updateOrCreate(
['key' => 'term-condition'],
['value' => [
'term_title' => $request->term_title,
'description_one' => $request->description_one,
'description_two' => $request->description_two
]]
);
Cache::forget('term-condition');
return response()->json(__('Term And Condition updated successfully.'));
}
}

View File

@@ -0,0 +1,121 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Testimonial;
use App\Helpers\HasUploader;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
class AcnooTestimonialController extends Controller
{
use HasUploader;
public function __construct()
{
$this->middleware('permission:testimonials-read')->only('index');
$this->middleware('permission:testimonials-create')->only('create', 'store');
$this->middleware('permission:testimonials-update')->only('edit', 'update','status');
$this->middleware('permission:testimonials-delete')->only('destroy','deleteAll');
}
public function index(Request $request)
{
$testimonials = Testimonial::when($request->search, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('text', 'like', '%' . $request->search . '%')
->orWhere('client_name', 'like', '%' . $request->search . '%')
->orWhere('work_at', 'like', '%' . $request->search . '%');
});
})->latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.testimonials.datas', compact('testimonials'))->render()
]);
}
return view('admin.testimonials.index', compact('testimonials'));
}
public function create()
{
return view('admin.testimonials.create');
}
public function store(Request $request)
{
$request->validate([
'work_at' => 'nullable|string',
'text' => 'nullable',
'star' => 'nullable',
'client_name' => 'required|string',
'client_image' => 'nullable|image|mimes:jpeg,png,jpg,gif',
]);
Testimonial::create($request->except('client_image') + [
'client_image' => $request->client_image ? $this->upload($request, 'client_image') : NULL
]);
return response()->json([
'message' => __('Testimonial created successfully'),
'redirect' => route('admin.testimonials.index')
]);
}
public function edit(Testimonial $testimonial)
{
return view('admin.testimonials.edit', compact('testimonial'));
}
public function update(Request $request, Testimonial $testimonial)
{
$request->validate([
'work_at' => 'nullable|string',
'text' => 'nullable|string',
'star' => 'nullable|integer',
'client_name' => 'required|string',
'client_image' => 'nullable|image|mimes:jpeg,png,jpg,gif',
]);
$testimonial->update($request->except('client_image') + [
'client_image' => $request->client_image ? $this->upload($request, 'client_image', $testimonial->client_image) : $testimonial->client_image,
]);
return response()->json([
'message' => __('Testimonial updated successfully'),
'redirect' => route('admin.testimonials.index')
]);
}
public function destroy(Testimonial $testimonial)
{
if (file_exists($testimonial->client_image)) {
Storage::delete($testimonial->client_image);
}
$testimonial->delete();
return response()->json([
'message' => __('Testimonial Deleted successfully'),
'redirect' => route('admin.testimonials.index')
]);
}
public function deleteAll(Request $request)
{
$testimonials = Testimonial::whereIn('id', $request->ids)->get();
foreach ($testimonials as $testimonial) {
if (file_exists($testimonial->image)) {
Storage::delete($testimonial->image);
}
}
$testimonials->each->delete();
return response()->json([
'message' => __('Selected Testimonial deleted successfully'),
'redirect' => route('admin.testimonials.index')
]);
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Option;
use App\Helpers\HasUploader;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
class AcnooWebSettingController extends Controller
{
use HasUploader;
public function index()
{
$page_data = get_option('manage-pages');
return view('admin.website-setting.manage-pages', compact('page_data'));
}
public function update(Request $request, $key)
{
$option = Option::where('key', 'manage-pages')->first();
Option::updateOrCreate(
['key' => 'manage-pages'],
['value' => [
'headings' => $request->except('_token', '_method','slider_image','scanner_image','card_icons','compatible_image','firebase_image','contact_us_icon','footer_socials_icons','footer_scanner_image','footer_apple_app_image','footer_google_app_image','watch_image','about_image','evanto_logo', 'slider_bg_img'),
'slider_image' => $request->slider_image ? $this->upload($request, 'slider_image') : $option->value['slider_image'] ?? null,
'scanner_image' => $request->scanner_image ? $this->upload($request, 'scanner_image') : $option->value['scanner_image'] ?? null,
'watch_image' => $request->watch_image ? $this->upload($request, 'watch_image') : $option->value['watch_image'] ?? null,
'compatible_image' => $request->compatible_image ? $this->upload($request, 'compatible_image') : $option->value['compatible_image'] ?? null,
'firebase_image' => $request->firebase_image ? $this->upload($request, 'firebase_image') : $option->value['firebase_image'] ?? null,
'contact_us_icon' => $request->contact_us_icon ? $this->upload($request, 'contact_us_icon') : $option->value['contact_us_icon'] ?? null,
'footer_scanner_image' => $request->footer_scanner_image ? $this->upload($request, 'footer_scanner_image') : $option->value['footer_scanner_image'] ?? null,
'footer_apple_app_image' => $request->footer_apple_app_image ? $this->upload($request, 'footer_apple_app_image') : $option->value['footer_apple_app_image'] ?? null,
'footer_google_app_image' => $request->footer_google_app_image ? $this->upload($request, 'footer_google_app_image') : $option->value['footer_google_app_image'] ?? null,
'about_image' => $request->about_image ? $this->upload($request, 'about_image') : $option->value['about_image'] ?? null,
'evanto_logo' => $request->evanto_logo ? $this->upload($request, 'evanto_logo') : $option->value['evanto_logo'] ?? null,
'slider_bg_img' => $request->slider_bg_img ? $this->upload($request, 'slider_bg_img') : $option->value['slider_bg_img'] ?? null,
'card_icons' => $request->card_icons ? $this->multipleUpload($request, 'card_icons') : $option->value['card_icons'] ?? null,
'footer_socials_icons' => $request->footer_socials_icons ? $this->multipleUpload($request, 'footer_socials_icons') : $option->value['footer_socials_icons'] ?? null,
]
]);
Cache::forget('manage-pages');
return response()->json(__('Pages updated successfully.'));
}
}

View File

@@ -0,0 +1,87 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Modules\AffiliateAddon\App\Models\AffiliateTransaction;
use Illuminate\Support\Facades\DB;
class AcnooWithdrawRequestController extends Controller
{
public function index()
{
$withdraws = AffiliateTransaction::with('user:id,name')->latest()->paginate(20);
return view('admin.affiliate-modules.withdraws.index', compact('withdraws'));
}
public function acnooFilter(Request $request)
{
$search = $request->input('search');
$withdraws = AffiliateTransaction::with('user:id,name')->when($search, function ($q) use ($search) {
$q->where(function ($q) use ($search) {
$q->where('amount', 'like', '%' . $search . '%')
->orWhereHas('user', function ($q) use ($search) {
$q->where('name', 'like', '%' . $search . '%');
});
});
})
->latest()
->paginate($request->per_page ?? 20);
if ($request->ajax()) {
return response()->json([
'data' => view('admin.affiliate-modules.withdraws.datas', compact('withdraws'))->render()
]);
}
return redirect(url()->previous());
}
public function reject(Request $request, string $id)
{
$request->validate([
'note' => 'required|string|max:255',
]);
$reject = AffiliateTransaction::findOrFail($id);
if ($reject) {
$reject->update([
'status' => 'unpaid',
'note' => $request->note,
]);
return response()->json([
'message' => 'Status Unpaid',
'redirect' => route('admin.affiliate-withdrawals.index'),
]);
} else {
return response()->json(['message' => 'request not found'], 404);
}
}
public function paid(Request $request, string $id)
{
$request->validate([
'note' => 'nullable|string|max:255',
]);
$paid = AffiliateTransaction::findOrFail($id);
if ($paid) {
$paid->update([
'status' => 'paid',
'note' => $request->note,
]);
return response()->json([
'message' => 'Status Paid',
'redirect' => route('admin.affiliate-withdrawals.index'),
]);
} else {
return response()->json(['message' => 'request not found'], 404);
}
}
}

View File

@@ -0,0 +1,117 @@
<?php
namespace App\Http\Controllers\Admin;
use ZipArchive;
use Illuminate\Http\Request;
use Nwidart\Modules\Facades\Module;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Artisan;
class AddonController extends Controller
{
public function index()
{
return view('admin.addons.index');
}
public function store(Request $request)
{
$request->validate([
'purchase_code' => 'required',
'file' => 'required|file|mimes:zip',
]);
try {
$is_valid = true;
$module_name = pathinfo($request->file('file')->getClientOriginalName(), PATHINFO_FILENAME);
if ($is_valid || $request->purchase_code == 'acnoo_license') {
$uploadedFile = $request->file('file');
// Open the ZIP file using ZipArchive without saving it first
$zip = new ZipArchive;
$tempFilePath = $uploadedFile->getRealPath();
// Check if the ZIP file can be opened
if ($zip->open($tempFilePath) === TRUE) {
// Define the path to the Modules folder
$destinationPath = base_path('Modules');
// Ensure the Modules folder exists
if (!File::exists($destinationPath)) {
File::makeDirectory($destinationPath, 0755, true);
}
$zip->extractTo($destinationPath);
$zip->close();
// Specify the path to the module's migrations folder
$moduleMigrationsPath = base_path('Modules/' . $module_name . '/Database/migrations');
// Check if the migrations folder exists and contains migration files
if (File::exists($moduleMigrationsPath)) {
// Dynamically add the module's migrations path to the migrator
$migrator = app('migrator');
$migrator->path($moduleMigrationsPath);
// Run the migrations from the module's migration path
Artisan::call('migrate', ['--force' => true]);
}
if (!moduleCheck($module_name)) {
Artisan::call('module:seed', ['module' => $module_name]);
}
// Update the modules_statuses.json file
$filePath = base_path('modules_statuses.json');
// Read the contents of the JSON file
$jsonContents = File::get($filePath);
// Decode the JSON into an associative array
$data = json_decode($jsonContents, true);
// Add the new key-value pair to the array
$data[$module_name] = true;
// Encode the array back into JSON format
$newJsonContents = json_encode($data, JSON_PRETTY_PRINT);
// Write the updated contents back to the file
File::put($filePath, $newJsonContents);
Artisan::call('cache:clear');
Artisan::call('config:clear');
Artisan::call('route:clear');
Artisan::call('view:clear');
return response()->json([
'message' => 'Addon installed successfully.',
'redirect' => route('admin.addons.index'),
]);
} else {
return response()->json('Failed to open ZIP file', 406);
}
} else {
return response()->json(['message' => __('Invalid purchase code.')], 406);
}
} catch (\Exception $e) {
return response()->json(['success' => false, 'message' => $e->getMessage()]);
}
}
public function show($module)
{
$module = Module::findOrFail($module);
if ($module->isEnabled()) {
$module->disable();
} else {
$module->enable();
}
return response()->json([
'message' => 'Addon'
]);
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Plan;
use App\Models\User;
use App\Models\Business;
use App\Models\PlanSubscribe;
use App\Models\BusinessCategory;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class DashboardController extends Controller
{
public function index()
{
$businesses = Business::with('enrolled_plan:id,plan_id', 'enrolled_plan.plan:id,subscriptionName', 'category:id,name')->latest()->take(5)->get();
return view('admin.dashboard.index', compact('businesses'));
}
public function getDashboardData()
{
$data['total_businesses'] = Business::count();
$data['expired_businesses'] = Business::where('will_expire', '<', now())->count();
$data['plan_subscribes'] = PlanSubscribe::count();
$data['business_categories'] = BusinessCategory::count();
$data['total_plans'] = Plan::count();
$data['total_staffs'] = User::whereNotIn('role', ['superadmin', 'staff', 'shop-owner'])->count();
return response()->json($data);
}
public function yearlySubscriptions()
{
$subscriptions = PlanSubscribe::whereYear('created_at', request('year') ?? date('Y'))
->selectRaw('MONTHNAME(created_at) as month, SUM(price) as total_amount')
->groupBy('month')
->get();
return response()->json($subscriptions);
}
public function plansOverview()
{
$subscription = PlanSubscribe::with('plan:id,subscriptionName')->select('plan_id', DB::raw('COUNT(*) as plan_count'))
->groupBy('plan_id')
->orderByDesc('plan_count')
->limit(4)
->get();
return response()->json($subscription);
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Helpers\HasUploader;
use App\Http\Controllers\Controller;
use App\Models\Currency;
use App\Models\Gateway;
use Illuminate\Http\Request;
class GatewayController extends Controller
{
use HasUploader;
/**
* Display a listing of the resource.
*/
public function index()
{
$gateways = Gateway::all();
$currencies = Currency::latest()->get();
return view('admin.gateways.index', compact('gateways', 'currencies'));
}
/**
* Store a newly created resource in storage.
*/
public function update(Request $request, $id)
{
Gateway::findOrFail($id)->update($request->except('image') + [
'image' => $request->hasFile('image') ? $this->upload($request, 'image') : NULL
]);
return response()->json('Gateway updated successfully');
}
}

View File

@@ -0,0 +1,56 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Notification;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class NotificationController extends Controller
{
public function __construct()
{
$this->middleware('permission:notifications-read')->only('mtIndex');
}
public function mtIndex()
{
$notifications = auth()->user()->notifications()
->whereDate('created_at', today())
->latest()
->get();
return view('admin.notifications.index', compact('notifications'));
}
public function acnooFilter(Request $request)
{
$notifications = Notification::whereDate('created_at', today())->latest()->paginate($request->per_page ?? 20);
if ($request->ajax()) {
return response()->json([
'data' => view('admin.notifications.datas', compact('notifications'))->render()
]);
}
return redirect(url()->previous());
}
public function mtView($id)
{
$notify = Notification::find($id);
if ($notify) {
$notify->read_at = now();
$notify->save();
return redirect($notify->data['url'] ?? '/');
}
return back()->with('error', __('Premission denied.'));
}
public function mtReadAll()
{
auth()->user()->unreadNotifications()->update(['read_at' => now()]);
return back();
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Spatie\Permission\Models\Role;
class PermissionController extends Controller
{
public function __construct()
{
$this->middleware('permission:permissions-read')->only('index','search');
$this->middleware('permission:permissions-create')->only('store');
}
public function index(Request $request)
{
$users = User::whereNotIn('role', ['shop-owner', 'staff', 'superadmin'])->get();
$roles = Role::where('name', '!=', 'superadmin')->get();
return view('admin.permissions.index', compact('roles', 'users'));
}
public function store(Request $request)
{
$request->validate([
'user' => ['required', 'exists:users,id'],
'roles' => ['required', 'exists:roles,id']
]);
$user = User::findOrFail($request->input('user'));
$user->roles()->sync($request->input('roles'));
return response()->json([
'message' => __('Role permissions assigned successfully.'),
'redirect' => route('admin.permissions.index')
]);
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Helpers\HasUploader;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class ProfileController extends Controller
{
use HasUploader;
public function index()
{
$user = User::where('id',Auth::user()->id)->first();
return view('admin.profile.index',compact('user'));
}
public function update(Request $request, string $id)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email',
'image' => 'nullable|image',
]);
$user = User::findOrFail($id);
if( $request->password || $request->current_password){
if(Hash::check($request->current_password,$user->password)){
$request->validate([
'current_password' => 'required|string',
'password' => 'required|string|confirmed',
]);
}
else{
return response()->json(__('Current Password does not match with old password'),404);
}
}
$user->update($request->except('image', 'password') + [
'image' => $request->image ? $this->upload($request, 'image', $user->image) : $user->image,
] + ($request->password ? ['password' => Hash::make($request->password)] : [])
);
return response()->json([
'message' => __('Profile updated successfully'),
'redirect' => route('admin.profiles.index')
]);
}
}

View File

@@ -0,0 +1,104 @@
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
class RoleController extends Controller
{
private $role;
public function __construct()
{
$this->middleware('permission:roles-create')->only('create', 'store');
$this->middleware('permission:roles-read')->only('index', 'show');
$this->middleware('permission:roles-update')->only('edit', 'update');
$this->middleware('permission:roles-delete')->only('destroy');
}
public function index()
{
$roles = Role::with('users')->whereNotIn('name', ['Super Admin', 'superadmin', 'super admin'])->withCount('users')->get();
return view('admin.roles.index', compact('roles'));
}
public function create()
{
$groups = [];
foreach (Permission::all() as $index => $permission) {
$groups[ucwords(str($permission->name)->remove(['-create','-read','-update','-delete'])->replace('-', ' '))][] = $permission;
}
return view('admin.roles.create', compact('groups'));
}
public function store(Request $request)
{
$request->validate([
'name' => ['required', 'string', 'unique:roles,name'],
'permissions' => ['required','array'],
'permissions.*' => ['required', 'exists:permissions,id']
]);
DB::transaction(function ()use ($request){
$this->role = Role::create([
'name' => $request->input('name')
]);
$this->role->permissions()->sync($request->input('permissions'));
});
return response()->json([
'message' => __('Role created successfully'),
'redirect' => route('admin.roles.index')
]);
}
public function edit(Role $role)
{
abort_if(in_array($role->name, ['Super Admin', 'superadmin', 'super admin']), 403, __("You are not allowed to mess with Super Admin"));
$role->load('permissions');
$groups = [];
foreach (Permission::all() as $index => $permission) {
$groups[ucwords(str($permission->name)->remove(['-', 'create','read','update','delete','status','list','folder']))][] = $permission;
}
return view('admin.roles.edit', compact('role', 'groups'));
}
public function update(Request $request, Role $role)
{
abort_if(in_array($role->name, ['Super Admin', 'superadmin', 'super admin']), 403, __("You are not allowed to mess with Super Admin"));
$request->validate([
'name' => ['required', 'string', Rule::unique('roles')->ignore($role->id)],
'permissions' => ['required','array'],
'permissions.*' => ['required', 'exists:permissions,id']
]);
$role->update([
'name' => $request->input('name')
]);
$role->permissions()->sync($request->input('permissions'));
return response()->json([
'message' => __('Role update successfully'),
'redirect' => route('admin.roles.index')
]);
}
public function destroy(Role $role)
{
abort_if(in_array($role->name, ['Super Admin', 'superadmin', 'super admin']), 403, __("You are not allowed to mess with Super Admin"));
$role->delete();
return response()->json([
'message' => __('Role deleted successfully'),
'redirect' => route('admin.roles.index')
]);
}
}

View File

@@ -0,0 +1,63 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Helpers\HasUploader;
use App\Http\Controllers\Controller;
use App\Models\Option;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class SettingController extends Controller
{
use HasUploader;
public function __construct()
{
$this->middleware('permission:settings-read')->only('index');
$this->middleware('permission:settings-update')->only('update');
}
public function index()
{
$general = Option::where('key', 'general')->first();
$languages = json_decode(file_get_contents(base_path('lang/langlist.json')), true);
return view('admin.settings.general', compact('general', 'languages'));
}
public function update(Request $request, $id)
{
$request->validate([
'title' => 'required|string|max:100',
'logo' => 'nullable|image',
'favicon' => 'nullable|image',
'common_header_logo' => 'nullable|image',
'footer_logo' => 'nullable|image',
'admin_logo' => 'nullable|image',
'login_page_logo' => 'nullable|image',
'login_page_image' => 'nullable|image',
'app_link' => 'nullable|url',
'whatsapp_number' => 'nullable|string|max:20',
]);
$general = Option::findOrFail($id);
Cache::forget($general->key);
$general->update([
'value' => $request->except('_token', '_method', 'logo', 'favicon', 'common_header_logo', 'footer_logo', 'admin_logo', 'login_page_logo', 'login_page_image') + [
'logo' => $request->logo ? $this->upload($request, 'logo', $general->value['logo'] ?? null) : ($general->value['logo'] ?? null),
'favicon' => $request->favicon ? $this->upload($request, 'favicon', $general->value['favicon'] ?? null) : ($general->value['favicon'] ?? null),
'common_header_logo' => $request->common_header_logo ? $this->upload($request, 'common_header_logo', $general->value['common_header_logo'] ?? null) : ($general->value['common_header_logo'] ?? null),
'footer_logo' => $request->footer_logo ? $this->upload($request, 'footer_logo', $general->value['footer_logo'] ?? null) : ($general->value['footer_logo'] ?? null),
'admin_logo' => $request->admin_logo ? $this->upload($request, 'admin_logo', $general->value['admin_logo'] ?? null) : ($general->value['admin_logo'] ?? null),
'login_page_logo' => $request->login_page_logo ? $this->upload($request, 'login_page_logo', $general->value['login_page_logo'] ?? null) : ($general->value['login_page_logo'] ?? null),
'login_page_image' => $request->login_page_image ? $this->upload($request, 'login_page_image', $general->value['login_page_image'] ?? null) : ($general->value['login_page_image'] ?? null),
]
]);
return response()->json([
'message' => __('General Setting updated successfully'),
'redirect' => route('admin.settings.index')
]);
}
}

View File

@@ -0,0 +1,85 @@
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Models\PlanSubscribe;
use App\Http\Controllers\Controller;
use Illuminate\Support\Carbon;
class SubscriptionReport extends Controller
{
public function index(Request $request)
{
$subscribeQuery = PlanSubscribe::with(['plan:id,subscriptionName', 'business:id,companyName,business_category_id,pictureUrl', 'business.category:id,name', 'gateway:id,name'])->whereDate('created_at', Carbon::today()->format('Y-m-d'));
// Date filter
$startDate = Carbon::today()->format('Y-m-d');
$endDate = Carbon::today()->format('Y-m-d');
switch ($request->custom_days) {
case 'yesterday':
$startDate = $endDate = Carbon::yesterday()->format('Y-m-d');
break;
case 'last_seven_days':
$startDate = Carbon::today()->subDays(6)->format('Y-m-d');
break;
case 'last_thirty_days':
$startDate = Carbon::today()->subDays(29)->format('Y-m-d');
break;
case 'current_month':
$startDate = Carbon::now()->startOfMonth()->format('Y-m-d');
$endDate = Carbon::now()->endOfMonth()->format('Y-m-d');
break;
case 'last_month':
$startDate = Carbon::now()->subMonth()->startOfMonth()->format('Y-m-d');
$endDate = Carbon::now()->subMonth()->endOfMonth()->format('Y-m-d');
break;
case 'current_year':
$startDate = Carbon::now()->startOfYear()->format('Y-m-d');
$endDate = Carbon::now()->endOfYear()->format('Y-m-d');
break;
case 'custom_date':
if ($request->from_date && $request->to_date) {
$startDate = Carbon::parse($request->from_date)->format('Y-m-d');
$endDate = Carbon::parse($request->to_date)->format('Y-m-d');
}
break;
}
$subscribeQuery->whereDate('created_at', '>=', $startDate)
->whereDate('created_at', '<=', $endDate);
// Search filter
if ($request->filled('search')) {
$search = $request->search;
$subscribeQuery->where(function ($query) use ($search) {
$query->where('duration', 'like', '%' . $search . '%')
->orWhereHas('plan', function ($q) use ($search) {
$q->where('subscriptionName', 'like', '%' . $search . '%');
})
->orWhereHas('gateway', function ($q) use ($search) {
$q->where('name', 'like', '%' . $search . '%');
})
->orWhereHas('business', function ($q) use ($search) {
$q->where('companyName', 'like', '%' . $search . '%')
->orWhereHas('category', function ($q) use ($search) {
$q->where('name', 'like', '%' . $search . '%');
});
});
});
}
$perPage = $request->input('per_page', 20);
$subscribers = $subscribeQuery->latest()->paginate($perPage)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.subscribers.datas', compact('subscribers'))->render()
]);
}
return view('admin.subscribers.index', compact('subscribers'));
}
}

View File

@@ -0,0 +1,165 @@
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Artisan;
class SystemSettingController extends Controller
{
public function __construct()
{
$this->middleware('permission:settings-read')->only('index');
$this->middleware('permission:settings-update')->only('update');
}
public function index()
{
return view('admin.settings.system');
}
public function store(Request $request)
{
$request->validate([
'SESSION_LIFETIME' => 'required|integer',
'service_account_credentials' => 'mimes:json,txt|max:100',
]);
if ($request->hasFile('service_account_credentials')) {
$file = $request->file('service_account_credentials');
$name = 'service-account-credentials.json';
$path = 'uploads/';
$file->move($path, $name);
}
$APP_NAME = '"' . $request->APP_NAME . '"';
$txt = "APP_NAME=" . $APP_NAME . "
APP_ENV=local
APP_KEY=" . env('APP_KEY') . "
APP_DEBUG=" . $request->APP_DEBUG . "
APP_URL=" . url('/') . "
SITE_KEY=" . env('SITE_KEY') . "
AUTHORIZED_KEY=" . env('AUTHORIZED_KEY') . "
CONTENT_EDITOR=" . $request->CONTENT_EDITOR . "
ANALYTICS_VIEW_ID=" . $request->ANALYTICS_VIEW_ID . "
GA_MEASUREMENT_ID=" . $request->GA_MEASUREMENT_ID . "
FORCE_USER_TO_PURCHASE_PLAN=" . $request->FORCE_USER_TO_PURCHASE_PLAN . "
UNSUBSCRIBE_AFTER_DAYS=" . $request->UNSUBSCRIBE_AFTER_DAYS . "
DB_CONNECTION=" . env("DB_CONNECTION") . "
DB_HOST=" . env("DB_HOST") . "
DB_PORT=" . env("DB_PORT") . "
DB_DATABASE=" . env("DB_DATABASE") . "
DB_USERNAME=" . env("DB_USERNAME") . "
DB_PASSWORD=" . env("DB_PASSWORD") . "
QUEUE_MAIL=" . $request->QUEUE_MAIL . "
" . $request->MAIL_DRIVER_TYPE . "=" . $request->MAIL_DRIVER . "
MAIL_DRIVER_TYPE=" . $request->MAIL_DRIVER_TYPE . "
MAIL_HOST=" . $request->MAIL_HOST . "
MAIL_PORT=" . $request->MAIL_PORT . "
MAIL_USERNAME=" . $request->MAIL_USERNAME . "
MAIL_PASSWORD=" . $request->MAIL_PASSWORD . "
MAIL_ENCRYPTION=" . $request->MAIL_ENCRYPTION . "
MAIL_FROM_ADDRESS=" . $request->MAIL_FROM_ADDRESS . "
MAIL_TO=" . $request->MAIL_TO . "
MAIL_FROM_NAME='" . $request->MAIL_FROM_NAME . "'
MAILCHIMP_DRIVER=" . $request->MAILCHIMP_DRIVER . "
MAILCHIMP_APIKEY=" . $request->MAILCHIMP_APIKEY . "
MAILCHIMP_LIST_ID=" . $request->MAILCHIMP_LIST_ID . "
NOCAPTCHA_SECRET=" . $request->NOCAPTCHA_SECRET . "
NOCAPTCHA_SITEKEY=" . $request->NOCAPTCHA_SITEKEY . "
BROADCAST_DRIVER=pusher
CACHE_DRIVER=" . $request->CACHE_DRIVER . "
QUEUE_CONNECTION=database
SESSION_DRIVER=" . $request->SESSION_DRIVER . "
SESSION_LIFETIME=" . $request->SESSION_LIFETIME . "
PUSHER_APP_ID=" . $request->PUSHER_APP_ID . "
PUSHER_APP_KEY=" . $request->PUSHER_APP_KEY . "
PUSHER_APP_SECRET=" . $request->PUSHER_APP_SECRET . "
PUSHER_APP_CLUSTER=" . $request->PUSHER_APP_CLUSTER . "
PUSHER_SCHEME=https
MIX_PUSHER_APP_KEY=" . '${PUSHER_APP_KEY}' . "
MIX_PUSHER_APP_CLUSTER=" . '${PUSHER_APP_CLUSTER}' . "
REDIS_HOST=" . $request->REDIS_HOST . "
REDIS_PORT=" . $request->REDIS_PORT . "
REDIS_URL=" . $request->REDIS_URL . "
REDIS_PASSWORD=" . $request->REDIS_PASSWORD . "
MEMCACHED_HOST=" . $request->MEMCACHED_HOST . "
MEMCACHED_PORT=" . $request->MEMCACHED_PORT . "
MEMCACHED_PERSISTENT_ID=" . $request->MEMCACHED_PERSISTENT_ID . "
MEMCACHED_USERNAME=" . $request->MEMCACHED_USERNAME . "
MEMCACHED_PASSWORD=" . $request->MEMCACHED_PASSWORD . "
AWS_ACCESS_KEY_ID=" . $request->AWS_ACCESS_KEY_ID . "
AWS_SECRET_ACCESS_KEY=" . $request->AWS_SECRET_ACCESS_KEY . "
AWS_DEFAULT_REGION=" . $request->AWS_DEFAULT_REGION . "
AWS_BUCKET=" . $request->AWS_BUCKET . "
WAS_ACCESS_KEY_ID=" . $request->WAS_ACCESS_KEY_ID . "
WAS_SECRET_ACCESS_KEY=" . $request->WAS_SECRET_ACCESS_KEY . "
WAS_DEFAULT_REGION=" . $request->WAS_DEFAULT_REGION . "
WAS_BUCKET=" . $request->WAS_BUCKET . "
WAS_ENDPOINT=" . $request->WAS_ENDPOINT . "
DISCUSS_COMMENT_KEY=" . $request->DISCUSS_COMMENT_KEY . "
LOG_CHANNEL=stack
LOG_LEVEL=debug
CACHE_LIFETIME=" . $request->CACHE_LIFETIME . "
TIMEZONE=" . $request->TIMEZONE . "
DEFAULT_LANG=" . $request->DEFAULT_LANG . "
DISCUSS_COMMENT_KEY=" . $request->DISCUSS_COMMENT_KEY . "
FILESYSTEM_DISK=" . $request->FILESYSTEM_DISK . "
VITE_PUSHER_APP_KEY=" . '${PUSHER_APP_KEY}' . "
VITE_PUSHER_HOST=" . '${PUSHER_HOST}' . "
VITE_PUSHER_PORT=" . '${PUSHER_PORT}' . "
VITE_PUSHER_SCHEME=" . '${PUSHER_SCHEME}' . "
VITE_PUSHER_APP_CLUSTER=" . '${PUSHER_APP_CLUSTER}' . "
APILAYER_API_KEY=" . $request->APILAYER_API_KEY . "
GOOGLE_CLIENT_ID=" . $request->GOOGLE_CLIENT_ID . "
GOOGLE_CLIENT_SECRET=" . $request->GOOGLE_CLIENT_SECRET . "
GOOGLE_REDIRECT_URI=" . url('login/google/callback') . "
TWITTER_CLIENT_ID=" . $request->TWITTER_CLIENT_ID . "
TWITTER_CLIENT_SECRET=" . $request->TWITTER_CLIENT_SECRET . "
TWITTER_REDIRECT_URI=" . url('login/twitter/callback') . "
WKHTMLTOPDF_BINARY=" . $request->WKHTMLTOPDF_BINARY . "
WKHTMLTOIMAGE_BINARY=" . $request->WKHTMLTOIMAGE_BINARY . "
WKHTMLTOPDF_TIMEOUT=" . $request->WKHTMLTOPDF_TIMEOUT . "
";
File::put(base_path('.env'), $txt);
Artisan::call('config:clear');
Artisan::call('cache:clear');
return response()->json([
'message' => __('Settings updated successfully.'),
'redirect' => route('admin.system-settings.index'),
]);
}
}

View File

@@ -0,0 +1,139 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\User;
use App\Helpers\HasUploader;
use Illuminate\Http\Request;
use Spatie\Permission\Models\Role;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
class UserController extends Controller
{
use HasUploader;
public function __construct()
{
$this->middleware('permission:users-create')->only('create', 'store');
$this->middleware('permission:users-read')->only('index', 'show');
$this->middleware('permission:users-update')->only('edit', 'update');
$this->middleware('permission:users-delete')->only('destroy');
}
public function index(Request $request)
{
$users = User::whereNotIn('role', ['superadmin', 'staff', 'shop-owner'])->when($request->search, function ($q) use ($request) {
$q->where(function ($q) use ($request) {
$q->where('name', 'like', '%' . $request->search . '%')
->orWhere('email', 'like', '%' . $request->search . '%')
->orWhere('role', 'like', '%' . $request->search . '%')
->orWhere('phone', 'like', '%' . $request->search . '%');
});
})->latest()->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('admin.users.datas', compact('users'))->render()
]);
}
return view('admin.users.index', compact('users'));
}
public function create()
{
$roles = Role::where('name', '!=', 'superadmin')->latest()->get();
return view('admin.users.create', compact('roles'));
}
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'role' => 'required|string',
'phone' => 'nullable|string',
'email' => 'required|email|unique:users',
'password' => 'required|string|confirmed',
'image' => 'nullable|image',
]);
$user = User::create($request->except('image', 'password') + [
'image' => $request->image ? $this->upload($request, 'image') : null,
'password' => Hash::make($request->password),
]);
$role = Role::where('name', $request->role)->first();
$user->roles()->sync($role->id);
sendNotification($user->id, route('admin.users.index', ['users' => $request->role]), __(ucfirst($request->role) . ' has been created.'), 'action', null, null, true);
return response()->json([
'message' => __(ucfirst($request->role) . ' created successfully'),
'redirect' => route('admin.users.index', ['users' => $request->role])
]);
}
public function edit(User $user)
{
if ($user->role == 'superadmin') {
abort(403);
}
$roles = Role::latest()->get();
return view('admin.users.edit', compact('user', 'roles'));
}
public function update(Request $request, User $user)
{
if ($user->role == 'superadmin') {
return response()->json(__('You can not update a superadmin.'), 400);
}
$request->validate([
'role' => 'required|string',
'phone' => 'nullable|string',
'country' => 'nullable|string',
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email,' . $user->id,
'password' => 'nullable|string|confirmed',
'image' => 'nullable|image',
]);
$role = Role::where('name', $request->role)->first();
$user->roles()->sync($role->id);
$user->update($request->except('image', 'password') + [
'image' => $request->image ? $this->upload($request, 'image', $user->image) : $user->image,
'password' => $request->password ? Hash::make($request->password) : $user->password,
]);
return response()->json([
'message' => __('Staff updated successfully'),
'redirect' => route('admin.users.index')
]);
}
public function destroy(User $user)
{
if ($user->role == 'superadmin') {
return response()->json(__('You can not delete a superadmin.'), 400);
}
if (file_exists($user->image)) {
Storage::delete($user->image);
}
$user->delete();
return response()->json([
'message' => __('Staff deleted successfully'),
'redirect' => route('admin.users.index')
]);
}
public function deleteAll(Request $request)
{
User::whereIn('id', $request->ids)->delete();
return response()->json([
'message' => __('Selected Staff deleted successfully'),
'redirect' => route('admin.users.index')
]);
}
}