180 lines
6.2 KiB
PHP
180 lines
6.2 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Http\Controllers\Admin;
|
||
|
|
|
||
|
|
use App\Http\Controllers\Controller;
|
||
|
|
use Illuminate\Http\Request;
|
||
|
|
use Illuminate\Support\Facades\Hash;
|
||
|
|
use App\Models\Admin;
|
||
|
|
use Spatie\Permission\Models\Permission;
|
||
|
|
use Illuminate\Support\Facades\DB;
|
||
|
|
|
||
|
|
class AdminStaffController extends Controller
|
||
|
|
{
|
||
|
|
public function index()
|
||
|
|
{
|
||
|
|
$staff = Admin::where('type', 'staff')->orderBy('id', 'DESC')->get();
|
||
|
|
return view('admin.staff.index', compact('staff'));
|
||
|
|
}
|
||
|
|
|
||
|
|
public function create()
|
||
|
|
{
|
||
|
|
$permissions = Permission::where('guard_name', 'admin')->get()->groupBy(function ($p) {
|
||
|
|
return explode('.', $p->name)[0];
|
||
|
|
});
|
||
|
|
|
||
|
|
return view('admin.staff.create', compact('permissions'));
|
||
|
|
}
|
||
|
|
|
||
|
|
public function store(Request $request)
|
||
|
|
{
|
||
|
|
$request->validate([
|
||
|
|
// Personal Info
|
||
|
|
'name' => 'required|string|max:255',
|
||
|
|
'email' => 'required|email|unique:admins,email',
|
||
|
|
'phone' => 'required|string|max:20',
|
||
|
|
'emergency_phone' => 'nullable|string|max:20',
|
||
|
|
'address' => 'nullable|string|max:255',
|
||
|
|
|
||
|
|
// Professional info
|
||
|
|
'role' => 'nullable|string|max:100',
|
||
|
|
'department' => 'nullable|string|max:100',
|
||
|
|
'designation' => 'nullable|string|max:100',
|
||
|
|
'joining_date' => 'nullable|date',
|
||
|
|
'status' => 'required|string|in:active,inactive',
|
||
|
|
'additional_info' => 'nullable|string',
|
||
|
|
|
||
|
|
// System access
|
||
|
|
'username' => 'nullable|string|unique:admins,username',
|
||
|
|
'password' => 'required|string|min:6',
|
||
|
|
|
||
|
|
// Permissions
|
||
|
|
'permissions' => 'nullable|array',
|
||
|
|
]);
|
||
|
|
|
||
|
|
DB::beginTransaction();
|
||
|
|
|
||
|
|
try {
|
||
|
|
$admin = Admin::create([
|
||
|
|
'name' => $request->name,
|
||
|
|
'email' => $request->email,
|
||
|
|
'phone' => $request->phone,
|
||
|
|
'emergency_phone' => $request->emergency_phone,
|
||
|
|
'address' => $request->address,
|
||
|
|
|
||
|
|
'role' => $request->role,
|
||
|
|
'department' => $request->department,
|
||
|
|
'designation' => $request->designation,
|
||
|
|
'joining_date' => $request->joining_date,
|
||
|
|
'status' => $request->status,
|
||
|
|
'additional_info' => $request->additional_info,
|
||
|
|
|
||
|
|
'username' => $request->username,
|
||
|
|
'password' => Hash::make($request->password),
|
||
|
|
'type' => 'staff',
|
||
|
|
]);
|
||
|
|
|
||
|
|
// Generate EMPLOYEE ID using admin ID (safe)
|
||
|
|
$employeeId = 'EMP' . str_pad($admin->id, 4, '0', STR_PAD_LEFT);
|
||
|
|
$admin->update(['employee_id' => $employeeId]);
|
||
|
|
|
||
|
|
// Assign permissions (if any)
|
||
|
|
if ($request->permissions) {
|
||
|
|
$admin->givePermissionTo($request->permissions);
|
||
|
|
}
|
||
|
|
|
||
|
|
DB::commit();
|
||
|
|
|
||
|
|
return redirect()->route('admin.staff.index')
|
||
|
|
->with('success', 'Staff created successfully.');
|
||
|
|
|
||
|
|
} catch (\Exception $e) {
|
||
|
|
DB::rollBack();
|
||
|
|
return back()->withErrors(['error' => $e->getMessage()]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public function edit($id)
|
||
|
|
{
|
||
|
|
$staff = Admin::where('type', 'staff')->findOrFail($id);
|
||
|
|
|
||
|
|
$permissions = Permission::where('guard_name', 'admin')->get()->groupBy(function ($p) {
|
||
|
|
return explode('.', $p->name)[0];
|
||
|
|
});
|
||
|
|
|
||
|
|
$staffPermissions = $staff->permissions->pluck('name')->toArray();
|
||
|
|
|
||
|
|
return view('admin.staff.edit', compact('staff', 'permissions', 'staffPermissions'));
|
||
|
|
}
|
||
|
|
|
||
|
|
public function update(Request $request, $id)
|
||
|
|
{
|
||
|
|
$staff = Admin::where('type', 'staff')->findOrFail($id);
|
||
|
|
|
||
|
|
$request->validate([
|
||
|
|
'name' => 'required|string|max:255',
|
||
|
|
'email' => 'required|email|unique:admins,email,' . $staff->id,
|
||
|
|
'phone' => 'required|string|max:20',
|
||
|
|
'emergency_phone' => 'nullable|string|max:20',
|
||
|
|
'address' => 'nullable|string|max:255',
|
||
|
|
|
||
|
|
'role' => 'nullable|string|max:100',
|
||
|
|
'department' => 'nullable|string|max:100',
|
||
|
|
'designation' => 'nullable|string|max:100',
|
||
|
|
'joining_date' => 'nullable|date',
|
||
|
|
'status' => 'required|string|in:active,inactive',
|
||
|
|
'additional_info' => 'nullable|string',
|
||
|
|
|
||
|
|
'username' => 'nullable|string|unique:admins,username,' . $staff->id,
|
||
|
|
'password' => 'nullable|string|min:6',
|
||
|
|
|
||
|
|
'permissions' => 'nullable|array',
|
||
|
|
]);
|
||
|
|
|
||
|
|
DB::beginTransaction();
|
||
|
|
|
||
|
|
try {
|
||
|
|
$staff->update([
|
||
|
|
'name' => $request->name,
|
||
|
|
'email' => $request->email,
|
||
|
|
'phone' => $request->phone,
|
||
|
|
'emergency_phone' => $request->emergency_phone,
|
||
|
|
'address' => $request->address,
|
||
|
|
|
||
|
|
'role' => $request->role,
|
||
|
|
'department' => $request->department,
|
||
|
|
'designation' => $request->designation,
|
||
|
|
'joining_date' => $request->joining_date,
|
||
|
|
'status' => $request->status,
|
||
|
|
'additional_info' => $request->additional_info,
|
||
|
|
|
||
|
|
'username' => $request->username,
|
||
|
|
]);
|
||
|
|
|
||
|
|
if ($request->password) {
|
||
|
|
$staff->update(['password' => Hash::make($request->password)]);
|
||
|
|
}
|
||
|
|
|
||
|
|
$staff->syncPermissions($request->permissions ?? []);
|
||
|
|
|
||
|
|
DB::commit();
|
||
|
|
|
||
|
|
return redirect()->route('admin.staff.index')
|
||
|
|
->with('success', 'Staff updated successfully.');
|
||
|
|
|
||
|
|
} catch (\Exception $e) {
|
||
|
|
DB::rollBack();
|
||
|
|
return back()->withErrors(['error' => $e->getMessage()]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public function destroy($id)
|
||
|
|
{
|
||
|
|
$staff = Admin::where('type', 'staff')->findOrFail($id);
|
||
|
|
$staff->delete();
|
||
|
|
|
||
|
|
return redirect()->route('admin.staff.index')
|
||
|
|
->with('success', 'Staff removed successfully.');
|
||
|
|
}
|
||
|
|
}
|