110 lines
3.7 KiB
PHP
110 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Admin\Users;
|
|
|
|
use App\Models\Student;
|
|
use App\Models\User;
|
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Database\Eloquent\Collection;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Hash;
|
|
|
|
class StudentService
|
|
{
|
|
public function getAllForSelect(): Collection
|
|
{
|
|
return Student::with(['user.profile', 'department'])->get();
|
|
}
|
|
|
|
public function getPaginated(array $filters = []): LengthAwarePaginator
|
|
{
|
|
return User::with(['profile', 'student.department'])
|
|
->whereHas('roles', fn ($q) => $q->where('name', 'mahasiswa'))
|
|
->when($filters['search'] ?? null, fn ($q, $search) => $q->where(function ($query) use ($search) {
|
|
$query->where('username', 'like', "%{$search}%")
|
|
->orWhere('email', 'like', "%{$search}%")
|
|
->orWhereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%"))
|
|
->orWhereHas('student', fn ($q) => $q->where('student_number', 'like', "%{$search}%"));
|
|
}))
|
|
->latest()
|
|
->paginate($filters['per_page'] ?? 25);
|
|
}
|
|
|
|
public function create(array $data): User
|
|
{
|
|
return DB::transaction(function () use ($data) {
|
|
$user = User::create([
|
|
'username' => $data['username'],
|
|
'email' => $data['email'],
|
|
'password' => Hash::make(config('app.default_password')),
|
|
]);
|
|
|
|
$user->assignRole('mahasiswa');
|
|
|
|
$user->profile()->create([
|
|
'full_name' => $data['full_name'],
|
|
'phone_number' => $data['phone_number'],
|
|
'address' => $data['address'],
|
|
'gender' => $data['gender'],
|
|
'birth_date' => $data['birth_date'],
|
|
'birth_place' => $data['birth_place'],
|
|
]);
|
|
|
|
$user->student()->create([
|
|
'student_number' => $data['student_number'],
|
|
'department_id' => $data['department_id'],
|
|
'enrollment_year' => $data['enrollment_year'],
|
|
'academic_advisor_id' => $data['academic_advisor_id'],
|
|
'status' => 'active',
|
|
]);
|
|
|
|
return $user;
|
|
});
|
|
}
|
|
|
|
public function update(User $user, array $data): User
|
|
{
|
|
DB::transaction(function () use ($user, $data) {
|
|
$user->update([
|
|
'username' => $data['username'],
|
|
'email' => $data['email'],
|
|
]);
|
|
|
|
$user->profile()->updateOrCreate([], [
|
|
'full_name' => $data['full_name'],
|
|
'phone_number' => $data['phone_number'],
|
|
'address' => $data['address'],
|
|
'gender' => $data['gender'],
|
|
'birth_date' => $data['birth_date'],
|
|
'birth_place' => $data['birth_place'],
|
|
]);
|
|
|
|
$user->student()->updateOrCreate([], [
|
|
'student_number' => $data['student_number'],
|
|
'department_id' => $data['department_id'],
|
|
'enrollment_year' => $data['enrollment_year'],
|
|
'academic_advisor_id' => $data['academic_advisor_id'],
|
|
'status' => $data['status'] ?? null,
|
|
]);
|
|
});
|
|
|
|
return $user->fresh(['profile', 'student.department', 'roles']);
|
|
}
|
|
|
|
public function delete(User $user): void
|
|
{
|
|
DB::transaction(function () use ($user) {
|
|
$user->student()->delete();
|
|
$user->profile()->delete();
|
|
$user->delete();
|
|
});
|
|
}
|
|
|
|
public function resetPassword(User $user): void
|
|
{
|
|
$user->update([
|
|
'password' => Hash::make(config('app.default_password')),
|
|
]);
|
|
}
|
|
}
|