itmpwk.ac.id/app/Services/Admin/Services/LetterRequestService.php
Yoga Pangestu 93c5514c22 Refactor Letter Request Management
- Created LetterRequestRequest and LetterRequestStatusRequest for handling form requests.
- Removed the old LetterRequestRequest class and updated the authorization logic.
- Changed the student relationship to user in the LetterRequest model.
- Updated LetterRequestService to reflect changes in the model and request handling.
- Modified permission catalog to include new permissions for letter request status updates.
- Updated database migrations and seeders to use user_id instead of student_id.
- Removed student-specific letter request pages and components, consolidating functionality under admin routes.
- Adjusted frontend components to accommodate new data structure and permissions.
- Enhanced the letter request columns to support status updates directly from the table.
2026-09-01 00:03:13 +07:00

71 lines
2.6 KiB
PHP

<?php
namespace App\Services\Admin\Services;
use App\Enums\LetterStatus;
use App\Models\LetterRequest;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Http\UploadedFile;
class LetterRequestService
{
public function paginated(int $perPage = 25, string $search = '', ?string $status = null): LengthAwarePaginator
{
$user = auth()->user();
return LetterRequest::query()
->select(['id', 'user_id', 'letter_type', 'purpose', 'status', 'processed_by', 'submitted_at', 'completed_at'])
->with(['user.profile', 'user.student.department', 'processor.profile'])
->when($search, fn ($q) => $q->where('letter_type', 'like', "%{$search}%")
->orWhereHas('user', fn ($q) => $q->whereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%"))
->orWhereHas('student', fn ($q) => $q->where('student_number', 'like', "%{$search}%"))))
->when($status, fn ($q) => $q->where('status', $status))
->when($user->hasRole('mahasiswa'), fn ($q) => $q->where('user_id', $user->id))
->latest()
->paginate($perPage);
}
public function create(array $data): LetterRequest
{
return LetterRequest::create([
'user_id' => $data['user_id'],
'letter_type' => $data['letter_type'],
'purpose' => $data['purpose'] ?? null,
'status' => LetterStatus::Submitted->value,
'submitted_at' => now(),
]);
}
public function update(LetterRequest $letterRequest, array $data): LetterRequest
{
$letterRequest->letter_type = $data['letter_type'];
$letterRequest->purpose = $data['purpose'] ?? null;
$letterRequest->update();
return $letterRequest;
}
public function delete(LetterRequest $letterRequest): bool
{
return $letterRequest->delete();
}
public function updateStatus(LetterRequest $letterRequest, ?string $status, ?UploadedFile $result): LetterRequest
{
$status = $result ? LetterStatus::Completed->value : $status;
$letterRequest->status = $status;
$letterRequest->processed_by = $status !== LetterStatus::Submitted->value ? auth()->id() : null;
$letterRequest->completed_at = $status === LetterStatus::Completed->value
? ($letterRequest->completed_at ?? now())
: null;
$letterRequest->update();
if ($result) {
$letterRequest->addMedia($result)->toMediaCollection('letter_result');
}
return $letterRequest;
}
}