Install the Package:
composer require baks-dev/users-table
Publish Configuration and Assets:
php artisan baks:assets:install
Run Migrations:
php artisan migrate
user_attendance, shifts). Use --pretend first to review SQL:
php artisan migrate --pretend
Basic Usage:
UserAttendance model:
use BaksDev\UsersTable\Models\UserAttendance;
$attendance = UserAttendance::create([
'user_id' => auth()->id(),
'start_time' => now(),
'end_time' => now()->addHours(8),
'status' => 'active',
]);
$records = UserAttendance::where('user_id', auth()->id())
->orderBy('start_time', 'desc')
->get();
Console Commands:
php artisan baks:assets:install
php artisan baks:attendance:report --user=1 --month=2023-10
Testing:
php artisan test --group=users-table
vendor/baks-dev/users-table/src for models, migrations, and services.config/users-table.php (published via vendor:publish) for customizable settings (e.g., default time formats, validation rules).database/migrations/ for schema details (e.g., user_attendance table structure).UserAttendance, Shift, and Break models for CRUD operations.php artisan list baks
UserAttendance model to log punch-in/punch-out events.
// Punch-in
$attendance = UserAttendance::create([
'user_id' => $user->id,
'start_time' => now(),
'status' => 'active',
]);
// Punch-out (auto-calculates duration)
$attendance->update([
'end_time' => now(),
'status' => 'completed',
]);
use Illuminate\Validation\Rule;
$validated = request()->validate([
'start_time' => 'required|date',
'end_time' => [
'required_with:start_time',
'after:start_time',
Rule::unique('user_attendance')->ignore($attendance->id),
],
]);
Shift model and associate them with attendance:
$shift = Shift::create([
'name' => 'Morning Shift',
'start_time' => '09:00',
'end_time' => '17:00',
]);
$attendance->shift()->associate($shift);
$attendance->save();
$users = User::whereIn('id', [1, 2, 3])->get();
$shift = Shift::find(1);
$users->each(function ($user) use ($shift) {
$user->attendances()->create([
'shift_id' => $shift->id,
'start_time' => now(),
]);
});
Break model, linked to attendance records:
$break = Break::create([
'attendance_id' => $attendance->id,
'start_time' => now(),
'end_time' => now()->addMinutes(30),
'duration' => 30, // in minutes
]);
UserAttendance model to calculate net working time:
public function getNetDurationAttribute()
{
$totalDuration = $this->start_time->diffInMinutes($this->end_time);
$breaksDuration = $this->breaks->sum('duration');
return $totalDuration - $breaksDuration;
}
// Monthly report for a user
$report = UserAttendance::where('user_id', $user->id)
->whereMonth('start_time', now()->month)
->with(['shift', 'breaks'])
->get()
->map(function ($record) {
return [
'date' => $record->start_time->format('Y-m-d'),
'duration' => $record->net_duration,
'shift' => $record->shift->name,
];
});
use Maatwebsite\Excel\Facades\Excel;
return Excel::download(new UserAttendanceExport($user), 'attendance_'.$user->id.'.csv');
// routes/api.php
Route::apiResource('attendance', \BaksDev\UsersTable\Http\Controllers\UserAttendanceController::class)
->middleware('auth:sanctum');
// Event listener for attendance logging
UserAttendance::created(function ($attendance) {
event(new AttendanceLogged($attendance));
});
// Listen for the event
AttendanceLogged::listen(function ($event) {
// Send webhook to payroll system
Http::post('https://payroll.example.com/webhook', [
'user_id' => $event->attendance->user_id,
'hours' => $event->attendance->net_duration / 60,
]);
});
// app/Policies/UserAttendancePolicy.php
public function viewAny(User $user)
{
return $user->isAdmin(); // Customize access logic
}
$attendance->user->notify(new AttendanceLoggedNotification($attendance));
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('baks:attendance:report:weekly')->dailyAt('18:00');
}
// app/Http/Livewire/UserAttendanceDashboard.php
public function render()
{
return view('livewire.user-attendance-dashboard', [
'attendances' => UserAttendance::with(['user', 'shift'])->latest()->get(),
]);
}
// app/Nova/UserAttendance.php
public static $model = \BaksDev\UsersTable\Models\UserAttendance::class;
public static $title = 'attendance';
public function test_attendance_creation()
{
$user = User::factory()->create();
$attendance = UserAttendance::create([
'user_id' => $user->id,
'start_time' => now(),
]);
$this->assertDatabaseHas('user_attendance', [
'user_id' => $user->id,
'status' => 'active',
]);
}
public function test_attendance_api()
{
$response = $this->actingAs(User::factory()->create())
->post('/api/attendance', [
'start_time' => now(),
]);
$
How can I help you explore Laravel packages today?