File manager - Edit - /var/www/html/homologBancodetalentos/app/Http/Controllers/Web/TalentBank/JobWebController.php
Back
<?php namespace App\Http\Controllers\Web\TalentBank; use App\Http\Controllers\Controller; use App\Http\Services\TalentBank\CandidateService; use App\Http\Services\TalentBank\JobService; use App\Models\TalentBank\Candidate; use App\Models\TalentBank\JobListing; use App\Support\SsoWebSession; use App\Support\TalentBank\CandidateJobCompatibility; use App\Support\TalentBank\JobApplicationStatus; use App\Support\TalentBank\JobListingQuery; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\DB; use Illuminate\View\View; class JobWebController extends Controller { public function index(Request $request): View { $perPage = (int) $request->input('perPage', 12); $page = (int) $request->input('page', 1); $offset = ($page - 1) * $perPage; if ($request->filled('descricao')) { $request->merge([ 'like' => 'description,'.$request->input('descricao'), 'search_occ' => $request->input('descricao'), ]); } $inFilters = [ 'modality_id' => (array) $request->input('modality_id', []), 'expertise_level_id' => (array) $request->input('expertise_level_id', []), 'workload_id' => (array) $request->input('workload_id', []), 'contract_type_filter' => (array) $request->input('contract_type_filter', []), ]; $inValues = []; foreach ($inFilters as $key => $values) { $values = array_filter($values, fn ($item) => $item !== null && $item !== ''); if ($values !== []) { $target = $key === 'contract_type_filter' ? 'contract_type_id' : $key; $inValues[] = $target.','.implode(',', $values); } } if ($inValues !== []) { $request->merge(['in' => $inValues]); } if (! $request->filled('sort')) { $request->merge(['sort' => 'id,desc']); } // Detecta candidato logado e se o filtro de compatibilidade está ativo $candidate = $this->resolveSessionCandidate(); $showAll = $request->boolean('todas_vagas'); $compatibilityFilter = false; $wantedOccupationNames = collect(); $candidateHasNoInterests = false; $showingAllOverride = false; if ($candidate !== null && ! $showAll) { $hasInterests = CandidateJobCompatibility::hasWantedOccupations($candidate); if ($hasInterests) { $compatibilityFilter = true; $wantedOccupationNames = CandidateJobCompatibility::wantedOccupationNames($candidate); $query = JobListingQuery::applyPublicFiltersForCandidate($request, $candidate); } else { $candidateHasNoInterests = true; $query = JobListingQuery::applyPublicFilters($request); } } else { if ($candidate !== null && $showAll && CandidateJobCompatibility::hasWantedOccupations($candidate)) { $showingAllOverride = true; $wantedOccupationNames = CandidateJobCompatibility::wantedOccupationNames($candidate); } $query = JobListingQuery::applyPublicFilters($request); } $query->with(['occupation', 'neighbourhood', 'contractType', 'salaryRange', 'expertiseLevel', 'modality', 'workload', 'company']); $total = (clone $query)->count(); $items = (clone $query)->offset($offset)->limit($perPage)->get(); $paginator = new LengthAwarePaginator( $items, $total, $perPage, $page, ['path' => url()->current(), 'query' => $request->query()] ); $candidateOptions = (new CandidateService())->getOptions(); $jobOptions = (new JobService())->getOptions(); $applicationStatuses = $this->sessionCandidateApplicationStatuses(); $filterOptions = [ 'occupations' => collect($candidateOptions['occupation'] ?? [])->map(fn ($r) => (object) $r), 'neighbourhoods' => collect($candidateOptions['neighbourhood'] ?? [])->map(fn ($r) => (object) $r), 'salary_ranges' => collect($jobOptions['salaryRange'] ?? [])->map(fn ($r) => (object) $r), 'contract_types' => collect($jobOptions['contractType'] ?? [])->map(fn ($r) => (object) $r), 'expertise_levels' => collect($jobOptions['expertiseLevel'] ?? [])->map(fn ($r) => (object) $r), 'modalities' => collect($jobOptions['modality'] ?? [])->map(fn ($r) => (object) $r), 'workloads' => collect($jobOptions['workload'] ?? [])->map(fn ($r) => (object) $r), ]; return view('pages.vagas', [ 'jobs' => $paginator, 'filterOptions' => $filterOptions, 'applicationStatuses' => $applicationStatuses, 'compatibilityFilter' => $compatibilityFilter, 'wantedOccupationNames' => $wantedOccupationNames, 'candidateHasNoInterests' => $candidateHasNoInterests, 'showingAllOverride' => $showingAllOverride, 'isLoggedCandidate' => $candidate !== null, ]); } public function show(Request $request, JobListing|int $job): View { $relations = ['occupation', 'salaryRange', 'contractType', 'neighbourhood', 'expertiseLevel', 'modality', 'workload', 'company']; $jobModel = $job instanceof JobListing ? $job->load($relations) : JobListing::with($relations)->findOrFail($job); $applied = false; $isCandidate = false; $applicationStatus = null; $candidate = $this->resolveSessionCandidate(); if ($candidate) { $isCandidate = true; $pivotRow = DB::table('job_listing_candidate') ->where('candidate_id', $candidate->id) ->where('job_listing_id', $jobModel->id) ->first(); if ($pivotRow !== null) { $applied = true; $applicationStatus = $pivotRow->status; } } return view('pages.detalhes-vagas', [ 'job' => $jobModel, 'applied' => $applied, 'isCandidate' => $isCandidate, 'applicationStatus' => $applicationStatus, 'applicationStatusLabel' => $applicationStatus !== null ? JobApplicationStatus::label($applicationStatus) : null, ]); } public function apply(Request $request, JobListing $job): RedirectResponse { $candidate = $request->talentBankUser; if (! $candidate instanceof Candidate) { return back()->with('error', __('validation.validation_error')); } (new JobService())->storeApplication($job, $candidate); return redirect()->route('vagas.show', $job) ->with('success', __('flash.application_registered')); } public function withdrawApplication(Request $request, JobListing $job): RedirectResponse { $candidate = $request->talentBankUser; if (! $candidate instanceof Candidate) { return back()->with('error', __('validation.validation_error')); } (new JobService())->deleteApplication($job, $candidate); return redirect()->route('vagas.show', $job) ->with('success', __('flash.application_withdrawn')); } /** * @return array<int, string> */ private function sessionCandidateApplicationStatuses(): array { $candidate = $this->resolveSessionCandidate(); if ($candidate === null) { return []; } return DB::table('job_listing_candidate') ->where('candidate_id', $candidate->id) ->get(['job_listing_id', 'status']) ->mapWithKeys(fn ($row) => [(int) $row->job_listing_id => (string) $row->status]) ->all(); } private function resolveSessionCandidate(): ?Candidate { if (! SsoWebSession::hasToken()) { return null; } $document = data_get(session('sso.user_payload', []), 'data.document', ''); if ($document === '') { return null; } return Candidate::where('cpf', $document)->first(); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.03 |
proxy
|
phpinfo
|
Settings