225 lines
10 KiB
C#
225 lines
10 KiB
C#
using data.Repository;
|
||
using domain.Models;
|
||
using domain.UseCase;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
|
||
namespace ui
|
||
{
|
||
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.GeneratePresenceForDay(firstLesson, lastLesson, groupId, date);
|
||
Console.WriteLine("Посещаемость на день сгенерирована.");
|
||
|
||
}
|
||
catch (ArgumentException ex)
|
||
{
|
||
// Обработка ошибки, если группа не существует
|
||
Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
// Обработка других ошибок
|
||
Console.WriteLine($"Неизвестная ошибка при генерации посещаемости: {ex.Message}");
|
||
}
|
||
}
|
||
|
||
|
||
public void GeneratePresenceForWeek(DateTime date, int groupId, int firstLesson, int lastLesson)
|
||
{
|
||
try
|
||
{
|
||
_presenceUseCase.GeneratePresenceForWeek(firstLesson, lastLesson, groupId, date);
|
||
Console.WriteLine("Посещаемость на неделю успешно сгенерирована.");
|
||
}
|
||
catch (ArgumentException ex)
|
||
{
|
||
Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine($"Неизвестная ошибка при генерации посещаемости: {ex.Message}");
|
||
}
|
||
}
|
||
|
||
// Метод для отображения посещаемости на конкретную дату и группу
|
||
public void DisplayPresence(DateTime date, int groupId)
|
||
{
|
||
try
|
||
{
|
||
List<PresenceLocalEntity> 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.UpdateAttention(userGuid, groupId, firstLesson, lastLesson, date, isAttendance);
|
||
|
||
if (result)
|
||
{
|
||
Console.WriteLine($"Статус посещаемости для пользователя {userGuid} обновлён.");
|
||
}
|
||
else
|
||
{
|
||
Console.WriteLine($"Данные о посещаемости для пользователя ID: {userGuid} не найдены.");
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine($"Ошибка при обновлении посещаемости: {ex.Message}");
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|