File manager - Edit - /var/www/html/homologBancodetalentos/app/Http/Services/TalentBank/CandidateService.php
Back
<?php namespace App\Http\Services\TalentBank; use App\Http\Resources\TalentBank\CandidateCollection; use App\Http\Services\BaseService; use App\Mail\TalentBank\TalentBankContact; use App\Models\TalentBank\AcademicDiscipline; use App\Models\TalentBank\BusinessLine; use App\Models\TalentBank\Candidate; use App\Models\TalentBank\EducationLevel; use App\Models\TalentBank\Gender; use App\Models\TalentBank\Language; use App\Models\TalentBank\LanguageProficiency; use App\Models\TalentBank\MaritalStatus; use App\Models\TalentBank\Neighbourhood; use App\Models\TalentBank\Occupation; use App\Support\TalentBank\CandidateQuery; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Storage; class CandidateService extends BaseService { protected $model = Candidate::class; /** Caminho relativo ao disco {@see FilesystemAdapter::url} `public` (storage/app/public). */ public static string $photoPublicUrl = 'talent_bank/candidate/'; public function index(Request $request) { $candidates = $this->paginateRessource($request, CandidateCollection::class); return $candidates->toArray(); } 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 = CandidateQuery::apply($request); $total = (clone $query)->count(); $result = (clone $query)->offset($offset)->limit($perPage)->get(); return new LengthAwarePaginator(new $resourceClass($result), $total, $perPage, $page); } public function store(Request $request): Candidate { $newCandidate = new Candidate(); $newCandidate->fill($request->all()); $newCandidate->save(); $newCandidate->refresh(); return $newCandidate; } public function show(Candidate $candidate): Candidate { return $candidate; } public function update(array $data, Candidate $candidate): Candidate { $candidate->fill($data); $candidate->save(); return $candidate; } public function destroy(Candidate $candidate): bool { $candidate->delete(); return true; } public function attachLanguage(Request $request, Candidate $candidate): Candidate { $data = $request->all(); $language = [$data['language_id'] => ['language_proficiency_id' => $data['language_proficiency_id']]]; $candidate->languages()->syncWithoutDetaching($language); $candidate->refresh(); return $candidate; } public function detachLanguage(Candidate $candidate, int $languageId): Candidate { $candidate->languages()->detach([$languageId]); $candidate->refresh(); return $candidate; } public function attachWantedOccupation(Candidate $candidate, int $occupationId): Candidate { $candidate->wantedOccupations()->syncWithoutDetaching([$occupationId]); $candidate->refresh(); return $candidate; } public function detachWantedOccupation(Candidate $candidate, int $occupationId): Candidate { $candidate->wantedOccupations()->detach([$occupationId]); $candidate->refresh(); return $candidate; } public function getOptions(): array { return [ 'academicDiscipline' => AcademicDiscipline::select(['id', 'name'])->get()->toArray(), 'businessLine' => BusinessLine::select(['id', 'name'])->get()->toArray(), 'educationLevel' => EducationLevel::select(['id', 'name'])->get()->toArray(), 'gender' => Gender::select(['id', 'name'])->get()->toArray(), 'language' => Language::select(['id', 'name'])->get()->toArray(), 'maritalStatus' => MaritalStatus::select(['id', 'name'])->get()->toArray(), 'neighbourhood' => Neighbourhood::select(['id', 'name'])->get()->toArray(), 'occupation' => Occupation::select(['id', 'name'])->get()->toArray(), 'proficiency' => LanguageProficiency::select(['id', 'name'])->get()->toArray(), ]; } public function reportPaginated(Request $request): LengthAwarePaginator { $counters = $this->getCounters($request); $perPage = is_null($request['perPage']) ? 10 : $request['perPage']; $page = is_null($request['page']) ? 1 : $request['page']; $offset = ($page - 1) * $perPage; $query = CandidateQuery::apply($request); $total = (clone $query)->count(); $result = (clone $query)->offset($offset)->limit($perPage)->get(); return new LengthAwarePaginator(['list' => new CandidateCollection($result), 'counters' => $counters], $total, $perPage, $page); } public function report(Request $request): Collection { $query = CandidateQuery::apply($request); $counters = $this->getCounters($request); return new Collection(['list' => new CandidateCollection($query->get()), 'counters' => $counters]); } public function getCounters(Request $request): array { $base = CandidateQuery::apply($request); $counters = []; $counters['special_needs'] = (clone $base)->where('special_needs', 1)->count(); if (! $request->has('gender_id')) { $counters['feminino'] = (clone $base)->whereHas('gender', function ($query) { $query->where('name', 'Feminino'); })->count(); $counters['masculino'] = (clone $base)->whereHas('gender', function ($query) { $query->where('name', 'Masculino'); })->count(); $counters['outro'] = (clone $base)->whereHas('gender', function ($query) { $query->where('name', 'Outro'); })->count(); } if (! $request->has('ethnicity')) { $map = [ 'brancos' => 'Branco', 'pretos' => 'Preto', 'pardos' => 'Pardo', 'indigenas' => 'IndÃgena', 'amarelos' => 'Amarelo', ]; foreach ($map as $key => $name) { $counters[$key] = (clone $base)->whereHas('ethnicity', function ($query) use ($name) { $query->where('name', $name); })->count(); } } if ($request->has('neighbourhoods') || $request->has('occupations')) { $arrayIn = array_filter([ 'neighbourhoods' => $request['neighbourhoods'] ?? null, 'occupations' => $request['occupations'] ?? null, ]); $counters = array_merge($counters, $this->getInCounters(clone $base, $arrayIn)); } $counters['total'] = (clone $base)->count(); return $counters; } private function getInCounters($query, array $arrayIn): array { $inFilters = [ 'neighbourhoods' => ['class' => Neighbourhood::class, 'column' => 'neighbourhood_id'], 'occupations' => ['class' => Occupation::class, 'column' => 'occupation_id'], ]; $array = $this->getInArray($arrayIn); $counters = []; foreach ($array as $key => $value) { if (isset($inFilters[$key])) { foreach ($value as $item) { $row = (new $inFilters[$key]['class']())->where('id', $item)->first(); if (! $row) { continue; } $counters[$key][$row->name] = (clone $query)->where($inFilters[$key]['column'], $item)->count(); } } } return $counters; } private function getInArray(array $arrayIn): array { $array = []; foreach ($arrayIn as $key => $item) { $array[$key] = explode(',', $item); } return $array; } public function contact(Request $request): void { $collection = collect($request->all()); $recipient = (string) (env('MAIL_CONTACT') ?: 'contato@example.com'); Mail::to($recipient)->send(new TalentBankContact($collection)); } public static function photoPublicUrl(?string $stored): ?string { if (! is_string($stored) || trim($stored) === '') { return null; } if (str_starts_with($stored, 'uploads/')) { return asset($stored); } return Storage::disk('public')->url(self::photoStoragePath($stored)); } public static function photoDataUri(Candidate $candidate): ?string { if (! Schema::hasColumn('candidates', 'photo_path')) { return null; } $stored = $candidate->photo_path; if (! is_string($stored) || $stored === '') { return null; } if (str_starts_with($stored, 'uploads/')) { $full = public_path($stored); if (! is_file($full)) { return null; } $mime = @mime_content_type($full) ?: 'image/jpeg'; $binary = @file_get_contents($full); } else { $path = self::photoStoragePath($stored); if (! Storage::disk('public')->exists($path)) { return null; } $mime = Storage::disk('public')->mimeType($path) ?: 'image/jpeg'; $binary = Storage::disk('public')->get($path); } if ($binary === false || $binary === '') { return null; } return 'data:'.$mime.';base64,'.base64_encode($binary); } public function updatePhoto(Request $request, Candidate $candidate): Candidate { $request->validate(['photo' => 'required|image|mimes:jpg,jpeg,png,webp|max:2048']); $file = $request->file('photo'); $filename = uniqid('candidate_', true).'.'.$file->getClientOriginalExtension(); self::deleteStoredPhoto($candidate->photo_path); Storage::disk('public')->putFileAs( rtrim(self::$photoPublicUrl, '/'), $file, $filename, ['visibility' => 'public'] ); return $this->update(['photo_path' => $filename], $candidate); } public static function deleteStoredPhoto(?string $stored): void { if (! is_string($stored) || trim($stored) === '') { return; } if (str_starts_with($stored, 'uploads/')) { $full = public_path($stored); if (is_file($full)) { @unlink($full); } return; } Storage::disk('public')->delete(self::photoStoragePath($stored)); } private static function photoStoragePath(string $filename): string { return self::$photoPublicUrl.ltrim($filename, '/'); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings