File manager - Edit - /var/www/html/portal/app/Http/Resources/Empresas/EmpresasResource.php
Back
<?php namespace App\Http\Resources\Empresas; use App\Helpers\FileUploadHelper; use App\Http\Requests\Empresas\EmpresaRequest; use App\Http\Services\Empresas\EmpresaService; use App\Models\Empresa; use App\Models\Endereco; use App\Models\User; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Session; use Illuminate\Validation\ValidationException; /** * Regras de negócio e orquestração do módulo Empresas. */ class EmpresasResource { private const DEFAULT_FILE = 'pmar/assets/img/icons/neutro.png'; public function __construct( private readonly EmpresaService $service, ) {} /** * Verifica se o CNPJ já está cadastrado. */ public function verify(EmpresaRequest $request): RedirectResponse { if (!$this->validaCnpj($request->cnpj)) { return redirect() ->back() ->withInput() ->with('error', __('* CNPJ inválido!')); } $cnpj = $this->normalizeCnpj($request->cnpj); $empresa = Empresa::query()->where('cnpj', $cnpj)->first(); if ($empresa) { return redirect() ->route('admin.empresas.edit', $empresa->id) ->with('success', __('Empresa encontrada. Você pode editar os dados.')); } Session::put('cnpjTmp', $request->cnpj); return redirect() ->route('admin.empresas.create') ->with('info', __('Empresa não encontrada. Você pode cadastrar uma nova.')); } /** * Cadastra uma empresa completa. */ public function store(EmpresaRequest $request): RedirectResponse { try { DB::beginTransaction(); $responsavel = $this->criarOuAtualizarResponsavel($request); $preposto = $this->criarOuAtualizarPreposto($request); $endereco = $this->criarEndereco($request); $empresa = Empresa::create([ 'razaoSocial' => $request->razaoSocial, 'nomeFantasia' => $request->nomeFantasia, 'numeroInscricaoMunicipal' => $request->numeroInscricaoMunicipal, 'cnpj' => $this->normalizeCnpj($request->cnpj), 'anoAbertura' => $request->anoAbertura ?? null, 'owner_id' => Auth::id(), 'endereco_id' => $endereco->id, 'responsavel_id' => $responsavel->id, 'preposto_id' => $preposto?->id, 'principalAtividade' => $request->principalAtividade ?? null, 'telefone' => $request->telefone, 'celular' => $request->celular, 'email' => $request->email, 'site' => $request->site ?? null, 'contratoSocial' => $this->handleDocumentUpload($request, 'contratoSocial', 'arquivos'), 'cartaoCNPJ' => $this->handleDocumentUpload($request, 'cartaoCNPJ', 'arquivos'), 'registroJuntaComercial' => $this->handleDocumentUpload($request, 'registroJuntaComercial', 'arquivos'), 'alvaraDeFuncionamento' => $this->handleDocumentUpload($request, 'alvaras', 'arquivos'), 'inscricaoEstadual' => $this->handleDocumentUpload($request, 'inscricaoEstadual', 'arquivos'), 'inscricaoMunicipal' => $this->handleDocumentUpload($request, 'inscricaoMunicipal', 'arquivos'), 'status' => $request->status, ]); $endereco->fill(['owner_id' => $empresa->id]); $endereco->save(); DB::commit(); return $this->service->redirectToIndex($request, __('Empresa cadastrada com sucesso!')); } catch (ValidationException $e) { throw $e; } catch (\Throwable $e) { DB::rollBack(); Log::error('Erro ao cadastrar empresa', [ 'user_id' => Auth::id(), 'exception' => $e->getMessage(), ]); return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar cadastrar empresa. Tente novamente ou contate o administrador.')); } } /** * Atualiza uma empresa. */ public function update(EmpresaRequest $request, Empresa $empresa): RedirectResponse { try { DB::beginTransaction(); $responsavel = $this->atualizarResponsavel($request, $empresa); $preposto = $this->atualizarPreposto($request, $empresa); $endereco = $empresa->endereco; if (!$endereco) { throw new \RuntimeException('Endereço da empresa não encontrado.'); } $endereco->fill([ 'domicilio' => $request->domicilio ?? null, 'cep' => $request->cep, 'logradouro' => $request->logradouro, 'numero' => $request->numero, 'complemento' => $request->complemento ?? null, 'cidade' => $request->cidade, 'bairro' => $request->bairro, 'uf' => $request->uf, 'latitude' => $request->latitude, 'longitude' => $request->longitude, 'comprovante' => $this->handleComprovanteUpload($request, $endereco), 'status' => $request->status, ]); $endereco->save(); $empresa->fill([ 'razaoSocial' => $request->razaoSocial, 'nomeFantasia' => $request->nomeFantasia, 'numeroInscricaoMunicipal' => $request->numeroInscricaoMunicipal, 'cnpj' => $this->normalizeCnpj($request->cnpj), 'anoAbertura' => $request->anoAbertura ?? null, 'responsavel_id' => $responsavel->id, 'preposto_id' => $preposto?->id, 'principalAtividade' => $request->principalAtividade ?? null, 'telefone' => $request->telefone, 'celular' => $request->celular, 'email' => $request->email, 'site' => $request->site ?? null, 'contratoSocial' => $this->handleDocumentUpload($request, 'contratoSocial', 'arquivos', $empresa->contratoSocial ?? self::DEFAULT_FILE), 'cartaoCNPJ' => $this->handleDocumentUpload($request, 'cartaoCNPJ', 'arquivos', $empresa->cartaoCNPJ ?? self::DEFAULT_FILE), 'registroJuntaComercial' => $this->handleDocumentUpload($request, 'registroJuntaComercial', 'arquivos', $empresa->registroJuntaComercial ?? self::DEFAULT_FILE), 'alvaraDeFuncionamento' => $this->handleDocumentUpload($request, 'alvaras', 'arquivos', $empresa->alvaraDeFuncionamento ?? self::DEFAULT_FILE), 'inscricaoEstadual' => $this->handleDocumentUpload($request, 'inscricaoEstadual', 'arquivos', $empresa->inscricaoEstadual ?? self::DEFAULT_FILE), 'inscricaoMunicipal' => $this->handleDocumentUpload($request, 'inscricaoMunicipal', 'arquivos', $empresa->inscricaoMunicipal ?? self::DEFAULT_FILE), 'status' => $request->status, ]); if (!$request->has('checkPrepostoEmpresa')) { $empresa->preposto_id = null; } $empresa->save(); DB::commit(); return $this->service->redirectToIndex($request, __('Empresa atualizada com sucesso!')); } catch (ValidationException $e) { throw $e; } catch (\Throwable $e) { DB::rollBack(); Log::error('Erro ao atualizar empresa', [ 'user_id' => Auth::id(), 'empresa_id' => $empresa->id, 'exception' => $e->getMessage(), ]); return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar atualizar empresa. Tente novamente ou contate o administrador.')); } } /** * Remove a empresa e seus vínculos diretos. */ public function destroy(EmpresaRequest $request, Empresa $empresa): RedirectResponse { try { DB::beginTransaction(); $this->removerArquivosDaEmpresa($empresa); $endereco = $empresa->endereco; if ($endereco?->comprovante) { $this->removerArquivo($endereco->comprovante); } Empresa::destroy($empresa->id); if ($endereco) { Endereco::destroy($endereco->id); } DB::commit(); return $this->service->redirectToIndex( $request, __('* A empresa foi excluída com sucesso! Esta ação não pode ser desfeita!') ); } catch (\Throwable $e) { DB::rollBack(); Log::error('Erro ao excluir empresa', [ 'user_id' => Auth::id(), 'empresa_id' => $empresa->id, 'exception' => $e->getMessage(), ]); return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar excluir esta empresa. Tente novamente ou contate o administrador.')); } } /** * Atualiza status da empresa. */ public function updateStatus(EmpresaRequest $request, Empresa $empresa): RedirectResponse { try { DB::beginTransaction(); $empresa->fill(['status' => $request->checkStatus]); $empresa->save(); DB::commit(); return $this->service->redirectToIndex( $request, __('* O status da empresa foi atualizado com sucesso!') ); } catch (\Throwable $e) { DB::rollBack(); Log::error('Erro ao alterar status da empresa', [ 'user_id' => Auth::id(), 'empresa_id' => $empresa->id, 'exception' => $e->getMessage(), ]); return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar alterar o status desta empresa. Tente novamente ou contate o administrador.')); } } /** * Remove arquivos ligados à empresa. */ public function removerArquivosDaEmpresa(Empresa $empresa): void { foreach ([ 'contratoSocial', 'cartaoCNPJ', 'registroJuntaComercial', 'alvaraDeFuncionamento', 'inscricaoEstadual', 'inscricaoMunicipal', ] as $name) { if (!empty($empresa->$name)) { $this->removerArquivo($empresa->$name); } } } /** * Remove arquivo físico caso exista. */ public function removerArquivo(string $path): void { $ds = DIRECTORY_SEPARATOR; $search = "pmar{$ds}assets{$ds}img"; $fileExist = storage_path() . str_replace($search, "{$ds}app{$ds}public", $path); if (file_exists($fileExist)) { @unlink($fileExist); } } /** * Normaliza CNPJ retirando caracteres não numéricos. */ public function normalizeCnpj(string $cnpj): string { return preg_replace('/\D/', '', $cnpj); } private function criarOuAtualizarResponsavel(Request $request): User { $fullnameResp = $this->resolveFullname($request->fullNameResponsavelEmpresa); $responsavel = User::firstOrNew([ 'cpf' => $this->clearCpf($request->cpfResponsavelEmpresa), ]); if ($responsavel->exists) { $responsavel->fill([ 'firstName' => $fullnameResp['firstName'], 'lastName' => $fullnameResp['lastName'], 'phoneNumber' => $request->phoneNumberResponsavelEmpresa, 'email' => $request->emailResponsavelEmpresa, 'photo' => $this->getPathImageUserField($request, 'photoResponsavelEmpresa', $responsavel), ]); } else { $responsavel->fill([ 'structure_id' => null, 'firstName' => $fullnameResp['firstName'], 'lastName' => $fullnameResp['lastName'], 'cpf' => $this->clearCpf($request->cpfResponsavelEmpresa), 'phoneNumber' => $request->phoneNumberResponsavelEmpresa, 'email' => $request->emailResponsavelEmpresa, 'photo' => $this->getPathImageUserField($request, 'photoResponsavelEmpresa', null), 'permission' => $this->setPermissions(null), 'password' => Hash::make(config('auth.default_password', 'mudar123')), 'isPasswordDefault' => 1, 'papers' => $this->setPapers(null), 'status' => $request->status, ]); } $responsavel->save(); return $responsavel; } private function criarOuAtualizarPreposto(Request $request): ?User { if (!$request->has('checkPrepostoEmpresa')) { return null; } $fullnamePrep = $this->resolveFullname($request->fullNamePrepostoEmpresa); $preposto = User::firstOrNew([ 'cpf' => $this->clearCpf($request->cpfPrepostoEmpresa), ]); if ($preposto->exists) { $preposto->fill([ 'firstName' => $fullnamePrep['firstName'], 'lastName' => $fullnamePrep['lastName'], 'phoneNumber' => $request->phoneNumberPrepostoEmpresa, 'email' => $request->emailPrepostoEmpresa, 'photo' => $this->getPathImageUserField($request, 'photoPrepostoEmpresa', $preposto), ]); } else { $preposto->fill([ 'structure_id' => null, 'firstName' => $fullnamePrep['firstName'], 'lastName' => $fullnamePrep['lastName'], 'cpf' => $this->clearCpf($request->cpfPrepostoEmpresa), 'phoneNumber' => $request->phoneNumberPrepostoEmpresa, 'email' => $request->emailPrepostoEmpresa, 'photo' => $this->getPathImageUserField($request, 'photoPrepostoEmpresa', null), 'permission' => $this->setPermissions(null), 'password' => Hash::make(config('auth.default_password', 'mudar123')), 'isPasswordDefault' => 1, 'papers' => $this->setPapers(null), 'status' => $request->status, ]); } $preposto->save(); return $preposto; } private function atualizarResponsavel(Request $request, Empresa $empresa): User { $fullnameResp = $this->resolveFullname($request->fullNameResponsavelEmpresa); return User::updateOrCreate( ['cpf' => $this->clearCpf($request->cpfResponsavelEmpresa)], [ 'firstName' => $fullnameResp['firstName'], 'lastName' => $fullnameResp['lastName'], 'phoneNumber' => $request->phoneNumberResponsavelEmpresa, 'email' => $request->emailResponsavelEmpresa, 'photo' => $this->getPathImageUserField($request, 'photoResponsavelEmpresa', $empresa->responsavel), 'structure_id' => $empresa->responsavel?->structure_id, 'permission' => $empresa->responsavel?->permission ?? $this->setPermissions(null), 'password' => $empresa->responsavel?->password ?? Hash::make(config('auth.default_password', 'mudar123')), 'isPasswordDefault' => $empresa->responsavel?->isPasswordDefault ?? 1, 'papers' => $empresa->responsavel?->papers ?? $this->setPapers(null), 'status' => $request->status, ] ); } private function atualizarPreposto(Request $request, Empresa $empresa): ?User { if (!$request->has('checkPrepostoEmpresa')) { return null; } $fullnamePrep = $this->resolveFullname($request->fullNamePrepostoEmpresa); return User::updateOrCreate( ['cpf' => $this->clearCpf($request->cpfPrepostoEmpresa)], [ 'firstName' => $fullnamePrep['firstName'], 'lastName' => $fullnamePrep['lastName'], 'phoneNumber' => $request->phoneNumberPrepostoEmpresa, 'email' => $request->emailPrepostoEmpresa, 'photo' => $this->getPathImageUserField($request, 'photoPrepostoEmpresa', $empresa->preposto), 'structure_id' => $empresa->preposto?->structure_id, 'permission' => $empresa->preposto?->permission ?? $this->setPermissions(null), 'password' => $empresa->preposto?->password ?? Hash::make(config('auth.default_password', 'mudar123')), 'isPasswordDefault' => $empresa->preposto?->isPasswordDefault ?? 1, 'papers' => $empresa->preposto?->papers ?? $this->setPapers(null), 'status' => $request->status, ] ); } private function criarEndereco(Request $request): Endereco { return Endereco::create([ 'user_id' => Auth::id(), 'owner_id' => null, 'domicilio' => $request->domicilio ?? null, 'cep' => $request->cep, 'logradouro' => $request->logradouro, 'numero' => $request->numero, 'complemento' => $request->complemento ?? null, 'cidade' => $request->cidade, 'bairro' => $request->bairro, 'uf' => $request->uf, 'latitude' => $request->latitude, 'longitude' => $request->longitude, 'comprovante' => $this->handleComprovanteUpload($request), 'status' => $request->status, ]); } private function handleDocumentUpload( Request $request, string $inputName, string $folder, string $default = self::DEFAULT_FILE, ): string { if (!$request->hasFile($inputName) || !$request->file($inputName)->isValid()) { return $default; } $file = $request->file($inputName); $path = $this->processUploadByMime($file, $folder); return $path ?: $default; } private function handleComprovanteUpload(Request $request, ?Endereco $endereco = null): string { $ds = DIRECTORY_SEPARATOR; $default = "pmar{$ds}assets{$ds}img{$ds}comprovante-residencia-default.jpg"; if ($request->hasFile('comprovante') && $request->file('comprovante')->isValid()) { $path = $this->processUploadByMime($request->file('comprovante'), 'comprovantes'); if ($path) { return $path; } } if ($endereco?->comprovante) { return $endereco->comprovante; } return $default; } private function processUploadByMime(UploadedFile $file, string $folder): ?string { $mime = (string) $file->getMimeType(); if (str_starts_with($mime, 'image/')) { return FileUploadHelper::processSafeImageUpload($file, $folder); } return FileUploadHelper::processSafeDocumentUpload($file, $folder); } private function getPathImageUserField(Request $request, string $inputName, ?User $user = null): string { $ds = DIRECTORY_SEPARATOR; $path = ($user && $user->photo) ? $user->photo : "pmar{$ds}assets{$ds}img{$ds}profile.jpg"; if ($request->hasFile($inputName) && $request->file($inputName)->isValid()) { $uploadedPath = FileUploadHelper::processSafeImageUpload($request->file($inputName), 'contas'); if ($uploadedPath) { return $uploadedPath; } } return $path; } private function clearCpf(string $cpf): string { return str_replace(['.', '-'], '', $cpf); } /** * @return array{firstName: string, lastName: string} */ private function resolveFullname(string $fullname): array { $parts = array_filter(explode(' ', trim($fullname))); return [ 'firstName' => $parts ? array_shift($parts) : '', 'lastName' => $parts ? implode(' ', $parts) : '', ]; } private function setPermissions(mixed $requestPermission): string { if (empty($requestPermission)) { return 'GUEST'; } if ($requestPermission instanceof \UnitEnum) { return $requestPermission->name; } if (is_array($requestPermission)) { return implode(',', array_map( static fn ($permission) => $permission instanceof \UnitEnum ? $permission->name : (string) $permission, $requestPermission )); } return (string) $requestPermission; } private function setPapers(mixed $requestPapers): string { $papers = $requestPapers ?? ['EDIT']; if (is_array($papers)) { return implode(',', $papers); } return (string) $papers; } private function validaCnpj(?string $cnpj): bool { $cnpj = preg_replace('/[^0-9]/', '', (string) $cnpj); if (strlen($cnpj) !== 14) { return false; } if (preg_match('/(\d)\1{13}/', $cnpj)) { return false; } $multiplicadores1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; $multiplicadores2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; for ($i = 0, $soma = 0; $i < 12; $i++) { $soma += (int) $cnpj[$i] * $multiplicadores1[$i]; } $resto = $soma % 11; $digito1 = ($resto < 2) ? 0 : 11 - $resto; for ($i = 0, $soma = 0; $i < 13; $i++) { $soma += (int) $cnpj[$i] * $multiplicadores2[$i]; } $resto = $soma % 11; $digito2 = ($resto < 2) ? 0 : 11 - $resto; return ((int) $cnpj[12] === $digito1 && (int) $cnpj[13] === $digito2); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings