/
home
/
maktab
/
server
/
app
/
Http
/
Controllers
/
api
/
File Upload :
llllll
Current File: /home/maktab/server/app/Http/Controllers/api/AttendanceController.php
<?php namespace App\Http\Controllers\api; use App\DB\Te\TableEngine; use App\Http\Controllers\Controller; use App\Http\Controllers\SuperAttendanceController; use App\Models\Attendance; use App\Models\ReportStudentAttendance; use App\Models\Maktab; use App\Models\StudentAttendance; use Carbon\Carbon; use App\Models\User; use Illuminate\Http\Request; use Hekmatinasser\Verta\Verta; use Illuminate\Support\Facades\DB; use niklasravnsborg\LaravelPdf\Facades\Pdf; //use Couchbase\User; use http\Env\Response; use DateTime; use Morilog\Jalali\Jalalian; class AttendanceController extends SuperAttendanceController { public function __construct(Request $request) { $user = auth()->user(); if ($request->type == 'student') { $select = ['*', StudentAttendance::$SELECT_DAJ]; parent::__construct(StudentAttendance::class, $select, $user, 'student_attendance'); } else { $select = ['*', Attendance::$SELECT_DAJ]; parent::__construct(Attendance::class, $select, $user, 'attendance'); } } public function oneChange(Request $request) { if ($request->type == 'student') { $model = StudentAttendance::class; } else { $model = Attendance::class; } $get = $model::findOrFail($request->id); $get->update([ 'present' => !$get->present ]); return response()->json(true); } public function getListEmployee(Request $request) { if ($request->type == 'student') { $query = StudentAttendance::where('student_id', $request->id); } else { $query = Attendance::where('employee_id', $request->id); } TableEngine::create($query, $request) ->initSearch([]) ->select(['*']) ->export($query); return response()->json($query); } public function pdf3(Request $request) { // Input timestamp $timestamp = new DateTime($request->date_at); $dayOfWeekEnglish = $timestamp->format('l'); // 'l' format character gives the full name of the day $daysOfWeekInPersian = ['Saturday' => 'شنبه', 'Sunday' => 'یک شنبه', 'Monday' => 'دو شنبه', 'Tuesday' => 'سه شنبه', 'Wednesday' => 'چهار شنبه', 'Thursday' => 'پنج شنبه', 'Friday' => 'جمعه',]; $persianDay = mb_convert_encoding('شنبه', 'UTF-8', 'auto'); // return Maktab::all(); $users = Maktab::with(["users"])->where("day_active", $daysOfWeekInPersian[$dayOfWeekEnglish])->get(); $data = $request; $send = []; $send["date_at"] = $data["date_at"]; $report_attendance = ReportStudentAttendance::with('maktab.master')->where('date_at', Carbon::parse($data["date_at"])->format("Y-m-d")) ->whereNotNull('type') ->get(); $report_student_attendance = ReportStudentAttendance::with(['maktab', 'teacher'])->where('date_at', Carbon::parse($data["date_at"])->format("Y-m-d")) ->whereNull('type') ->get(); $attendance = StudentAttendance::with(['maktab', 'employee'])->where('date_at', Carbon::parse($data["date_at"])->format("Y-m-d")) ->whereNotNull('absent_body')->get(); $send['report_attendance'] = $report_attendance; $send['report_student_attendance'] = $report_student_attendance; $send['attendance'] = $attendance; $send['users'] = $users; // return $send; view()->share('send', $send); $pdf = \niklasravnsborg\LaravelPdf\Facades\Pdf::loadView('pdf', $send); $file_name = md5(time() . 'download') . '.' . 'pdf'; if (!\Illuminate\Support\Facades\File::exists(public_path('storage/pdf'))) { \Illuminate\Support\Facades\File::makeDirectory(public_path('storage/pdf')); } $pdf->save(public_path('storage/pdf' . '/' . $file_name)); return response()->json(url('storage/pdf' . '/' . $file_name)); // view()->share('send',$send); // return view('pdf',$send); // return $pdf->download('pdf.pdf'); } public function reportattendanceByMaktab(Request $request) { // بررسی ورود تاریخ شروع و پایان if (!$request->filled('from_date') || !$request->filled('to_date')) { return response()->json([ 'status' => 'error', 'message' => 'لطفاً تاریخ شروع و پایان را وارد کنید.' ], 422); } // گرفتن ورودیهای تاریخ از کاربر $fromDateInput = $request->input('from_date'); $toDateInput = $request->input('to_date'); // تبدیل تاریخها به Carbon و تنظیم ابتدای و انتهای روز $fromDateCarbon = Carbon::parse($fromDateInput)->startOfDay(); $toDateCarbon = Carbon::parse($toDateInput)->endOfDay(); // تبدیل Carbon به رشته قابل ذخیره در دیتابیس $fromDate = $fromDateCarbon->toDateTimeString(); $toDate = $toDateCarbon->toDateTimeString(); // فرمت تاریخ برای نمایش با Verta $toDateVertaFormatted = Verta::instance($toDateCarbon)->format('Y/n/j'); // گرفتن فیلترهای مدارس و مربیان از ورودی $schoolIds = $request->input('schools') ?? []; $teacherIds = $request->input('teachers') ?? []; // محاسبه تعداد جلسات هر مکتب و مربی در بازه زمانی مشخص $sessionCountsQuery = StudentAttendance::whereBetween('date_at', [$fromDate, $toDate]) ->when(!empty($schoolIds), function ($query) use ($schoolIds) { return $query->whereIn('maktab_id', $schoolIds); }) ->when(!empty($teacherIds), function ($query) use ($teacherIds) { return $query->whereIn('employee_id', $teacherIds); }) ->select('maktab_id', 'employee_id', DB::raw('COUNT(DISTINCT DATE(date_at)) as session_count')) ->groupBy('maktab_id', 'employee_id') ->get(); // تبدیل نتایج کوئری به آرایه برای دسترسی سریع $sessionCounts = []; foreach ($sessionCountsQuery as $item) { $sessionCounts[$item->maktab_id . '-' . $item->employee_id] = $item->session_count; } // گرفتن شناسه مکتبهای معتبر از نتایج کوئری جلسات $validMaktabIds = collect($sessionCountsQuery)->pluck('maktab_id')->unique()->all(); // گرفتن تمام تاریخهای جلسات برای هر مکتب $sessions = StudentAttendance::whereBetween('date_at', [$fromDate, $toDate]) ->whereIn('maktab_id', $validMaktabIds) ->select('maktab_id', DB::raw('DATE(date_at) as only_date')) ->get() ->groupBy('maktab_id'); $attendances = collect(); // جمعآوری حضور و غیاب هر دانشآموز برای هر مکتب foreach ($sessions as $maktabId => $sessionDates) { $dates = $sessionDates->pluck('only_date')->all(); $partialAttendances = StudentAttendance::with(['student', 'maktab', 'employee']) ->whereIn('maktab_id', [$maktabId]) ->when(!empty($teacherIds), function ($query) use ($teacherIds) { return $query->whereIn('employee_id', $teacherIds); }) ->whereIn(DB::raw('DATE(date_at)'), $dates) ->select('student_id', 'maktab_id', 'employee_id', DB::raw('DATE(date_at) as only_date'), DB::raw('MAX(present) as present')) ->groupBy('student_id', 'maktab_id', 'employee_id', 'only_date') ->get(); $attendances = $attendances->merge($partialAttendances); } $studentsData = []; // آرایه نهایی اطلاعات دانشآموزان $maktabStats = []; // آمار تعداد دانشآموزان هر مکتب // گروهبندی حضورها بر اساس مکتب $attendancesGroupedByMaktab = $attendances->groupBy('maktab_id'); foreach ($attendancesGroupedByMaktab as $maktabId => $records) { $firstRecord = $records->first(); $maktabName = 'نامشخص'; $teacherName = ''; // تعیین نام مکتب و مربی در صورت موجود بودن if (!empty($firstRecord) && !empty($firstRecord->maktab)) { $maktabName = $firstRecord->maktab->title; } if (!empty($teacherIds) && !empty($firstRecord->employee)) { $teacherName = $firstRecord->employee->name; $maktabName .=" - مربی: " . $teacherName; } // شمارش تعداد دانشآموزان یکتا $uniqueStudentsCount = $records->pluck('student_id')->unique()->count(); $maktabStats[$maktabName] = $uniqueStudentsCount; // گروهبندی بر اساس دانشآموز $recordsGroupedByStudent = $records->groupBy('student_id'); foreach ($recordsGroupedByStudent as $studentId => $studentRecords) { $firstStudentRecord = $studentRecords->first(); $studentName = 'نامشخص'; $employeeId = $firstStudentRecord->employee_id ?? 0; if (!empty($firstStudentRecord) && !empty($firstStudentRecord->student)) { $studentName = $firstStudentRecord->student->name; } // شمارش تعداد حضور واقعی دانشآموز $totalPresent = 0; foreach ($studentRecords as $rec) { if ($rec->present == 1) { $totalPresent++; } } // گرفتن تعداد کل جلسات مربوط به مکتب و مربی $totalSessions = $sessionCounts[$maktabId . '-' . $employeeId] ?? 0; // آمادهسازی آرایه تاریخها با جزئیات حضور و غیاب $datesArray = []; foreach ($studentRecords as $attendance) { $vertaDate = Verta::instance(Carbon::parse($attendance->date_at))->format('Y/n/j'); $vertaTime = Verta::instance(Carbon::parse($attendance->date_at))->format('H:i'); $presentStatus = $attendance->present ? 'حاضر' : 'غایب'; $datesArray[] = [ 'date' => $vertaDate, 'time' => $vertaTime, 'present' => $presentStatus, ]; } // افزودن اطلاعات دانشآموز به آرایه نهایی در صورتی که مکتب معتبر باشد if (in_array($maktabId, $validMaktabIds)) { $studentsData[] = [ 'student_id' => $studentId, 'student_name' => $studentName, 'maktab_name' => $maktabName, 'maktab_id' => $maktabId, "employee_id" => $employeeId, "teacher_name" => $teacherName, 'total_present' => $totalPresent, 'total_sessions' => $totalSessions, 'dates' => $datesArray ]; $totalSessionsByGroup[$maktabName] = $totalSessions; } } } // محاسبه حضور مربیان نوع ۳ در بازه زمانی مشخص $type3ManagerSessions = Attendance::with('employee') ->whereBetween('date_at', [$fromDate, $toDate]) ->whereHas('employee', function ($query) { $query->where('type', 3); }) ->where('present', 1) ->select('maktab_id', DB::raw('COUNT(DISTINCT DATE(date_at)) as session_count')) ->groupBy('maktab_id') ->get(); $type3SessionsByMaktab = []; foreach ($type3ManagerSessions as $item) { $type3SessionsByMaktab[$item->maktab_id] = $item->session_count; } // محاسبه میانگین حضور کل دانشآموزان $totalPresence = array_sum(array_column($studentsData, 'total_present')); $studentCount = count($studentsData); $averagePresence = $studentCount > 0 ? round($totalPresence / $studentCount, 2) : 0; // گروهبندی دانشآموزان بر اساس نام مکتب $studentsGroupedByMaktabName = collect($studentsData)->groupBy('maktab_name'); // محاسبه میانگین حضور هر مکتب $averagePresenceByMaktab = []; foreach ($studentsGroupedByMaktabName as $maktabName => $students) { $maktabId = $students->first()['maktab_id']; $totalPresentInMaktab = array_sum($students->pluck('total_present')->toArray()); $type3Sessions = $type3SessionsByMaktab[$maktabId] ?? 0; $averagePresenceByMaktab[$maktabName] = $type3Sessions > 0 ? round($totalPresentInMaktab / $type3Sessions, 2) : 0; } // آمادهسازی دادههای کلی برای PDF و View $send = [ 'from_date' => Verta::instance(Carbon::parse($fromDate))->format('Y/n/j'), 'to_date' => $toDateVertaFormatted, 'students' => $studentsData, 'maktab_stats' => $maktabStats, 'session_counts' => $sessionCounts, 'session_count' => array_sum(array_column($studentsData, 'total_sessions')), 'average_presence' => $averagePresence, 'average_presence_by_maktab' => $averagePresenceByMaktab, 'mode' => 'maktab', 'total_type3_teacher_presence'=> $type3SessionsByMaktab, 'total_sessions_by_group' => $totalSessionsByGroup ?? [], ]; // به اشتراکگذاری دادهها برای View view()->share('send', $send); // تولید فایل PDF کلی $pdf = \niklasravnsborg\LaravelPdf\Facades\Pdf::loadView('reportattend', $send); $file_name = md5(time() . 'download') . '.pdf'; if (!\Illuminate\Support\Facades\File::exists(public_path('storage/pdf'))) { \Illuminate\Support\Facades\File::makeDirectory(public_path('storage/pdf')); } $pdf->save(public_path('storage/pdf/' . $file_name)); // تولید فایل PDF جداگانه برای هر مکتب $individualFiles = []; foreach ($studentsGroupedByMaktabName as $maktabName => $students) { if (count($students) == 0) continue; $customData = $send; $customData['students'] = $students->values(); $customData['maktab_stats'] = [$maktabName => $maktabStats[$maktabName] ?? 0]; $customData['session_counts'] = collect($students->pluck('total_sessions', 'maktab_id')); $customData['session_count'] = $customData['session_counts']->sum(); $customData['average_presence'] = $averagePresenceByMaktab[$maktabName] ?? 0; $customData['average_presence_by_maktab'] = [$maktabName => $averagePresenceByMaktab[$maktabName] ?? 0]; view()->share('send', $customData); $pdf = \niklasravnsborg\LaravelPdf\Facades\Pdf::loadView('reportattend', $customData); $filename = md5($maktabName . time()) . '.pdf'; $pdf->save(public_path('storage/pdf/' . $filename)); $individualFiles[$maktabName] = url('storage/pdf/' . $filename); } // آمادهسازی آرایه لینک PDFهای جداگانه $individualFilesArray = []; foreach ($individualFiles as $maktabName => $link) { $individualFilesArray[] = [ 'school_name' => $maktabName, 'pdf_link' => $link ]; } // گروهبندی دانشآموزان بر اساس مکتب و مربی $studentsGroupedByMaktabAndTeacher = collect($studentsData) ->groupBy(function($item) { return $item['maktab_id'] . '-' . $item['employee_id']; }); // تولید فایلهای ترکیبی برای هر مکتب-مربی $combinedFiles = []; foreach ($studentsGroupedByMaktabAndTeacher as $groupKey => $students) { if (count($students) == 0) continue; $firstStudent = $students->first(); $maktabName = $firstStudent['maktab_name']; $teacherName = $firstStudent['teacher_name'] ?? 'نامشخص'; // نام نمایشی ترکیبی مکتب و مربی $displayGroupName = $maktabName . ' - مربی: ' . $teacherName; $customData = $send; $customData['students'] = $students->values(); $customData['maktab_stats'] = [$displayGroupName => $maktabStats[$maktabName] ?? 0]; $customData['session_counts'] = collect($students->pluck('total_sessions', 'maktab_id')); $customData['session_count'] = $customData['session_counts']->sum(); $customData['average_presence'] = $averagePresenceByMaktab[$displayGroupName] ?? 0; $customData['average_presence_by_maktab'] = [$displayGroupName => $averagePresenceByMaktab[$displayGroupName] ?? 0]; view()->share('send', $customData); $pdf = \niklasravnsborg\LaravelPdf\Facades\Pdf::loadView('reportattend', $customData); $filename = md5($groupKey . time()) . '.pdf'; $pdf->save(public_path('storage/pdf/' . $filename)); $combinedFiles[$displayGroupName] = url('storage/pdf/' . $filename); } // بررسی مدارس درخواست شده که هیچ گزارشی ندارند $reportedMaktabIds = collect($studentsGroupedByMaktabName) ->map(function ($group) { return $group->first()['maktab_id']; }) ->unique() ->values() ->all(); $missingMaktabIds = []; if (!empty($schoolIds)) { $missingMaktabIds = array_diff($schoolIds, $reportedMaktabIds); } $missingMaktabs = \App\Models\Maktab::whereIn('id', $missingMaktabIds)->pluck('title')->all(); // بازگشت پاسخ JSON شامل لینک PDFها و هشدار مدارس بدون گزارش return response()->json([ 'all' => url('storage/pdf/' . $file_name), 'individuals' => $individualFilesArray, 'warnings' => $missingMaktabs ]); } public function reportattendanceByTeacher(Request $request) { // بررسی وجود تاریخ شروع و پایان در درخواست if (!$request->filled('from_date') || !$request->filled('to_date')) { return response()->json([ 'status' => 'error', 'message' => 'لطفاً تاریخ شروع و پایان را وارد کنید.' ], 422); } // دریافت تاریخها از درخواست و تبدیل به Carbon برای پردازش $fromDateInput = $request->input('from_date'); $toDateInput = $request->input('to_date'); $fromDateCarbon = Carbon::parse($fromDateInput)->startOfDay(); $toDateCarbon = Carbon::parse($toDateInput)->endOfDay(); $fromDate = $fromDateCarbon->toDateTimeString(); $toDate = $toDateCarbon->toDateTimeString(); // تاریخ پایان به فرمت شمسی برای نمایش در خروجی $toDateVertaFormatted = Verta::instance($toDateCarbon)->format('Y/n/j'); // دریافت فیلتر مدارس و مربیان از درخواست $schoolIds = $request->input('schools') ?? []; $teacherIds = $request->input('teachers') ?? []; // گرفتن تعداد جلسات هر مکتب و مربی در بازه زمانی مشخص $sessionCountsQuery = StudentAttendance::whereBetween('date_at', [$fromDate, $toDate]) ->when(!empty($schoolIds), function ($query) use ($schoolIds) { return $query->whereIn('maktab_id', $schoolIds); }) ->when(!empty($teacherIds), function ($query) use ($teacherIds) { return $query->whereIn('employee_id', $teacherIds); }) ->select('maktab_id', 'employee_id', DB::raw('COUNT(DISTINCT DATE(date_at)) as session_count')) ->groupBy('maktab_id', 'employee_id') ->get(); // تبدیل نتیجه به آرایه برای دسترسی سریعتر $sessionCounts = []; foreach ($sessionCountsQuery as $item) { $sessionCounts[$item->maktab_id . '-' . $item->employee_id] = $item->session_count; } // گرفتن لیست مکتبهای معتبر بر اساس جلسات ثبت شده $validMaktabIds = collect($sessionCountsQuery)->pluck('maktab_id')->unique()->all(); // دریافت تاریخ جلسات برای هر مکتب $sessions = StudentAttendance::whereBetween('date_at', [$fromDate, $toDate]) ->whereIn('maktab_id', $validMaktabIds) ->select('maktab_id', DB::raw('DATE(date_at) as only_date')) ->get() ->groupBy('maktab_id'); $attendances = collect(); // جمعآوری حضور و غیاب دانشآموزان برای هر مکتب و مربی foreach ($sessions as $maktabId => $sessionDates) { $dates = $sessionDates->pluck('only_date')->all(); $partialAttendances = StudentAttendance::with(['student', 'maktab', 'employee']) ->whereIn('maktab_id', [$maktabId]) ->when(!empty($teacherIds), function ($query) use ($teacherIds) { return $query->whereIn('employee_id', $teacherIds); }) ->whereIn(DB::raw('DATE(date_at)'), $dates) ->select( 'student_id', 'maktab_id', 'employee_id', DB::raw('DATE(date_at) as only_date'), DB::raw('MAX(present) as present') ) ->groupBy('student_id', 'maktab_id', 'employee_id', 'only_date') ->get(); // ترکیب نتایج با کل مجموعه حضور و غیاب $attendances = $attendances->merge($partialAttendances); } $studentsData = []; // آرایه نهایی برای اطلاعات دانشآموزان $maktabStats = []; // آمار هر مکتب و مربی $attendancesGroupedByMaktab = $attendances->groupBy('maktab_id'); // پردازش حضور و غیاب گروهبندی شده بر اساس مکتب foreach ($attendancesGroupedByMaktab as $maktabId => $records) { // گروهبندی بر اساس مربی $recordsGroupedByTeacher = $records->groupBy('employee_id'); foreach ($recordsGroupedByTeacher as $employeeId => $teacherRecords) { $firstRecord = $teacherRecords->first(); $maktabName = 'نامشخص'; $teacherName = ''; // تعیین نام مکتب و مربی if (!empty($firstRecord) && !empty($firstRecord->maktab)) { $maktabName = $firstRecord->maktab->title; } if (!empty($firstRecord->employee)) { $teacherName = $firstRecord->employee->name; } // ترکیب نام مکتب و مربی برای نمایش $displayMaktabName = $maktabName; if (!empty($teacherName)) { $displayMaktabName .= " - مربی: " . $teacherName; } // شمارش تعداد دانشآموزان منحصربهفرد $uniqueStudentsCount = $teacherRecords->pluck('student_id')->unique()->count(); $maktabStats[$displayMaktabName] = $uniqueStudentsCount; // گروهبندی حضور و غیاب بر اساس دانشآموز $recordsGroupedByStudent = $teacherRecords->groupBy('student_id'); foreach ($recordsGroupedByStudent as $studentId => $studentRecords) { $firstStudentRecord = $studentRecords->first(); $studentName = 'نامشخص'; if (!empty($firstStudentRecord) && !empty($firstStudentRecord->student)) { $studentName = $firstStudentRecord->student->name; } // شمارش تعداد حضور هر دانشآموز $totalPresent = 0; foreach ($studentRecords as $rec) { if ($rec->present == 1) { $totalPresent++; } } // تعداد کل جلسات برای این مربی و مکتب $totalSessions = $sessionCounts[$maktabId . '-' . $employeeId] ?? 0; // آرایه تاریخها و وضعیت حضور برای هر دانشآموز $datesArray = []; foreach ($studentRecords as $attendance) { $vertaDate = Verta::instance(Carbon::parse($attendance->date_at))->format('Y/n/j'); $vertaTime = Verta::instance(Carbon::parse($attendance->date_at))->format('H:i'); $presentStatus = $attendance->present ? 'حاضر' : 'غایب'; $datesArray[] = [ 'date' => $vertaDate, 'time' => $vertaTime, 'present' => $presentStatus, ]; } // اضافه کردن اطلاعات دانشآموز به آرایه نهایی if (in_array($maktabId, $validMaktabIds)) { $studentsData[] = [ 'student_id' => $studentId, 'student_name' => $studentName, 'maktab_name' => $displayMaktabName, 'maktab_id' => $maktabId, "employee_id" => $employeeId, "teacher_name" => $teacherName, 'total_present' => $totalPresent, 'total_sessions' => $totalSessions, 'dates' => $datesArray ]; } } } } // گرفتن تعداد جلسات حضور مربیان نوع 3 (مدیر) در بازه زمانی $type3ManagerSessions = Attendance::with('employee') ->whereBetween('date_at', [$fromDate, $toDate]) ->whereHas('employee', function ($query) { $query->where('type', 3); }) ->where('present', 1) ->select('maktab_id', DB::raw('COUNT(DISTINCT DATE(date_at)) as session_count')) ->groupBy('maktab_id') ->get(); $type3SessionsByMaktab = []; foreach ($type3ManagerSessions as $item) { $type3SessionsByMaktab[$item->maktab_id] = $item->session_count; } // محاسبه حضور میانگین کلی $totalPresence = array_sum(array_column($studentsData, 'total_present')); $studentCount = count($studentsData); $averagePresence = $studentCount > 0 ? round($totalPresence / $studentCount, 2) : 0; // گروهبندی دانشآموزان بر اساس نام مکتب $studentsGroupedByMaktabName = collect($studentsData)->groupBy('maktab_name'); // محاسبه میانگین حضور بر اساس مکتب $averagePresenceByMaktab = []; foreach ($studentsGroupedByMaktabName as $maktabName => $students) { $maktabId = $students->first()['maktab_id']; $employeeId = $students->first()['employee_id']; $totalPresentInMaktab = array_sum($students->pluck('total_present')->toArray()); $type3Sessions = $type3SessionsByMaktab[$maktabId] ?? 0; $averagePresenceByMaktab[$maktabName] = $type3SessionsByMaktab[$maktabId] > 0 ? round($totalPresentInMaktab / $type3SessionsByMaktab[$maktabId], 2) : 0; } // آمادهسازی دادهها برای ارسال به PDF و خروجی JSON $send = [ 'from_date' => Verta::instance(Carbon::parse($fromDate))->format('Y/n/j'), 'to_date' => $toDateVertaFormatted, 'students' => $studentsData, 'maktab_stats' => $maktabStats, 'session_counts' => $sessionCounts, 'session_count' => array_sum(array_column($studentsData, 'total_sessions')), 'average_presence' => $averagePresence, 'average_presence_by_maktab' => $averagePresenceByMaktab, 'mode' => 'maktab', 'total_type3_teacher_presence'=> $type3SessionsByMaktab ]; // اشتراکگذاری دادهها با view view()->share('send', $send); // تولید PDF کلی $pdf = \niklasravnsborg\LaravelPdf\Facades\Pdf::loadView('reportattend', $send); $file_name = md5(time() . 'download') . '.pdf'; if (!\Illuminate\Support\Facades\File::exists(public_path('storage/pdf'))) { \Illuminate\Support\Facades\File::makeDirectory(public_path('storage/pdf')); } $pdf->save(public_path('storage/pdf/' . $file_name)); // تولید PDFهای جداگانه برای هر مکتب و مربی $individualFiles = []; foreach ($studentsGroupedByMaktabName as $maktabName => $students) { if (count($students) == 0) continue; $customData = $send; $customData['students'] = $students->values(); $customData['maktab_stats'] = [$maktabName => $maktabStats[$maktabName] ?? 0]; $customData['session_counts'] = collect($students->pluck('total_sessions', 'maktab_id')); $customData['session_count'] = $customData['session_counts']->sum(); $customData['average_presence'] = $averagePresenceByMaktab[$maktabName] ?? 0; $customData['average_presence_by_maktab'] = [$maktabName => $averagePresenceByMaktab[$maktabName] ?? 0]; view()->share('send', $customData); $pdf = \niklasravnsborg\LaravelPdf\Facades\Pdf::loadView('reportattend', $customData); $filename = md5($maktabName . time()) . '.pdf'; $pdf->save(public_path('storage/pdf/' . $filename)); $individualFiles[$maktabName] = url('storage/pdf/' . $filename); } // تبدیل آرایه PDFها به فرمت نهایی برای خروجی JSON $individualFilesArray = []; foreach ($individualFiles as $maktabName => $link) { $individualFilesArray[] = [ 'school_name' => $maktabName, 'pdf_link' => $link ]; } // پیدا کردن مربیانی که گزارش حضورشان ثبت نشده است $allTeachers = User::query() ->whereIn('id', Attendance::pluck('employee_id')->unique()) ->when(!empty($teacherIds), function($q) use ($teacherIds) { return $q->whereIn('id', $teacherIds); }) ->when(!empty($maktabId), function($q) use ($maktabId) { return $q->where('maktab_id', $maktabId); }) ->get(); $reportedTeacherIds = collect($studentsData)->pluck('employee_id')->map(function($id) { return (int)$id; })->unique(); $missingTeacherIds = $allTeachers->pluck('id')->map(function($id) { return (int)$id; })->diff($reportedTeacherIds); $missingTeachers = User::whereIn('id', $missingTeacherIds)->pluck('name')->toArray(); // بازگشت نتیجه نهایی به صورت JSON شامل لینک PDFها و هشدارها return response()->json([ 'all' => url('storage/pdf/' . $file_name), 'individuals' => $individualFilesArray, 'warnings' => $missingTeachers, ]); } public function reportattendance(Request $request) { $schools = $request->input('schools', []); $teachers = $request->input('teachers', []); if (!empty($teachers)) { $request->merge([ 'schools' => $schools, 'teachers' => $teachers, ]); return $this->reportattendanceByTeacher($request); } $request->merge([ 'schools' => $schools, ]); return $this->reportattendanceByMaktab($request); } }
Copyright ©2k19 -
Hexid
|
Tex7ure