File manager - Edit - /var/www/html/homologBancodetalentos/app/Http/Controllers/Web/TalentBank/CompanyAreaWebController.php
Back
<?php namespace App\Http\Controllers\Web\TalentBank; use App\Http\Controllers\Controller; use App\Events\TalentBank\JobPublished; use App\Http\Services\TalentBank\CandidateService; use App\Http\Services\TalentBank\CompanyService; use App\Http\Services\TalentBank\JobService; use App\Http\Services\UserService; use App\Models\TalentBank\Candidate; use App\Models\TalentBank\Company; use App\Models\TalentBank\JobListing; use App\Models\TalentBank\Neighbourhood; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Validation\Rule; use App\Support\TalentBank\CurriculumPresenter; use App\Support\TalentBank\JobApplicantsCsvExporter; use App\Support\TalentBank\JobApplicationStatus; use App\Support\TalentBank\JobFormOptionsResolver; use Illuminate\Support\Facades\DB; use Symfony\Component\HttpFoundation\StreamedResponse; use Illuminate\View\View; class CompanyAreaWebController extends Controller { private JobService $jobService; private CompanyService $companyService; public function __construct() { $this->jobService = new JobService(); $this->companyService = new CompanyService(); } public function editProfile(Request $request): View { $company = $this->resolveCompany($request); $company->load('neighbourhood'); $neighbourhoods = Neighbourhood::query()->orderBy('name')->get(); return view('pages.alterar-cadastro-empresa', [ 'company' => $company, 'neighbourhoods' => $neighbourhoods, ]); } public function updateProfile(Request $request): RedirectResponse { $company = $this->resolveCompany($request); $request->validate([ 'corporate_name' => ['required', 'string', 'max:255'], 'trading_name' => ['nullable', 'string', 'max:255'], 'description' => ['nullable', 'string', 'max:10000'], 'address' => ['nullable', 'string', 'max:500'], 'zip_code' => ['nullable', 'string', 'max:20'], 'neighbourhood_id' => ['nullable', 'integer', 'exists:neighbourhoods,id'], 'telephone' => ['nullable', 'string', 'max:30'], 'cellphone' => ['nullable', 'string', 'max:30'], 'contact_name' => ['nullable', 'string', 'max:255'], 'email' => ['required', 'email', 'max:255'], 'active' => ['nullable', 'in:0,1'], 'logo' => ['nullable', 'image', 'max:2048'], ], [ 'corporate_name.required' => 'Informe a razão social.', 'email.required' => 'Informe o e-mail de contato.', 'email.email' => 'Informe um e-mail válido.', 'logo.image' => 'O arquivo da logo deve ser uma imagem.', 'logo.max' => 'A logo deve ter no máximo 2MB.', ]); $request->request->remove('cnpj'); $request->request->remove('document'); $isFirstCompletion = ! $company->isProfileComplete(); try { DB::beginTransaction(); $this->companyService->update($request, $company); if ($isFirstCompletion) { $company->markProfileComplete(); } DB::commit(); $company->refresh(); } catch (\Exception $e) { DB::rollBack(); return back()->withErrors(['form' => $e->getMessage()])->withInput(); } session()->forget('sso.profile_photo_path'); $successMsg = $isFirstCompletion ? 'Cadastro concluído! Bem-vinda ao Banco de Talentos. Agora você já pode publicar vagas.' : __('crud.message.update', ['model' => __('crud.model.talent_bank.company')]); return redirect()->route('talent-bank.company.dashboard') ->with('success', $successMsg); } public function dashboard(Request $request): View { $company = $this->resolveCompany($request); $perPage = (int) $request->input('perPage', 12); $page = (int) $request->input('page', 1); $offset = ($page - 1) * $perPage; $query = $company->jobListings() ->with(['occupation', 'modality', 'contractType']) ->orderByDesc('is_hiring') ->orderByDesc('id'); $total = (clone $query)->count(); $items = (clone $query)->offset($offset)->limit($perPage)->get(); $jobsPaginator = new LengthAwarePaginator( $items, $total, $perPage, $page, ['path' => url()->current(), 'query' => $request->query()] ); $empresa = ['nome' => $company->trading_name ?: $company->corporate_name ?: '']; $vagas = $items->map(function ($job) { $tags = array_values(array_filter([ optional($job->modality)->name, optional($job->contractType)->name, ])); return [ 'id' => $job->id, 'titulo' => optional($job->occupation)->name ?? 'Vaga', 'codigo' => $job->id, 'tags' => $tags, 'status' => $job->is_hiring ? 'Aberta' : 'Fechada', ]; }); return view('pages.perfil-empresa', [ 'company' => $company, 'empresa' => $empresa, 'vagas' => $vagas, 'jobs' => $jobsPaginator, ]); } public function createJob(Request $request): View { [$candidateOptions, $jobOptions] = $this->resolveJobFormOptions(); return view('pages.criacao-vaga', [ 'vaga' => [], 'formOptions' => $this->formatJobFormOptions($candidateOptions, $jobOptions), ]); } public function storeJob(Request $request): RedirectResponse { $company = $this->resolveCompany($request); $payload = $this->buildJobPayload($request); $fakeRequest = new Request($payload); try { $newJob = $this->jobService->store($fakeRequest, $company); JobPublished::dispatch($newJob); } catch (\Exception $e) { return back()->withErrors(['form' => $e->getMessage()])->withInput(); } return redirect()->route('talent-bank.company.dashboard') ->with('success', __('flash.job_registered')); } public function editJob(Request $request, JobListing $job): View { $company = $this->resolveCompany($request); [$candidateOptions, $jobOptions] = $this->resolveJobFormOptions(); $jobModel = JobListing::where('company_id', $company->id) ->with(['occupation', 'salaryRange', 'contractType', 'modality', 'expertiseLevel', 'neighbourhood', 'workload']) ->findOrFail($job->id); $vaga = [ 'id' => $jobModel->id, 'codigo' => $jobModel->id, 'titulo' => optional($jobModel->occupation)->name ?? '', 'role' => optional($jobModel->occupation)->name ?? '', 'salary' => optional($jobModel->salaryRange)->name ?? '', 'hide_company' => $jobModel->hide_company ? '1' : '0', 'hiring' => $jobModel->is_hiring ? '1' : '0', 'contract' => optional($jobModel->contractType)->name ?? '', 'modality' => optional($jobModel->modality)->name ?? '', 'experience_level' => optional($jobModel->expertiseLevel)->name ?? '', 'neighborhood' => optional($jobModel->neighbourhood)->name ?? '', 'workload' => optional($jobModel->workload)->name ?? '', 'total' => $jobModel->spots_total ?? '', 'filled' => $jobModel->spots_filled ?? '', 'description' => $jobModel->description ?? '', 'required_skills' => $jobModel->requirements_mandatory ?? '', 'optional_skills' => $jobModel->requirements_optional ?? '', 'benefits' => $jobModel->benefits ?? '', 'other_info' => $jobModel->misc_info ?? '', ]; return view('pages.editar-vaga', [ 'job' => $jobModel, 'vaga' => $vaga, 'formOptions' => $this->formatJobFormOptions($candidateOptions, $jobOptions), ]); } public function updateJob(Request $request, JobListing $job): RedirectResponse { $company = $this->resolveCompany($request); $jobModel = JobListing::where('company_id', $company->id)->findOrFail($job->id); $wasHiring = (bool) $jobModel->is_hiring; $payload = $this->buildJobPayload($request); $fakeRequest = new Request($payload); try { $this->jobService->update($fakeRequest, $jobModel); $jobModel->refresh(); if ($wasHiring && ! $jobModel->is_hiring) { $this->jobService->closeJobApplications($jobModel); } } catch (\Exception $e) { return back()->withErrors(['form' => $e->getMessage()])->withInput(); } return redirect()->route('talent-bank.company.dashboard') ->with('success', __('crud.message.update', ['model' => __('crud.model.talent_bank.job')])); } public function destroyJob(Request $request, JobListing $job): RedirectResponse { $company = $this->resolveCompany($request); $jobModel = JobListing::where('company_id', $company->id)->findOrFail($job->id); try { $this->jobService->destroy($jobModel); } catch (\Exception $e) { return back()->with('error', $e->getMessage()); } return redirect()->route('talent-bank.company.dashboard') ->with('success', __('crud.message.delete', ['model' => __('crud.model.talent_bank.job')])); } public function jobApplicants(Request $request, JobListing $job): View|StreamedResponse { $company = $this->resolveCompany($request); $jobModel = JobListing::where('company_id', $company->id) ->with(array_merge(['occupation'], JobApplicantsCsvExporter::candidateRelationPaths())) ->findOrFail($job->id); $candidatos = $jobModel->candidates; $empresa = ['nome' => $company->trading_name ?: $company->corporate_name ?: '']; if ($request->query('export') === 'csv') { $filename = 'candidatos-vaga-'.$jobModel->id.'.csv'; return (new JobApplicantsCsvExporter())->download($candidatos, $filename); } return view('pages.candidatos-vaga', [ 'company' => $company, 'empresa' => $empresa, 'job' => $jobModel, 'candidatos' => $candidatos, 'totalCandidatos' => $candidatos->count(), ]); } public function downloadCandidatePdf(Request $request, JobListing $job, Candidate $candidate): \Symfony\Component\HttpFoundation\Response { $company = $this->resolveCompany($request); JobListing::where('company_id', $company->id)->findOrFail($job->id); return CurriculumPresenter::downloadResponse($candidate); } public function streamCandidatePdf(Request $request, JobListing $job, Candidate $candidate): \Symfony\Component\HttpFoundation\Response { $company = $this->resolveCompany($request); JobListing::where('company_id', $company->id)->findOrFail($job->id); return CurriculumPresenter::streamResponse($candidate); } public function printCandidateCurriculum(Request $request, JobListing $job, Candidate $candidate): \Illuminate\View\View { $company = $this->resolveCompany($request); JobListing::where('company_id', $company->id)->findOrFail($job->id); $payload = CurriculumPresenter::build($candidate); $photoDataUri = CurriculumPresenter::photoDataUri($candidate); return view('pages.curriculo-imprimir', array_merge($payload, compact('photoDataUri'))); } public function updateApplicantStatus(Request $request, JobListing $job, Candidate $candidate): RedirectResponse { $request->validate([ 'status' => ['required', 'string', Rule::in(JobApplicationStatus::values())], ]); $company = $this->resolveCompany($request); // Garante que a vaga pertence à empresa logada JobListing::where('company_id', $company->id)->findOrFail($job->id); $this->jobService->updateApplicationStatus($job, $candidate, $request->input('status')); return redirect() ->route('talent-bank.company.jobs.applicants', $job) ->with('success', 'Status do candidato atualizado com sucesso.'); } public function selfEdit(Request $request): RedirectResponse { $company = $this->resolveCompany($request); try { DB::beginTransaction(); $userService = new UserService(); $ssoResponse = $userService->selfEdit($request); if ($ssoResponse->status() === 200) { $userData = data_get($ssoResponse->json(), 'data.user', []); $updateRequest = new Request(array_filter([ 'corporate_name' => $userData['name'] ?? null, 'email' => $userData['email'] ?? null, ])); if ($updateRequest->all()) { $this->companyService->update($updateRequest, $company); } } DB::commit(); } catch (\Exception $e) { DB::rollBack(); return back()->withErrors(['form' => $e->getMessage()])->withInput(); } return redirect()->route('talent-bank.company.dashboard') ->with('success', __('crud.message.update', ['model' => __('crud.model.talent_bank.company')])); } private function buildJobPayload(Request $request): array { [$candidateOptions, $jobOptions] = $this->resolveJobFormOptions(); return [ 'occupation_id' => JobFormOptionsResolver::optionId($candidateOptions['occupation'] ?? [], $request->input('role')), 'salary_range_id' => JobFormOptionsResolver::optionId($jobOptions['salaryRange'] ?? [], $request->input('salary')), 'contract_type_id' => JobFormOptionsResolver::optionId($jobOptions['contractType'] ?? [], $request->input('contract')), 'modality_id' => JobFormOptionsResolver::optionId($jobOptions['modality'] ?? [], $request->input('modality')), 'expertise_level_id' => JobFormOptionsResolver::optionId($jobOptions['expertiseLevel'] ?? [], $request->input('experience_level')), 'neighbourhood_id' => JobFormOptionsResolver::optionId($candidateOptions['neighbourhood'] ?? [], $request->input('neighborhood')), 'workload_id' => JobFormOptionsResolver::optionId($jobOptions['workload'] ?? [], $request->input('workload')), 'hide_company' => (int) $request->input('hide_company', 0), 'is_hiring' => (int) $request->input('hiring', 1), 'spots_total' => (int) $request->input('total', 0), 'spots_filled' => (int) $request->input('filled', 0), 'description' => $request->input('description'), 'requirements_mandatory' => $request->input('required_skills'), 'requirements_optional' => $request->input('optional_skills'), 'benefits' => $request->input('benefits'), 'misc_info' => $request->input('other_info'), ]; } /** * @return array{0: array<string, mixed>, 1: array<string, mixed>} */ private function resolveJobFormOptions(): array { return JobFormOptionsResolver::resolveRaw(); } /** * @param array<string, mixed> $candidateOptions * @param array<string, mixed> $jobOptions * @return array<string, array<int, array<string, mixed>>> */ private function formatJobFormOptions(array $candidateOptions, array $jobOptions): array { return JobFormOptionsResolver::formatForView($candidateOptions, $jobOptions); } private function resolveCompany(Request $request): Company { $user = $request->input('talentBankUser') ?? $request->talentBankUser ?? null; abort_if(! $user instanceof Company, 403); return $user; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings