use App\Http\Controllers\GroupController;
Route::resource('groups', GroupController::class);
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Group extends Model
protected $fillable = ['group_name', 'description', 'shift_id', 'status'];
// Relationships
public function employees()
return $this->belongsToMany(Employee::class, 'employee_group');
public function workDays()
return $this->belongsToMany(WorkDay::class, 'group_work_day');
public function shift()
return $this->belongsTo(ShiftSetting::class, 'shift_id');
}
namespace App\Http\Controllers;
use App\Models\Group;
use App\Models\Employee;
use App\Models\WorkDay;
use App\Models\ShiftSetting;
use Illuminate\Http\Request;
class GroupController extends Controller
public function index()
$groups = Group::with(['employees', 'workDays', 'shift'])->paginate(10);
return view('groups.index', compact('groups'));
public function create()
$employees = Employee::all();
$workDays = WorkDay::all();
$shifts = ShiftSetting::all();
return view('groups.create', compact('employees', 'workDays', 'shifts'));
public function store(Request $request)
$validated = $request->validate([
'group_name' => 'required|unique:groups,group_name',
'description' => 'nullable|string',
'shift_id' => 'nullable|exists:shift_settings,id',
'status' => 'required|in:active,inactive',
'employee_ids' => 'required|array|min:1',
'employee_ids.*' => 'exists:employees,id',
'work_day_ids' => 'required|array|min:1',
'work_day_ids.*' => 'exists:work_days,id',
]);
$group = Group::create([
'group_name' => $validated['group_name'],
'description' => $validated['description'] ?? null,
'shift_id' => $validated['shift_id'] ?? null,
'status' => $validated['status'],
]);
$group->employees()->sync($validated['employee_ids']);
$group->workDays()->sync($validated['work_day_ids']);
return redirect()->route('groups.index')->with('success', 'Group created successfully.');
public function edit(Group $group)
$employees = Employee::all();
$workDays = WorkDay::all();
$shifts = ShiftSetting::all();
$group->load(['employees', 'workDays']);
return view('groups.edit', compact('group', 'employees', 'workDays', 'shifts'));
public function update(Request $request, Group $group)
$validated = $request->validate([
'group_name' => 'required|unique:groups,group_name,' . $group->id,
'description' => 'nullable|string',
'shift_id' => 'nullable|exists:shift_settings,id',
'status' => 'required|in:active,inactive',
'employee_ids' => 'required|array|min:1',
'employee_ids.*' => 'exists:employees,id',
'work_day_ids' => 'required|array|min:1',
'work_day_ids.*' => 'exists:work_days,id',
]);
$group->update([
'group_name' => $validated['group_name'],
'description' => $validated['description'] ?? null,
'shift_id' => $validated['shift_id'] ?? null,
'status' => $validated['status'],
]);
$group->employees()->sync($validated['employee_ids']);
$group->workDays()->sync($validated['work_day_ids']);
return redirect()->route('groups.index')->with('success', 'Group updated successfully.');
}
public function destroy(Group $group)
$group->employees()->detach();
$group->workDays()->detach();
$group->delete();
return redirect()->route('groups.index')->with('success', 'Group deleted successfully.');
@extends('layouts.master')
@section('content_body')
<div class="container">
<h1>Groups</h1>
<a href="{{ route('groups.create') }}" class="btn btn-primary mb-3">Add New Group</a>
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
@if($groups->count())
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>Group Name</th>
<th>Description</th>
<th>Employees</th>
<th>Work Days</th>
<th>Shift</th>
<th>Status</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach($groups as $group)
<tr>
<td>{{ $group->id }}</td>
<td>{{ $group->group_name }}</td>
<td>{{ $group->description }}</td>
<td>
@foreach($group->employees as $employee)
{{ $employee->name }}@if(!$loop->last), @endif
@endforeach
</td>
<td>
@foreach($group->workDays as $day)
{{ $day->day_name }}@if(!$loop->last), @endif
@endforeach
</td>
<td>{{ $group->shift?->shift_name ?? '-' }}</td>
<td>{{ ucfirst($group->status) }}</td>
<td>
<a href="{{ route('groups.edit', $group->id) }}" class="btn btn-sm btn-warning">Edit</a>
<form action="{{ route('groups.destroy', $group->id) }}" method="POST"
style="display:inline-block;" onsubmit="return confirm('Are you sure?');">
@csrf
@method('DELETE')
<button class="btn btn-sm btn-danger" type="submit">Delete</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
{{ $groups->links() }}
@else
<p>No groups found.</p>
@endif
</div>
@endsection
Create:
@extends('layouts.master')
@section('content_body')
<div class="container">
<h1>Add New Group</h1>
<form method="POST" action="{{ route('groups.store') }}">
@csrf
<div class="form-group">
<label for="group_name">Group Name</label>
<input type="text" name="group_name" id="group_name" class="form-control
@error('group_name') is-invalid @enderror" value="{{ old('group_name') }}" required>
@error('group_name')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="form-group">
<label for="description">Description (optional)</label>
<textarea name="description" id="description" class="form-control">{{ old('description')
}}</textarea>
</div>
<div class="form-group">
<label for="shift_id">Shift</label>
<select name="shift_id" id="shift_id" class="form-control">
<option value="">-- Select Shift --</option>
@foreach($shifts as $shift)
<option value="{{ $shift->id }}" {{ old('shift_id') == $shift->id ? 'selected' : '' }}>{{ $shift-
>shift_name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="employee_ids">Employees</label>
<select name="employee_ids[]" id="employee_ids" class="form-control" multiple required>
@foreach($employees as $employee)
<option value="{{ $employee->id }}" {{ (collect(old('employee_ids'))->contains($employee-
>id)) ? 'selected':'' }}>{{ $employee->name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="work_day_ids">Work Days</label>
<select name="work_day_ids[]" id="work_day_ids" class="form-control" multiple required>
@foreach($workDays as $day)
<option value="{{ $day->id }}" {{ (collect(old('work_day_ids'))->contains($day->id)) ? 'selected':''
}}>{{ $day->day_name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="status">Status</label>
<select name="status" id="status" class="form-control" required>
<option value="active" {{ old('status') == 'active' ? 'selected' : '' }}>Active</option>
<option value="inactive" {{ old('status') == 'inactive' ? 'selected' : '' }}>Inactive</option>
</select>
</div>
<button type="submit" class="btn btn-success">Create Group</button>
</form>
</div>
@endsection
Edit:
@extends('layouts.master')
@section('content_body')
<div class="container">
<h1>Edit Group: {{ $group->group_name }}</h1>
<form method="POST" action="{{ route('groups.update', $group->id) }}">
@csrf
@method('PUT')
<div class="form-group">
<label for="group_name">Group Name</label>
<input type="text" name="group_name" id="group_name" class="form-control
@error('group_name') is-invalid @enderror" value="{{ old('group_name', $group->group_name) }}"
required>
@error('group_name')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="form-group">
<label for="description">Description (optional)</label>
<textarea name="description" id="description" class="form-control">{{ old('description', $group-
>description) }}</textarea>
</div>
<div class="form-group">
<label for="shift_id">Shift</label>
<select name="shift_id" id="shift_id" class="form-control">
<option value="">-- Select Shift --</option>
@foreach($shifts as $shift)
<option value="{{ $shift->id }}" {{ (old('shift_id', $group->shift_id) == $shift->id) ? 'selected' :
'' }}>{{ $shift->shift_name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="employee_ids">Employees</label>
<select name="employee_ids[]" id="employee_ids" class="form-control" multiple required>
@foreach($employees as $employee)
<option value="{{ $employee->id }}" {{ (collect(old('employee_ids', $group->employees-
>pluck('id')->toArray()))->contains($employee->id)) ? 'selected':'' }}>{{ $employee->name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="work_day_ids">Work Days</label>
<select name="work_day_ids[]" id="work_day_ids" class="form-control" multiple required>
@foreach($workDays as $day)
<option value="{{ $day->id }}" {{ (collect(old('work_day_ids', $group->workDays->pluck('id')-
>toArray()))