diff --git a/app/Http/Controllers/Admin/AdminStaffController.php b/app/Http/Controllers/Admin/AdminStaffController.php index 020239e..f7d8ddb 100644 --- a/app/Http/Controllers/Admin/AdminStaffController.php +++ b/app/Http/Controllers/Admin/AdminStaffController.php @@ -55,6 +55,7 @@ class AdminStaffController extends Controller DB::beginTransaction(); try { + // 1️⃣ Create staff WITHOUT employee_id (ID not available yet) $admin = Admin::create([ 'name' => $request->name, 'email' => $request->email, @@ -69,23 +70,33 @@ class AdminStaffController extends Controller 'status' => $request->status, 'additional_info' => $request->additional_info, - 'username' => $request->username, + // username may be NULL here + 'username' => $request->username ?: null, 'password' => Hash::make($request->password), 'type' => 'staff', ]); - // Generate EMPLOYEE ID using admin ID (safe) + // 2️⃣ Generate EMPLOYEE ID $employeeId = 'EMP' . str_pad($admin->id, 4, '0', STR_PAD_LEFT); - $admin->update(['employee_id' => $employeeId]); - // Assign permissions (if any) + // 3️⃣ Auto-generate username if left blank + $username = $request->username ?: strtolower($employeeId); + + // 4️⃣ Update employee_id + username together + $admin->update([ + 'employee_id' => $employeeId, + 'username' => $username, + ]); + + // 5️⃣ Assign permissions (if any) if ($request->permissions) { $admin->givePermissionTo($request->permissions); } DB::commit(); - return redirect()->route('admin.staff.index') + return redirect() + ->route('admin.staff.index') ->with('success', 'Staff created successfully.'); } catch (\Exception $e) { @@ -94,6 +105,7 @@ class AdminStaffController extends Controller } } + public function edit($id) { $staff = Admin::where('type', 'staff')->findOrFail($id); diff --git a/app/Http/Controllers/Admin/UserRequestController.php b/app/Http/Controllers/Admin/UserRequestController.php index e09c56f..eb977c6 100644 --- a/app/Http/Controllers/Admin/UserRequestController.php +++ b/app/Http/Controllers/Admin/UserRequestController.php @@ -15,7 +15,12 @@ class UserRequestController extends Controller public function index() { $requests = CustomerRequest::orderBy('id', 'desc')->get(); - return view('admin.requests', compact('requests')); + $pendingProfileUpdates = \App\Models\UpdateRequest::where('status', 'pending')->count(); + + return view('admin.requests', compact( + 'requests', + 'pendingProfileUpdates' + )); } // Approve user request diff --git a/app/Models/Admin.php b/app/Models/Admin.php index 118f371..c897aeb 100644 --- a/app/Models/Admin.php +++ b/app/Models/Admin.php @@ -18,7 +18,7 @@ class Admin extends Authenticatable 'name', 'email', 'password', 'username', 'phone', 'emergency_phone', 'address', 'role', 'department', 'designation', 'joining_date', - 'status', 'additional_info', 'type', // admin/staff indicator + 'status', 'additional_info', 'type','employee_id', // admin/staff indicator ]; protected $hidden = [ diff --git a/public/invoices/invoice-INV-2025-000016.pdf b/public/invoices/invoice-INV-2025-000016.pdf new file mode 100644 index 0000000..0a36ff8 Binary files /dev/null and b/public/invoices/invoice-INV-2025-000016.pdf differ diff --git a/public/invoices/invoice-INV-2025-000030.pdf b/public/invoices/invoice-INV-2025-000030.pdf index 2f12f72..593eead 100644 Binary files a/public/invoices/invoice-INV-2025-000030.pdf and b/public/invoices/invoice-INV-2025-000030.pdf differ diff --git a/resources/views/admin/layouts/app.blade.php b/resources/views/admin/layouts/app.blade.php index 7f63cc7..04b1698 100644 --- a/resources/views/admin/layouts/app.blade.php +++ b/resources/views/admin/layouts/app.blade.php @@ -201,7 +201,7 @@ background: #fff; padding: 10px 18px !important; position: relative; - height: 48px; + height: 65px; width: 100%; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); } @@ -221,6 +221,32 @@ font-size: 1.06rem; font-weight: 500; } + + /* ================================ + HEADER NOTIFICATION BADGE FIX +================================ */ + +/* Target ONLY badge inside bell icon */ +header .bi-bell { + position: relative; +} + +/* Override broken global badge styles */ +header .bi-bell .badge { + width: 22px !important; + height: 22px !important; + min-width: 22px !important; + padding: 0 !important; + font-size: 12px !important; + line-height: 22px !important; + border-radius: 50% !important; + display: inline-flex !important; + align-items: center; + justify-content: center; + animation: none !important; + box-shadow: 0 0 0 2px #ffffff; +} + @@ -285,12 +311,12 @@ @endcan - {{-- Profile Update Requests --}} + {{-- Staff (NO PERMISSION REQUIRED) --}} diff --git a/resources/views/admin/profile_update_requests.blade.php b/resources/views/admin/profile_update_requests.blade.php index 4797665..e6938ce 100644 --- a/resources/views/admin/profile_update_requests.blade.php +++ b/resources/views/admin/profile_update_requests.blade.php @@ -5,107 +5,207 @@ @section('content')
- @php - $perPage = 5; - $currentPage = request()->get('page', 1); - $currentPage = max(1, (int)$currentPage); - $total = $requests->count(); - $totalPages = ceil($total / $perPage); - $currentItems = $requests->slice(($currentPage - 1) * $perPage, $perPage); - @endphp +@php + $perPage = 5; + $currentPage = request()->get('page', 1); + $currentPage = max(1, (int)$currentPage); + $total = $requests->count(); + $currentItems = $requests->slice(($currentPage - 1) * $perPage, $perPage); +@endphp - + + +

Profile Update Requests ({{ $total }})

+ +@foreach($currentItems as $index => $req) +@php + $user = $req->user; + $newData = is_array($req->data) ? $req->data : json_decode($req->data, true); +@endphp + +
+ + + + + +
+ @foreach(['customer_name','company_name','email'] as $field) + @php + $old = $user->$field ?? '—'; + $new = $newData[$field] ?? $old; + @endphp +
+
{{ ucfirst(str_replace('_',' ', $field)) }}
+
Old: {{ $old }}
+
New: {{ $new }}
+
+ @endforeach +
+ + +
+ @foreach(['mobile_no','address','pincode'] as $field) + + @php + $old = $user->$field ?? '—'; + $new = $newData[$field] ?? $old; + @endphp +
+
{{ ucfirst(str_replace('_',' ', $field)) }}
+
Old: {{ $old }}
+
New: {{ $new }}
+
+ @endforeach +
+ +
+@endforeach +
@endsection diff --git a/resources/views/admin/requests.blade.php b/resources/views/admin/requests.blade.php index cab3f38..a4e598b 100644 --- a/resources/views/admin/requests.blade.php +++ b/resources/views/admin/requests.blade.php @@ -307,13 +307,54 @@ justify-content: center; } } +/* ============================================== + PROFILE UPDATE REQUEST BUTTON BADGE FIX +============================================== */ + +/* Ensure button is positioning context */ +a.btn.btn-primary.position-relative { + position: relative; + margin-right: 10px; +} + +/* Fix badge inside Profile Update Requests button */ +a.btn.btn-primary.position-relative .badge { + width: 30px !important; + height: 30px !important; + min-width: 30px !important; + padding: 0 !important; + font-size: 14px !important; + line-height: 30px !important; + border-radius: 50% !important; + display: inline-flex !important; + align-items: center; + justify-content: center; + animation: none !important; + box-shadow: 0 0 0 2px #ffffff; + +} + +
-

User Requests (Total: {{ $total }})

- -
+

User Requests (Total: {{ $total }})

+ + @can('request.update_profile') + + + Profile Update Requests + + @if($pendingProfileUpdates > 0) + + {{ $pendingProfileUpdates }} + + @endif + + @endcan + +
diff --git a/resources/views/admin/staff/create.blade.php b/resources/views/admin/staff/create.blade.php index 1eb7fe0..a91e221 100644 --- a/resources/views/admin/staff/create.blade.php +++ b/resources/views/admin/staff/create.blade.php @@ -849,8 +849,7 @@ name="username" value="{{ old('username') }}" class="form-input" - placeholder="Leave blank to generate automatically" - required> + placeholder="Leave blank to generate automatically">
ℹ️ If left blank, username will be generated from employee ID