presence/ui/PresenceConsole.cs

246 lines
12 KiB
C#
Raw Permalink Normal View History

2024-11-15 08:04:29 +00:00
using data.RemoteData.RemoteDataBase;
using data.Repository;
2024-11-11 09:07:11 +00:00
using domain.Models;
using domain.UseCase;
using System;
using System.Collections.Generic;
namespace ui
{
2024-11-14 11:46:38 +00:00
namespace ui
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
public class PresenceConsole
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
private readonly UseCaseGeneratePresence _presenceUseCase;
private readonly IPresenceRepository _presenceRepository;
2024-11-15 08:04:29 +00:00
private readonly RemoteDatabaseContext _remoteDatabaseContext;
2024-11-11 09:07:11 +00:00
2024-11-15 07:44:04 +00:00
public PresenceConsole(UseCaseGeneratePresence presenceUseCase,IPresenceRepository presenceRepository)
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
_presenceUseCase = presenceUseCase;
2024-11-15 07:44:04 +00:00
_presenceRepository = presenceRepository;
2024-11-15 08:04:29 +00:00
_remoteDatabaseContext = new RemoteDatabaseContext();
2024-11-11 09:07:11 +00:00
}
2024-11-14 11:46:38 +00:00
public void GeneratePresenceForDay(DateTime date, int groupId, int firstLesson, int lastLesson)
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
try
{
// Попытка сгенерировать посещаемость
_presenceUseCase.GeneratePresenceForDay(firstLesson, lastLesson, groupId, date);
Console.WriteLine("Посещаемость на день сгенерирована.");
2024-11-11 09:07:11 +00:00
2024-11-14 11:46:38 +00:00
}
catch (ArgumentException ex)
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
// Обработка ошибки, если группа не существует
Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
2024-11-11 09:07:11 +00:00
}
2024-11-14 11:46:38 +00:00
catch (Exception ex)
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
// Обработка других ошибок
Console.WriteLine($"Неизвестная ошибка при генерации посещаемости: {ex.Message}");
2024-11-11 09:07:11 +00:00
}
}
2024-11-14 11:46:38 +00:00
public void GeneratePresenceForWeek(DateTime date, int groupId, int firstLesson, int lastLesson)
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
try
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
_presenceUseCase.GeneratePresenceForWeek(firstLesson, lastLesson, groupId, date);
Console.WriteLine("Посещаемость на неделю успешно сгенерирована.");
2024-11-11 09:07:11 +00:00
}
2024-11-14 11:46:38 +00:00
catch (ArgumentException ex)
{
Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Неизвестная ошибка при генерации посещаемости: {ex.Message}");
}
}
2024-11-11 09:07:11 +00:00
2024-11-14 11:46:38 +00:00
// Метод для отображения посещаемости на конкретную дату и группу
public void DisplayPresence(DateTime date, int groupId)
{
try
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
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("-----------------------------------------------------");
2024-11-11 09:07:11 +00:00
// Сохраняем номер занятия для сравнения
int previousLessonNumber = -1;
2024-11-14 11:46:38 +00:00
foreach (var presence in presences)
2024-11-11 09:07:11 +00:00
{
// Проверяем, изменился ли номер занятия
if (previousLessonNumber != presence.LessonNumber)
{
2024-11-14 11:46:38 +00:00
Console.WriteLine("-----------------------------------------------------");
Console.WriteLine($" Занятие: {presence.LessonNumber} ");
Console.WriteLine("-----------------------------------------------------");
2024-11-11 09:07:11 +00:00
previousLessonNumber = presence.LessonNumber;
}
// Форматируем статус присутствия
2024-11-14 11:46:38 +00:00
string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
2024-11-11 09:07:11 +00:00
Console.WriteLine($"Пользователь (ID: {presence.UserGuid}) - Статус: {status}");
}
2024-11-14 11:46:38 +00:00
Console.WriteLine("-----------------------------------------------------");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка при отображении посещаемости: {ex.Message}");
2024-11-11 09:07:11 +00:00
}
}
2024-11-14 11:46:38 +00:00
public void MarkUserAsAbsent(DateTime date, int groupId, Guid userGuid, int firstLesson, int lastLesson)
2024-11-11 09:07:11 +00:00
{
2024-11-15 08:04:29 +00:00
// Проверка существования группы
var groupExists = _remoteDatabaseContext.Groups.Any(g => g.Id == groupId);
if (!groupExists)
{
Console.WriteLine("Ошибка: группа с таким ID не существует.");
return;
}
// Проверка существования пользователя
var userExists = _remoteDatabaseContext.Users.Any(u => u.Guid == userGuid);
if (!userExists)
{
Console.WriteLine("Ошибка: пользователь с таким GUID не существует.");
return;
}
// Теперь, когда группа и пользователь найдены, вызываем метод для отметки отсутствия
2024-11-14 11:46:38 +00:00
_presenceUseCase.MarkUserAsAbsent(userGuid, groupId, firstLesson, lastLesson, date);
2024-11-15 08:04:29 +00:00
Console.WriteLine("Пользователь отмечен как отсутствующий.");
2024-11-11 09:07:11 +00:00
}
2024-11-14 11:46:38 +00:00
public void DisplayAllPresenceByGroup(int groupId)
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
try
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
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;
2024-11-11 09:07:11 +00:00
2024-11-14 11:46:38 +00:00
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}");
}
2024-11-11 09:07:11 +00:00
}
2024-11-14 11:46:38 +00:00
public void DisplayGeneralPresenceForGroup(int groupId)
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
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();
}
2024-11-11 09:07:11 +00:00
}
2024-11-14 11:46:38 +00:00
public void ExportAttendanceToExcel()
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
try
{
_presenceUseCase.ExportAttendanceToExcel();
Console.WriteLine("Данные посещаемости успешно экспортированы в Excel.");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка при экспорте посещаемости: {ex.Message}");
}
2024-11-11 09:07:11 +00:00
}
2024-11-14 11:46:38 +00:00
public void UpdateUserAttendance(Guid userGuid, int groupId, int firstLesson, int lastLesson, DateOnly date, bool isAttendance)
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
try
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
bool result = _presenceRepository.UpdateAttention(userGuid, groupId, firstLesson, lastLesson, date, isAttendance);
if (result)
{
Console.WriteLine($"Статус посещаемости для пользователя {userGuid} обновлён.");
}
else
{
Console.WriteLine($"Данные о посещаемости для пользователя ID: {userGuid} не найдены.");
}
2024-11-11 09:07:11 +00:00
}
2024-11-14 11:46:38 +00:00
catch (Exception ex)
2024-11-11 09:07:11 +00:00
{
2024-11-14 11:46:38 +00:00
Console.WriteLine($"Ошибка при обновлении посещаемости: {ex.Message}");
2024-11-11 09:07:11 +00:00
}
}
2024-11-14 11:46:38 +00:00
}
2024-11-11 09:07:11 +00:00
}
}