lms/app/Services/JobCircularService.php
2025-12-15 12:26:23 +01:00

155 lines
5.0 KiB
PHP

<?php
namespace App\Services;
use App\Models\JobCircular;
use Illuminate\Support\Facades\DB;
use Illuminate\Pagination\LengthAwarePaginator;
class JobCircularService
{
/**
* Get all job circulars with optional filters and pagination.
*/
public function getJobCirculars(array $data): LengthAwarePaginator
{
return DB::transaction(function () use ($data) {
$page = array_key_exists('per_page', $data) ? intval($data['per_page']) : 10;
$query = JobCircular::query()
->when(array_key_exists('search', $data), function ($query) use ($data) {
return $query->where(function ($q) use ($data) {
$q->where('title', 'LIKE', "%{$data['search']}%");
});
})
->when(array_key_exists('status', $data), function ($query) use ($data) {
return $query->where('status', $data['status']);
})
->when(array_key_exists('job_type', $data), function ($query) use ($data) {
return $query->byJobType($data['job_type']);
})
->when(array_key_exists('experience_level', $data), function ($query) use ($data) {
return $query->byExperienceLevel($data['experience_level']);
})
->when(array_key_exists('work_type', $data), function ($query) use ($data) {
return $query->byWorkType($data['work_type']);
})
->orderBy('created_at', 'desc');
return $query->paginate($page);
}, 5);
}
/**
* Get active job circulars for public display.
*/
public function getActiveJobCirculars(array $data): LengthAwarePaginator
{
return DB::transaction(function () use ($data) {
$per_page = array_key_exists('per_page', $data) ? intval($data['per_page']) : 10;
$query = JobCircular::query()
->published()
->notExpired()
->when(array_key_exists('search', $data), function ($query) use ($data) {
return $query->where(function ($q) use ($data) {
$q->where('title', 'LIKE', "%{$data['search']}%");
});
})
->when(array_key_exists('job_type', $data), function ($query) use ($data) {
return $query->byJobType($data['job_type']);
})
->when(array_key_exists('experience_level', $data), function ($query) use ($data) {
return $query->byExperienceLevel($data['experience_level']);
})
->when(array_key_exists('work_type', $data), function ($query) use ($data) {
return $query->byWorkType($data['work_type']);
})
->orderBy('created_at', 'desc');
return $query->paginate($per_page);
}, 5);
}
/**
* Create a new job circular.
*/
public function createJobCircular(array $data): JobCircular
{
return DB::transaction(function () use ($data) {
return JobCircular::create($data);
}, 5);
}
/**
* Update an existing job circular.
*/
public function updateJobCircular(JobCircular $jobCircular, array $data): JobCircular
{
return DB::transaction(function () use ($jobCircular, $data) {
// Set published_at if status is being changed to active for the first time
if (
$data['status'] === 'active' &&
$jobCircular->status !== 'active' &&
empty($data['published_at'])
) {
$data['published_at'] = now();
}
// Clear published_at if status is being changed to draft
if ($data['status'] === 'draft') {
$data['published_at'] = null;
}
$jobCircular->update($data);
return $jobCircular->fresh();
}, 5);
}
/**
* Delete a job circular.
*/
public function deleteJobCircular(JobCircular $jobCircular): bool
{
return DB::transaction(function () use ($jobCircular) {
return $jobCircular->delete();
}, 5);
}
/**
* Toggle job circular status between active and draft.
*/
public function toggleStatus(JobCircular $jobCircular): JobCircular
{
return DB::transaction(function () use ($jobCircular) {
$newStatus = $jobCircular->status === 'active' ? 'draft' : 'active';
$jobCircular->update(['status' => $newStatus]);
return $jobCircular->fresh();
}, 5);
}
/**
* Get job circular statistics.
*/
public function getStatistics(): array
{
return DB::transaction(function () {
$total = JobCircular::count();
$active = JobCircular::where('status', 'active')->count();
$draft = JobCircular::where('status', 'draft')->count();
$closed = JobCircular::where('status', 'closed')->count();
$expired = JobCircular::where('application_deadline', '<', now()->format('Y-m-d'))->count();
return [
'total' => $total,
'active' => $active,
'draft' => $draft,
'closed' => $closed,
'expired' => $expired,
];
}, 5);
}
}