Some checks failed
tests / ci (pull_request) Has been cancelled
- 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.
71 lines
2.7 KiB
PHP
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();
|
|
}
|
|
}
|