arcadiasuite/plus/app/Http/Controllers/UsuarioController.php

298 lines
9.9 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Models\Role;
use App\Models\Empresa;
use App\Models\AcessoLog;
use App\Models\UsuarioEmpresa;
use App\Models\UsuarioLocalizacao;
use App\Utils\UploadUtil;
use GuzzleHttp\Promise\Create;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class UsuarioController extends Controller
{
protected $util;
public function __construct(UploadUtil $util)
{
$this->util = $util;
$this->middleware('permission:usuarios_create', ['only' => ['create', 'store']]);
$this->middleware('permission:usuarios_edit', ['only' => ['edit', 'update']]);
$this->middleware('permission:usuarios_view', ['only' => ['show', 'index']]);
$this->middleware('permission:usuarios_delete', ['only' => ['destroy']]);
}
public function index(Request $request)
{
$data = User::where('usuario_empresas.empresa_id', request()->empresa_id)
->join('usuario_empresas', 'users.id', '=', 'usuario_empresas.usuario_id')
->select('users.*')
->when(!empty($request->name), function ($q) use ($request) {
return $q->where(function ($quer) use ($request) {
return $quer->where('name', 'LIKE', "%$request->name%");
});
})
->paginate(__itensPagina());
return view('usuarios.index', compact('data'));
}
public function create(Request $request)
{
$roles = Role::orderBy('name', 'desc')
->where('empresa_id', $request->empresa_id)
->get();
$count = UsuarioEmpresa::where('empresa_id', request()->empresa_id)->count();
$count++;
$empresa = Empresa::findOrFail(request()->empresa_id);
$plano = $empresa->plano;
if($count >= $plano->plano->maximo_usuarios){
session()->flash("flash_warning", "Limite de usuários atingido!");
return redirect()->back();
}
return view('usuarios.create', compact('roles'));
}
public function edit(Request $request, $id)
{
$item = User::findOrFail($id);
if($item->empresa == null){
abort(403);
}
$roles = Role::orderBy('name', 'desc')
->where('empresa_id', $request->empresa_id)
->get();
$passwdHidden = 1;
if(!__isMaster()){
__validaObjetoEmpresa($item->empresa);
}else{
$passwdHidden = 0;
}
return view('usuarios.edit', compact('item', 'roles', 'passwdHidden'));
}
public function store(Request $request)
{
$this->__validate($request);
try {
$file_name = '';
if ($request->hasFile('image')) {
$file_name = $this->util->uploadImage($request, '/usuarios');
}
$dias_semana = isset($request->dias_semana)
? json_encode($request->dias_semana)
: null;
$request->merge([
'password' => Hash::make($request['password']),
'imagem' => $file_name,
'dias_semana' => $dias_semana,
]);
$usuario = User::create($request->all());
UsuarioEmpresa::create([
'empresa_id' => $request->empresa_id,
'usuario_id' => $usuario->id
]);
$role = Role::findOrFail($request->role_id);
$usuario->assignRole($role->name);
if(isset($request->locais)){
for($i=0; $i<sizeof($request->locais); $i++){
UsuarioLocalizacao::updateOrCreate([
'usuario_id' => $usuario->id,
'localizacao_id' => $request->locais[$i]
]);
}
}
__createLog($request->empresa_id, 'Usuário', 'cadastrar', $request->name);
session()->flash("flash_success", "Usuário cadastrado!");
} catch (\Exception $e) {
__createLog($request->empresa_id, 'Usuário', 'erro', $e->getMessage());
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
}
return redirect()->route('usuarios.index');
}
private function __validate(Request $request)
{
$rules = [
'email' => 'unique:users',
];
$messages = [
'email.unique' => 'Este email já esta em uso!',
];
$this->validate($request, $rules, $messages);
}
public function update(Request $request, $id)
{
$usuario = User::findOrFail($id);
try {
$file_name = $usuario->imagem;
if ($request->hasFile('image')) {
$this->util->unlinkImage($usuario, '/usuarios');
$file_name = $this->util->uploadImage($request, '/usuarios');
}
if ($request->password) {
$request->merge([
'password' => Hash::make($request->password),
'imagem' => $file_name
]);
} else {
$request->merge([
'password' => $usuario->password,
'imagem' => $file_name
]);
}
$dias_semana = isset($request->dias_semana)
? json_encode($request->dias_semana)
: null;
$request->merge([
'dias_semana' => $dias_semana
]);
if(__isMaster()){
if ($request->nova_senha) {
$request->merge([
'password' => Hash::make($request->nova_senha)
]);
}
}
$usuario->fill($request->all())->save();
$role = Role::findOrFail($request->role_id);
$user_role = $usuario->roles->first();
foreach($usuario->roles as $r){
$usuario->removeRole($r->name);
}
$usuario->assignRole($role->name);
if(isset($request->locais)){
$usuario->locais()->delete();
for($i=0; $i<sizeof($request->locais); $i++){
UsuarioLocalizacao::updateOrCreate([
'usuario_id' => $usuario->id,
'localizacao_id' => $request->locais[$i]
]);
}
}
session()->flash("flash_success", "Usuário alterado!");
if($usuario->empresa){
__createLog($request->empresa_id, 'Usuário', 'editar', $request->name);
}else{
return redirect()->route('usuarios.profile', [$usuario->id]);
}
} catch (\Exception $e) {
if($usuario->empresa){
__createLog($request->empresa_id, 'Usuário', 'erro', $e->getMessage());
}
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
}
return redirect()->route('usuarios.index');
}
public function destroy($id)
{
$item = User::findOrFail($id);
__validaObjetoEmpresa($item->empresa);
try {
$descricaoLog = $item->name;
$item->empresa->delete();
$item->delete();
__createLog(request()->empresa_id, 'Usuário', 'excluir', $descricaoLog);
session()->flash("flash_success", "Usuário removido com sucesso!");
} catch (\Exception $e) {
__createLog(request()->empresa_id, 'Usuário', 'erro', $e->getMessage());
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
}
return redirect()->back();
}
public function profile($id)
{
$item = User::findOrFail($id);
if($item->empresa == null){
abort(403);
}
__validaObjetoEmpresa($item->empresa);
return view('usuarios.profile', compact('item'));
}
public function show($id){
if(!__isAdmin()){
session()->flash("flash_error", "Acesso permitido somente para administradores");
return redirect()->back();
}
$item = User::findOrFail($id);
return view('usuarios.show', compact('item'));
}
public function alterSenha($id)
{
$item = User::findOrFail($id);
return view('usuarios.alterar_senha', compact('item'));
}
public function updateSenha(Request $request, $id){
$item = User::findOrFail($id);
if($request->senha == $request->repita_senha){
$item->password = Hash::make($request->senha);
$item->save();
session()->flash("flash_success", "Senha alterada com sucesso!");
return redirect()->route('usuarios.index');
}else{
session()->flash("flash_error", "Senhas não coencidem!");
return redirect()->back();
}
}
public function historico(Request $request){
$start_date = $request->get('start_date');
$end_date = $request->get('end_date');
$usuario_id = $request->get('usuario_id');
$data = AcessoLog::select('acesso_logs.*')
->join('usuario_empresas', 'usuario_empresas.usuario_id', '=', 'acesso_logs.usuario_id')
->where('usuario_empresas.empresa_id', $request->empresa_id)
->when(!empty($start_date), function ($query) use ($start_date) {
return $query->whereDate('acesso_logs.created_at', '>=', $start_date);
})
->when(!empty($end_date), function ($query) use ($end_date) {
return $query->whereDate('acesso_logs.created_at', '<=', $end_date);
})
->when(!empty($usuario_id), function ($query) use ($usuario_id) {
return $query->where('acesso_logs.usuario_id', $usuario_id);
})
->orderBy('id', 'desc')
->paginate(__itensPagina());
$usuario = null;
if($usuario_id){
$usuario = User::findOrFail($usuario_id);
}
return view('usuarios.historico', compact('data', 'usuario'));
}
}