File manager - Edit - /var/www/html/homologBancodetalentos/app/Support/TalentBank/JobApplicantsCsvExporter.php
Back
<?php namespace App\Support\TalentBank; use App\Models\TalentBank\Candidate; use App\Models\TalentBank\LanguageProficiency; use Illuminate\Support\Carbon; use Illuminate\Support\Collection; use Symfony\Component\HttpFoundation\StreamedResponse; final class JobApplicantsCsvExporter { /** @return list<string> */ public static function candidateRelationPaths(): array { return [ 'candidates.occupation', 'candidates.neighbourhood', 'candidates.gender', 'candidates.maritalStatus', 'candidates.ethnicity', 'candidates.experiences.occupation', 'candidates.experiences.businessLine', 'candidates.educations.educationLevel', 'candidates.educations.academicDiscipline', 'candidates.courses', 'candidates.languages', 'candidates.wantedOccupations', 'candidates.skills', ]; } /** @return list<string> */ public static function headers(): array { return [ 'Nome', 'CPF', 'E-mail', 'Celular', 'Telefone', 'Data de Nascimento', 'Genero', 'Estado Civil', 'Etnia', 'PCD', 'Possui experiencia profissional', 'Bairro', 'Endereco', 'CEP', 'Ocupacao Atual', 'Areas de Interesse', 'Salario Minimo (R$)', 'Pretensao Salarial (R$)', 'Experiencias Profissionais', 'Formacao Academica', 'Cursos e Certificacoes', 'Idiomas', 'Habilidades', 'Resumo / CV', 'Candidatura em', 'Status', ]; } /** * @param iterable<int, Candidate> $candidatos */ public function download(iterable $candidatos, string $filename): StreamedResponse { $proficiencyLabels = LanguageProficiency::query()->pluck('name', 'id'); return response()->streamDownload(function () use ($candidatos, $proficiencyLabels): void { $handle = fopen('php://output', 'wb'); if ($handle === false) { return; } fwrite($handle, "\xEF\xBB\xBF"); fputcsv($handle, self::headers(), ';'); foreach ($candidatos as $candidato) { fputcsv($handle, self::row($candidato, $proficiencyLabels), ';'); } fclose($handle); }, $filename, [ 'Content-Type' => 'text/csv; charset=UTF-8', ]); } /** * @param Collection<int|string, string|null> $proficiencyLabels * @return list<string> */ public static function row(Candidate $candidato, Collection $proficiencyLabels): array { $pivotStatus = (string) (data_get($candidato, 'pivot.status') ?? JobApplicationStatus::ENROLLED); return [ (string) ($candidato->name ?? ''), self::formatCpf((string) ($candidato->cpf ?? '')), (string) ($candidato->email ?? ''), (string) ($candidato->cellphone ?? ''), (string) ($candidato->telephone ?? ''), self::formatDate($candidato->birth_date), (string) (optional($candidato->gender)->name ?? ''), (string) (optional($candidato->maritalStatus)->name ?? ''), (string) (optional($candidato->ethnicity)->name ?? ''), $candidato->special_needs ? 'Sim' : 'Nao', $candidato->has_experience ? 'Sim' : 'Nao', (string) (optional($candidato->neighbourhood)->name ?? ''), (string) ($candidato->address ?? ''), (string) ($candidato->zip_code ?? ''), (string) (optional($candidato->occupation)->name ?? ''), $candidato->wantedOccupations->pluck('name')->filter()->implode(', '), self::formatMoney($candidato->min_payment), self::formatMoney($candidato->desired_payment), self::formatExperiences($candidato->experiences), self::formatEducations($candidato->educations), self::formatCourses($candidato->courses), self::formatLanguages($candidato->languages, $proficiencyLabels), $candidato->skills->pluck('name')->filter()->implode(', '), self::normalizeText((string) ($candidato->cv_summary ?? '')), self::formatDateTime(data_get($candidato, 'pivot.created_at')), JobApplicationStatus::label($pivotStatus), ]; } private static function formatCpf(string $cpf): string { $digits = preg_replace('/\D/', '', $cpf) ?? ''; if (strlen($digits) === 11) { return substr($digits, 0, 3).'.' .substr($digits, 3, 3).'.' .substr($digits, 6, 3).'-' .substr($digits, 9, 2); } return $digits; } private static function formatMoney(mixed $value): string { if (! is_numeric($value)) { return ''; } return 'R$ '.number_format((float) $value, 2, ',', '.'); } private static function formatDate(mixed $value): string { if ($value instanceof Carbon) { return $value->format('d/m/Y'); } if ($value === null || $value === '') { return ''; } try { return Carbon::parse($value)->format('d/m/Y'); } catch (\Throwable) { return ''; } } private static function formatDateTime(mixed $value): string { if ($value === null || $value === '') { return ''; } try { return Carbon::parse($value)->format('d/m/Y H:i'); } catch (\Throwable) { return ''; } } private static function formatPeriod(mixed $start, mixed $end, bool $isCurrent): string { $from = $start instanceof Carbon ? $start->format('m/Y') : ($start ? self::formatMonthYear($start) : ''); if ($isCurrent) { return trim($from.' - atual', ' -'); } $to = $end instanceof Carbon ? $end->format('m/Y') : ($end ? self::formatMonthYear($end) : ''); if ($from === '' && $to === '') { return ''; } if ($from === '') { return $to; } if ($to === '') { return $from; } return $from.' - '.$to; } private static function formatMonthYear(mixed $value): string { try { return Carbon::parse($value)->format('m/Y'); } catch (\Throwable) { return ''; } } /** * @param Collection<int, \App\Models\TalentBank\Candidate\Experience> $experiences */ private static function formatExperiences(Collection $experiences): string { return $experiences ->sortByDesc(fn ($exp) => $exp->date_start?->format('Y-m-d') ?? '') ->map(function ($exp) { $role = optional($exp->occupation)->name ?? 'Cargo nao informado'; $company = $exp->company ?: 'Empresa nao informada'; $line = $role.' @ '.$company; if (optional($exp->businessLine)->name) { $line .= ' ('.$exp->businessLine->name.')'; } $period = self::formatPeriod($exp->date_start, $exp->date_end, (bool) $exp->is_current); if ($period !== '') { $line .= ' ['.$period.']'; } if (is_string($exp->description) && trim($exp->description) !== '') { $line .= ': '.self::normalizeText($exp->description); } return $line; }) ->implode(' | '); } /** * @param Collection<int, \App\Models\TalentBank\Candidate\Education> $educations */ private static function formatEducations(Collection $educations): string { return $educations ->sortByDesc(fn ($edu) => $edu->date_start?->format('Y-m-d') ?? '') ->map(function ($edu) { $title = optional($edu->educationLevel)->name ?? 'Nivel nao informado'; if (optional($edu->academicDiscipline)->name) { $title .= ' - '.$edu->academicDiscipline->name; } if (is_string($edu->specialization) && trim($edu->specialization) !== '') { $title .= ' ('.trim($edu->specialization).')'; } if (is_string($edu->institution) && trim($edu->institution) !== '') { $title .= ' @ '.trim($edu->institution); } $period = self::formatPeriod($edu->date_start, $edu->date_end, false); if ($period !== '') { $title .= ' ['.$period.']'; } return $title; }) ->implode(' | '); } /** * @param Collection<int, \App\Models\TalentBank\Candidate\Course> $courses */ private static function formatCourses(Collection $courses): string { return $courses ->sortByDesc(fn ($course) => $course->date_start?->format('Y-m-d') ?? '') ->map(function ($course) { $parts = array_filter([ $course->name, $course->institution, $course->duration ? $course->duration.'h' : null, ]); $line = implode(', ', $parts); $period = self::formatPeriod($course->date_start, $course->date_end, false); if ($period !== '') { $line .= ' ['.$period.']'; } return $line; }) ->implode(' | '); } /** * @param Collection<int, \App\Models\TalentBank\Language> $languages * @param Collection<int|string, string|null> $proficiencyLabels */ private static function formatLanguages(Collection $languages, Collection $proficiencyLabels): string { return $languages ->map(function ($language) use ($proficiencyLabels) { $label = (string) ($language->name ?? ''); $proficiencyId = data_get($language, 'pivot.language_proficiency_id'); $proficiency = $proficiencyId !== null ? (string) ($proficiencyLabels->get($proficiencyId) ?? '') : ''; if ($proficiency !== '') { $label .= ' ('.$proficiency.')'; } return $label; }) ->filter() ->implode(', '); } private static function normalizeText(string $text): string { $text = strip_tags($text); $text = preg_replace('/\s+/u', ' ', $text) ?? $text; return trim($text); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings