join( 'cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_supervisor.infraestrutura_id' ) ->join( 'cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id' ) ->join( 'cadastro_usuario', 'cadastro_usuario.id', 'cadastro_supervisor.usuario_id' ) ->join( 'cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id' ) ->select( 'cadastro_supervisor.id', DB::raw('cadastro_unidade.nome_fantasia as unidade'), DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) as infraestrutura'), DB::raw('cadastro_cidadao.nome as usuario'), ); } public static function isSupervisor($usuarioId) { return Supervisor::where('usuario_id', $usuarioId) ->where('infraestrutura_id', self::getCurrentCentroCusto()->infraestrutura_id) ->exists(); } public static function isUsuarioLogadoSupervisor() { $lotacaoLogada = self::getCurrentLotacao(); return Supervisor::where('infraestrutura_id', $lotacaoLogada->infraestrutura_id) ->where('usuario_id', $lotacaoLogada->usuario_id) ->exists(); } public static function create() { return [ 'form' => [ 'unidades' => self::getUnidades(), 'infraestruturas' => [], 'usuarios' => [], ], 'model' => [ 'unidade_id' => null, 'infraestrutura_id' => null, 'usuario_id' => null, ] ]; } public static function edit($id) { $supervisor = Supervisor::findOrFail($id); $params = (object) [ 'unidade_id' => $supervisor->infraestrutura->unidade_id, 'infraestrutura_id' => $supervisor->infraestrutura_id ]; return [ 'form' => [ 'unidades' => self::getUnidades($supervisor->infraestrutura->unidade_id), 'infraestruturas' => self::getInfraestruturas($params, $supervisor->infraestrutura_id), 'usuarios' => self::getUsuarios($params), ], 'model' => [ 'unidade_id' => $supervisor->infraestrutura->unidade_id, 'infraestrutura_id' => $supervisor->infraestrutura_id, 'usuario_id' => $supervisor->usuario_id, ] ]; } public static function list() { $params = (object) request()->all(); switch (request()->listar) { case 'infraestruturas': { return self::getInfraestruturas($params); } case 'usuarios': { return self::getUsuarios($params); } } } private static function getUnidades() { return DB::table('cadastro_unidade as unidade') ->select('unidade.id', 'unidade.nome_fantasia') ->where('unidade.deleted_at', null) ->orderBy('unidade.nome_fantasia') ->get(); } private static function getInfraestruturas($params) { return DB::table('cadastro_infraestrutura as infraestrutura') ->select([ 'infraestrutura.id', DB::raw('CASE WHEN infraestrutura.principal THEN unidade.nome_fantasia ELSE infraestrutura.nome END AS nome'), ]) ->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id') ->where('infraestrutura.unidade_id', $params->unidade_id) ->where('infraestrutura.deleted_at', null) ->orderByRaw('CASE WHEN infraestrutura.principal THEN unidade.nome_fantasia ELSE infraestrutura.nome END') ->get(); } private static function getUsuarios($params) { return DB::table('cadastro_usuario as usuario') ->select('usuario.id', 'cidadao.nome') ->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id') ->whereExists( fn($q) => $q ->select(DB::raw(1)) ->from('cadastro_lotacao as lotacao') ->whereColumn('lotacao.usuario_id', 'usuario.id') ->where('lotacao.infraestrutura_id', $params->infraestrutura_id) ) ->where('usuario.deleted_at', null) ->orderBy('cidadao.nome') ->get(); } public static function store() { self::validate(); return Supervisor::create(request()->all())->fresh(); } public static function update($id) { self::validate(); return (tap(Supervisor::findOrFail($id))->update(request()->all()))->fresh(); } public static function validate() { $rules = [ 'infraestrutura_id' => [ 'required', 'integer', Rule::exists(Infraestrutura::class, 'id'), ], 'usuario_id' => [ 'required', 'integer', Rule::exists(Usuario::class, 'id'), Rule::unique(Supervisor::class, 'usuario_id') ->where('infraestrutura_id', request()->infraestrutura_id) ->ignore(request()->route('supervisor')) ], ]; $messages = [ 'usuario_id.unique' => 'O local de atendimento e o profissional já foram inseridos anteriormente.', ]; request()->validate($rules, $messages); } public static function destroy($id) { Supervisor::findOrFail($id)->delete(); } }