File manager - Edit - /var/www/html/portal/app/Http/Controllers/CurriculoController.php
Back
<?php namespace App\Http\Controllers; use App\Enums\GendersCurriculo; use App\Enums\CurriculoStatus; use App\Models\Siati\Candidate; use App\Models\Siati\Companie; use App\Models\Siati\Neighbourhood; use App\Models\Siati\Occupation; use App\Models\Siati\StatusCurriculo; use App\Models\Siati\UserSiatiAuth; use App\Models\SystemLog; use Illuminate\Http\Request; use Illuminate\Support\Str; use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; class CurriculoController extends Controller { public function __construct() { $this->middleware('curriculos'); } public function index(Request $request) { $query = Candidate::with('occupation')->orderBy('name', 'asc'); if ($request->filled('busca')) { $busca = $request->busca; $query->where(function ($q) use ($busca) { $q->where('name', 'like', "%{$busca}%") ->orWhere('email', 'like', "%{$busca}%") ->orWhere('cpf', 'like', "%{$busca}%"); }); } if ($request->filled('occupation_id')) { $query->where('occupation_id', $request->occupation_id); } if ($request->filled('neighbourhood_id')) { $query->where('neighbourhood_id', $request->neighbourhood_id); } if ($request->filled('gender_id')) { $query->where('gender_id', $request->gender_id); } if ($request->filled('data_cadastro_inicio')) { $query->whereDate('created_at', '>=', $request->data_cadastro_inicio); } if ($request->filled('data_cadastro_fim')) { $query->whereDate('created_at', '<=', $request->data_cadastro_fim); } if ($request->filled('data_atualizacao_inicio')) { $query->whereDate('updated_at', '>=', $request->data_atualizacao_inicio); } if ($request->filled('data_atualizacao_fim')) { $query->whereDate('updated_at', '<=', $request->data_atualizacao_fim); } $curriculos = $query->paginate(50)->appends($request->all()); // Armazena o id mostrado no paginate $candidateIds = $curriculos->pluck('id'); $statusMap = DB::connection('mysql') ->table('status_curriculo') ->select('candidate_id', 'status', 'status_date') ->whereIn('candidate_id', $candidateIds) ->orderBy('status_date', 'desc') ->get() ->groupBy('candidate_id') ->map(fn($items) => $items->first()); foreach ($curriculos as $curriculo) { $curriculo->ultimo_status = $statusMap[$curriculo->id]->status ?? null; } $occupations = Occupation::orderBy('name', 'asc')->get(); $neighbourhoods = Neighbourhood::orderBy('name', 'asc')->get(); $genders = GendersCurriculo::cases(); $status = CurriculoStatus::cases(); return view("admin.curriculos.index", compact('curriculos', 'occupations', 'neighbourhoods', 'genders', 'status')); } public function acompanhamentoCurriculo(Request $request, $id) { $curriculo = Candidate::findOrFail($id); $status = CurriculoStatus::cases(); $acompanhamentos = StatusCurriculo::where('candidate_id', $id) ->orderBy('created_at', 'desc') ->paginate(20); // Parâmetros de busca para manter na URL de retorno $searchParams = $request->except(['return_url', 'page']); return view('admin.curriculos.acompanhamento', compact('curriculo', 'acompanhamentos', 'status', 'searchParams')); } public function store(Request $request) { $request->validate([ 'candidate_id' => 'required', 'status_date' => 'required|date', 'status' => 'required|string|max:255', 'observacao' => 'nullable|string|max:2000', ]); StatusCurriculo::create([ 'id' => Str::uuid(), 'candidate_id' => $request->candidate_id, 'status' => $request->status, 'status_date' => $request->status_date, 'observacao' => $request->observacao, ]); // Mantém os parâmetros de busca ao redirecionar $searchParams = $request->except(['candidate_id', 'status_date', 'status', 'observacao', '_token']); $returnUrl = $request->input('return_url'); if ($returnUrl) { return redirect($returnUrl)->with('success', 'Status do currículo criado com sucesso.'); } return redirect()->back()->with('success', 'Status do currículo criado com sucesso.'); } public function update(Request $request, $id) { $request->validate([ 'status' => 'required|string|max:255', 'observacao' => 'nullable|string|max:2000', 'status_date' => 'required|date', ]); $status = StatusCurriculo::findOrFail($id); $status->update([ 'status' => $request->status, 'observacao' => $request->observacao, 'status_date' => $request->status_date, ]); // Mantém os parâmetros de busca ao redirecionar $returnUrl = $request->input('return_url'); if ($returnUrl) { return redirect($returnUrl)->with('success', 'Status do currículo atualizado com sucesso.'); } return redirect()->back()->with('success', 'Status do currículo atualizado com sucesso.'); } public function gerarCurriculo(Request $request, $id) { $curriculo = Candidate::with(['occupation', 'neighbourhood', 'courses', 'education', 'experiences.occupation', 'languages', 'skills']) ->findOrFail($id); $pdf = Pdf::loadView('admin.curriculos.relatorios.curriculo', compact('curriculo')); $nomeArquivo = Str::slug($curriculo->name) . '_curriculo.pdf'; return $pdf->stream($nomeArquivo); } public function gerarRelatorio(Request $request) { $statuses = $request->input('statuses', []); $ultimoStatus = DB::connection('mysql') ->table('status_curriculo as stts') ->select('stts.*') ->join(DB::raw('( SELECT candidate_id, MAX(status_date) as max_date FROM status_curriculo GROUP BY candidate_id ) as latest'), function ($join) { $join->on('stts.candidate_id', '=', 'latest.candidate_id') ->on('stts.status_date', '=', 'latest.max_date'); }) ->whereIn('stts.status', $statuses) ->get(); $candidateIds = $ultimoStatus->pluck('candidate_id')->unique()->toArray(); $candidates = Candidate::whereIn('id', $candidateIds)->get()->keyBy('id'); $resultados = $ultimoStatus->map(function ($status) use ($candidates) { $status->candidate = $candidates[$status->candidate_id] ?? null; return $status; }); $data = [ 'statuses' => $statuses, 'resultados' => $resultados, ]; $pdf = Pdf::loadView('admin.curriculos.relatorios.relatorioCandidatos', $data); return $pdf->stream('relatorio_status.pdf'); } public function listaCadastros(Request $request) { $tipo = $request->query('tipo', 'candidatos'); $busca = $request->query('busca'); if ($tipo === 'candidatos') { $query = Candidate::query(); if ($busca) { $query->where(function ($q) use ($busca) { $q->where('name', 'like', "%{$busca}%") ->orWhere('cpf', 'like', "%{$busca}%") ->orWhere('email', 'like', "%{$busca}%"); }); } $candidatos = $query->paginate(50)->appends(['tipo' => $tipo, 'busca' => $busca]); return view('admin.curriculos.listaCadastros', compact('tipo', 'candidatos')); } $query = Companie::query(); if ($busca) { $query->where(function ($q) use ($busca) { $q->where('corporate_name', 'like', "%{$busca}%") ->orWhere('cnpj', 'like', "%{$busca}%") ->orWhere('email', 'like', "%{$busca}%"); }); } $empresas = $query->paginate(50)->appends(['tipo' => $tipo, 'busca' => $busca]); return view('admin.curriculos.listaCadastros', compact('tipo', 'empresas')); } public function edit(Request $request, $tipo, $id) { if ($tipo === 'candidato') { $cadastro = Candidate::findOrFail($id); } else { $cadastro = Companie::findOrFail($id); } // Parâmetros de busca para manter na URL de retorno $searchParams = $request->except(['return_url', 'page']); return view('admin.curriculos.edit', compact('tipo', 'cadastro', 'searchParams')); } public function updateCadastro(Request $request, $tipo, $id) { try { if ($tipo === 'candidato') { $item = Candidate::findOrFail($id); $request->merge([ 'cpf' => preg_replace('/\D/', '', $request->cpf), ]); $validated = $request->validate([ 'name' => 'required|string|max:255', 'cpf' => 'required|string|max:20', 'email' => 'required|email|max:255', ]); // Guarda o CPF antigo para buscar no UserSiatiAuth $cpfAntigo = preg_replace('/\D/', '', $item->cpf); $cpfNovo = $validated['cpf']; // Transação na conexão mysql_siati_app para Candidate DB::connection('mysql_siati_app')->beginTransaction(); try { $item->update($validated); DB::connection('mysql_siati_app')->commit(); } catch (\Exception $e) { DB::connection('mysql_siati_app')->rollBack(); throw $e; } // Transação na conexão mysql_siati_auth para UserSiatiAuth DB::connection('mysql_siati_auth')->beginTransaction(); try { $userAuth = UserSiatiAuth::where('document', $cpfAntigo)->first(); if ($userAuth) { $userAuth->update([ 'name' => $validated['name'], 'email' => $validated['email'], 'document' => $cpfNovo, ]); } else { // Se não encontrou pelo CPF antigo, tenta pelo novo (caso já tenha sido atualizado) $userAuth = UserSiatiAuth::where('document', $cpfNovo)->first(); if ($userAuth) { $userAuth->update([ 'name' => $validated['name'], 'email' => $validated['email'], ]); } else { throw new \Exception(__('Usuário não encontrado no sistema de autenticação.')); } } DB::connection('mysql_siati_auth')->commit(); } catch (\Exception $e) { DB::connection('mysql_siati_auth')->rollBack(); throw $e; } // Transação na conexão mysql (padrão) para SystemLog DB::beginTransaction(); try { SystemLog::create([ 'user_id' => auth()->id(), 'action' => 'Atualizou cadastro', 'module' => 'buscar_curriculos', 'model' => 'siati_app->candidate', 'model_id' => $item->id, 'details' => 'Alterou e-mail e CPF', 'ip_address' => request()->ip(), 'user_agent' => request()->header('User-Agent'), ]); DB::commit(); } catch (\Exception $e) { DB::rollBack(); // Log não é crítico, não interrompe o fluxo } } else { $item = Companie::findOrFail($id); $request->merge([ 'cnpj' => preg_replace('/\D/', '', $request->cnpj), ]); $validated = $request->validate([ 'corporate_name' => 'required|string|max:255', 'cnpj' => 'required|string|regex:/^\d+$/|max:19', 'email' => 'required|email|max:255', ], [ 'cnpj.regex' => 'O CNPJ deve conter apenas números.', 'cnpj.max' => 'O CNPJ não pode exceder 19 dígitos (limite BIGINT).', ]); // Guarda o CNPJ antigo para buscar no UserSiatiAuth $cnpjAntigo = preg_replace('/\D/', '', $item->cnpj); $cnpjNovo = $validated['cnpj']; // Transação na conexão mysql_siati_app para Companie DB::connection('mysql_siati_app')->beginTransaction(); try { $item->update($validated); DB::connection('mysql_siati_app')->commit(); } catch (\Exception $e) { DB::connection('mysql_siati_app')->rollBack(); throw $e; } // Transação na conexão mysql_siati_auth para UserSiatiAuth DB::connection('mysql_siati_auth')->beginTransaction(); try { $userAuth = UserSiatiAuth::where('document', $cnpjAntigo)->first(); if ($userAuth) { $userAuth->update([ 'name' => $validated['corporate_name'], 'email' => $validated['email'], 'document' => $cnpjNovo, ]); } else { // Se não encontrou pelo CNPJ antigo, tenta pelo novo (caso já tenha sido atualizado) $userAuth = UserSiatiAuth::where('document', $cnpjNovo)->first(); if ($userAuth) { $userAuth->update([ 'name' => $validated['corporate_name'], 'email' => $validated['email'], ]); } else { throw new \Exception(__('Usuário não encontrado no sistema de autenticação.')); } } DB::connection('mysql_siati_auth')->commit(); } catch (\Exception $e) { DB::connection('mysql_siati_auth')->rollBack(); throw $e; } // Transação na conexão mysql (padrão) para SystemLog DB::beginTransaction(); try { SystemLog::create([ 'user_id' => auth()->id(), 'action' => 'Atualizou cadastro', 'module' => 'buscar_curriculos', 'model' => 'siati_app->companies', 'model_id' => $item->id, 'details' => 'Alterou e-mail e CNPJ', 'ip_address' => request()->ip(), 'user_agent' => request()->header('User-Agent'), ]); DB::commit(); } catch (\Exception $e) { DB::rollBack(); // Log não é crítico, não interrompe o fluxo } } // Mantém os parâmetros de busca ao redirecionar $returnUrl = $request->input('return_url'); if ($returnUrl) { return redirect($returnUrl)->with('success', __('Registro atualizado com sucesso!')); } return redirect()->route('admin.curriculos.edit', ['tipo' => $tipo, 'id' => $id]) ->with('success', __('Registro atualizado com sucesso!')); } catch (\Illuminate\Validation\ValidationException $e) { return redirect()->back() ->withErrors($e->errors()) ->with('error', __('Erro de validação. Verifique os campos preenchidos.')) ->withInput(); } catch (\Illuminate\Database\QueryException $e) { $errorMessage = __('Erro ao salvar no banco de dados.'); // Mensagens mais específicas baseadas no código de erro if (str_contains($e->getMessage(), 'Duplicate entry')) { $errorMessage = __('Erro: Este CPF/CNPJ ou e-mail já está cadastrado no sistema.'); } elseif (str_contains($e->getMessage(), 'foreign key constraint')) { $errorMessage = __('Erro: Não é possível atualizar este cadastro pois ele possui relacionamentos no sistema.'); } elseif (str_contains($e->getMessage(), 'Connection')) { $errorMessage = __('Erro: Não foi possível conectar ao banco de dados. Tente novamente mais tarde.'); } return redirect()->back() ->with('error', $errorMessage) ->withInput(); } catch (\Exception $e) { $errorMessage = __('Ocorreu um erro ao atualizar o cadastro.'); // Log do erro para debug (em produção, verificar logs) Log::error('Erro ao atualizar cadastro de currículo', [ 'tipo' => $tipo, 'id' => $id, 'erro' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); // Mensagens mais específicas para erros comuns if (str_contains($e->getMessage(), 'not found')) { $errorMessage = __('Erro: Cadastro não encontrado no sistema.'); } elseif (str_contains($e->getMessage(), 'permission')) { $errorMessage = __('Erro: Você não tem permissão para realizar esta operação.'); } return redirect()->back() ->with('error', $errorMessage . ' ' . __('Detalhes técnicos: :detalhes', ['detalhes' => $e->getMessage()])) ->withInput(); } } public function logs(Request $request) { $query = SystemLog::query(); if ($request->filled('busca')) { $busca = $request->busca; $query->where(function ($q) use ($busca) { $q->where('nome', 'like', "%{$busca}%") ->orWhere('matricula', 'like', "%{$busca}%") ->orWhere('acao', 'like', "%{$busca}%"); }); } if ($request->filled('inicio')) { $query->whereDate('created_at', '>=', $request->inicio); } if ($request->filled('fim')) { $query->whereDate('created_at', '<=', $request->fim); } $logs = $query->orderBy('created_at', 'desc')->paginate(20); return view('admin.curriculos.logs', compact('logs')); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.13 |
proxy
|
phpinfo
|
Settings