siakad-itm/app/Services/Admin/Manage/Service/LetterRequestService.php
Yoga Pangestu 353829e053
Some checks failed
tests / ci (pull_request) Has been cancelled
feat: Refactor Admin Manage structure into sub-namespaces for better organization
- Created sub-namespaces under Admin\Manage for Course, Academic, Announcement, Finance, and Service.
- Added new FormRequest classes for handling validation in each sub-namespace.
- Implemented Service classes for managing business logic related to each resource.
- Updated routes to reflect the new sub-namespace structure.
- Enhanced code organization and maintainability by grouping related functionalities.
2026-08-25 21:17:48 +07:00

71 lines
2.7 KiB
PHP

<?php
namespace App\Services\Admin\Manage\Service;
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 $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator
{
return LetterRequest::query()
->select(['id', 'student_id', 'letter_type', 'purpose', 'status', 'processed_by', 'submitted_at', 'completed_at'])
->with(['student.user.profile', 'student.department', 'processor.profile'])
->when($search, fn ($q) => $q->where('letter_type', 'like', "%{$search}%")
->orWhereHas('student', fn ($q) => $q->where('student_number', 'like', "%{$search}%")
->orWhereHas('user.profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%"))))
->orderBy($sort, $direction)
->paginate($perPage);
}
public function create(array $data, ?UploadedFile $result): LetterRequest
{
$status = $data['status'] ?? LetterStatus::Submitted->value;
$letterRequest = LetterRequest::create([
'student_id' => $data['student_id'],
'letter_type' => $data['letter_type'],
'purpose' => $data['purpose'] ?? null,
'status' => $status,
'processed_by' => $status !== LetterStatus::Submitted->value ? auth()->id() : null,
'submitted_at' => now(),
'completed_at' => $status === LetterStatus::Completed->value ? now() : null,
]);
if ($result) {
$letterRequest->addMedia($result)->toMediaCollection('letter_result');
}
return $letterRequest;
}
public function update(LetterRequest $letterRequest, array $data, ?UploadedFile $result): LetterRequest
{
$status = $data['status'] ?? LetterStatus::Submitted->value;
$letterRequest->student_id = $data['student_id'];
$letterRequest->letter_type = $data['letter_type'];
$letterRequest->purpose = $data['purpose'] ?? null;
$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;
}
public function delete(LetterRequest $letterRequest): bool
{
return $letterRequest->delete();
}
}