*/ public static function listTeachDates(Course $course): array { if (! $course->teach_start_date || ! $course->teach_end_date) { return []; } $start = $course->teach_start_date->copy()->startOfDay(); $end = $course->teach_end_date->copy()->startOfDay(); if ($start->gt($end)) { return []; } $items = []; $seq = 0; foreach (CarbonPeriod::create($start, $end) as $day) { /** @var Carbon $day */ $seq++; $items[] = [ 'id' => $seq, 'course_id' => $course->id, 'teach_date' => $day->toDateString(), ]; } return $items; } public static function isTeachDate(Course $course, string $dateYmd): bool { foreach (self::listTeachDates($course) as $item) { if ($item['teach_date'] === $dateYmd) { return true; } } return false; } public static function syncForCourse(Course $course): void { if (! $course->teach_start_date || ! $course->teach_end_date) { CourseCheckinDay::query()->where('course_id', $course->id)->delete(); return; } $start = $course->teach_start_date->copy()->startOfDay(); $end = $course->teach_end_date->copy()->startOfDay(); if ($start->gt($end)) { CourseCheckinDay::query()->where('course_id', $course->id)->delete(); return; } $period = CarbonPeriod::create($start, $end); $keepDates = []; foreach ($period as $day) { /** @var Carbon $day */ $dateStr = $day->toDateString(); $keepDates[] = $dateStr; CourseCheckinDay::query()->updateOrCreate( [ 'course_id' => $course->id, 'teach_date' => $dateStr, ], ['signin_code' => $course->id.'-'.$dateStr] ); } CourseCheckinDay::query() ->where('course_id', $course->id) ->whereNotIn('teach_date', $keepDates) ->delete(); } public static function courseSigninCode(Course $course): string { if ($course->code) { $base = preg_replace('/[^A-Za-z0-9_-]/', '', $course->code) ?: ('C'.$course->id); return strtoupper($base); } if ($course->code_prefix) { $base = preg_replace('/[^A-Za-z0-9_-]/', '', $course->code_prefix) ?: ('C'.$course->id); return strtoupper($base); } return 'COURSE-'.str_pad((string) $course->id, 3, '0', STR_PAD_LEFT); } public static function ensureCourseCode(Course $course): void { if ($course->code) { return; } $prefix = $course->code_prefix ? preg_replace('/[^A-Za-z0-9_-]/', '', $course->code_prefix) : ''; $course->code = $prefix ? 'COURSE-'.strtoupper($prefix).'-'.str_pad((string) $course->id, 3, '0', STR_PAD_LEFT) : 'COURSE-'.str_pad((string) $course->id, 3, '0', STR_PAD_LEFT); $course->save(); } }