presence/ui/PresenceConsole.cs
2024-11-15 11:04:29 +03:00

246 lines
12 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using data.RemoteData.RemoteDataBase;
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;
private readonly RemoteDatabaseContext _remoteDatabaseContext;
public PresenceConsole(UseCaseGeneratePresence presenceUseCase,IPresenceRepository presenceRepository)
{
_presenceUseCase = presenceUseCase;
_presenceRepository = presenceRepository;
_remoteDatabaseContext = new RemoteDatabaseContext();
}
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)
{
// Проверка существования группы
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;
}
// Теперь, когда группа и пользователь найдены, вызываем метод для отметки отсутствия
_presenceUseCase.MarkUserAsAbsent(userGuid, groupId, firstLesson, lastLesson, date);
Console.WriteLine("Пользователь отмечен как отсутствующий.");
}
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}");
}
}
}
}
}