where('link', request()->header('customer')) ->first(); if (!is_null($cliente) && $cliente->ativo === false) { return response()->json(['message' => 'O cliente está com o status inativo.'], Response::HTTP_UNAUTHORIZED); } $credentials = request(['usuario', 'senha']); $usuario = Usuario::where('usuario', $credentials['usuario']) ->first(); if (is_null($usuario)) { return response()->json(['message' => 'Usuário e/ou senha incorreto(s).'], Response::HTTP_UNAUTHORIZED); } if ($usuario->bloqueado) { AcessoSistema::create([ 'usuario_id' => $usuario->id, 'status_id' => AcessoSistemaStatus::USUARIO_BLOQUEADO, ]); return response()->json(['message' => 'Usuário bloqueado e sem acesso ao sistema.'], Response::HTTP_UNAUTHORIZED); } if (!Hash::check($credentials['senha'], $usuario->senha)) { $configuracao = Configuracao::first(); $usuarioHistoricoAcesso = UsuarioHistoricoAcesso::where('usuario_id', $usuario->id) ->where('ativo', true) ->orderBy('created_at', 'desc') ->take($configuracao->maximo_tentativa_login - 1) ->get(); if ($usuarioHistoricoAcesso->count() === ($configuracao->maximo_tentativa_login - 1) && $usuarioHistoricoAcesso->contains('sucesso', true) === false) { $usuario->update(['bloqueado' => true]); } UsuarioHistoricoAcesso::create( [ 'usuario_id' => $usuario->id, 'sucesso' => false ] ); AcessoSistema::create([ 'usuario_id' => $usuario->id, 'status_id' => AcessoSistemaStatus::USUARIO_E_OU_SENHA_INCORRETOS, ]); return response()->json(['message' => 'Usuário e/ou senha incorreto(s).'], Response::HTTP_UNAUTHORIZED); } UsuarioHistoricoAcesso::create( [ 'usuario_id' => $usuario->id, 'sucesso' => true, 'ativo' => false, ] ); UsuarioHistoricoAcesso::where('usuario_id', $usuario->id)->update(['ativo' => false]); AcessoSistema::create([ 'usuario_id' => $usuario->id, 'status_id' => AcessoSistemaStatus::ACESSO_REALIZADO_COM_SUCESSO, ]); $token = auth()->login($usuario); $usuario = auth()->user()->load([ 'lotacoes' => fn ($q) => $q->where('ativo', true), 'lotacoes.infraestrutura.unidade', 'lotacoes.ocupacao', ]); $lotacoes = $usuario->lotacoes->sortBy('infraestrutura.unidade.nome_fantasia')->values() ->map(function($lotacao) { $centrosCusto = $lotacao->centrosCusto->sortBy('setor.nome')->values()->toArray(); if (empty($centrosCusto)) { $centrosCusto = $lotacao->infraestrutura->centrosCusto->sortBy('setor.nome')->values()->toArray(); } $lotacao = $lotacao->toArray(); $lotacao['infraestrutura']['centrosCusto'] = $centrosCusto; return $lotacao; }) ->toArray(); $usuario = $usuario->toArray(); $usuario['lotacoes'] = $lotacoes; $response = [ 'expiration' => time() + 60 * auth()->factory()->getTTL(), 'token' => $token, 'usuario' => $usuario, ]; return response()->json($response, Response::HTTP_OK); } public function logout() { auth()->logout(); return response()->json(['message' => 'Successfully logged out']); } public function refresh() { $usuario = auth()->user(); if ($usuario->troca_senha) { return response()->json(['error' => 'Você deve alterar sua senha antes de prosseguir.'], Response::HTTP_UNAUTHORIZED); } $lotacao = Lotacao::with(['usuario', 'ocupacao', 'papeis.permissoes.funcionalidade.modulo', 'permissoes.funcionalidade.modulo']) ->where('id', request()->lotacao_id) ->where('ativo', true) ->firstOrFail(); $centroCusto = CentroCusto::with(['setor', 'salas'])->findOrFail(request()->centro_custo_id); $cliente = Cliente::with(['municipio.estado'])->where('link', app('config')->get('database.default'))->firstOrFail(); $token = auth()->claims([ 'lotacao_id' => $lotacao->id, 'centro_custo_id' => $centroCusto->id, 'unidade_id' => $centroCusto->infraestrutura->unidade_id, 'infraestrutura_id' => $centroCusto->infraestrutura_id, ]); $permissoes = collect(); foreach ($lotacao->papeis as $papel) { foreach ($papel->permissoes as $permissao) { $permissoes->push($permissao); } } $permissoes = $permissoes->merge($lotacao->permissoes); $menu = Menu::whereHas('menu.funcionalidade.permissoes.lotacoes', function($query) use ($lotacao) { $query->where('lotacao_id', $lotacao->id); }) ->orWhereHas('menu.funcionalidade.permissoes.papeis.lotacoes', function($query) use ($lotacao) { $query->where('lotacao_id', $lotacao->id); }) ->orWhereHas('menu', function($query) use ($lotacao) { $query->whereNull('funcionalidade_id') ->where(function($query) use ($lotacao) { $query->whereHas('menu.funcionalidade.permissoes.lotacoes', function($query) use ($lotacao) { $query->where('lotacao_id', $lotacao->id); }) ->orWhereHas('menu.funcionalidade.permissoes.papeis.lotacoes', function($query) use ($lotacao) { $query->where('lotacao_id', $lotacao->id); }) ->orWhereHas('menu', function($query) use ($lotacao) { $query->whereNull('funcionalidade_id') ->where(function($query) use ($lotacao) { $query->whereHas('menu.funcionalidade.permissoes.lotacoes', function($query) use ($lotacao) { $query->where('lotacao_id', $lotacao->id); }) ->orWhereHas('menu.funcionalidade.permissoes.papeis.lotacoes', function($query) use ($lotacao) { $query->where('lotacao_id', $lotacao->id); }); }); }); }); }) ->orWhereHas('funcionalidade.permissoes.lotacoes', function($query) use ($lotacao) { $query->where('lotacao_id', $lotacao->id); }) ->orWhereHas('funcionalidade.permissoes.papeis.lotacoes', function($query) use ($lotacao) { $query->where('lotacao_id', $lotacao->id); }) ->orderBy('nome') ->get(); $menuIds = $menu->pluck('menu_id')->filter()->unique(); while ($menuIds->isNotEmpty()) { $menusPais = Menu::whereIn('id', $menuIds)->get(); $menu = $menu->merge($menusPais); $menuIds = $menusPais->pluck('menu_id')->filter()->unique()->diff($menu->pluck('id')); } $usuario = auth()->user()->load([ 'lotacoes' => fn ($q) => $q->where('ativo', true), 'lotacoes.infraestrutura.unidade', 'lotacoes.ocupacao', ]); $lotacoes = $usuario->lotacoes->sortBy('infraestrutura.unidade.nome_fantasia') ->values() ->map(function($lotacao) { $centrosCusto = $lotacao->centrosCusto->sortBy('setor.nome')->values()->toArray(); if (empty($centrosCusto)) { $centrosCusto = $lotacao->infraestrutura->centrosCusto->sortBy('setor.nome')->values()->toArray(); } $lotacao = $lotacao->toArray(); $lotacao['infraestrutura']['centrosCusto'] = $centrosCusto; return $lotacao; }) ->toArray(); $usuario = $usuario->toArray(); $usuario['lotacoes'] = $lotacoes; return response()->json([ 'expiration' => time() + 60 * auth()->factory()->getTTL(), 'lotacao' => $lotacao->load('infraestrutura.unidade')->unsetRelation('papeis')->unsetRelation('permissoes'), 'centro_custo' => $centroCusto, 'menu' => $this->buildTreeMenu($menu), 'token' => $token->refresh(), 'usuario' => $usuario, 'cliente' => [ 'municipio' => [ 'estado' => [ 'id' => $cliente->municipio->estado->id, 'uf' => $cliente->municipio->estado->uf, 'nome' => $cliente->municipio->estado->nome, ], 'id' => $cliente->municipio->id, 'nome' => $cliente->municipio->nome, ], 'nome' => $cliente->nome, 'ativo_app_conectasus_cidadao' => $cliente->ativo_app_conectasus_cidadao, ], 'permissoes' => $permissoes, 'quantidade_notificacoes_nao_lidas' => $this->getQuantidadeNotificacoesNaoLidas(), 'quantidade_notas_versao_novas' => $this->getQuantidadeNotasVersaoNovas(), ]); } public function recuperarSenha(RecuperacaoSenhaRequest $request) { $usuario = Usuario::where('email', $request->email) ->whereHas('cidadao', function($query) use ($request) { $query->where('cpf', $request->cpf); }) ->first(); if (is_null($usuario)) { return response()->json([ 'message' => 'A informação inserida não está correta, tente novamente.' ], Response::HTTP_BAD_REQUEST); } if ($usuario) { $senha = Senha::gerar(); $params = [ 'senha' => $senha, 'troca_senha' => true, ]; $usuario->update($params); $object = new \stdClass(); $object->user = $usuario->usuario; $object->password = $senha; $object->cliente = $request->header('customer'); Email::enviar(strtolower($usuario->email), new UsuarioLogin($object)); } return response()->json([ 'message' => 'Usuário e senha enviados para o e-mail ' . $usuario->email ], Response::HTTP_OK); } public function trocarSenha(TrocaSenhaRequest $request, $id) { $usuario = Usuario::findOrFail($id); $params = [ 'senha' => $request->nova_senha, 'troca_senha' => false, ]; $usuario->update($params); return response()->json($usuario->fresh(), Response::HTTP_OK); } private function buildTreeMenu($elements, $identifier = null) { $items = collect(); foreach ($elements as $element) { if ($element->menu_id === $identifier) { $children = $this->buildTreeMenu($elements, $element->id); if ($children) { $element['items'] = $children; } $item = [ 'id' => $element->id, 'nome' => $element->nome, ]; if ($element->menu_id) { $item['menu_id'] = $element->menu_id; } if ($element->funcionalidade_id) { $item['link'] = '/' . $element->funcionalidade->modulo->identificador . '/' . $element->funcionalidade->identificador; } if ($element->icone) { $item['icone'] = $element->icone; } $item['items'] = $children; $items->push($item); } } return $items; } private function getQuantidadeNotificacoesNaoLidas() { return sizeOf(NotificacaoService::index()->where('visualizado', false)); } private function getQuantidadeNotasVersaoNovas() { return NotaVersaoService::index() ->where('created_at', '>=', Carbon::now()->subDays(7)) ->count(); } }