Version: 1.0
Last updated: December 10, 2025
Approver Management is the core administrative module for managing approval workflows in the DTR System. Administrators can:
Key files involved:
resources/views/users/admin/approver/ (index, create, edit)App\Http\Controllers\Web\Admin\ApproverController.phpApp\Models\Approver, App\Models\User, App\Models\WorkPlaceapprovers tablePurpose:
Scope:
Out of scope:
Required permissions:
view_approvers — view approver list and detailscreate_approvers — create new approver assignmentsedit_approvers — modify existing approver assignmentsdelete_approvers — remove approver assignmentsRecommended roles:
Implementation note:
hr, admin, or tl rolesauthorize() in controller methodsAdmin URLs:
/admin/approvers/admin/approvers?type=leave or /admin/approvers?type=overtime/admin/approvers/create/admin/approvers/{id}/edit (via inline edit or modal)/admin/approvers/{id}/delete (POST with confirmation)/admin/approvers?search={query}Browser requirements: Modern Chromium-based browsers, recent Safari/Firefox. Mobile viewing supported; recommend desktop for full approver management.
Purpose: Display all approvers with filtering, search and bulk actions.
View file: resources/views/users/admin/approver/index.blade.php
UI elements:
Top filters & search:
Type filter (dropdown):
Search bar: filter by approver name, workplace, email
Quick actions:
Approvers table:
Columns:
Pagination: 10 approvers per page (configurable)
Sorting: by workplace, creation date (newest first default)
Row status indicator:
Key features:
Controller method: ApproverController::index(Request $request)
public function index(Request $request)
{
$type = $request->get('type', 'all');
$query = Approver::with(['user.profile', 'workPlace', 'delegateApprover.profile'])
->when($type !== 'all', function ($query) use ($type) {
$query->where('approver_for', $type);
})
->orderBy('work_place_id')
->orderBy('created_at', 'desc');
$approvers = $query->paginate(10);
return view('users.admin.approver.index', compact('approvers'));
}
Purpose: Assign a user as an approver for a specific workplace and request type.
Trigger: "Create Approver" button on index view.
View file: resources/views/users/admin/approver/create.blade.php
Form fields:
User (required, dropdown):
hr, admin, or tl rolesWorkplace (required, dropdown):
Approval Type (required, radio or dropdown):
leave or overtimeDelegate Approver (optional, dropdown):
hr, admin, or tl rolesActive (optional, checkbox):
Form submission (POST /admin/approvers):
Validation:
$validated = $request->validate([
'user_id' => 'required|exists:users,id',
'work_place_id' => 'required|exists:work_places,id',
'approver_for' => 'required|in:leave,overtime',
'active' => 'boolean',
'delegate_approver_id' => 'nullable|exists:users,id|different:user_id'
]);
// Check if delegate approver has appropriate roles
if ($request->delegate_approver_id) {
$delegateUser = User::find($request->delegate_approver_id);
if (!$delegateUser->hasAnyRole(['hr', 'admin', 'tl'])) {
return back()->withErrors([
'delegate_approver_id' => 'The delegate approver must have appropriate permissions.'
])->withInput();
}
}
Controller method:
public function store(Request $request)
{
$validated = $request->validate([
'user_id' => 'required|exists:users,id',
'work_place_id' => 'required|exists:work_places,id',
'approver_for' => 'required|in:leave,overtime',
'active' => 'boolean',
'delegate_approver_id' => 'nullable|exists:users,id|different:user_id'
]);
// Check if delegate approver has appropriate roles
if ($request->delegate_approver_id) {
$delegateUser = User::find($request->delegate_approver_id);
if (!$delegateUser->hasAnyRole(['hr', 'admin', 'tl'])) {
return back()->withErrors([
'delegate_approver_id' => 'The delegate approver must have appropriate permissions.'
])->withInput();
}
}
Approver::create([
...$validated,
'created_by' => Auth::user()->name,
]);
return redirect()->route('admin.approvers.index')
->with('success', 'Approver added successfully');
}
Purpose: Modify approver assignment (change workplace, type, delegate, or status).
Trigger: Click "Edit" button next to approver in index view.
View file: resources/views/users/admin/approver/edit.blade.php
Form fields:
Same as create form, except:
User (read-only or disabled):
Workplace (required, dropdown):
Approval Type (required, radio/dropdown):
Delegate Approver (optional, dropdown):
Active (optional, checkbox):
Form submission (PUT /admin/approvers/{id}):
Validation:
$validated = $request->validate([
'work_place_id' => 'required|exists:work_places,id',
'approver_for' => 'required|in:leave,overtime',
'active' => 'boolean',
'delegate_approver_id' => 'nullable|exists:users,id|different:user_id'
]);
if ($request->delegate_approver_id) {
$delegateUser = User::find($request->delegate_approver_id);
if (!$delegateUser->hasAnyRole(['hr', 'admin', 'tl'])) {
return back()->withErrors([
'delegate_approver_id' => 'The delegate approver must have appropriate permissions.'
])->withInput();
}
}
Controller method:
public function update(Request $request, Approver $approver)
{
$validated = $request->validate([
'work_place_id' => 'required|exists:work_places,id',
'approver_for' => 'required|in:leave,overtime',
'active' => 'boolean',
'delegate_approver_id' => 'nullable|exists:users,id|different:user_id'
]);
if ($request->delegate_approver_id) {
$delegateUser = User::find($request->delegate_approver_id);
if (!$delegateUser->hasAnyRole(['hr', 'admin', 'tl'])) {
return back()->withErrors([
'delegate_approver_id' => 'The delegate approver must have appropriate permissions.'
])->withInput();
}
}
$approver->update($validated);
return redirect()->route('admin.approvers.index')
->with('success', 'Approver updated successfully');
}
Delete Approver:
Trigger: Click "Delete" button or link on edit page.
Flow:
Controller method:
public function destroy(Approver $approver)
{
// Optional: Handle pending approvals
// $pending = LeaveRequest::where('approver_id', $approver->user_id)
// ->where('status', 'pending')
// ->count();
// if ($pending > 0) {
// // Notify or reassign
// }
$approver->delete();
return redirect()->route('admin.approvers.index')
->with('success', 'Approver removed successfully');
}
Approver table fields:
id — Primary key
user_id — Foreign key to users (primary approver)
work_place_id — Foreign key to work_places
approver_for — Enum: 'leave' or 'overtime'
delegate_approver_id — Foreign key to users (nullable, backup approver)
active — Boolean (default true)
created_by — String (admin user name who created)
created_at — Timestamp
updated_at — Timestamp
deleted_at — Timestamp (soft delete, nullable)
Sample records:
Approver 1:
id: 1
user_id: 5 (Jane Doe - HR Manager)
work_place_id: 1 (New York Office)
approver_for: 'leave'
delegate_approver_id: 8 (John Smith - HR Backup)
active: true
created_by: 'Admin'
created_at: '2025-01-01 09:00:00'
Approver 2:
id: 2
user_id: 6 (Alice Johnson - Team Lead)
work_place_id: 2 (San Francisco Office)
approver_for: 'overtime'
delegate_approver_id: null
active: true
created_by: 'Admin'
created_at: '2025-01-05 10:30:00'
Approver 3:
id: 3
user_id: 7 (Bob Wilson - HR Manager)
work_place_id: 1 (New York Office)
approver_for: 'overtime'
delegate_approver_id: 9 (Carol White - HR Backup)
active: false
created_by: 'Admin'
created_at: '2024-12-20 14:00:00'
Relationships:
Approver belongsTo User (primary approver)Approver belongsTo User as delegateApprover (backup)Approver belongsTo WorkPlaceUser hasMany Approver (user can be approver in multiple workplaces)WorkPlace hasMany Approver (workplace can have multiple approvers)Leave Request Approvers:
Approver Type: leave
├─ Responsibility: Review and approve employee leave requests
├─ Approval Authority: Accept/Reject leave requests
├─ Scope: Specific workplace
└─ Typical Users: HR Manager, HR Officer, Team Lead
Example:
Jane Doe (HR Manager) approves leave for New York Office
- Handles all leave requests from NY employees
- Can delegate to John Smith (HR backup)
Overtime Request Approvers:
Approver Type: overtime
├─ Responsibility: Review and approve overtime requests
├─ Approval Authority: Accept/Reject overtime requests
├─ Scope: Specific workplace
└─ Typical Users: HR Manager, Department Manager, Team Lead
Example:
Alice Johnson (Team Lead) approves overtime for SF Office
- Handles overtime requests from her team
- Ensures budget compliance
Hierarchy by Workplace:
New York Office:
├─ Leave Approver: Jane Doe (HR Manager)
│ └─ Delegate: John Smith (HR Backup)
├─ Overtime Approver: Bob Wilson (HR Manager)
│ └─ Delegate: Carol White (HR Backup)
San Francisco Office:
├─ Leave Approver: Alice Johnson (Team Lead)
│ └─ No delegate
└─ Overtime Approver: Alice Johnson (Team Lead)
└─ No delegate
Scenario: Assign Jane Doe as leave approver for New York Office.
Steps:
Server-side processing:
hr, admin, or tl roleScenario: Alice Johnson approves both leave and overtime for San Francisco Office.
Steps:
Scenario: Assign John Smith as HR backup when Jane is unavailable.
Steps:
Workflow impact:
Scenario: Remove Bob Wilson as overtime approver (leaving company or role change).
Steps:
Server-side processing:
Purpose of delegation:
How delegation works:
Scenario 1: Primary approver active
Leave Request → Routed to Jane Doe (primary)
Scenario 2: Primary approver inactive (status = false)
Leave Request → Routed to John Smith (delegate)
Scenario 3: No delegate assigned
Leave Request → Queues or auto-rejects (configurable)
Setting up delegation:
During creation:
Adding delegate to existing:
Removing delegate:
Temporary approval authority:
If primary approver on leave:
GET /admin/approvers
type (leave, overtime, all), search, page$approvers — paginated approvers$type — current filterpublic function index(Request $request)
{
$type = $request->get('type', 'all');
$query = Approver::with(['user.profile', 'workPlace', 'delegateApprover.profile'])
->when($type !== 'all', function ($query) use ($type) {
$query->where('approver_for', $type);
})
->orderBy('work_place_id')
->orderBy('created_at', 'desc');
$approvers = $query->paginate(10);
return view('users.admin.approver.index', compact('approvers'));
}
GET /admin/approvers/create
$users — eligible users for approver role$workPlaces — all workplacespublic function create()
{
$users = User::role(['hr', 'admin', 'tl'])->get();
$workPlaces = WorkPlace::all();
return view('users.admin.approver.create', compact('users', 'workPlaces'));
}
POST /admin/approvers
{
"user_id": 5,
"work_place_id": 1,
"approver_for": "leave",
"delegate_approver_id": 8,
"active": true
}GET /admin/approvers/{id}/edit
$approver — approver record$workPlaces — all workplaces$users — eligible users for delegate rolepublic function edit(Approver $approver)
{
$workPlaces = WorkPlace::all();
$users = User::whereHas('roles', function ($query) {
$query->whereIn('name', ['hr', 'admin', 'tl']);
})->get();
return view('users.admin.approver.edit', compact('approver', 'workPlaces', 'users'));
}
PUT /admin/approvers/{id}
public function update(Request $request, Approver $approver)
{
$validated = $request->validate([
'work_place_id' => 'required|exists:work_places,id',
'approver_for' => 'required|in:leave,overtime',
'active' => 'boolean',
'delegate_approver_id' => 'nullable|exists:users,id|different:user_id'
]);
if ($request->delegate_approver_id) {
$delegateUser = User::find($request->delegate_approver_id);
if (!$delegateUser->hasAnyRole(['hr', 'admin', 'tl'])) {
return back()->withErrors([
'delegate_approver_id' => 'The delegate approver must have appropriate permissions.'
])->withInput();
}
}
$approver->update($validated);
return redirect()->route('admin.approvers.index')
->with('success', 'Approver updated successfully');
}
DELETE /admin/approvers/{id}
public function destroy(Approver $approver)
{
$approver->delete();
return redirect()->route('admin.approvers.index')
->with('success', 'Approver removed successfully');
}
GET /api/admin/approvers
type, workplace_id, search, page{
"data": [
{
"id": 1,
"user": {
"id": 5,
"name": "Jane Doe",
"email": "jane@company.com"
},
"workplace": {
"id": 1,
"name": "New York Office"
},
"approver_for": "leave",
"delegate_approver": {
"id": 8,
"name": "John Smith"
},
"active": true,
"created_at": "2025-01-01T09:00:00Z"
}
],
"pagination": { "total": 10, "per_page": 25, "current_page": 1 }
}GET /api/admin/approvers/by-workplace/{workplace_id}
{
"workplace_id": 1,
"leave_approver": { "id": 5, "name": "Jane Doe", ... },
"overtime_approver": { "id": 6, "name": "Alice Johnson", ... }
}GET /api/admin/approvers/for-request
type (leave/overtime), workplace_id{
"approver": { "id": 5, "name": "Jane Doe", ... },
"delegate": { "id": 8, "name": "John Smith", ... }
}Location: app/Http/Controllers/Web/Admin/ApproverController.php
index() — List all approvers
public function index(Request $request)
{
$type = $request->get('type', 'all');
$query = Approver::with(['user.profile', 'workPlace', 'delegateApprover.profile'])
->when($type !== 'all', function ($query) use ($type) {
$query->where('approver_for', $type);
})
->orderBy('work_place_id')
->orderBy('created_at', 'desc');
$approvers = $query->paginate(10);
return view('users.admin.approver.index', compact('approvers'));
}
create() — Show create form
public function create()
{
$users = User::role(['hr', 'admin', 'tl'])->get();
$workPlaces = WorkPlace::all();
return view('users.admin.approver.create', compact('users', 'workPlaces'));
}
store() — Create new approver
public function store(Request $request)
{
$validated = $request->validate([
'user_id' => 'required|exists:users,id',
'work_place_id' => 'required|exists:work_places,id',
'approver_for' => 'required|in:leave,overtime',
'active' => 'boolean',
'delegate_approver_id' => 'nullable|exists:users,id|different:user_id'
]);
// Check if delegate approver has appropriate roles
if ($request->delegate_approver_id) {
$delegateUser = User::find($request->delegate_approver_id);
if (!$delegateUser->hasAnyRole(['hr', 'admin', 'tl'])) {
return back()->withErrors([
'delegate_approver_id' => 'The delegate approver must have appropriate permissions.'
])->withInput();
}
}
Approver::create([
...$validated,
'created_by' => Auth::user()->name,
]);
// Audit log
activity()
->causedBy(auth()->user())
->withProperties([
'approver_name' => User::find($validated['user_id'])->name,
'workplace' => WorkPlace::find($validated['work_place_id'])->name,
'approver_for' => $validated['approver_for']
])
->log('approver_created');
// Notification (optional)
// Mail::queue(new ApproverAssigned($user));
return redirect()->route('admin.approvers.index')
->with('success', 'Approver added successfully');
}
edit() — Show edit form
public function edit(Approver $approver)
{
$workPlaces = WorkPlace::all();
$users = User::whereHas('roles', function ($query) {
$query->whereIn('name', ['hr', 'admin', 'tl']);
})->get();
return view('users.admin.approver.edit', compact('approver', 'workPlaces', 'users'));
}
update() — Update approver
public function update(Request $request, Approver $approver)
{
$validated = $request->validate([
'work_place_id' => 'required|exists:work_places,id',
'approver_for' => 'required|in:leave,overtime',
'active' => 'boolean',
'delegate_approver_id' => 'nullable|exists:users,id|different:user_id'
]);
if ($request->delegate_approver_id) {
$delegateUser = User::find($request->delegate_approver_id);
if (!$delegateUser->hasAnyRole(['hr', 'admin', 'tl'])) {
return back()->withErrors([
'delegate_approver_id' => 'The delegate approver must have appropriate permissions.'
])->withInput();
}
}
$approver->update($validated);
// Audit log
activity()
->causedBy(auth()->user())
->performedOn($approver)
->withProperties([
'old' => array_diff_key($approver->getOriginal(), $validated),
'new' => $validated
])
->log('approver_updated');
return redirect()->route('admin.approvers.index')
->with('success', 'Approver updated successfully');
}
destroy() — Delete approver
public function destroy(Approver $approver)
{
// Audit log
activity()
->causedBy(auth()->user())
->performedOn($approver)
->withProperties(['approver_name' => $approver->user->name])
->log('approver_deleted');
$approver->delete();
return redirect()->route('admin.approvers.index')
->with('success', 'Approver removed successfully');
}
Quick filters:
Search functionality:
Advanced filters (optional):
Reports:
Export formats: CSV, Excel
Leave Request Integration:
Overtime Request Integration:
Auto-routing logic:
// Find approver for request
$approver = Approver::where('work_place_id', $request->workplace_id)
->where('approver_for', 'leave') // or 'overtime'
->where('active', true)
->first();
if (!$approver) {
// Check for delegate
$approver = Approver::where('work_place_id', $request->workplace_id)
->where('approver_for', 'leave')
->with('delegateApprover')
->first();
if ($approver && $approver->delegateApprover) {
$approver = $approver->delegateApprover;
} else {
// No approver found - queue or auto-reject
$request->status = 'no_approver';
}
}
$request->approver_id = $approver->user_id;
$request->save();
Task 1: Assign Leave Approver
Task 2: Assign Multiple Types
Task 3: Update Delegate
Task 4: Deactivate Approver
Task 5: Remove Approver
Task 6: View All Leave Approvers
Audit logging:
Notifications:
Compliance:
Example 1: Multi-Location Approver Setup
Company with 3 offices:
New York Office:
├─ Leave Approver: Jane Doe (HR Manager)
│ └─ Delegate: John Smith (HR Specialist)
├─ Overtime Approver: Bob Wilson (Operations Manager)
│ └─ No delegate
San Francisco Office:
├─ Leave Approver: Alice Johnson (HR Manager)
│ └─ Delegate: Carol White (HR Assistant)
├─ Overtime Approver: David Lee (Operations Manager)
│ └─ Delegate: Emma Brown (Ops Specialist)
Chicago Office:
├─ Leave Approver: Frank Martinez (HR Manager)
│ └─ Delegate: Grace Kim (HR Assistant)
└─ Overtime Approver: Frank Martinez (dual role)
└─ Delegate: Grace Kim
Example 2: Approver with Delegation
Jane Doe (Primary Leave Approver for NY)
├─ Role: HR Manager
├─ Approves: Leave requests for NY office
├─ Pending requests: 5
├─ Avg response time: 24 hours
└─ Delegate: John Smith
├─ Role: HR Specialist
├─ Takes over when Jane unavailable
└─ Current status: Active
Workflow:
1. Employee submits leave request for NY
2. Request routed to Jane Doe
3. If Jane inactive: Request routed to John Smith
4. John approves/rejects on Jane's behalf
Example 3: Approver Transition
Scenario: Jane Doe retiring, transitioning to Alice Johnson
Action Plan:
1. Create new approver: Alice Johnson → Leave → NY
2. Set Jane as Alice's delegate (temporary, during transition)
3. Announce change to employees
4. Jane handles remaining requests with Alice learning
5. After transition period: Remove Jane as approver
6. Alice becomes sole leave approver for NY
Unit tests:
Integration tests:
E2E tests (manual):
Permission tests:
Q: "Approver not found for leave request"
Q: "Cannot save approver - delegate has wrong role"
hr, admin, or tl roleQ: "Requests going to wrong approver"
Q: "Delegate approver not receiving requests"
Q: "Cannot edit approver - user_id shows as read-only"
Q: "Search not returning expected approvers"
Q: "Approver appears twice in list"
SQL: Find approvers for specific workplace
SELECT a.*, u.first_name, u.last_name, w.name as workplace_name
FROM approvers a
JOIN users u ON a.user_id = u.id
JOIN work_places w ON a.work_place_id = w.id
WHERE a.work_place_id = 1 AND a.active = 1
ORDER BY a.approver_for;
SQL: Find leave approvers by workplace
SELECT a.id, u.name, u.email, w.name as workplace,
da.name as delegate_name, a.active
FROM approvers a
JOIN users u ON a.user_id = u.id
JOIN work_places w ON a.work_place_id = w.id
LEFT JOIN users da ON a.delegate_approver_id = da.id
WHERE a.approver_for = 'leave'
ORDER BY w.name, a.created_at DESC;
SQL: Count pending requests per approver
SELECT a.user_id, u.name, COUNT(lr.id) as pending_count
FROM approvers a
JOIN users u ON a.user_id = u.id
LEFT JOIN leave_requests lr ON a.user_id = lr.approver_id
AND lr.status = 'pending'
WHERE a.approver_for = 'leave' AND a.active = 1
GROUP BY a.user_id
ORDER BY pending_count DESC;
SQL: Find approvers with delegates
SELECT a.id, u.name as primary_approver, da.name as delegate,
w.name as workplace, a.approver_for
FROM approvers a
JOIN users u ON a.user_id = u.id
JOIN users da ON a.delegate_approver_id = da.id
JOIN work_places w ON a.work_place_id = w.id
WHERE a.delegate_approver_id IS NOT NULL
ORDER BY w.name;
Laravel Model: Approver with relationships
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Approver extends Model
{
protected $fillable = [
'user_id', 'work_place_id', 'approver_for',
'delegate_approver_id', 'active', 'created_by'
];
protected $casts = [
'active' => 'boolean',
];
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function workPlace(): BelongsTo
{
return $this->belongsTo(WorkPlace::class);
}
public function delegateApprover(): BelongsTo
{
return $this->belongsTo(User::class, 'delegate_approver_id');
}
// Scopes
public function scopeActive($query)
{
return $query->where('active', true);
}
public function scopeForLeave($query)
{
return $query->where('approver_for', 'leave');
}
public function scopeForOvertime($query)
{
return $query->where('approver_for', 'overtime');
}
}
Laravel: Find approver for request
// In LeaveRequest or OvertimeRequest model/service
public function findApprover($workplaceId, $type = 'leave')
{
$approver = Approver::where('work_place_id', $workplaceId)
->where('approver_for', $type)
->where('active', true)
->with('delegateApprover')
->first();
if (!$approver) {
return null;
}
// Return delegate if primary inactive
if ($approver->active === false && $approver->delegateApprover) {
return $approver->delegateApprover;
}
return $approver->user;
}
Blade template: Approvers table
@foreach($approvers as $approver)
<tr>
<td>{{ $approver->user->name }}</td>
<td>{{ $approver->user->email }}</td>
<td>{{ $approver->workPlace->name }}</td>
<td>
<span class="badge badge-{{ $approver->approver_for === 'leave' ? 'info' : 'warning' }}">
{{ ucfirst($approver->approver_for) }}
</span>
</td>
<td>
@if($approver->delegateApprover)
{{ $approver->delegateApprover->name }}
@else
<span class="text-muted">—</span>
@endif
</td>
<td>
<span class="badge badge-{{ $approver->active ? 'success' : 'secondary' }}">
{{ $approver->active ? 'Active' : 'Inactive' }}
</span>
</td>
<td>
<a href="{{ route('admin.approvers.edit', $approver->id) }}" class="btn btn-sm btn-primary">Edit</a>
<form action="{{ route('admin.approvers.destroy', $approver->id) }}" method="POST" style="display:inline;">
@csrf @method('DELETE')
<button type="submit" class="btn btn-sm btn-danger"
onclick="return confirm('Are you sure?')">Delete</button>
</form>
</td>
</tr>
@endforeach
Blade template: Create form
<form action="{{ route('admin.approvers.store') }}" method="POST">
@csrf
<div class="form-group">
<label for="user_id">Approver</label>
<select name="user_id" id="user_id" class="form-control" required>
<option value="">— Select Approver —</option>
@foreach($users as $user)
<option value="{{ $user->id }}">{{ $user->name }} ({{ $user->email }})</option>
@endforeach
</select>
@error('user_id')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<div class="form-group">
<label for="work_place_id">Workplace</label>
<select name="work_place_id" id="work_place_id" class="form-control" required>
<option value="">— Select Workplace —</option>
@foreach($workPlaces as $workplace)
<option value="{{ $workplace->id }}">{{ $workplace->name }}</option>
@endforeach
</select>
@error('work_place_id')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<div class="form-group">
<label for="approver_for">Approval Type</label>
<select name="approver_for" id="approver_for" class="form-control" required>
<option value="">— Select Type —</option>
<option value="leave">Leave</option>
<option value="overtime">Overtime</option>
</select>
@error('approver_for')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<div class="form-group">
<label for="delegate_approver_id">Delegate Approver (Optional)</label>
<select name="delegate_approver_id" id="delegate_approver_id" class="form-control">
<option value="">— None —</option>
@foreach($users as $user)
<option value="{{ $user->id }}">{{ $user->name }}</option>
@endforeach
</select>
@error('delegate_approver_id')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<div class="form-group">
<label for="active">
<input type="checkbox" name="active" id="active" value="1" checked>
Active
</label>
@error('active')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<button type="submit" class="btn btn-primary">Create Approver</button>
<a href="{{ route('admin.approvers.index') }}" class="btn btn-secondary">Cancel</a>
</form>
Document version: 1.0
Maintainers: HR / Operations / Engineering
Last updated: December 10, 2025