using data.Repository; using domain.Models; using domain.UseCase; using System; using System.Collections.Generic; namespace ui { public class PresenceConsole { private readonly UseCaseGeneratePresence _presenceUseCase; private readonly IPresenceRepository _presenceRepository; public PresenceConsole(UseCaseGeneratePresence presenceUseCase, IPresenceRepository presenceRepository) { _presenceUseCase = presenceUseCase; _presenceRepository = presenceRepository; } // Метод для генерации посещаемости на день public void GeneratePresenceForDay(DateTime date, int groupId, int firstLesson, int lastLesson) { try { _presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId, date); Console.WriteLine("Посещаемость на день успешно сгенерирована."); } catch (Exception ex) { Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}"); } } // Метод для генерации посещаемости на неделю public void GeneratePresenceForWeek(DateTime date, int groupId, int firstLesson, int lastLesson) { try { _presenceUseCase.GenerateWeeklyPresence(firstLesson, lastLesson, groupId, date); Console.WriteLine("Посещаемость на неделю успешно сгенерирована."); } catch (Exception ex) { Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}"); } } // Метод для отображения посещаемости на конкретную дату и группу public void DisplayPresence(DateTime date, int groupId) { try { List presences = _presenceUseCase.GetPresenceByGroupAndDate(groupId, date); if (presences == null || presences.Count == 0) { Console.WriteLine("Нет данных о посещаемости на выбранную дату."); return; } Console.WriteLine($"\n Посещаемость на {date:dd.MM.yyyy} "); Console.WriteLine("-----------------------------------------------------"); // Сохраняем номер занятия для сравнения int previousLessonNumber = -1; foreach (var presence in presences) { // Проверяем, изменился ли номер занятия if (previousLessonNumber != presence.LessonNumber) { Console.WriteLine("-----------------------------------------------------"); Console.WriteLine($" Занятие: {presence.LessonNumber} "); Console.WriteLine("-----------------------------------------------------"); previousLessonNumber = presence.LessonNumber; } // Форматируем статус присутствия string status = presence.IsAttedance ? "Присутствует" : "Отсутствует"; Console.WriteLine($"Пользователь (ID: {presence.UserGuid}) - Статус: {status}"); } Console.WriteLine("-----------------------------------------------------"); } catch (Exception ex) { Console.WriteLine($"Ошибка при отображении посещаемости: {ex.Message}"); } } public void MarkUserAsAbsent(DateTime date, int groupId, Guid userGuid, int firstLesson, int lastLesson) { _presenceUseCase.MarkUserAsAbsent(userGuid, groupId, firstLesson, lastLesson, date); } public void DisplayAllPresenceByGroup(int groupId) { try { var presences = _presenceUseCase.GetAllPresenceByGroup(groupId); if (presences == null || !presences.Any()) { Console.WriteLine($"Нет данных о посещаемости для группы с ID: {groupId}."); return; } // Группируем записи посещаемости по дате var groupedPresences = presences.GroupBy(p => p.Date); foreach (var group in groupedPresences) { Console.WriteLine("==================================================="); Console.WriteLine($" Дата: {group.Key:dd.MM.yyyy} "); Console.WriteLine("==================================================="); // Сохраняем номер занятия для сравнения int previousLessonNumber = -1; foreach (var presence in group) { // Проверяем, изменился ли номер занятия if (previousLessonNumber != presence.LessonNumber) { Console.WriteLine("---------------------------------------------------"); Console.WriteLine($" Занятие: {presence.LessonNumber} "); Console.WriteLine("---------------------------------------------------"); previousLessonNumber = presence.LessonNumber; } // Форматируем статус присутствия string status = presence.IsAttedance ? "✅ Присутствует" : "❌ Отсутствует"; Console.WriteLine($"Пользователь (ID: {presence.UserGuid}) - Статус: {status}"); } Console.WriteLine("---------------------------------------------------"); } } catch (Exception ex) { Console.WriteLine($"Ошибка при отображении посещаемости: {ex.Message}"); } } public void DisplayGeneralPresenceForGroup(int groupId) { var summary = _presenceRepository.GetGeneralPresenceForGroup(groupId); Console.WriteLine($"Человек в группе: {summary.UserCount}, " + $"Количество проведённых занятий: {summary.LessonCount}, " + $"Общий процент посещаемости группы: {summary.TotalAttendancePercentage}%"); foreach (var user in summary.UserAttendances) { if (user.AttendanceRate < 40) { Console.ForegroundColor = ConsoleColor.Red; } Console.WriteLine($"GUID Пользователя: {user.UserGuid}, " + $"Посетил: {user.Attended}, " + $"Пропустил: {user.Missed}, " + $"Процент посещаемости: {user.AttendanceRate}%"); Console.ResetColor(); } } public void ExportAttendanceToExcel() { try { _presenceUseCase.ExportAttendanceToExcel(); Console.WriteLine("Данные посещаемости успешно экспортированы в Excel."); } catch (Exception ex) { Console.WriteLine($"Ошибка при экспорте посещаемости: {ex.Message}"); } } public void UpdateUserAttendance(Guid userGuid, int groupId, int firstLesson, int lastLesson, DateOnly date, bool isAttendance) { try { bool result = _presenceRepository.UpdateAtt(userGuid, groupId, firstLesson, lastLesson, date, isAttendance); if (result) { Console.WriteLine($"Статус посещаемости для пользователя {userGuid} обновлён."); } else { Console.WriteLine($"Данные о посещаемости для пользователя ID: {userGuid} не найдены."); } } catch (Exception ex) { Console.WriteLine($"Ошибка при обновлении посещаемости: {ex.Message}"); } } } }