File manager - Edit - /var/www/html/portal/app/Http/Resources/TurisAngra/EmpresasDeTurismo/EmpresaTurismoResource.php
Back
<?php namespace App\Http\Resources\TurisAngra\EmpresasDeTurismo; use App\Helpers\DataPrivacyHelper; use App\Helpers\EmpresaTurismoFileHelper; use App\Http\Controllers\Controller; use App\Http\Requests\TurisAngra\EmpresasDeTurismo\EmpresaTurismoEnderecoRequest; use App\Http\Requests\TurisAngra\EmpresasDeTurismo\EmpresaTurismoPrepostoRequest; use App\Http\Requests\TurisAngra\EmpresasDeTurismo\EmpresaTurismoProprietarioRequest; use App\Http\Requests\TurisAngra\EmpresasDeTurismo\EmpresaTurismoRequest; use App\Http\Requests\TurisAngra\EmpresasDeTurismo\EmpresaTurismoUpdateRequest; use App\Http\Requests\TurisAngra\EmpresasDeTurismo\EmpresasTurismoClipBoardRequest; use App\Http\Services\TurisAngra\EmpresasDeTurismo\EmpresaTurismoService; use App\Models\Empresa; use App\Models\Endereco; use App\Models\User; use App\Models\TurisAngra\EmpresasDeTurismo\EmpresaTurismo; use App\Models\TurisAngra\EmpresasDeTurismo\EmpresaTurismoCadasturAlertaEnviado; use Carbon\Carbon; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Session; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\View\View; /** * Orquestra fluxos do módulo Empresas de Turismo, mantendo controllers magros. */ class EmpresaTurismoResource extends Controller { public const TIPO_CADASTUR_VENCIMENTO_30_DIAS_EMPRESA = 'cadastur_vencimento_30_dias_empresa'; public const TIPO_CADASTUR_VENCIMENTO_30_DIAS_TURISANGRA = 'cadastur_vencimento_30_dias_turisangra'; /** @var string[] */ public const ADMIN_FILTER_KEYS = [ 'q', 'status', 'possui_whatsapp', 'cadastur', 'cnpj', 'cadastur_situacao', 'page', ]; public function __construct(private readonly EmpresaTurismoService $service) { } /** * Parâmetros de filtro da listagem para persistência em links e formulários. * * @return array<string, mixed> */ public static function listFilterParamsFromRequest(Request $request): array { $params = []; foreach (self::ADMIN_FILTER_KEYS as $key) { if ($request->filled($key)) { $params[$key] = $request->input($key); } } return $params; } public function index(Request $request): LengthAwarePaginator { return $this->service->index($request); } public function verify(Request $request): RedirectResponse { if ($this->validaCNPJ($request->cnpj)) { $cnpj = $request->filled('cnpj') ? preg_replace('/[^0-9]/', '', $request->cnpj) : null; $empresa = Empresa::where('cnpj', $cnpj)->first(); if ($empresa) { $empresaTurismo = EmpresaTurismo::firstOrCreate( ['empresa_id' => $empresa->id], [ 'owner_id' => Auth::id(), 'cadastur' => '', ] ); $message = $empresaTurismo->wasRecentlyCreated ? __('Empresa localizada no cadastro geral e vinculada à lista de turismo. Complete todos os dados e salve o formulário para finalizar o cadastro.') : __('Empresa já consta na lista de turismo. Revise os dados e salve o formulário para atualizar o cadastro.'); return redirect()->route('admin.empresasDeTurismo.edit', $empresaTurismo->id) ->with('info', $message); } Session::put('cnpjTmp', $request->cnpj); return redirect()->route('admin.empresasDeTurismo.create') ->with('info', __('Empresa não encontrada. Você pode cadastrar uma nova.')); } return redirect() ->back() ->withInput() ->with('error', __('* CNPJ inválido!')); } public function createView(): View { return view('admin.turisAngra.empresasDeTurismo.create', [ 'empresaTurismo' => new EmpresaTurismo(), 'empresa' => new Empresa(), 'endereco' => null, 'responsavel' => null, 'preposto' => null, ]); } public function store(EmpresaTurismoRequest $request): RedirectResponse { $request->validated(); $responsavel = null; $preposto = null; $endereco = null; $empresa = null; $empresaTurismo = null; $empresaWasNewlyCreated = false; try { $fullnameResp = $this->resolveFullname($request->fullNameResponsavelEmpresa); $responsavelTmp = $this->checkExistsUserWithCPFOrEmail( $request->cpfResponsavelEmpresa, $request->emailResponsavelEmpresa ); if ($responsavelTmp instanceof RedirectResponse) { return $responsavelTmp; } $responsavelData = [ 'firstName' => $fullnameResp['firstName'], 'lastName' => $fullnameResp['lastName'], 'phoneNumber' => $request->phoneNumberResponsavelEmpresa, 'email' => $request->emailResponsavelEmpresa, ]; if ($responsavelTmp instanceof User) { $responsavel = $this->service->updateUser($request, $responsavelData, 'photoResponsavelEmpresa', $request->cpfResponsavelEmpresa); } else { $responsavel = $this->service->createUser($request, array_merge($responsavelData, [ 'structure_id' => null, 'cpf' => $this->clearCPF($request->cpfResponsavelEmpresa), 'matriculation' => null, 'password' => Hash::make(config('auth.default_password', 'mudar123')), 'email_verified_at' => null, 'remember_token' => null, 'isPasswordDefault' => 1, 'isServidorPublico' => 'Não', 'status' => $request->status, ]), 'photoResponsavelEmpresa'); } if ($request->has('checkPrepostoEmpresa')) { $fullnamePrep = $this->resolveFullname($request->fullNamePrepostoEmpresa); $prepostoTmp = $this->checkExistsUserWithCPFOrEmail( $request->cpfPrepostoEmpresa, $request->emailPrepostoEmpresa ); if ($prepostoTmp instanceof RedirectResponse) { return $prepostoTmp; } $prepostoData = [ 'firstName' => $fullnamePrep['firstName'], 'lastName' => $fullnamePrep['lastName'], 'phoneNumber' => $request->phoneNumberPrepostoEmpresa, 'email' => $request->emailPrepostoEmpresa, ]; if ($prepostoTmp instanceof User) { $preposto = $this->service->updateUser($request, $prepostoData, 'photoPrepostoEmpresa', $request->cpfPrepostoEmpresa); } else { $preposto = $this->service->createUser($request, array_merge($prepostoData, [ 'structure_id' => null, 'cpf' => $this->clearCPF($request->cpfPrepostoEmpresa), 'matriculation' => null, 'password' => Hash::make(config('auth.default_password', 'mudar123')), 'email_verified_at' => null, 'remember_token' => null, 'isPasswordDefault' => 1, 'isServidorPublico' => 'Não', 'status' => 'ATIVADO', ]), 'photoPrepostoEmpresa'); } } $enderecoTmp = $this->checkExistsEnderecoWithCNPJ($request->cnpj); $arrayEndereco = [ 'user_id' => Auth::id(), 'domicilio' => $request->domicilio ?? 'OUTROS', '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' => EmpresaTurismoFileHelper::uploadComprovanteEndereco($request), 'status' => $request->status, ]; if ($enderecoTmp instanceof Endereco) { $endereco = $this->service->updateEndereco($arrayEndereco, $enderecoTmp); } elseif ($enderecoTmp instanceof RedirectResponse) { return $enderecoTmp; } else { $arrayEndereco['owner_id'] = null; $endereco = $this->service->createEndereco($arrayEndereco); $enderecoWasNewlyCreated = true; } $empresaTmp = $this->checkExistsEmpresaWithCNPJOrEmail($request->cnpj, $request->email); if ($empresaTmp instanceof RedirectResponse) { return $empresaTmp; } $currentEmpresa = $empresaTmp instanceof Empresa ? $empresaTmp : null; $arrayEmpresa = [ 'razaoSocial' => $request->razaoSocial, 'nomeFantasia' => $request->nomeFantasia, 'numeroInscricaoMunicipal' => $request->numeroInscricaoMunicipal, 'cnpj' => preg_replace('/\D/', '', $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, 'possui_whatsapp' => filter_var($request->possui_whatsapp ?? false, FILTER_VALIDATE_BOOLEAN), 'email' => $request->email, 'site' => $request->site ?? null, 'status' => $request->status, ...$this->buildEmpresaDocumentFields($request, $currentEmpresa), ]; if ($currentEmpresa instanceof Empresa) { $empresa = $this->service->updateEmpresa($arrayEmpresa, $currentEmpresa); } else { $empresa = $this->service->createEmpresa($arrayEmpresa); $empresaWasNewlyCreated = true; } $this->service->updateEndereco(['owner_id' => $empresa->id], $endereco); $arrayEmpresaTurismo = [ 'owner_id' => Auth::id(), 'cadastur' => $request->cadastur, 'cadastur_vencimento' => $request->cadasturVencimento ?: null, 'status' => $request->status, ]; $empresaTurismoTmp = $this->checkEmpresaTurismoWithEmpresaId($empresa->id); if ($empresaTurismoTmp instanceof EmpresaTurismo) { $empresaTurismo = $this->service->updateEmpresaTurismo($arrayEmpresaTurismo, $empresaTurismoTmp); } elseif ($empresaTurismoTmp instanceof RedirectResponse) { return $empresaTurismoTmp; } else { $arrayEmpresaTurismo['empresa_id'] = $empresa->id; $empresaTurismo = $this->service->createEmpresaTurismo($arrayEmpresaTurismo); } return $this->service->redirectToIndexAfterSave( $request, __('Empresa de turismo cadastrada com sucesso!'), clearSearchFilter: true, ); } catch (\Throwable $e) { $this->service->rollbackFailedStore( $empresa, $empresaWasNewlyCreated, $endereco, $enderecoWasNewlyCreated, $empresaTurismo, ); return redirect() ->back() ->withInput() ->with('error', __('Erro ao cadastrar empresa de turismo.') . ' ' . $e->getMessage()); } } public function editView(EmpresaTurismo $empresaTurismo): View { $companhia = $empresaTurismo->companhia; return view('admin.turisAngra.empresasDeTurismo.edit', [ 'empresaTurismo' => $empresaTurismo, 'empresa' => $companhia, 'endereco' => $empresaTurismo->sede, 'responsavel' => $companhia?->responsavel, 'preposto' => $companhia?->preposto, ]); } public function update(EmpresaTurismoUpdateRequest $request, EmpresaTurismo $empresaTurismo): RedirectResponse { $request->validated(); $companhia = $empresaTurismo->companhia; $array_empresa = array_merge([ 'razaoSocial' => $request->razaoSocial, 'nomeFantasia' => $request->nomeFantasia, 'cnpj' => preg_replace('/\D/', '', $request->cnpj), 'numeroInscricaoMunicipal' => $request->numeroInscricaoMunicipal, 'anoAbertura' => $request->anoAbertura ?? null, 'principalAtividade' => $request->principalAtividade ?? null, 'telefone' => $request->telefone, 'celular' => $request->celular, 'possui_whatsapp' => filter_var($request->possui_whatsapp ?? false, FILTER_VALIDATE_BOOLEAN), 'email' => $request->email, 'site' => $request->site ?? null, 'status' => $request->status, ], $this->buildEmpresaDocumentFields($request, $companhia)); $array_empresaTurismo = [ 'owner_id' => Auth::id(), 'cadastur' => $request->cadastur, 'cadastur_vencimento' => $request->cadasturVencimento ?: null, 'status' => $request->status, ]; $this->service->updateEmpresa($array_empresa, $empresaTurismo->companhia); $this->service->updateEmpresaTurismo($array_empresaTurismo, $empresaTurismo); return $this->service->redirectToIndexAfterSave( $request, __('Empresa atualizada com sucesso!'), clearSearchFilter: false, empresaTurismo: $empresaTurismo->fresh(), ); } public function destroy(Request $request, EmpresaTurismo $empresaTurismo): RedirectResponse { return $this->service->destroy($request, $empresaTurismo); } public function status(Request $request, EmpresaTurismo $empresaTurismo): RedirectResponse { return $this->service->status($request, $empresaTurismo); } public function clipboardView(EmpresaTurismo $empresaTurismo): View { return view('admin.turisAngra.empresasDeTurismo.clipboard', [ 'empresaTurismo' => $empresaTurismo, 'empresa' => $empresaTurismo->companhia, ]); } public function updateClipboard(EmpresasTurismoClipBoardRequest $request, EmpresaTurismo $empresaTurismo): RedirectResponse { $request->validated(); return $this->service->updateClipboard($request, $empresaTurismo); } public function enderecoView(EmpresaTurismo $empresaTurismo, Endereco $endereco): View { return view('admin.turisAngra.empresasDeTurismo.endereco', [ 'empresaTurismo' => $empresaTurismo, 'endereco' => $endereco, 'empresa' => $empresaTurismo->companhia, ]); } public function updateEndereco( EmpresaTurismoEnderecoRequest $request, EmpresaTurismo $empresaTurismo, Endereco $endereco ): RedirectResponse { $request->validated(); $arrayEndereco = [ 'user_id' => Auth::id(), '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' => EmpresaTurismoFileHelper::uploadComprovanteEndereco($request, $endereco), ]; return $this->service->updateEnderecoEmpresa($request, $empresaTurismo, $endereco, $arrayEndereco); } public function proprietarioView(EmpresaTurismo $empresaTurismo, User $user): View { return view('admin.turisAngra.empresasDeTurismo.proprietario', [ 'empresaTurismo' => $empresaTurismo, 'user' => $user, 'empresa' => $empresaTurismo->companhia, ]); } public function updateProprietario( EmpresaTurismoProprietarioRequest $request, EmpresaTurismo $empresaTurismo, User $user ): RedirectResponse { $request->validated(); $fullName = $this->resolveFullname($request->fullName); $arrayUser = [ 'structure_id' => null, 'firstName' => $fullName['firstName'], 'lastName' => $fullName['lastName'], 'cpf' => $request->cpf, 'phoneNumber' => $request->phoneNumber, 'email' => $request->email, 'status' => 'ATIVADO', 'photo' => EmpresaTurismoFileHelper::uploadUserPhoto($request, 'photo', $user), ]; if ($request->input('resetPasswordCheckbox') === 'on') { $arrayUser['password'] = Hash::make($request->password ?? config('auth.default_password', 'mudar123')); $arrayUser['isPasswordDefault'] = 1; } if ($user->cpf === '000000000000') { $arrayUser['password'] = Hash::make(config('auth.default_password', 'mudar123')); return $this->service->createProprietario($request, $empresaTurismo, $arrayUser); } return $this->service->storeProprietario($request, $empresaTurismo, $user, $arrayUser); } public function prepostoView(EmpresaTurismo $empresaTurismo): View { return view('admin.turisAngra.empresasDeTurismo.preposto', [ 'empresaTurismo' => $empresaTurismo, 'preposto' => $empresaTurismo->companhia?->preposto, 'empresa' => $empresaTurismo->companhia, ]); } public function updatePreposto(EmpresaTurismoPrepostoRequest $request, EmpresaTurismo $empresaTurismo): RedirectResponse { $request->validated(); if (!$this->validaCPF($request->cpf)) { return redirect() ->back() ->withInput() ->withErrors(['cpf' => __('O número de CPF informado não é válido!')]) ->with('error', __('O número de CPF informado não é válido!')); } $responsavel = $empresaTurismo->companhia?->responsavel; if ($responsavel && $this->clearCPF($responsavel->cpf) === $this->clearCPF($request->cpf)) { return redirect() ->back() ->withInput() ->withErrors(['cpf' => __('O número de CPF informado pertence ao Responsável Legal desta empresa!')]) ->with('error', __('O número de CPF informado pertence ao Responsável Legal desta empresa!')); } $fullName = $this->resolveFullname($request->fullName); $preposto = $empresaTurismo->companhia?->preposto; $arrayUser = [ 'structure_id' => null, 'firstName' => $fullName['firstName'], 'lastName' => $fullName['lastName'], 'cpf' => $request->cpf, 'phoneNumber' => $request->phoneNumber, 'email' => $request->email, 'status' => 'ATIVADO', 'photo' => EmpresaTurismoFileHelper::uploadUserPhoto($request, 'photo', $preposto), ]; if ($request->input('resetPasswordCheckbox') === 'on') { $arrayUser['password'] = Hash::make(config('auth.default_password', 'mudar123')); $arrayUser['isPasswordDefault'] = 1; } $existingUser = User::where(function ($query) use ($request) { $query->where('cpf', 'like', '%' . trim($this->clearCPF($request->cpf)) . '%') ->orWhere('email', 'like', '%' . trim($request->email) . '%'); })->first(); if ($preposto) { return $this->service->updatePreposto($request, $empresaTurismo, $preposto, $arrayUser); } if ($existingUser) { $arrayUser['password'] = Hash::make(config('auth.default_password', 'mudar123')); $arrayUser['isPasswordDefault'] = 1; return $this->service->updatePreposto($request, $empresaTurismo, $existingUser, $arrayUser); } $arrayUser['password'] = Hash::make(config('auth.default_password', 'mudar123')); $arrayUser['isPasswordDefault'] = 1; return $this->service->storePreposto($request, $empresaTurismo, $arrayUser); } public function removePreposto(EmpresaTurismoPrepostoRequest $request, EmpresaTurismo $empresaTurismo): RedirectResponse { return $this->service->removePreposto($request, $empresaTurismo); } /** * Prepara os dados para a ficha de comprovação de cadastro em PDF. */ public function prepareFichaComprovacaoPdfData(EmpresaTurismo $empresaTurismo): array { $empresaTurismo->load([ 'companhia.responsavel', 'companhia.preposto', 'companhia.endereco', 'embarcacoes' => fn ($query) => $query ->where('status', 'ATIVADO') ->orderBy('nome'), ]); $empresa = $empresaTurismo->companhia; $responsavel = $empresa?->responsavel; $preposto = $empresa?->preposto; return [ 'empresaTurismo' => $empresaTurismo, 'empresa' => $empresa, 'endereco' => $empresa?->endereco, 'responsavel' => $this->anonimizarPessoaFisica($responsavel), 'preposto' => $this->anonimizarPessoaFisica($preposto), 'embarcacoes' => $empresaTurismo->embarcacoes, 'fotoResponsavel' => EmpresaTurismoFileHelper::resolveImagePathForPdf(null), 'fotoPreposto' => $preposto ? EmpresaTurismoFileHelper::resolveImagePathForPdf(null) : null, 'geradoEm' => now()->format('d/m/Y H:i'), ]; } /** * Anonimiza os dados pessoais de uma pessoa física para exibição em documentos, * em conformidade com a LGPD (Lei 13.709/2018). * * Mantém apenas o mínimo necessário para conferência da ficha, mascarando * nome, CPF, e-mail e telefone. A foto não é exposta (resolvida como padrão * pela view). */ protected function anonimizarPessoaFisica(?User $pessoa): ?object { if (! $pessoa) { return null; } return (object) [ 'name' => DataPrivacyHelper::maskName($pessoa->name), 'cpf' => DataPrivacyHelper::maskCpf($pessoa->cpf), 'email' => DataPrivacyHelper::maskEmail($pessoa->email), 'phoneNumber' => DataPrivacyHelper::maskPhone($pessoa->phoneNumber), ]; } /** * Verifica se já existe usuário pelo CPF ou email. */ protected function checkExistsUserWithCPFOrEmail(string $cpf, string $email): RedirectResponse|User|bool { try { $user = User::where(function ($query) use ($cpf, $email) { $query->where('cpf', 'like', '%' . trim($this->clearCPF($cpf)) . '%') ->orWhere('email', 'like', '%' . trim($email) . '%'); })->first(); if ($user != null && $user->exists) { if ($this->clearCPF($user->cpf) == $cpf && $user->email == $email) { return $user; } $checkUserWithEmail = User::where('email', $email)->first(); if ($checkUserWithEmail != null && $checkUserWithEmail->exists && $user->cpf == $checkUserWithEmail->cpf) { return redirect() ->back() ->withInput() ->with('error', __('Já existe um usuário no sistema cadastrado com este email: . ') . $email); } return $user; } return false; } catch (\Exception $e) { return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar checar se um usuário existe. ') . $e->getMessage()); } } /** * Verifica empresa por CNPJ ou email. */ protected function checkExistsEmpresaWithCNPJOrEmail(string $cnpj, string $email): RedirectResponse|Empresa|bool { try { $empresa = Empresa::where(function ($query) use ($cnpj, $email) { $query->where('cnpj', 'like', '%' . trim($this->clearCpfCnpj($cnpj)) . '%') ->orWhere('email', 'like', '%' . trim($email) . '%'); })->first(); if ($empresa != null && $empresa->exists) { if ($empresa->cnpj == $cnpj && $empresa->email == $email) { return $empresa; } $checkEmpresaWithEmail = Empresa::where('email', $email)->first(); if ($checkEmpresaWithEmail != null && $checkEmpresaWithEmail->exists && $empresa->cnpj != $checkEmpresaWithEmail->cnpj) { return redirect() ->back() ->withInput() ->with('error', __('Já existe uma empresa no sistema cadastrada com este email: . ') . $email); } return $empresa; } return false; } catch (\Exception $e) { return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar checar se uma empresa existe. ') . $e->getMessage()); } } /** * Verifica endereço existente por CNPJ. */ protected function checkExistsEnderecoWithCNPJ(string $cnpj): RedirectResponse|Endereco|bool { try { $empresa = Empresa::where('cnpj', $this->clearCpfCnpj($cnpj))->first(); if ($empresa != null && $empresa->exists) { $endereco = Endereco::where('owner_id', $empresa->id)->first(); if ($endereco?->exists) { return $endereco; } } return false; } catch (\Exception $e) { return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar checar o endereço. ') . $e->getMessage()); } } /** * Monta campos de documentos da empresa preservando arquivos já anexados. */ protected function buildEmpresaDocumentFields(Request $request, ?Empresa $currentEmpresa = null): array { return EmpresaTurismoFileHelper::buildEmpresaDocumentPayload($request, $currentEmpresa); } /** * Localiza EmpresaTurismo pelo ID da empresa. */ protected function checkEmpresaTurismoWithEmpresaId(string $empresaId): RedirectResponse|EmpresaTurismo|bool { try { $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); if ($empresaTurismo != null && $empresaTurismo->exists) { return $empresaTurismo; } return false; } catch (\Exception $e) { return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar criar uma nova empresa. ') . $e->getMessage()); } } /** * Retorna a quantidade de dias de antecedência configurada para alertas CADASTUR. */ public static function cadasturDiasAntecedencia(): int { $dias = (int) config('empresas_turismo.cadastur_dias_antecedencia', 30); return $dias > 0 ? $dias : 30; } /** * Data em que o alerta de e-mail deve ser disparado (N dias antes do vencimento). */ public static function cadasturDataReferenciaAlerta(Carbon $vencimento): Carbon { return $vencimento->copy()->startOfDay()->subDays(self::cadasturDiasAntecedencia()); } /** * Indica se o CADASTUR da empresa já está vencido. */ public static function cadasturVencido(EmpresaTurismo $empresaTurismo, ?Carbon $hoje = null): bool { if ($empresaTurismo->cadastur_vencimento === null) { return false; } $hoje = ($hoje ?? Carbon::today())->startOfDay(); $vencimento = $empresaTurismo->cadastur_vencimento->copy()->startOfDay(); return $hoje->greaterThan($vencimento); } /** * Mensagem para tooltip de CADASTUR vencido na listagem administrativa. */ public static function cadasturMensagemVencidoGestor(EmpresaTurismo $empresaTurismo, ?Carbon $hoje = null): ?string { if (!self::cadasturVencido($empresaTurismo, $hoje)) { return null; } $data = $empresaTurismo->cadastur_vencimento->format('d/m/Y'); $diasVencidos = abs((int) self::cadasturDiasRestantes($empresaTurismo, $hoje)); if ($diasVencidos === 1) { return __('O CADASTUR dessa empresa está vencido desde :data (1 dia).', ['data' => $data]); } return __('O CADASTUR dessa empresa está vencido desde :data (:dias dias).', [ 'data' => $data, 'dias' => $diasVencidos, ]); } /** * Indica se a empresa está no período de alerta visual (N dias antes até o vencimento). */ public static function cadasturEmAlertaVisual(EmpresaTurismo $empresaTurismo, ?Carbon $hoje = null): bool { if ($empresaTurismo->status !== 'ATIVADO' || $empresaTurismo->cadastur_vencimento === null) { return false; } $hoje = ($hoje ?? Carbon::today())->startOfDay(); $vencimento = $empresaTurismo->cadastur_vencimento->copy()->startOfDay(); $inicioAlerta = self::cadasturDataReferenciaAlerta($vencimento); return $hoje->greaterThanOrEqualTo($inicioAlerta) && $hoje->lessThanOrEqualTo($vencimento); } /** * Dias restantes até o vencimento do CADASTUR (negativo se já vencido). */ public static function cadasturDiasRestantes(EmpresaTurismo $empresaTurismo, ?Carbon $hoje = null): ?int { if ($empresaTurismo->cadastur_vencimento === null) { return null; } $hoje = ($hoje ?? Carbon::today())->startOfDay(); $vencimento = $empresaTurismo->cadastur_vencimento->copy()->startOfDay(); return (int) $hoje->diffInDays($vencimento, false); } /** * Mensagem amigável para tooltip ou banner (visão da empresa / Conta Angra). */ public static function cadasturMensagemAlertaVisual(EmpresaTurismo $empresaTurismo, ?Carbon $hoje = null): ?string { if (!self::cadasturEmAlertaVisual($empresaTurismo, $hoje)) { return null; } $dias = self::cadasturDiasRestantes($empresaTurismo, $hoje); $data = $empresaTurismo->cadastur_vencimento->format('d/m/Y'); if ($dias === 0) { return __('O CADASTUR vence hoje (:data). Providencie a renovação.', ['data' => $data]); } return __('O CADASTUR vence em :dias dia(s) (:data). Providencie a renovação.', [ 'dias' => $dias, 'data' => $data, ]); } /** * Mensagem para tooltip na listagem administrativa (gestor do módulo TurisAngra). */ public static function cadasturMensagemAlertaVisualGestor(EmpresaTurismo $empresaTurismo, ?Carbon $hoje = null): ?string { if (!self::cadasturEmAlertaVisual($empresaTurismo, $hoje)) { return null; } $dias = self::cadasturDiasRestantes($empresaTurismo, $hoje); $data = $empresaTurismo->cadastur_vencimento->format('d/m/Y'); if ($dias === 0) { return __('O CADASTUR dessa empresa vence hoje (:data).', ['data' => $data]); } return __('O CADASTUR dessa empresa vence em :dias dia(s) (:data).', [ 'dias' => $dias, 'data' => $data, ]); } /** * Empresas de turismo com alerta visual de vencimento CADASTUR visíveis na Conta Angra. * Exibe apenas quando o e-mail do usuário coincide com o e-mail cadastrado na empresa. * Gestores do módulo admin (GERENCIADOR_DE_EMPRESAS_DE_TURISMO) não veem aqui - usam o painel admin. * * @return Collection<int, EmpresaTurismo> */ public static function empresasTurismoCadasturAlertaVisualParaUsuario(User $user): Collection { $permissoesModulo = $user->getPermissaoDetalhes('GERENCIADOR_DE_EMPRESAS_DE_TURISMO'); if ($permissoesModulo['visualizar'] ?? false) { return collect(); } $emailUsuario = trim((string) ($user->email ?? '')); if ($emailUsuario === '') { return collect(); } $empresaIdsPorEmail = Empresa::query() ->whereRaw('LOWER(TRIM(email)) = ?', [$emailUsuario]) ->pluck('id'); if ($empresaIdsPorEmail->isEmpty()) { return collect(); } return EmpresaTurismo::query() ->with('companhia') ->where('status', 'ATIVADO') ->whereNotNull('cadastur_vencimento') ->whereIn('empresa_id', $empresaIdsPorEmail) ->get() ->filter(fn (EmpresaTurismo $empresaTurismo) => self::cadasturEmAlertaVisual($empresaTurismo)) ->values(); } /** * E-mails de alerta de vencimento CADASTUR pendentes de envio para a empresa informada. * * @return Collection<int, array{tipo: string, email: string, mensagem: string, data_referencia: Carbon}> */ public static function emailsCadasturPendentesEnvio(EmpresaTurismo $empresaTurismo, ?Carbon $hoje = null): Collection { $hoje = ($hoje ?? Carbon::today())->startOfDay(); if ($empresaTurismo->status !== 'ATIVADO' || $empresaTurismo->cadastur_vencimento === null) { return collect(); } $vencimento = $empresaTurismo->cadastur_vencimento->copy()->startOfDay(); $dataReferencia = self::cadasturDataReferenciaAlerta($vencimento); if (!$hoje->equalTo($dataReferencia)) { return collect(); } $mensagem = __('O CADASTUR nº :cadastur vence em :dias dia(s) (:data). Providencie a renovação.', [ 'cadastur' => $empresaTurismo->cadastur, 'dias' => self::cadasturDiasAntecedencia(), 'data' => $vencimento->format('d/m/Y'), ]); $pendentes = collect(); $emailEmpresa = trim((string) ($empresaTurismo->companhia?->email ?? '')); if ( $emailEmpresa !== '' && filter_var($emailEmpresa, FILTER_VALIDATE_EMAIL) && !self::cadasturAlertaJaEnviado($empresaTurismo, self::TIPO_CADASTUR_VENCIMENTO_30_DIAS_EMPRESA, $dataReferencia) ) { $pendentes->push([ 'tipo' => self::TIPO_CADASTUR_VENCIMENTO_30_DIAS_EMPRESA, 'email' => $emailEmpresa, 'mensagem' => $mensagem, 'data_referencia' => $dataReferencia, ]); } foreach (config('empresas_turismo.alertas_email_turisangra', []) as $emailTurisangra) { if ( filter_var($emailTurisangra, FILTER_VALIDATE_EMAIL) && !self::cadasturAlertaJaEnviado($empresaTurismo, self::TIPO_CADASTUR_VENCIMENTO_30_DIAS_TURISANGRA, $dataReferencia) ) { $pendentes->push([ 'tipo' => self::TIPO_CADASTUR_VENCIMENTO_30_DIAS_TURISANGRA, 'email' => $emailTurisangra, 'mensagem' => $mensagem, 'data_referencia' => $dataReferencia, ]); break; } } return $pendentes; } /** * Registra o envio de um alerta CADASTUR para evitar duplicidade. */ public static function registrarCadasturAlertaEnviado( EmpresaTurismo $empresaTurismo, string $tipo, Carbon $dataReferencia ): void { EmpresaTurismoCadasturAlertaEnviado::firstOrCreate( [ 'empresa_turismo_id' => $empresaTurismo->id, 'tipo' => $tipo, 'data_referencia' => $dataReferencia->toDateString(), ], [ 'enviado_em' => now(), ] ); } /** * Verifica se o alerta CADASTUR já foi enviado para a data de referência informada. */ public static function cadasturAlertaJaEnviado( EmpresaTurismo $empresaTurismo, string $tipo, Carbon $dataReferencia ): bool { return EmpresaTurismoCadasturAlertaEnviado::query() ->where('empresa_turismo_id', $empresaTurismo->id) ->where('tipo', $tipo) ->whereDate('data_referencia', $dataReferencia->toDateString()) ->exists(); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings