File manager - Edit - /var/www/html/homologBancodetalentos/app/Http/Services/TalentBank/JobService.php
Back
<?php namespace App\Http\Services\TalentBank; use App\Http\Resources\TalentBank\JobCollection; use App\Http\Resources\TalentBank\JobPublicResource; use App\Http\Services\BaseService; use App\Models\TalentBank\Candidate; use App\Models\TalentBank\Company; use App\Models\TalentBank\ContractType; use App\Models\TalentBank\ExpertiseLevel; use App\Models\TalentBank\JobListing; use App\Models\TalentBank\Modality; use App\Models\TalentBank\SalaryRange; use App\Models\TalentBank\Workload; use App\Support\TalentBank\ApplicationNotificationType; use App\Support\TalentBank\JobApplicationStatus; use App\Support\TalentBank\JobListingQuery; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; class JobService extends BaseService { private NotificationService $notificationService; public function __construct(?NotificationService $notificationService = null) { $this->notificationService = $notificationService ?? app(NotificationService::class); } protected $model = JobListing::class; public function index(Request $request) { $perPage = is_null($request['perPage']) ? 10 : $request['perPage']; $page = is_null($request['page']) ? 1 : $request['page']; $offset = ($page - 1) * $perPage; $query = JobListingQuery::applyPublicFilters($request); $total = (clone $query)->count(); $result = (clone $query)->offset($offset)->limit($perPage)->get(); return new LengthAwarePaginator(JobPublicResource::collection($result), $total, $perPage, $page); } public function indexToAdmin(Request $request) { return $this->paginateRessource($request, JobCollection::class); } public function paginateRessource(Request $request, string $resourceClass): LengthAwarePaginator { if (! class_exists($resourceClass)) { throw new \Exception(__('crud.message.class_not_found')); } $perPage = is_null($request['perPage']) ? 10 : $request['perPage']; $page = is_null($request['page']) ? 1 : $request['page']; $offset = ($page - 1) * $perPage; $query = JobListingQuery::applyAdminFilters($request); $total = (clone $query)->count(); $result = (clone $query)->with('candidates')->offset($offset)->limit($perPage)->get(); return new LengthAwarePaginator(new $resourceClass($result), $total, $perPage, $page); } public function store(Request $request, Company $company): JobListing { $data = $this->sanitizeJobPayload($request->all()); $companyKey = $this->resolveColumnName(['company_id', 'id_company']); if ($companyKey !== null) { $data[$companyKey] = $company->id; } $now = now(); $data['created_at'] = $now; $data['updated_at'] = $now; $jobId = DB::table('job_listings')->insertGetId($data); $newJob = JobListing::query()->findOrFail($jobId); return $newJob; } public function show(JobListing $job): JobListing { return $job; } public function update(Request $request, JobListing $job): JobListing { $data = $this->sanitizeJobPayload($request->all()); JobListing::query()->whereKey($job->getKey())->update($data); $job->refresh(); return $job; } public function destroy(JobListing $job): bool { $this->closeJobApplications($job); $job->delete(); return true; } public function getOptions(): array { $salaryRanges = SalaryRange::select(['id', 'name'])->get(); $contractTypes = ContractType::select(['id', 'name'])->get(); $expertiseLevels = ExpertiseLevel::select(['id', 'name'])->get(); $modalities = Modality::select(['id', 'name'])->get(); $workloads = Workload::select(['id', 'name'])->get(); return [ 'salaryRange' => $salaryRanges->toArray(), 'contractType' => $contractTypes->toArray(), 'expertiseLevel' => $expertiseLevels->toArray(), 'modality' => $modalities->toArray(), 'workload' => $workloads->toArray(), ]; } public function storeApplication(JobListing $job, Candidate $candidate): bool { $job->candidates()->syncWithoutDetaching([ $candidate->id => ['status' => JobApplicationStatus::initialOnApply()], ]); $this->notificationService->dispatch( ApplicationNotificationType::APPLICATION_SUBMITTED, $job, $candidate, null, JobApplicationStatus::ENROLLED, 'candidate', $candidate->id, ); return true; } public function deleteApplication(JobListing $job, Candidate $candidate): bool { $job->candidates()->detach($candidate->id); $this->notificationService->dispatch( ApplicationNotificationType::APPLICATION_WITHDRAWN, $job, $candidate, null, JobApplicationStatus::CANCELLED, 'candidate', $candidate->id, ); return true; } public function updateApplicationStatus( JobListing $job, Candidate $candidate, string $status, string $changedByType = 'company', ?int $changedById = null, ): bool { if (! JobApplicationStatus::isValid($status)) { throw new \InvalidArgumentException("Status inválido: {$status}"); } $previous = $job->candidates()->where('candidates.id', $candidate->id)->first(); $fromStatus = $previous?->pivot?->status; if ($fromStatus === $status) { return true; } $job->candidates()->updateExistingPivot($candidate->id, ['status' => $status]); $this->notificationService->dispatch( ApplicationNotificationType::STATUS_CHANGED, $job, $candidate, $fromStatus, $status, $changedByType, $changedById, [], ); return true; } public function closeJobApplications(JobListing $job): void { $candidates = $job->candidates()->get(); foreach ($candidates as $candidate) { $from = $candidate->pivot->status; if ($from === JobApplicationStatus::CLOSED) { continue; } $job->candidates()->updateExistingPivot($candidate->id, ['status' => JobApplicationStatus::CLOSED]); $this->notificationService->dispatch( ApplicationNotificationType::JOB_CLOSED, $job, $candidate, $from, JobApplicationStatus::CLOSED, 'system', null, ); } } /** * @param array<string, mixed> $payload * @return array<string, mixed> */ private function sanitizeJobPayload(array $payload): array { if (array_key_exists('descripton', $payload) && ! array_key_exists('description', $payload)) { $payload['description'] = $payload['descripton']; } unset($payload['descripton'], $payload['id_company'], $payload['company_id']); $columnMap = [ 'occupation_id' => ['occupation_id', 'id_occupation'], 'salary_range_id' => ['salary_range_id', 'id_salary_range', 'salary_id'], 'contract_type_id' => ['contract_type_id', 'id_contract_type', 'contract_id'], 'neighbourhood_id' => ['neighbourhood_id', 'id_neighbourhood', 'neighborhood_id'], 'expertise_level_id' => ['expertise_level_id', 'id_expertise_level'], 'modality_id' => ['modality_id', 'id_modality'], 'workload_id' => ['workload_id', 'id_workload'], 'spots_total' => ['spots_total', 'total_spots', 'vacancies'], 'spots_filled' => ['spots_filled', 'filled_spots', 'vacancies_filled'], 'description' => ['description', 'descripton'], 'requirements_mandatory' => ['requirements_mandatory'], 'requirements_optional' => ['requirements_optional'], 'benefits' => ['benefits'], 'misc_info' => ['misc_info', 'other_info'], 'hide_company' => ['hide_company', 'hideCompany'], 'is_hiring' => ['is_hiring', 'hiring'], ]; $normalized = []; foreach ($columnMap as $canonical => $candidates) { if (! array_key_exists($canonical, $payload)) { continue; } $target = $this->resolveColumnName($candidates); if ($target !== null) { $normalized[$target] = $payload[$canonical]; } } return $normalized; } /** * @param array<int, string> $candidates */ private function resolveColumnName(array $candidates): ?string { if (! Schema::hasTable('job_listings')) { return null; } $columns = Schema::getColumnListing('job_listings'); foreach ($candidates as $candidate) { if (in_array($candidate, $columns, true)) { return $candidate; } } return null; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings