customer section
This commit is contained in:
134
app/Http/Controllers/Admin/AdminCustomerController.php
Normal file
134
app/Http/Controllers/Admin/AdminCustomerController.php
Normal file
@@ -0,0 +1,134 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class AdminCustomerController extends Controller
|
||||
{
|
||||
// ---------------------------------------------------------
|
||||
// LIST CUSTOMERS (with search + status filter)
|
||||
// ---------------------------------------------------------
|
||||
public function index(Request $request)
|
||||
{
|
||||
$search = $request->search;
|
||||
$status = $request->status;
|
||||
|
||||
$query = User::with(['marks', 'orders'])->orderBy('id', 'desc');
|
||||
|
||||
// SEARCH FILTER
|
||||
if (!empty($search)) {
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('customer_name', 'like', "%$search%")
|
||||
->orWhere('email', 'like', "%$search%")
|
||||
->orWhere('mobile_no', 'like', "%$search%")
|
||||
->orWhere('customer_id', 'like', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// STATUS FILTER
|
||||
if (!empty($status) && in_array($status, ['active', 'inactive'])) {
|
||||
$query->where('status', $status);
|
||||
}
|
||||
|
||||
$customers = $query->get();
|
||||
|
||||
return view('admin.customers', compact('customers', 'search', 'status'));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// SHOW ADD CUSTOMER FORM
|
||||
// ---------------------------------------------------------
|
||||
public function create()
|
||||
{
|
||||
return view('admin.customers_add');
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// STORE NEW CUSTOMER
|
||||
// ---------------------------------------------------------
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'customer_name' => 'required|string|max:255',
|
||||
'company_name' => 'nullable|string|max:255',
|
||||
'designation' => 'nullable|string|max:255',
|
||||
'email' => 'required|email|unique:users,email',
|
||||
'mobile_no' => 'required|string|max:20',
|
||||
'address' => 'nullable|string',
|
||||
'pincode' => 'nullable|string|max:10',
|
||||
'customer_type' => 'required|in:regular,premium',
|
||||
'status' => 'required|in:active,inactive',
|
||||
]);
|
||||
|
||||
// AUTO GENERATE CUSTOMER ID
|
||||
$year = date('Y');
|
||||
$prefix = "CID-$year-";
|
||||
|
||||
$lastCustomer = User::whereYear('created_at', $year)
|
||||
->orderBy('id', 'DESC')
|
||||
->first();
|
||||
|
||||
$next = $lastCustomer ? intval(substr($lastCustomer->customer_id, -6)) + 1 : 1;
|
||||
$customerId = $prefix . str_pad($next, 6, '0', STR_PAD_LEFT);
|
||||
|
||||
// CREATE CUSTOMER
|
||||
User::create([
|
||||
'customer_id' => $customerId,
|
||||
'customer_name' => $request->customer_name,
|
||||
'company_name' => $request->company_name,
|
||||
'designation' => $request->designation,
|
||||
'email' => $request->email,
|
||||
'mobile_no' => $request->mobile_no,
|
||||
'address' => $request->address,
|
||||
'pincode' => $request->pincode,
|
||||
'date' => date('Y-m-d'),
|
||||
'customer_type' => $request->customer_type,
|
||||
'status' => $request->status,
|
||||
'password' => Hash::make('123456'), // DEFAULT PASSWORD
|
||||
]);
|
||||
|
||||
return redirect()
|
||||
->route('admin.customers.index')
|
||||
->with('success', 'Customer added successfully!');
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// VIEW CUSTOMER FULL DETAILS
|
||||
// ---------------------------------------------------------
|
||||
public function view($id)
|
||||
{
|
||||
$customer = User::with(['marks', 'orders'])->findOrFail($id);
|
||||
|
||||
$totalOrders = $customer->orders->count();
|
||||
$totalAmount = $customer->orders->sum('ttl_amount');
|
||||
$recentOrders = $customer->orders()->latest()->take(5)->get();
|
||||
|
||||
return view('admin.customers_view', compact(
|
||||
'customer',
|
||||
'totalOrders',
|
||||
'totalAmount',
|
||||
'recentOrders'
|
||||
));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// TOGGLE STATUS ACTIVE / INACTIVE
|
||||
// ---------------------------------------------------------
|
||||
public function toggleStatus($id)
|
||||
{
|
||||
$customer = User::findOrFail($id);
|
||||
|
||||
$customer->status = $customer->status === 'active'
|
||||
? 'inactive'
|
||||
: 'active';
|
||||
|
||||
$customer->save();
|
||||
|
||||
return back()->with('success', 'Customer status updated.');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,7 +15,7 @@ class User extends Authenticatable implements JWTSubject
|
||||
* The attributes that are mass assignable.
|
||||
*/
|
||||
protected $fillable = [
|
||||
'customer_id', // CID-2025-000001 format
|
||||
'customer_id',
|
||||
'customer_name',
|
||||
'company_name',
|
||||
'designation',
|
||||
@@ -25,10 +25,15 @@ class User extends Authenticatable implements JWTSubject
|
||||
'pincode',
|
||||
'date',
|
||||
'password',
|
||||
|
||||
// newly added customer fields
|
||||
'status', // active / inactive
|
||||
'customer_type', // premium / regular
|
||||
'profile_image', // optional image
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes that should be hidden for arrays.
|
||||
* Attributes that should be hidden.
|
||||
*/
|
||||
protected $hidden = [
|
||||
'password',
|
||||
@@ -36,7 +41,7 @@ class User extends Authenticatable implements JWTSubject
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes that should be cast.
|
||||
* Attribute casting.
|
||||
*/
|
||||
protected function casts(): array
|
||||
{
|
||||
@@ -47,7 +52,30 @@ class User extends Authenticatable implements JWTSubject
|
||||
}
|
||||
|
||||
/**
|
||||
* JWT Identifier.
|
||||
* Relationship: User → MarkList (Many)
|
||||
*/
|
||||
public function marks()
|
||||
{
|
||||
return $this->hasMany(\App\Models\MarkList::class, 'customer_id', 'customer_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* Relationship: User → Orders (Through MarkList)
|
||||
*/
|
||||
public function orders()
|
||||
{
|
||||
return $this->hasManyThrough(
|
||||
\App\Models\Order::class,
|
||||
\App\Models\MarkList::class,
|
||||
'customer_id', // MarkList.customer_id
|
||||
'mark_no', // Orders.mark_no
|
||||
'customer_id', // Users.customer_id
|
||||
'mark_no' // MarkList.mark_no
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* JWT Identifier
|
||||
*/
|
||||
public function getJWTIdentifier()
|
||||
{
|
||||
@@ -55,7 +83,7 @@ class User extends Authenticatable implements JWTSubject
|
||||
}
|
||||
|
||||
/**
|
||||
* JWT Custom Claims.
|
||||
* JWT Custom Claims
|
||||
*/
|
||||
public function getJWTCustomClaims()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user