select([ 'administracao_notificacao.id', 'administracao_notificacao_lotacao.lotacao_id', DB::raw("DATE_FORMAT(administracao_notificacao.updated_at, '%d/%m/%Y %H:%i') AS data_hora_atualizacao"), 'administracao_notificacao_tipo.nome AS tipo_nome', 'administracao_notificacao.titulo', 'administracao_notificacao.mensagem', 'administracao_notificacao_lotacao.visualizado', ]) ->join('administracao_notificacao', 'administracao_notificacao.id', 'administracao_notificacao_lotacao.notificacao_id') ->join('administracao_notificacao_tipo', 'administracao_notificacao_tipo.id', 'administracao_notificacao.tipo_id') ->when(request()->lotacao_id, fn ($query) => $query->where('administracao_notificacao_lotacao.lotacao_id', request()->lotacao_id)); if (request()->get('order')) { $orderDir = request()->get('order')['dir']; $query->orderBy('administracao_notificacao.updated_at', $orderDir); } return $query->get(); } public static function create() { return [ 'form' => self::getFormData(), 'model' => self::getModelData(), ]; } public static function store($request) { self::validate($request); $notificacao = null; DB::transaction(function () use ($request, &$notificacao) { $notificacao = Notificacao::create($request->all())->fresh(); $lotacoes = DB::table('cadastro_lotacao') ->select('cadastro_lotacao.id') ->whereNull('cadastro_lotacao.deleted_at') ->whereIn('cadastro_lotacao.infraestrutura_id', $request['infraestruturas']) ->whereIn('cadastro_lotacao.usuario_id', $request['usuarios']) ->get() ->map(fn ($lotacao) => $lotacao->id); $notificacao->lotacoes()->sync($lotacoes); $notificacao = $notificacao->fresh(); }); return $notificacao; } public static function show($id) { return Notificacao::find($id); } public static function edit($id) { return [ 'form' => self::getFormData($id), 'model' => self::getModelData($id), ]; } public static function update($request, $id) { $notificacao = null; if ($request->isMethod('patch')) { self::validatePatch($request); DB::transaction(function () use ($request, $id, &$notificacao) { $notificacao = self::show($id); $notificacao->lotacoes()->updateExistingPivot($request->lotacao_id, ['visualizado' => $request->visualizado]); $notificacao = $notificacao->fresh(); }); } else { self::validate($request); DB::transaction(function () use ($request, $id, &$notificacao) { $notificacao = tap(self::show($id))->update($request->all()); $lotacoes = DB::table('cadastro_lotacao') ->select('cadastro_lotacao.id') ->whereNull('cadastro_lotacao.deleted_at') ->whereIn('cadastro_lotacao.infraestrutura_id', $request['infraestruturas']) ->whereIn('cadastro_lotacao.usuario_id', $request['usuarios']) ->get() ->mapWithKeys(fn ($lotacao) => [$lotacao->id => ['visualizado' => false]]) ->toArray(); if (sizeof($lotacoes) > 0) { $notificacao->lotacoes()->sync($lotacoes); } $notificacao = $notificacao->fresh(); }); } return $notificacao; } public static function destroy($id) { return self::show($id)->delete(); } public static function datatable() { $query = DB::table('administracao_notificacao') ->select([ 'administracao_notificacao.id', DB::raw("DATE_FORMAT(administracao_notificacao.updated_at, '%d/%m/%Y %H:%i') AS data_hora_atualizacao"), 'administracao_notificacao_tipo.nome AS tipo_nome', 'administracao_notificacao.titulo', 'administracao_notificacao.mensagem', ]) ->join('administracao_notificacao_tipo', 'administracao_notificacao_tipo.id', 'administracao_notificacao.tipo_id'); if (request()->get('order')) { $orderDir = request()->get('order')[0]['dir']; $query->orderBy('administracao_notificacao.updated_at', $orderDir); } return $query; } public static function list() { switch (request()->get('listar')) { case 'infraestruturas': { return [ 'infraestruturas' => self::getInfraestruturas(request()->unidades), 'usuarios' => self::getUsuarios(request()->unidades, request()->infraestruturas), ]; } case 'usuarios': { return [ 'usuarios' => self::getUsuarios(request()->unidades, request()->infraestruturas), ]; } } } private static function validate($request) { return $request->validate([ 'tipo_id' => [ 'required', 'integer', Rule::exists(NotificacaoTipo::class, 'id'), ], 'titulo' => [ 'required', 'string', 'between:3,200', ], 'mensagem' => [ 'required', 'string', ], ]); } private static function validatePatch($request) { return $request->validate([ 'lotacao_id' => [ 'required', 'integer', Rule::exists(Lotacao::class, 'id'), ], 'visualizado' => [ 'required', 'boolean', ], ]); } private static function getFormData($id = null) { $notificacao = self::show($id); $unidades = []; $infraestruturas = []; if (!is_null($notificacao)) { $unidades = DB::table('cadastro_unidade') ->select('cadastro_unidade.id') ->whereNull('cadastro_unidade.deleted_at') ->whereExists(fn($q) => $q ->select(DB::raw(1)) ->from('administracao_notificacao_lotacao') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'administracao_notificacao_lotacao.lotacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id') ->where('administracao_notificacao_lotacao.notificacao_id', $notificacao->id) ->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id') ) ->get() ->map(fn ($query) => $query->id) ->values(); $infraestruturas = DB::table('cadastro_infraestrutura') ->select('cadastro_infraestrutura.id') ->whereNull('cadastro_infraestrutura.deleted_at') ->whereExists(fn($q) => $q ->select(DB::raw(1)) ->from('administracao_notificacao_lotacao') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'administracao_notificacao_lotacao.lotacao_id') ->where('administracao_notificacao_lotacao.notificacao_id', $notificacao->id) ->whereColumn('cadastro_lotacao.infraestrutura_id', 'cadastro_infraestrutura.id') ) ->get() ->map(fn ($query) => $query->id) ->values(); } return [ 'tipos' => NotificacaoTipo::orderBy('nome')->get(['id', 'nome']), 'unidades' => self::getUnidades(), 'infraestruturas' => $notificacao ? self::getInfraestruturas($unidades) : self::getInfraestruturas(), 'usuarios' => $notificacao ? self::getUsuarios($unidades, $infraestruturas) : self::getUsuarios(), ]; } private static function getModelData($id = null) { $notificacao = self::show($id); $unidades = []; $infraestruturas = []; $usuarios = []; if (!is_null($notificacao)) { $unidades = DB::table('cadastro_unidade') ->select('cadastro_unidade.id') ->whereNull('cadastro_unidade.deleted_at') ->whereExists(fn($q) => $q ->select(DB::raw(1)) ->from('administracao_notificacao_lotacao') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'administracao_notificacao_lotacao.lotacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id') ->where('administracao_notificacao_lotacao.notificacao_id', $notificacao->id) ->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id') ) ->get() ->map(fn ($query) => $query->id) ->values(); $infraestruturas = DB::table('cadastro_infraestrutura') ->select('cadastro_infraestrutura.id') ->whereNull('cadastro_infraestrutura.deleted_at') ->whereExists(fn($q) => $q ->select(DB::raw(1)) ->from('administracao_notificacao_lotacao') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'administracao_notificacao_lotacao.lotacao_id') ->where('administracao_notificacao_lotacao.notificacao_id', $notificacao->id) ->whereColumn('cadastro_lotacao.infraestrutura_id', 'cadastro_infraestrutura.id') ) ->get() ->map(fn ($query) => $query->id) ->values(); $usuarios = DB::table('cadastro_usuario') ->select('cadastro_usuario.id') ->whereNull('cadastro_usuario.deleted_at') ->whereExists(fn($q) => $q ->select(DB::raw(1)) ->from('administracao_notificacao_lotacao') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'administracao_notificacao_lotacao.lotacao_id') ->where('administracao_notificacao_lotacao.notificacao_id', $notificacao->id) ->whereColumn('cadastro_lotacao.usuario_id', 'cadastro_usuario.id') ) ->get() ->map(fn ($query) => $query->id) ->values(); } return [ 'id' => $notificacao->id ?? null, 'tipo_id' => $notificacao->tipo_id ?? null, 'unidades' => $notificacao ? $unidades : self::getUnidades()->map(fn ($unidade) => $unidade->id), 'infraestruturas' => $notificacao ? $infraestruturas : self::getInfraestruturas()->map(fn ($infraestrutura) => $infraestrutura->id), 'usuarios' => $notificacao ? $usuarios : self::getUsuarios()->map(fn ($usuario) => $usuario->id), 'titulo' => $notificacao->titulo ?? null, 'mensagem' => $notificacao->mensagem ?? null, ]; } private static function getUnidades() { return DB::table('cadastro_unidade') ->select([ 'cadastro_unidade.id', 'cadastro_unidade.nome_fantasia AS nome', ]) ->whereNull('cadastro_unidade.deleted_at') ->whereExists( fn($q) => $q ->select(DB::raw(1)) ->from('cadastro_lotacao') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id') ->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id') ) ->orderBy('cadastro_unidade.nome_fantasia') ->get(); } private static function getInfraestruturas($unidades = null) { return DB::table('cadastro_infraestrutura') ->select([ 'cadastro_infraestrutura.id', DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome'), ]) ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->whereNull('cadastro_infraestrutura.deleted_at') ->whereExists(fn($q) => $q ->select(DB::raw(1)) ->from('cadastro_lotacao') ->whereColumn('cadastro_lotacao.infraestrutura_id', 'cadastro_infraestrutura.id') ) ->when($unidades, fn ($query) => $query->whereIn('cadastro_infraestrutura.unidade_id', $unidades)) ->orderBy('cadastro_infraestrutura.nome') ->get(); } private static function getUsuarios($unidades = null, $infraestruturas = null) { return DB::table('cadastro_usuario') ->select([ 'cadastro_usuario.id', 'cadastro_cidadao.nome', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->whereNull('cadastro_usuario.deleted_at') ->whereExists(fn($q) => $q ->select(DB::raw(1)) ->from('cadastro_lotacao') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id') ->whereNull('cadastro_lotacao.deleted_at') ->when($unidades, fn ($query) => $query->whereIn('cadastro_infraestrutura.unidade_id', $unidades)) ->when($infraestruturas, fn ($query) => $query->whereIn('cadastro_lotacao.infraestrutura_id', $infraestruturas)) ->whereColumn('cadastro_lotacao.usuario_id', 'cadastro_usuario.id') ) ->orderBy('cadastro_cidadao.nome') ->get(); } }