init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,379 @@
<?php
namespace App\Http\Controllers\Administracao;
use App\Enums\Intranet\Sistema;
use App\Enums\Log\AcessoSistemaStatus;
use App\Http\Controllers\Controller;
use App\Http\Requests\Autenticacao\RecuperacaoSenhaRequest;
use App\Http\Requests\Autenticacao\TrocaSenhaRequest;
use App\Mail\UsuarioLogin;
use App\Models\Administracao\Menu;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Cadastro\SujeitoAtencao\UsuarioHistoricoAcesso;
use App\Models\Geral\Configuracao;
use App\Models\Intranet\Cliente;
use App\Models\Log\AcessoSistema;
use App\Services\Administracao\NotificacaoService;
use App\Services\Intranet\Cadastro\NotaVersaoService;
use App\Utils\Email;
use App\Utils\Senha;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Hash;
class AutenticacaoController extends Controller
{
public function login()
{
$cliente = Cliente::where('sistema_id', Sistema::CONECTASUS)
->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();
}
}