Root Zanli
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
home
/
o5t6x7pgljbm
/
public_html
/
admin
/
app
/
Http
/
Controllers
/
Admin
/
Filename :
StudentSegmentController.php
back
Copy
<?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Libraries\Helpers; use Illuminate\Http\Request; use App\Models\SchoolManagement\StudentSegment; use App\Models\User; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Yajra\DataTables\Facades\DataTables; class StudentSegmentController extends Controller { /** * Display the student segments list. */ public function index(Request $request) { $school = Helpers::getCurrentSchool($request->user()); return view('School.StudentSegment.index', compact('school')); } /** * Fetch student segments with search & pagination. */ public function getData(Request $request) { $school = Helpers::getCurrentSchool($request->user()); $query = StudentSegment::where('school_id', $school->school_id); if ($request->has('search') && !empty($request->search)) { $query->where('name', 'like', '%' . $request->search . '%'); } return DataTables::of($query) ->addColumn('student_segment_pk_id', function ($segment) { return $segment->id; }) ->addColumn('actions', function ($segment) { return view('School.StudentSegment.partials.actions', compact('segment'))->render(); }) ->rawColumns(['actions']) ->make(true); } /** * Show the form for creating a new segment. */ public function create() { return view('School.StudentSegment.create'); } /** * Store a newly created segment. */ public function store(Request $request) { $school = Helpers::getCurrentSchool($request->user()); $request->validate([ 'name' => 'required|string|max:255', 'description' => 'required|string|max:255', ]); StudentSegment::create([ 'name' => $request->name, 'description' => $request->description, 'school_id' => $school->school_id, ]); return redirect()->route('student_segments.index')->with('success', 'Segment created successfully.'); } /** * Show the form for editing a segment. */ public function edit($id) { $segment = StudentSegment::findOrFail($id); return view('School.StudentSegment.edit', compact('segment')); } /** * Update a student segment. */ public function update(Request $request, $id) { $school = Helpers::getCurrentSchool($request->user()); $segment = StudentSegment::findOrFail($id); if($segment->school_id != $school->school_id){ return redirect()->back()->with('error', 'Student Segment not found for current school'); } $request->validate([ 'name' => 'required|string|max:255', 'description' => 'required|string|max:255', ]); $segment->update([ 'name' => $request->name, 'description' => $request->description, ]); return redirect()->route('student_segments.index')->with('success', 'Segment updated successfully.'); } /** * Delete a student segment. */ public function destroy($id) { StudentSegment::findOrFail($id)->delete(); return response()->json(['message' => 'Segment deleted successfully.']); } public function bulkAction(Request $request) { Log::debug("Request Params: " . print_r($request->all(), true)); $action = $request->input('action'); $studentSegmentIds = $request->input('student_segment_ids', []); $areAllSegmentsSelected = filter_var($request->input('selected_all_segments', false), FILTER_VALIDATE_BOOLEAN); $searchText = $request->input('search_text', null); $message = $request->input('message'); // For "Send Mail" action if (!$action || (empty($studentSegmentIds) && !$areAllSegmentsSelected)) { return response()->json(['message' => 'Invalid request.'], 400); } $school = Helpers::getCurrentSchool($request->user()); $selectedUsers = $this->getSelectedUsersFromSegment($school, $studentSegmentIds, $areAllSegmentsSelected, $searchText); if ($selectedUsers->isEmpty()) { return response()->json(['message' => 'No students are eligible post filter'], 400); } return match ($action) { 'Send Mail' => $this->handleSendMail($school, $selectedUsers, $message), default => response()->json(['message' => 'Invalid action.'], 400), }; } /** * Fetch selected users based on selection criteria. */ private function getSelectedUsersFromSegment($school, $studentSegmentIds, $isAllUsersSelected, $searchText) { $columns = ["users.*"]; $searchableColumns = ["student_segments.name", "student_segments.description"]; $queryBuilder = $isAllUsersSelected ? $this->getQuerySelectorForStudent($school, $columns, $searchableColumns, $searchText) : $this->getQuerySelectorForStudent($school, $columns, $searchableColumns, $searchText, $studentSegmentIds); Log::debug("SQL: ". $queryBuilder->toSql()); return $queryBuilder->get(); } /** * Handles the "Send Mail" action. */ private function handleSendMail($school, $selectedUsers, $message) { $usersToNotify = []; foreach ($selectedUsers as $user) { if (!isset($usersToNotify[$user->user_id])) { $usersToNotify[$user->user_id] = $user; } foreach ($user->membershipGroups as $group) { foreach ($group->parents() as $parent) { $usersToNotify[$parent->user_id] = $parent; } } } Log::debug("Sending mail to user IDs: " . print_r(array_keys($usersToNotify), true)); Helpers::notifyFromSchool(null, $message, $school, $usersToNotify); return response()->json([ 'message' => 'Mail sent to total ' . count($usersToNotify) . ' selected users successfully.' ]); } public function getQuerySelectorForStudent($school, $columnsToSelect, $searchableColumns, $searchText, $selectedSegmentIds = []) { Log::debug("Selected UserIds inside StudentSegmentController:" . print_r($selectedSegmentIds, true)); // Ensure we select users and their segment names $query = User::select(array_merge($columnsToSelect, [ DB::raw('GROUP_CONCAT(student_segments.name SEPARATOR ", ") as segment_names') ])) ->join('student_segment_user', function ($join) { $join->on('users.user_id', '=', 'student_segment_user.user_id') ->whereNull('student_segment_user.deleted_at'); // Ensuring only active relations }) ->join('student_segments', function ($join) { $join->on('student_segment_user.student_segment_id', '=', 'student_segments.id') ->whereNull('student_segments.deleted_at'); // Ensuring only active segments }) ->where('users.preferred_school_id', $school->school_id) ->where('student_segments.school_id', $school->school_id) ->groupBy('users.user_id'); // Group to avoid duplicate users if (!empty($searchText)) { $query->where(function ($query2) use ($searchText, $searchableColumns) { foreach ($searchableColumns as $key => $value) { if ($key == 0) { $query2->where($value, 'LIKE', "%{$searchText}%"); } else { $query2->orWhere($value, 'LIKE', "%{$searchText}%"); } } }); } if (!empty($selectedSegmentIds)) { $query->whereIn('student_segments.id', $selectedSegmentIds); } return $query; } }