presence/ui/PresenceConsole.cs
2024-11-13 12:00:26 +03:00

209 lines
9.0 KiB
C#
Raw 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.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.GeneratePresenceForDay(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.GeneratePresenceForWeek(firstLesson, lastLesson, groupId, date);
Console.WriteLine("Посещаемость на неделю успешно сгенерирована.");
}
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}");
}
}
}
}