using System; using data.Domain.UseCase; using data.Exceptions; using data.domain.Models; using data.Domain.UseCase; using System.Collections.Generic; using data.RemoteData.RemoteDataBase.DAO; namespace ui { public class PresenceConsoleUI { private readonly UseCaseGeneratePresence _presenceUseCase; public PresenceConsoleUI(UseCaseGeneratePresence presenceUseCase) { _presenceUseCase = presenceUseCase; } public void ExportAttendanceToExcel() { try { _presenceUseCase.ExportAttendanceToExcel(); Console.WriteLine("Данные посещаемости успешно экспортированы в Excel."); } catch (Exception ex) { Console.WriteLine($"Ошибка при экспорте посещаемости: {ex.Message}"); } } // Метод для генерации посещаемости на день public void GeneratePresenceForDay(DateTime date, int groupId, int firstLesson, int lastLesson) { try { _presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId); 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.GetPresenceByDateAndGroup(date, groupId); if (presences == null || presences.Count == 0) { Console.WriteLine("Посещаемость на выбранную дату отсутствует."); return; } // Сортируем присутствия по номеру занятия и ID пользователя var sortedPresences = presences.OrderBy(p => p.LessonNumber) .ThenBy(p => p.UserId); Console.WriteLine($"\nПосещаемость на {date.ToShortDateString()} для группы с ID {groupId}:"); Console.WriteLine("---------------------------------------------"); int previousLessonNumber = -1; // Инициализация для сравнения foreach (var presence in sortedPresences) { if (previousLessonNumber != presence.LessonNumber) { Console.WriteLine("---------------------------------------------"); previousLessonNumber = presence.LessonNumber; } string status = presence.IsAttedance ? "Присутствует" : "Отсутствует"; Console.WriteLine($"Пользователь ID: {presence.UserId}, Занятие {presence.LessonNumber}: {status}"); } Console.WriteLine("---------------------------------------------"); } catch (Exception ex) { Console.WriteLine($"Ошибка при выводе посещаемости: {ex.Message}"); } } public void MarkUserAbsent(DateTime date, int groupId, int userId, int firstLesson, int lastLesson) { bool check = _presenceUseCase.MarkUserAbsentForLessons(userId, groupId, firstLesson, lastLesson, date); if (check) { Console.WriteLine("Пользователь отмечен как осутсвующий"); } else { Console.WriteLine($"Посещаемость для пользователя ID: {userId} на дату {date.ToShortDateString()}" + $" с {firstLesson} по {lastLesson} уроки не найдена."); } } public void DisplayGeneralPresence(int groupId) { var statistics = _presenceUseCase.GetGeneralPresence(groupId); Console.WriteLine($"Человек в группе: {statistics.UserCount}, " + $"Количество проведённых занятий: {statistics.TotalLessons}, " + $"Общий процент посещаемости группы: {statistics.AttendancePercentage}%"); foreach (var user in statistics.UserAttendanceDetails) { Console.ForegroundColor = user.AttendanceRate < 40 ? ConsoleColor.Red : ConsoleColor.White; Console.WriteLine($"ID Пользователя: {user.UserId}, Посетил: {user.Attended}, " + $"Пропустил: {user.Missed}, Процент посещаемости: {user.AttendanceRate}%"); } Console.ForegroundColor = ConsoleColor.White; } public void DisplayAllPresenceByGroup(int groupId) { try { // Получаем все посещения для группы var presences = _presenceUseCase.GetAllPresenceByGroup(groupId); if (presences == null || presences.Count == 0) { Console.WriteLine($"Посещаемость для группы с ID {groupId} отсутствует."); return; } // Группируем по дате var groupedPresences = presences.GroupBy(p => p.Date); foreach (var group in groupedPresences) { Console.WriteLine("==================================================="); Console.WriteLine($"Дата: {group.Key.ToString("dd.MM.yyyy")}"); Console.WriteLine("==================================================="); // Группируем по занятию var groupedByLesson = group.GroupBy(p => p.LessonNumber); foreach (var lessonGroup in groupedByLesson) { Console.WriteLine($"Занятие {lessonGroup.Key}:"); // Создаем HashSet для уникальных пользователей var userIds = new HashSet(); foreach (var presence in lessonGroup) { // Проверяем, добавляется ли пользователь в HashSet if (userIds.Add(presence.UserId)) { string status = presence.IsAttedance ? "Присутствует" : "Отсутствует"; Console.WriteLine($"Пользователь ID: {presence.UserId}, Статус: {status}"); } } Console.WriteLine("---------------------------------------------------"); } } } catch (Exception ex) { Console.WriteLine($"Ошибка при выводе посещаемости: {ex.Message}"); } } } }