This commit is contained in:
atabidze105 2024-10-24 11:50:32 +03:00
parent aa3336ca1b
commit ad36f40a57
56 changed files with 1030 additions and 898 deletions

View File

@ -0,0 +1,9 @@
using System;
namespace AttendanceApp.Data.Exceptions
{
public class GroupNotFoundException : Exception
{
public GroupNotFoundException(string message) : base(message) { }
}
}

View File

@ -0,0 +1,9 @@
using System;
namespace AttendanceApp.Data.Exceptions
{
public class RepositoryException : Exception
{
public RepositoryException(string message) : base(message) { }
}
}

View File

@ -0,0 +1,9 @@
using System;
namespace AttendanceApp.Data.Exceptions
{
public class UserNotFoundException : Exception
{
public UserNotFoundException(string message) : base(message) { }
}
}

View File

@ -1,10 +0,0 @@

namespace Demo.Domain.Models
{
public class ClassGroup
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty; // Название группы
public List<User>? Users { get; internal set; }
}
}

View File

@ -1,20 +0,0 @@
using System;
namespace Demo.Data.LocalData.Entity
{
public class DailyAttendance
{
public Guid UserId { get; set; }
public bool[] Attendance { get; set; }
public DailyAttendance(Guid userId, int days)
{
UserId = userId;
Attendance = new bool[days];
for (int i = 0; i < days; i++)
{
Attendance[i] = true; // По умолчанию все присутствуют
}
}
}
}

View File

@ -1,10 +0,0 @@
using System;
namespace Demo.Data.LocalData.Entity
{
public class Group
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty; // По умолчанию пустая строка
}
}

View File

@ -1,12 +0,0 @@
using Demo.Domain.Models;
namespace Demo.Data.LocalData.Entity
{
public class LocalUser
{
public Guid Id { get; set; } // Это будет уникальный идентификатор
public string FIO { get; set; } = string.Empty;
public int GroupID { get; set; }
public ClassGroup ClassGroup { get; set; } = new ClassGroup();
}
}

View File

@ -1,25 +0,0 @@
using System;
namespace Demo.Domain.Models
{
public class StudentAttendance
{
public Guid UserId { get; set; }
public bool[] Attendance { get; set; }
public StudentAttendance(Guid userId, int lessonsCount)
{
UserId = userId;
Attendance = new bool[lessonsCount];
for (int i = 0; i < lessonsCount; i++)
{
Attendance[i] = true; // По умолчанию все присутствуют
}
}
// Добавьте здесь новые свойства, если хотите хранить дополнительные данные
public int LessonId { get; set; } // Идентификатор урока
public bool IsPresent { get; set; } // Статус присутствия
public DateTime AttendanceDate { get; set; } // Дата посещаемости
}
}

View File

@ -0,0 +1,8 @@
namespace AttendanceApp.Data.LocalData
{
public class LocalGroup
{
public int Id { get; set; }
public string Name { get; set; }
}
}

View File

@ -0,0 +1,12 @@
using System;
namespace AttendanceApp.Data.LocalData
{
public class LocalPresence
{
public DateTime ClassDate { get; set; }
public int ClassNumber { get; set; }
public bool IsPresent { get; set; }
public Guid UserId { get; set; }
}
}

View File

@ -1,57 +0,0 @@
using Demo.Data.LocalData.Entity;
using System;
using System.Collections.Generic;
using Demo.Domain.Models;
namespace Demo.Data.LocalData
{
public static class LocalStaticData
{
public static List<LocalUser> Users { get; } = new List<LocalUser>
{
new LocalUser { Id = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), FIO = "Иванов Иван Иванович", GroupID = 1 },
new LocalUser { Id = Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), FIO = "Петров Петр Петрович", GroupID = 2 },
new LocalUser { Id = Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), FIO = "Мендалиев Наиль", GroupID = 3 },
new LocalUser { Id = Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), FIO = "Сидоров Сидор Сидорович", GroupID = 1 },
new LocalUser { Id = Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), FIO = "Кузнецов Алексей Викторович", GroupID = 2 },
new LocalUser { Id = Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), FIO = "Смирнова Анна Сергеевна", GroupID = 3 }
};
public static List<string> Groups { get; } = new List<string>
{
"ИП1-22",
"ИП1-23",
"С1-23"
};
// Список посещаемостей
public static List<Presence> Presences { get; } = new List<Presence>();
public static void InitializePresences()
{
// Инициализация списка посещаемости для текущей недели
foreach (var user in Users)
{
var lessons = new List<bool>(new bool[3]); // Предположим, что у нас 3 занятия
Presences.Add(new Presence(user.Id, DateTime.Today, user.GroupID, lessons));
}
}
}
// Класс для хранения посещаемости
public class Presence
{
public Guid UserID { get; set; }
public DateTime Date { get; set; }
public int GroupID { get; set; }
public List<bool> Lessons { get; set; } // true - присутствует, false - отсутствует
public Presence(Guid userId, DateTime date, int groupId, List<bool> lessons)
{
UserID = userId;
Date = date;
GroupID = groupId;
Lessons = lessons;
}
}
}

View File

@ -0,0 +1,11 @@
using System;
namespace AttendanceApp.Data.LocalData
{
public class LocalUser
{
public Guid Id { get; set; }
public string FIO { get; set; }
public int GroupID { get; set; }
}
}

View File

@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
namespace Demo.Domain.Models
{
public class WeeklyAttendance
{
public Guid UserId { get; set; }
public int GroupID { get; set; }
public DateTime Date { get; set; }
public List<bool> Lessons { get; set; }
public WeeklyAttendance(Guid userId, int groupId)
{
UserId = userId;
GroupID = groupId;
Date = DateTime.Now; // или передайте дату в качестве параметра
Lessons = new List<bool>();
}
}
}

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using AttendanceApp.Data.LocalData;
namespace AttendanceApp.Data
{
public static class LocalStaticData
{
public static List<LocalUser> Users { get; set; } = new List<LocalUser>
{
new LocalUser { Id = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), FIO = "Иванов Иван Иванович", GroupID = 1 },
new LocalUser { Id = Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), FIO = "Петров Петр Петрович", GroupID = 2 },
new LocalUser { Id = Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), FIO = "Мендалиев Наиль", GroupID = 3 },
new LocalUser { Id = Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), FIO = "Сидоров Сидор Сидорович", GroupID = 1 },
new LocalUser { Id = Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), FIO = "Кузнецов Алексей Викторович", GroupID = 2 },
new LocalUser { Id = Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), FIO = "Смирнова Анна Сергеевна", GroupID = 3 }
};
public static List<LocalGroup> Groups { get; set; } = new List<LocalGroup>
{
new LocalGroup { Id = 1, Name = "ИП1-22" },
new LocalGroup { Id = 2, Name = "ИП1-23" },
new LocalGroup { Id = 3, Name = "С1-23" }
};
public static List<LocalPresence> Presences { get; set; } = new List<LocalPresence>();
}
}

View File

@ -1,37 +1,60 @@
using Demo.Data.LocalData.Entity;
using Demo.Domain.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using AttendanceApp.Data.Exceptions;
using AttendanceApp.Data.LocalData;
using AttendanceApp.Domain.Models;
namespace Demo.Data.Repository
namespace AttendanceApp.Data.Repository
{
public class GroupRepositoryImpl
public class GroupRepositoryImpl : IGroupRepository
{
private List<ClassGroup> groups;
private readonly List<LocalGroup> _groups = LocalStaticData.Groups;
public GroupRepositoryImpl()
public IEnumerable<Group> GetAllGroups()
{
groups = new List<ClassGroup>();
return _groups.Select(g => new Group
{
Id = g.Id,
Name = g.Name
});
}
public List<ClassGroup> GetAllGroups()
public Group GetGroupById(int id)
{
return groups;
var localGroup = _groups.FirstOrDefault(g => g.Id == id);
if (localGroup == null)
throw new GroupNotFoundException($"Группа с ID {id} не найдена.");
return new Group
{
Id = localGroup.Id,
Name = localGroup.Name
};
}
public void AddGroup(ClassGroup group)
public void AddGroup(Group group)
{
if (group == null) throw new ArgumentNullException(nameof(group));
groups.Add(group);
_groups.Add(new LocalGroup
{
Id = group.Id,
Name = group.Name
});
}
// Метод для получения пользователей по ID группы
public List<User> GetUsersByGroup(int groupId)
public void UpdateGroup(Group group)
{
// Предполагаем, что ClassGroup имеет свойство Users, содержащее список пользователей
var group = groups.FirstOrDefault(g => g.Id == groupId);
return group?.Users ?? new List<User>(); // Возвращаем пользователей или пустой список, если группа не найдена
var localGroup = _groups.FirstOrDefault(g => g.Id == group.Id);
if (localGroup == null)
throw new GroupNotFoundException($"Группа с ID {group.Id} не найдена.");
localGroup.Name = group.Name;
}
public void DeleteGroup(int id)
{
var group = _groups.FirstOrDefault(g => g.Id == id);
if (group == null)
throw new GroupNotFoundException($"Группа с ID {id} не найдена.");
_groups.Remove(group);
}
}
}
}

View File

@ -0,0 +1,14 @@
using System.Collections.Generic;
using AttendanceApp.Domain.Models;
namespace AttendanceApp.Data.Repository
{
public interface IGroupRepository
{
IEnumerable<Group> GetAllGroups();
Group GetGroupById(int id);
void AddGroup(Group group);
void UpdateGroup(Group group);
void DeleteGroup(int id);
}
}

View File

@ -1,18 +1,13 @@
using System;
using System.Collections.Generic;
using Demo.Domain.Models;
using AttendanceApp.Domain.Models;
namespace Demo.Data.Repository
namespace AttendanceApp.Data.Repository
{
public interface IPresenceRepository
{
List<User> GetUsersByGroup(int groupNumber);
void SavePresence(List<LessonPresence> presenceList);
List<LessonPresence> GetPresenceByGroup(int groupNumber);
List<LessonPresence> GetPresenceByGroupAndDate(int groupNumber, DateTime date);
void MarkUserAbsent(Guid userId, int groupNumber, int lessonIndex, DateTime date);
// Добавляем метод для обновления записи о посещаемости
void UpdatePresence(LessonPresence presence); // Обновление присутствия
IEnumerable<Presence> GetPresenceByGroupAndDate(int groupId, DateTime date);
IEnumerable<Presence> GetPresenceByGroup(int groupId);
void AddPresence(Presence presence);
void UpdatePresence(Presence presence);
// Дополнительные методы по необходимости
}
}
}

View File

@ -0,0 +1,13 @@
using AttendanceApp.Domain.Models;
namespace AttendanceApp.Data.Repository
{
public interface IUserRepository
{
IEnumerable<User> GetAllUsers();
User GetUserById(Guid id);
void AddUser(User user);
void UpdateUser(User user);
void DeleteUser(Guid id);
}
}

View File

@ -1,22 +0,0 @@
using System;
using System.Collections.Generic;
namespace Demo.Domain.Models
{
public class LessonPresence
{
public Guid UserId { get; set; } // Идентификатор пользователя
public DateTime Date { get; set; } // Дата посещаемости
public int GroupID { get; set; } // ID группы
public List<bool> Lessons { get; set; } // Список посещаемости по занятиям
// Конструктор класса
public LessonPresence(Guid userId, DateTime date, int groupId, List<bool> lessons)
{
UserId = userId;
Date = date;
GroupID = groupId;
Lessons = lessons;
}
}
}

View File

@ -0,0 +1,70 @@
using AttendanceApp.Data.Exceptions;
using AttendanceApp.Data.LocalData;
using AttendanceApp.Domain.Models;
using System.Collections.Generic;
using System.Linq;
namespace AttendanceApp.Data.Repository
{
public class PresenceRepositoryImpl : IPresenceRepository
{
private readonly List<LocalPresence> _presences = LocalStaticData.Presences;
public IEnumerable<Presence> GetPresenceByGroupAndDate(int groupId, DateTime date)
{
var usersInGroup = LocalStaticData.Users.Where(u => u.GroupID == groupId).Select(u => u.Id);
return _presences
.Where(p => usersInGroup.Contains(p.UserId) && p.ClassDate.Date == date.Date)
.Select(p => new Presence
{
ClassDate = p.ClassDate,
ClassNumber = p.ClassNumber,
IsPresent = p.IsPresent,
UserId = p.UserId
});
}
public IEnumerable<Presence> GetPresenceByGroup(int groupId)
{
var usersInGroup = LocalStaticData.Users
.Where(u => u.GroupID == groupId)
.Select(u => u.Id);
return _presences
.Where(p => usersInGroup.Contains(p.UserId))
.Select(p => new Presence
{
ClassDate = p.ClassDate,
ClassNumber = p.ClassNumber,
IsPresent = p.IsPresent,
UserId = p.UserId
})
.OrderBy(p => p.ClassDate)
.ThenBy(p => p.ClassNumber);
}
public void AddPresence(Presence presence)
{
_presences.Add(new LocalPresence
{
ClassDate = presence.ClassDate,
ClassNumber = presence.ClassNumber,
IsPresent = presence.IsPresent,
UserId = presence.UserId
});
}
public void UpdatePresence(Presence presence)
{
var localPresence = _presences.FirstOrDefault(p =>
p.UserId == presence.UserId &&
p.ClassDate.Date == presence.ClassDate.Date &&
p.ClassNumber == presence.ClassNumber);
if (localPresence == null)
throw new RepositoryException("Посещаемость не найдена.");
localPresence.IsPresent = presence.IsPresent;
}
}
}

View File

@ -1,52 +0,0 @@
using System;
using System.Collections.Generic;
using Demo.Data.LocalData;
using Demo.Domain.Models;
namespace Demo.Data.Repository
{
public class PresenceRepositoryImpl : IPresenceRepository
{
private readonly List<LessonPresence> _presences = new List<LessonPresence>();
public List<User> GetUsersByGroup(int groupNumber)
{
// Здесь должна быть логика получения пользователей по номеру группы
return new List<User>
{
new User { Id = Guid.NewGuid(), FullName = "Иванов Иван", ClassId = groupNumber },
new User { Id = Guid.NewGuid(), FullName = "Петров Пётр", ClassId = groupNumber },
// Добавьте других пользователей по аналогии
};
}
public void SavePresence(List<LessonPresence> presenceList)
{
_presences.AddRange(presenceList);
}
public List<LessonPresence> GetPresenceByGroup(int groupNumber)
{
return _presences.FindAll(p => p.GroupID == groupNumber);
}
public List<LessonPresence> GetPresenceByGroupAndDate(int groupNumber, DateTime date)
{
return _presences.FindAll(p => p.GroupID == groupNumber && p.Date.Date == date.Date);
}
public void MarkUserAbsent(Guid userId, int groupNumber, int lessonIndex, DateTime date)
{
var presence = _presences.Find(p => p.UserId == userId && p.GroupID == groupNumber && p.Date.Date == date.Date);
if (presence != null && lessonIndex >= 0 && lessonIndex < presence.Lessons.Count)
{
presence.Lessons[lessonIndex] = false; // Отметим занятие как отсутствующее
}
}
public void UpdatePresence(LessonPresence presence)
{
throw new NotImplementedException();
}
}
}

View File

@ -1,38 +1,64 @@
using Demo.Data.LocalData;
using Demo.Data.LocalData.Entity;
using Demo.Domain.Models; // Убедитесь, что эта директива используется только один раз
using System;
using System.Collections.Generic;
using System.Linq;
using AttendanceApp.Data.Exceptions;
using AttendanceApp.Data.LocalData;
using AttendanceApp.Domain.Models;
namespace Demo.Data.Repository
namespace AttendanceApp.Data.Repository
{
public class UserRepositoryImpl
public class UserRepositoryImpl : IUserRepository
{
private List<LocalUser> users;
private readonly List<LocalUser> _users = LocalStaticData.Users;
public UserRepositoryImpl()
public IEnumerable<User> GetAllUsers()
{
users = LocalStaticData.Users; // Инициализируем пользователей из статических данных
return _users.Select(u => new User
{
Id = u.Id,
FIO = u.FIO,
GroupId = u.GroupID
});
}
public List<User> GetAllUsers()
public User GetUserById(Guid id)
{
return users.Select(u => (User)u).ToList();
var localUser = _users.FirstOrDefault(u => u.Id == id);
if (localUser == null)
throw new UserNotFoundException($"Пользователь с ID {id} не найден.");
return new User
{
Id = localUser.Id,
FIO = localUser.FIO,
GroupId = localUser.GroupID
};
}
public User GetUserById(Guid userId) // Изменено на Guid
public void AddUser(User user)
{
var entityUser = users.FirstOrDefault(u => u.Id == userId);
if (entityUser == null) throw new InvalidOperationException("User not found");
return (User)entityUser;
_users.Add(new LocalUser
{
Id = user.Id,
FIO = user.FIO,
GroupID = user.GroupId
});
}
public void AddUser(LocalUser user)
public void UpdateUser(User user)
{
if (user == null) throw new ArgumentNullException(nameof(user));
users.Add(user);
var localUser = _users.FirstOrDefault(u => u.Id == user.Id);
if (localUser == null)
throw new UserNotFoundException($"Пользователь с ID {user.Id} не найден.");
localUser.FIO = user.FIO;
localUser.GroupID = user.GroupId;
}
public void DeleteUser(Guid id)
{
var user = _users.FirstOrDefault(u => u.Id == id);
if (user == null)
throw new UserNotFoundException($"Пользователь с ID {id} не найден.");
_users.Remove(user);
}
}
}
}

View File

@ -1,10 +1,8 @@
using System;
namespace Demo.Domain.Models
namespace AttendanceApp.Domain.Models
{
public class Group
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty; // Переименован на Name
public string Name { get; set; }
}
}
}

View File

@ -1,22 +1,12 @@
using System;
using System.Collections.Generic;
namespace Demo.Domain.Models
namespace AttendanceApp.Domain.Models
{
public class Presence
{
public Guid UserId { get; set; } // Идентификатор пользователя
public DateTime Date { get; set; } // Дата посещаемости
public int GroupID { get; set; } // ID группы
public List<bool> Lessons { get; set; } // Список посещаемости по занятиям
// Конструктор класса
public Presence(Guid userId, DateTime date, int groupId, List<bool> lessons)
{
UserId = userId;
Date = date;
GroupID = groupId;
Lessons = lessons;
}
public DateTime ClassDate { get; set; }
public int ClassNumber { get; set; }
public bool IsPresent { get; set; }
public Guid UserId { get; set; }
}
}
}

View File

@ -1,24 +1,11 @@
using System;
namespace Demo.Domain.Models
namespace AttendanceApp.Domain.Models
{
public class User
{
public Guid Id { get; set; }
public string FullName { get; set; } = string.Empty;
public ClassGroup ClassGroup { get; set; } = new ClassGroup();
public int ClassId { get; set; }
public Guid UserId { get; internal set; }
public static explicit operator User(Data.LocalData.Entity.LocalUser v)
{
return new User
{
Id = Guid.NewGuid(),
FullName = v.FIO,
ClassGroup = v.ClassGroup,
ClassId = v.GroupID
};
}
public string FIO { get; set; }
public int GroupId { get; set; }
}
}
}

View File

@ -1,82 +1,41 @@
using Demo.Data.Repository;
using Demo.Domain.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections.Generic;
using AttendanceApp.Data.Repository;
using AttendanceApp.Domain.Models;
namespace Demo.Domain.UseCases
namespace AttendanceApp.Domain.UseCases
{
public class GroupUseCase
{
private readonly IPresenceRepository _presenceRepository;
private readonly GroupRepositoryImpl _groupRepository; // Измените на GroupRepositoryImpl
private readonly IGroupRepository _groupRepository;
public GroupUseCase(GroupRepositoryImpl groupRepository, IPresenceRepository presenceRepository) // Конструктор
public GroupUseCase(IGroupRepository groupRepository)
{
_groupRepository = groupRepository;
_presenceRepository = presenceRepository;
}
// Метод для генерации посещаемости на текущий день
public List<LessonPresence> GeneratePresence(int firstLessonNumber, int lastLessonNumber, int groupId, DateTime currentDate)
public IEnumerable<Group> GetAllGroups()
{
var users = _groupRepository.GetUsersByGroup(groupId); // Получаем пользователей группы
List<LessonPresence> presenceList = new List<LessonPresence>();
foreach (var user in users)
{
var lessons = new List<bool>(new bool[lastLessonNumber - firstLessonNumber + 1]); // По умолчанию все посещены
var presence = new LessonPresence(user.Id, currentDate, groupId, lessons); // Измените на LessonPresence
presenceList.Add(presence);
}
return presenceList;
return _groupRepository.GetAllGroups();
}
// Метод для генерации посещаемости на неделю
public Dictionary<DateTime, List<LessonPresence>> GenerateWeeklyPresence(int firstLessonNumber, int lastLessonNumber, int groupId, DateTime startDate)
public Group GetGroupById(int id)
{
var weeklyPresence = new Dictionary<DateTime, List<LessonPresence>>();
for (int i = 0; i < 7; i++)
{
var currentDate = startDate.AddDays(i);
var dailyPresence = GeneratePresence(firstLessonNumber, lastLessonNumber, groupId, currentDate);
weeklyPresence[currentDate] = dailyPresence;
}
return weeklyPresence;
return _groupRepository.GetGroupById(id);
}
// Метод для вывода посещаемости по группе
public List<LessonPresence> GetPresenceByGroup(int groupId)
public void AddGroup(Group group)
{
return _presenceRepository.GetPresenceByGroup(groupId);
_groupRepository.AddGroup(group);
}
// Метод для вывода посещаемости по группе по дате
public List<LessonPresence> GetPresenceByGroupAndDate(int groupId, DateTime date)
public void UpdateGroup(Group group)
{
return _presenceRepository.GetPresenceByGroupAndDate(groupId, date);
_groupRepository.UpdateGroup(group);
}
// Метод для отметки пользователя как отсутствующего
public void MarkUserAbsent(Guid userId, int groupId, DateTime date, List<int> lessonNumbers)
public void DeleteGroup(int id)
{
var presenceRecords = _presenceRepository.GetPresenceByGroupAndDate(groupId, date);
var presenceRecord = presenceRecords.FirstOrDefault(p => p.UserId == userId);
if (presenceRecord != null)
{
foreach (var lessonNumber in lessonNumbers)
{
if (lessonNumber >= 0 && lessonNumber < presenceRecord.Lessons.Count)
{
presenceRecord.Lessons[lessonNumber] = false; // Отмечаем как отсутствующего
}
}
_presenceRepository.UpdatePresence(presenceRecord); // Обновляем запись в репозитории
}
_groupRepository.DeleteGroup(id);
}
}
}
}

View File

@ -1,47 +0,0 @@
using System;
using System.Collections.Generic;
using Demo.Data.Repository;
using Demo.Domain.Models;
namespace Demo.Domain.UseCases
{
public class PresenceUseCase
{
private readonly IPresenceRepository _presenceRepository;
public PresenceUseCase(IPresenceRepository presenceRepository) // Конструктор
{
_presenceRepository = presenceRepository;
}
public void GeneratePresence(int groupNumber, DateTime date)
{
var users = _presenceRepository.GetUsersByGroup(groupNumber);
var presenceList = new List<LessonPresence>();
foreach (var user in users)
{
// Создаем список посещаемости, по умолчанию все отмечены как присутствующие
var lessons = new List<bool> { true, true, true }; // Пример, 3 занятия
presenceList.Add(new LessonPresence(user.UserId, date, groupNumber, lessons));
}
_presenceRepository.SavePresence(presenceList);
}
public List<LessonPresence> GetPresenceByGroup(int groupNumber)
{
return _presenceRepository.GetPresenceByGroup(groupNumber);
}
public List<LessonPresence> GetPresenceByGroupAndDate(int groupNumber, DateTime date)
{
return _presenceRepository.GetPresenceByGroupAndDate(groupNumber, date);
}
public void MarkUserAbsent(Guid userId, int groupNumber, int lessonId, DateTime date)
{
_presenceRepository.MarkUserAbsent(userId, groupNumber, lessonId, date);
}
}
}

View File

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using AttendanceApp.Data.Repository;
using AttendanceApp.Domain.Models;
namespace AttendanceApp.Domain.UseCases
{
public class UseCaseGeneratePresence
{
private readonly IPresenceRepository _presenceRepository;
private readonly IUserRepository _userRepository;
private readonly IGroupRepository _groupRepository;
public UseCaseGeneratePresence(IPresenceRepository presenceRepository, IUserRepository userRepository, IGroupRepository groupRepository)
{
_presenceRepository = presenceRepository;
_userRepository = userRepository;
_groupRepository = groupRepository;
}
public void GenerateDailyPresence(int firstClassNumber, int lastClassNumber, int groupId, DateTime date)
{
var group = _groupRepository.GetGroupById(groupId);
var users = _userRepository.GetAllUsers().Where(u => u.GroupId == groupId);
foreach (var user in users)
{
for (int classNum = firstClassNumber; classNum <= lastClassNumber; classNum++)
{
var presence = new Presence
{
ClassDate = date.Date,
ClassNumber = classNum,
IsPresent = true,
UserId = user.Id
};
_presenceRepository.AddPresence(presence);
}
}
}
public void GenerateWeeklyPresence(int firstClassNumber, int lastClassNumber, int groupId, DateTime startDate)
{
for (int i = 0; i < 7; i++)
{
var currentDate = startDate.AddDays(i);
GenerateDailyPresence(firstClassNumber, lastClassNumber, groupId, currentDate);
}
}
}
}

View File

@ -1,30 +0,0 @@
using Demo.Data.LocalData.Entity;
using Demo.Domain.Models;
using System;
using System.Collections.Generic;
namespace Demo.Domain.UseCase
{
public class UseCasePresence
{
private List<StudentAttendance> _studentAttendances = new(); // Хранилище для посещаемости студентов
// Метод для добавления посещаемости по занятию
public void AddLessonAttendance(LocalUser student, DateTime attendanceDate, int lessonId, bool isPresent)
{
var studentAttendance = new StudentAttendance(student.Id, 1) // Замените на 1, так как это один урок
{
AttendanceDate = attendanceDate,
LessonId = lessonId,
IsPresent = isPresent
};
_studentAttendances.Add(studentAttendance);
}
// Метод для получения посещаемости по занятию
public List<StudentAttendance> GetLessonAttendance(int lessonId)
{
return _studentAttendances.FindAll(sa => sa.LessonId == lessonId);
}
}
}

View File

@ -1,6 +0,0 @@

internal class UserModel
{
public string FIO { get; set; }
public Guid Guid { get; set; }
}

View File

@ -1,16 +1,42 @@
using Demo.Data.Repository;
using System;
using System.Collections.Generic;
using AttendanceApp.Data.Repository;
using AttendanceApp.Domain.Models;
namespace Demo.Domain.UseCases
namespace AttendanceApp.Domain.UseCases
{
public class UserUseCase
{
private UserRepositoryImpl _userRepository;
private readonly IUserRepository _userRepository;
public UserUseCase(UserRepositoryImpl userRepository) // Конструктор
public UserUseCase(IUserRepository userRepository)
{
_userRepository = userRepository;
}
// Другие методы
public IEnumerable<User> GetAllUsers()
{
return _userRepository.GetAllUsers();
}
public User GetUserById(Guid id)
{
return _userRepository.GetUserById(id);
}
public void AddUser(User user)
{
_userRepository.AddUser(user);
}
public void UpdateUser(User user)
{
_userRepository.UpdateUser(user);
}
public void DeleteUser(Guid id)
{
_userRepository.DeleteUser(id);
}
}
}
}

View File

@ -1,371 +1,14 @@
using Demo.Data.LocalData;
using Demo.Data.LocalData.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System;
using AttendanceApp.UI;
namespace Demo
namespace AttendanceApp
{
class Program
{
static void Main(string[] args)
{
bool exit = false;
while (!exit)
{
Console.Clear();
Console.WriteLine("1. Показать всех пользователей");
Console.WriteLine("2. Удалить пользователя по GUID");
Console.WriteLine("3. Обновить пользователя");
Console.WriteLine("4. Найти пользователя по GUID");
Console.WriteLine("5. Показать все группы");
Console.WriteLine("6. Добавить группу");
Console.WriteLine("7. Обновить группу");
Console.WriteLine("8. Удалить группу по ID");
Console.WriteLine("9. Найти группу по ID");
Console.WriteLine("10. Генерация посещаемости на текущий день");
Console.WriteLine("11. Генерация посещаемости на неделю");
Console.WriteLine("12. Показать посещаемость по группе и дате");
Console.WriteLine("13. Отметить пользователя как отсутствующего");
Console.WriteLine("0. Выход");
Console.Write("Выберите опцию: ");
var choice = Console.ReadLine();
switch (choice)
{
case "1": ShowUsers(); break;
case "2": DeleteUserByGuid(); break;
case "3": UpdateUser(); break;
case "4": FindUserByGuid(); break;
case "5": ShowGroups(); break;
case "6": AddGroup(); break;
case "7": UpdateGroup(); break;
case "8": DeleteGroupById(); break;
case "9": FindGroupById(); break;
case "10": GeneratePresenceForToday(); break;
case "11": GeneratePresenceForWeek(); break;
case "12": ShowPresenceByGroupAndDate(); break;
case "13": MarkUserAsAbsent(); break;
case "0": exit = true; break;
default:
Console.WriteLine("Неверный выбор. Нажмите любую клавишу для продолжения.");
Console.ReadKey();
break;
}
}
}
static void ShowUsers()
{
Console.Clear();
foreach (var user in LocalStaticData.Users)
{
Console.WriteLine($"ID: {user.Id}, ФИО: {user.FIO}, GroupID: {user.GroupID}");
}
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
}
static void DeleteUserByGuid()
{
Console.Clear();
Console.Write("Введите GUID пользователя для удаления: ");
if (Guid.TryParse(Console.ReadLine(), out Guid userId))
{
var user = LocalStaticData.Users.FirstOrDefault(u => u.Id == userId);
if (user != null)
{
LocalStaticData.Users.Remove(user);
Console.WriteLine("Пользователь удалён.");
}
else
{
Console.WriteLine("Пользователь не найден.");
}
}
else
{
Console.WriteLine("Неверный формат GUID.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
}
static void UpdateUser()
{
Console.Clear();
Console.Write("Введите GUID пользователя для обновления: ");
if (Guid.TryParse(Console.ReadLine(), out Guid userId))
{
var user = LocalStaticData.Users.FirstOrDefault(u => u.Id == userId);
if (user != null)
{
Console.Write("Введите новое ФИО: ");
user.FIO = Console.ReadLine();
Console.Write("Введите новый GroupID: ");
if (int.TryParse(Console.ReadLine(), out int groupId))
{
user.GroupID = groupId;
Console.WriteLine("Пользователь обновлён.");
}
else
{
Console.WriteLine("Неверный формат GroupID.");
}
}
else
{
Console.WriteLine("Пользователь не найден.");
}
}
else
{
Console.WriteLine("Неверный формат GUID.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
}
static void FindUserByGuid()
{
Console.Clear();
Console.Write("Введите GUID пользователя для поиска: ");
if (Guid.TryParse(Console.ReadLine(), out Guid userId))
{
var user = LocalStaticData.Users.FirstOrDefault(u => u.Id == userId);
if (user != null)
{
Console.WriteLine($"ID: {user.Id}, ФИО: {user.FIO}, GroupID: {user.GroupID}");
}
else
{
Console.WriteLine("Пользователь не найден.");
}
}
else
{
Console.WriteLine("Неверный формат GUID.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
}
static void ShowGroups()
{
Console.Clear();
Console.WriteLine("Список групп:");
foreach (var group in LocalStaticData.Groups)
{
Console.WriteLine(group);
}
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
}
static void AddGroup()
{
Console.Clear();
Console.Write("Введите название группы для добавления: ");
var groupName = Console.ReadLine();
LocalStaticData.Groups.Add(groupName);
Console.WriteLine("Группа добавлена.");
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
}
static void UpdateGroup()
{
Console.Clear();
Console.Write("Введите индекс группы для обновления (начиная с 0): ");
if (int.TryParse(Console.ReadLine(), out int index) && index >= 0 && index < LocalStaticData.Groups.Count)
{
Console.Write("Введите новое название группы: ");
LocalStaticData.Groups[index] = Console.ReadLine();
Console.WriteLine("Группа обновлена.");
}
else
{
Console.WriteLine("Неверный индекс группы.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
}
static void DeleteGroupById()
{
Console.Clear();
Console.Write("Введите индекс группы для удаления (начиная с 0): ");
if (int.TryParse(Console.ReadLine(), out int index) && index >= 0 && index < LocalStaticData.Groups.Count)
{
LocalStaticData.Groups.RemoveAt(index);
Console.WriteLine("Группа удалена.");
}
else
{
Console.WriteLine("Неверный индекс группы.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
}
static void FindGroupById()
{
Console.Clear();
Console.Write("Введите индекс группы для поиска (начиная с 0): ");
if (int.TryParse(Console.ReadLine(), out int index) && index >= 0 && index < LocalStaticData.Groups.Count)
{
Console.WriteLine($"Группа: {LocalStaticData.Groups[index]}");
}
else
{
Console.WriteLine("Группа не найдена.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
}
static void GeneratePresenceForToday()
{
Console.Clear();
Console.Write("Введите номер группы: ");
var groupIdInput = Console.ReadLine();
Console.Write("Введите номер первого занятия: ");
var firstLesson = int.Parse(Console.ReadLine());
Console.Write("Введите номер последнего занятия: ");
var lastLesson = int.Parse(Console.ReadLine());
var currentDate = DateTime.Now.Date;
// Преобразуйте groupIdInput в int для сравнения
if (int.TryParse(groupIdInput, out int groupId))
{
// Получите идентификатор пользователя
var user = LocalStaticData.Users.FirstOrDefault(u => u.GroupID == groupId);
var userId = user != null ? user.Id : Guid.NewGuid(); // Если пользователь не найден, создайте новый идентификатор
// Создание посещаемости с параметрами
var presence = new Presence(userId, currentDate, groupId, Enumerable.Range(firstLesson, lastLesson - firstLesson + 1).Select(lesson => true).ToList());
LocalStaticData.Presences.Add(presence);
Console.WriteLine("Посещаемость сгенерирована для сегодняшнего дня.");
}
else
{
Console.WriteLine("Некорректный ввод номера группы.");
}
Console.ReadKey();
}
static void GeneratePresenceForWeek()
{
Console.Clear();
Console.Write("Введите номер группы: ");
var groupIdInput = Console.ReadLine();
Console.Write("Введите номер первого занятия: ");
var firstLesson = int.Parse(Console.ReadLine());
Console.Write("Введите номер последнего занятия: ");
var lastLesson = int.Parse(Console.ReadLine());
var startDate = DateTime.Now.Date;
// Преобразуйте groupIdInput в int для сравнения
if (int.TryParse(groupIdInput, out int groupId))
{
// Получите идентификатор пользователя
var user = LocalStaticData.Users.FirstOrDefault(u => u.GroupID == groupId);
var userId = user != null ? user.Id : Guid.NewGuid(); // Если пользователь не найден, создайте новый идентификатор
for (int i = 0; i < 7; i++)
{
var currentDate = startDate.AddDays(i);
// Создание посещаемости с параметрами
var presence = new Presence(userId, currentDate, groupId, Enumerable.Range(firstLesson, lastLesson - firstLesson + 1).Select(lesson => true).ToList());
LocalStaticData.Presences.Add(presence);
}
Console.WriteLine("Посещаемость сгенерирована на текущую неделю.");
}
else
{
Console.WriteLine("Некорректный ввод номера группы.");
}
Console.ReadKey();
}
static void ShowPresenceByGroupAndDate()
{
Console.Clear();
Console.Write("Введите номер группы: ");
var groupId = Console.ReadLine();
Console.Write("Введите дату (yyyy-MM-dd): ");
if (DateTime.TryParse(Console.ReadLine(), out DateTime date))
{
var presence = LocalStaticData.Presences.FirstOrDefault(p => p.GroupID == int.Parse(groupId) && p.Date.Date == date);
if (presence != null)
{
Console.WriteLine($"Посещаемость для группы {groupId} на {date.ToShortDateString()}:");
for (int i = 0; i < presence.Lessons.Count; i++)
{
Console.WriteLine($"Занятие {i + 1}: {(presence.Lessons[i] ? "Присутствует" : "Отсутствует")}");
}
}
else
{
Console.WriteLine("Посещаемость не найдена.");
}
}
else
{
Console.WriteLine("Неверный формат даты.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
}
static void MarkUserAsAbsent()
{
Console.Clear();
Console.Write("Введите номер группы: ");
var groupId = Console.ReadLine();
Console.Write("Введите дату (yyyy-MM-dd): ");
if (DateTime.TryParse(Console.ReadLine(), out DateTime date))
{
Console.Write("Введите GUID пользователя для отметки отсутствия: ");
if (Guid.TryParse(Console.ReadLine(), out Guid userId))
{
var presence = LocalStaticData.Presences.FirstOrDefault(p => p.GroupID == int.Parse(groupId) && p.Date.Date == date);
if (presence != null)
{
// Поиск занятия пользователя
var userIndex = LocalStaticData.Users.FindIndex(u => u.Id == userId && u.GroupID.ToString() == groupId);
if (userIndex >= 0)
{
presence.Lessons[userIndex] = false;
Console.WriteLine("Пользователь отмечен как отсутствующий.");
}
else
{
Console.WriteLine("Пользователь не найден в этой группе.");
}
}
else
{
Console.WriteLine("Посещаемость не найдена.");
}
}
else
{
Console.WriteLine("Неверный формат GUID.");
}
}
else
{
Console.WriteLine("Неверный формат даты.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения.");
Console.ReadKey();
var mainMenu = new MainMenu();
mainMenu.Show();
}
}
}
}

154
Demo1/UI/GroupConsole.cs Normal file
View File

@ -0,0 +1,154 @@
using System;
using AttendanceApp.Domain.UseCases;
using AttendanceApp.Domain.Models;
using AttendanceApp.Data.Exceptions;
namespace AttendanceApp.UI
{
public class GroupConsole
{
private readonly GroupUseCase _groupUseCase;
public GroupConsole(GroupUseCase groupUseCase)
{
_groupUseCase = groupUseCase;
}
public void ShowAllGroups()
{
Console.Clear();
Console.WriteLine("=== Список всех групп ===");
var groups = _groupUseCase.GetAllGroups();
foreach (var group in groups)
{
Console.WriteLine($"ID: {group.Id} | Название: {group.Name}");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void AddGroup()
{
Console.Clear();
Console.WriteLine("=== Добавление новой группы ===");
Console.Write("Введите название группы: ");
var groupName = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(groupName))
{
var newGroup = new Group
{
Id = GenerateNewGroupId(),
Name = groupName
};
_groupUseCase.AddGroup(newGroup);
Console.WriteLine("Группа успешно добавлена.");
}
else
{
Console.WriteLine("Название группы не может быть пустым.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
private int GenerateNewGroupId()
{
var groups = _groupUseCase.GetAllGroups();
if (groups != null && groups.Any())
{
return groups.Max(g => g.Id) + 1;
}
return 1;
}
public void UpdateGroup()
{
Console.Clear();
Console.WriteLine("=== Обновление группы ===");
Console.Write("Введите ID группы: ");
var input = Console.ReadLine();
if (int.TryParse(input, out int groupId))
{
try
{
var group = _groupUseCase.GetGroupById(groupId);
Console.WriteLine($"Текущее название группы: {group.Name}");
Console.Write("Введите новое название группы: ");
var newName = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(newName))
{
group.Name = newName;
_groupUseCase.UpdateGroup(group);
Console.WriteLine("Группа успешно обновлена.");
}
else
{
Console.WriteLine("Название группы не может быть пустым.");
}
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void DeleteGroup()
{
Console.Clear();
Console.WriteLine("=== Удаление группы ===");
Console.Write("Введите ID группы: ");
var input = Console.ReadLine();
if (int.TryParse(input, out int groupId))
{
try
{
_groupUseCase.DeleteGroup(groupId);
Console.WriteLine("Группа успешно удалена.");
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void FindGroupById()
{
Console.Clear();
Console.WriteLine("=== Поиск группы по ID ===");
Console.Write("Введите ID группы: ");
var input = Console.ReadLine();
if (int.TryParse(input, out int groupId))
{
try
{
var group = _groupUseCase.GetGroupById(groupId);
Console.WriteLine($"ID: {group.Id} | Название: {group.Name}");
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
}
}

View File

@ -1,13 +1,107 @@
namespace Demo
using AttendanceApp.Domain.UseCases;
using AttendanceApp.Data.Repository;
using Demo1;
namespace AttendanceApp.UI
{
public static class MainMenu
public class MainMenu
{
public static void DisplayMenu() // Метод для отображения меню
private readonly UserConsole _userConsole;
private readonly GroupConsole _groupConsole;
private readonly PresenceConsole _presenceConsole;
public MainMenu()
{
// Логика отображения меню
Console.WriteLine("1. Показать пользователей");
Console.WriteLine("2. Показать группы");
// Добавь остальные опции по необходимости
// Инициализация репозиториев и use cases
var userRepository = new UserRepositoryImpl();
var groupRepository = new GroupRepositoryImpl();
var presenceRepository = new PresenceRepositoryImpl();
var userUseCase = new UserUseCase(userRepository);
var groupUseCase = new GroupUseCase(groupRepository);
var generatePresenceUseCase = new UseCaseGeneratePresence(presenceRepository, userRepository, groupRepository);
_userConsole = new UserConsole(userUseCase);
_groupConsole = new GroupConsole(groupUseCase);
_presenceConsole = new PresenceConsole(generatePresenceUseCase, presenceRepository, groupRepository);
}
public void Show()
{
while (true)
{
Console.Clear();
Console.WriteLine("=== Меню ===");
Console.WriteLine("1. Показать всех пользователей");
Console.WriteLine("2. Удалить пользователя по GUID");
Console.WriteLine("3. Обновить пользователя");
Console.WriteLine("4. Найти пользователя по GUID");
Console.WriteLine("5. Показать все группы");
Console.WriteLine("6. Добавить группу");
Console.WriteLine("7. Обновить группу");
Console.WriteLine("8. Удалить группу по ID");
Console.WriteLine("9. Найти группу по ID");
Console.WriteLine("10. Генерация посещаемости на текущий день");
Console.WriteLine("11. Генерация посещаемости на неделю");
Console.WriteLine("12. Показать посещаемость по группе и дате");
Console.WriteLine("13. Отметить пользователя как отсутствующего");
Console.WriteLine("14. Показать посещаемость по группе");
Console.WriteLine("0. Выход");
Console.Write("Выберите опцию: ");
var input = Console.ReadLine();
switch (input)
{
case "1":
_userConsole.ShowAllUsers();
break;
case "2":
_userConsole.DeleteUser();
break;
case "3":
_userConsole.UpdateUser();
break;
case "4":
_userConsole.FindUserById();
break;
case "5":
_groupConsole.ShowAllGroups();
break;
case "6":
_groupConsole.AddGroup();
break;
case "7":
_groupConsole.UpdateGroup();
break;
case "8":
_groupConsole.DeleteGroup();
break;
case "9":
_groupConsole.FindGroupById();
break;
case "10":
_presenceConsole.GenerateDailyPresence();
break;
case "11":
_presenceConsole.GenerateWeeklyPresence();
break;
case "12":
_presenceConsole.ShowPresenceByGroupAndDate();
break;
case "13":
_presenceConsole.MarkUserAbsent();
break;
case "14":
_presenceConsole.ShowPresenceByGroup();
break;
case "0":
return;
default:
Console.WriteLine("Неверная опция. Нажмите любую клавишу для продолжения...");
Console.ReadKey();
break;
}
}
}
}
}
}

207
Demo1/UI/PresenceConsole.cs Normal file
View File

@ -0,0 +1,207 @@
using System;
using AttendanceApp.Domain.UseCases;
using AttendanceApp.Data.Repository;
using AttendanceApp.Domain.Models;
using AttendanceApp.Data.Exceptions;
namespace AttendanceApp.UI
{
public class PresenceConsole
{
private readonly UseCaseGeneratePresence _generatePresenceUseCase;
private readonly IPresenceRepository _presenceRepository;
private readonly IGroupRepository _groupRepository;
public PresenceConsole(UseCaseGeneratePresence generatePresenceUseCase, IPresenceRepository presenceRepository, IGroupRepository groupRepository)
{
_generatePresenceUseCase = generatePresenceUseCase;
_presenceRepository = presenceRepository;
_groupRepository = groupRepository;
}
public void GenerateDailyPresence()
{
Console.Clear();
Console.WriteLine("=== Генерация посещаемости на текущий день ===");
Console.Write("Введите номер первого занятия: ");
var firstClassInput = Console.ReadLine();
Console.Write("Введите номер последнего занятия: ");
var lastClassInput = Console.ReadLine();
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
var currentDate = DateTime.Now.Date;
if (int.TryParse(firstClassInput, out int firstClassNum) &&
int.TryParse(lastClassInput, out int lastClassNum) &&
int.TryParse(groupIdInput, out int groupId))
{
try
{
_generatePresenceUseCase.GenerateDailyPresence(firstClassNum, lastClassNum, groupId, currentDate);
Console.WriteLine("Посещаемость успешно сгенерирована на текущий день.");
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ввода.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void GenerateWeeklyPresence()
{
Console.Clear();
Console.WriteLine("=== Генерация посещаемости на неделю ===");
Console.Write("Введите номер первого занятия: ");
var firstClassInput = Console.ReadLine();
Console.Write("Введите номер последнего занятия: ");
var lastClassInput = Console.ReadLine();
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
Console.Write("Введите стартовую дату (yyyy-MM-dd): ");
var startDateInput = Console.ReadLine();
if (int.TryParse(firstClassInput, out int firstClassNum) &&
int.TryParse(lastClassInput, out int lastClassNum) &&
int.TryParse(groupIdInput, out int groupId) &&
DateTime.TryParse(startDateInput, out DateTime startDate))
{
try
{
_generatePresenceUseCase.GenerateWeeklyPresence(firstClassNum, lastClassNum, groupId, startDate);
Console.WriteLine("Посещаемость успешно сгенерирована на неделю.");
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ввода.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void ShowPresenceByGroupAndDate()
{
Console.Clear();
Console.WriteLine("=== Показать посещаемость по группе и дате ===");
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
Console.Write("Введите дату (yyyy-MM-dd): ");
var dateInput = Console.ReadLine();
if (int.TryParse(groupIdInput, out int groupId) &&
DateTime.TryParse(dateInput, out DateTime date))
{
try
{
var group = _groupRepository.GetGroupById(groupId);
var presences = _presenceRepository.GetPresenceByGroupAndDate(groupId, date);
Console.WriteLine($"Посещаемость группы {group.Name} на {date.ToShortDateString()}:");
foreach (var presence in presences)
{
Console.WriteLine($"Пользователь ID: {presence.UserId} | Занятие №: {presence.ClassNumber} | Присутствует: {presence.IsPresent}");
}
}
catch (GroupNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат ввода.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void MarkUserAbsent()
{
Console.Clear();
Console.WriteLine("=== Отметить пользователя как отсутствующего ===");
Console.Write("Введите ID пользователя (GUID): ");
var userIdInput = Console.ReadLine();
Console.Write("Введите диапазон занятий (через запятую, например: 1,3): ");
var classRangeInput = Console.ReadLine();
if (Guid.TryParse(userIdInput, out Guid userId) &&
classRangeInput.Contains(",") &&
int.TryParse(classRangeInput.Split(',')[0], out int startClass) &&
int.TryParse(classRangeInput.Split(',')[1], out int endClass))
{
try
{
var currentDate = DateTime.Now.Date;
for (int classNum = startClass; classNum <= endClass; classNum++)
{
var presence = new Presence
{
ClassDate = currentDate,
ClassNumber = classNum,
IsPresent = false,
UserId = userId
};
_presenceRepository.UpdatePresence(presence);
}
Console.WriteLine("Пользователь успешно отмечен как отсутствующий на указанных занятиях.");
}
catch (RepositoryException ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
else
{
Console.WriteLine("Неверный формат ввода.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void ShowPresenceByGroup()
{
Console.Clear();
Console.WriteLine("=== Показать посещаемость по группе ===");
Console.Write("Введите ID группы: ");
var groupIdInput = Console.ReadLine();
if (int.TryParse(groupIdInput, out int groupId))
{
try
{
var group = _groupRepository.GetGroupById(groupId);
var presences = _presenceRepository.GetPresenceByGroup(groupId);
Console.WriteLine($"Посещаемость группы {group.Name}:");
foreach (var presence in presences)
{
Console.WriteLine($"Дата: {presence.ClassDate.ToShortDateString()} | " +
$"Занятие №{presence.ClassNumber} | " +
$"Присутствует: {(presence.IsPresent ? "Да" : "Нет")} | " +
$"Студент ID: {presence.UserId}");
}
}
catch (GroupNotFoundException ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
else
{
Console.WriteLine("Неверный формат ID группы.");
}
Console.WriteLine("\nНажмите любую клавишу для продолжения...");
Console.ReadKey();
}
}
}

View File

@ -1,20 +0,0 @@
using Demo.Domain.Models;
namespace Demo.UI
{
public class UserConsole
{
private readonly Demo.Domain.Models.User user;
public UserConsole(Demo.Data.LocalData.Entity.LocalUser entityUser) // Принимаем Entity User
{
// Преобразуем entityUser в Domain User
this.user = (Demo.Domain.Models.User)entityUser;
}
public void DisplayUserInfo()
{
Console.WriteLine($"Имя: {user.FullName}, ID: {user.Id}");
}
}
}

125
Demo1/UserConsole.cs Normal file
View File

@ -0,0 +1,125 @@
using System;
using AttendanceApp.Domain.UseCases;
using AttendanceApp.Domain.Models;
using AttendanceApp.Data.Exceptions;
namespace Demo1
{
public class UserConsole
{
private readonly UserUseCase _userUseCase;
public UserConsole(UserUseCase userUseCase)
{
_userUseCase = userUseCase;
}
public void ShowAllUsers()
{
Console.Clear();
Console.WriteLine("=== Список всех пользователей ===");
var users = _userUseCase.GetAllUsers();
foreach (var user in users)
{
Console.WriteLine($"ID: {user.Id} | ФИО: {user.FIO} | Группа ID: {user.GroupId}");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void DeleteUser()
{
Console.Clear();
Console.WriteLine("=== Удаление пользователя ===");
Console.Write("Введите GUID пользователя: ");
var input = Console.ReadLine();
if (Guid.TryParse(input, out Guid userId))
{
try
{
_userUseCase.DeleteUser(userId);
Console.WriteLine("Пользователь успешно удалён.");
}
catch (UserNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат GUID.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void UpdateUser()
{
Console.Clear();
Console.WriteLine("=== Обновление пользователя ===");
Console.Write("Введите GUID пользователя: ");
var input = Console.ReadLine();
if (Guid.TryParse(input, out Guid userId))
{
try
{
var user = _userUseCase.GetUserById(userId);
Console.WriteLine($"Текующее ФИО: {user.FIO}");
Console.Write("Введите новое ФИО (оставьте пустым для сохранения текущего): ");
var newFIO = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(newFIO))
{
user.FIO = newFIO;
}
Console.WriteLine($"Текущая группа ID: {user.GroupId}");
Console.Write("Введите новый Group ID (оставьте пустым для сохранения текущего): ");
var newGroupIdInput = Console.ReadLine();
if (int.TryParse(newGroupIdInput, out int newGroupId))
{
user.GroupId = newGroupId;
}
_userUseCase.UpdateUser(user);
Console.WriteLine("Пользователь успешно обновлён.");
}
catch (UserNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат GUID.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
public void FindUserById()
{
Console.Clear();
Console.WriteLine("=== Поиск пользователя по GUID ===");
Console.Write("Введите GUID пользователя: ");
var input = Console.ReadLine();
if (Guid.TryParse(input, out Guid userId))
{
try
{
var user = _userUseCase.GetUserById(userId);
Console.WriteLine($"ID: {user.Id} | ФИО: {user.FIO} | Группа ID: {user.GroupId}");
}
catch (UserNotFoundException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Неверный формат GUID.");
}
Console.WriteLine("Нажмите любую клавишу для продолжения...");
Console.ReadKey();
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Demo1")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+df8314a5edf631ad091dc7bfca86e0f6f5c724cb")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+aa3336ca1b11c1685b7d76482c3b1b14608267a3")]
[assembly: System.Reflection.AssemblyProductAttribute("Demo1")]
[assembly: System.Reflection.AssemblyTitleAttribute("Demo1")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
221e0c768b0d742a8ba97ec496228ed7816062bae551ae6dca0fa140cf72a07e
40dc55726398d581826007a1a5883ce5e0fdddf730f9f50a2bf471c9f635d905

View File

@ -8,6 +8,6 @@ build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Demo1
build_property.ProjectDir = C:\Users\class_Student\Source\Repos\slarny4\Demo1\
build_property.ProjectDir = C:\Users\prdb\source\repos\slarny4\Demo1\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@ -1 +1 @@
1d50d3593a629a5dd88b49d245e89f299208f24874e2084a9b532f66739617bd
5d4a55edd9d214d3ff28a518ab18442791e4dd2a2a9a71ab193e8c59dd5b546e

View File

@ -26,3 +26,17 @@ C:\Users\class_Student\Source\Repos\slarny4\Demo1\bin\Debug\net8.0\Demo1.dll
C:\Users\class_Student\Source\Repos\slarny4\Demo1\bin\Debug\net8.0\Demo1.pdb
C:\Users\class_Student\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\Demo1.genruntimeconfig.cache
C:\Users\class_Student\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\ref\Demo1.dll
C:\Users\prdb\Source\Repos\slarny4\Demo1\bin\Debug\net8.0\Demo1.exe
C:\Users\prdb\Source\Repos\slarny4\Demo1\bin\Debug\net8.0\Demo1.deps.json
C:\Users\prdb\Source\Repos\slarny4\Demo1\bin\Debug\net8.0\Demo1.runtimeconfig.json
C:\Users\prdb\Source\Repos\slarny4\Demo1\bin\Debug\net8.0\Demo1.dll
C:\Users\prdb\Source\Repos\slarny4\Demo1\bin\Debug\net8.0\Demo1.pdb
C:\Users\prdb\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\Demo1.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\prdb\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\Demo1.AssemblyInfoInputs.cache
C:\Users\prdb\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\Demo1.AssemblyInfo.cs
C:\Users\prdb\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\Demo1.csproj.CoreCompileInputs.cache
C:\Users\prdb\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\Demo1.dll
C:\Users\prdb\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\refint\Demo1.dll
C:\Users\prdb\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\Demo1.pdb
C:\Users\prdb\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\Demo1.genruntimeconfig.cache
C:\Users\prdb\Source\Repos\slarny4\Demo1\obj\Debug\net8.0\ref\Demo1.dll

Binary file not shown.

View File

@ -1 +1 @@
efacd2456a8517402d3b53b9ec65ae943b078068dce16d9c1e2c139cbb2efa47
e50ae4bf7831d90ecaca8867ac9c11e9f8406a06bd388d07cb6606821f2f7100

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,24 +1,20 @@
{
"format": 1,
"restore": {
"C:\\Users\\class_Student\\Source\\Repos\\slarny4\\Demo1\\Demo1.csproj": {}
"C:\\Users\\prdb\\source\\repos\\slarny4\\Demo1\\Demo1.csproj": {}
},
"projects": {
"C:\\Users\\class_Student\\Source\\Repos\\slarny4\\Demo1\\Demo1.csproj": {
"C:\\Users\\prdb\\source\\repos\\slarny4\\Demo1\\Demo1.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\class_Student\\Source\\Repos\\slarny4\\Demo1\\Demo1.csproj",
"projectUniqueName": "C:\\Users\\prdb\\source\\repos\\slarny4\\Demo1\\Demo1.csproj",
"projectName": "Demo1",
"projectPath": "C:\\Users\\class_Student\\Source\\Repos\\slarny4\\Demo1\\Demo1.csproj",
"packagesPath": "C:\\Users\\class_Student\\.nuget\\packages\\",
"outputPath": "C:\\Users\\class_Student\\Source\\Repos\\slarny4\\Demo1\\obj\\",
"projectPath": "C:\\Users\\prdb\\source\\repos\\slarny4\\Demo1\\Demo1.csproj",
"packagesPath": "C:\\Users\\prdb\\.nuget\\packages\\",
"outputPath": "C:\\Users\\prdb\\source\\repos\\slarny4\\Demo1\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\class_Student\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Users\\prdb\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
@ -26,7 +22,6 @@
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"C:\\Program Files\\dotnet\\library-packs": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
@ -65,7 +60,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.204/PortableRuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.203/PortableRuntimeIdentifierGraph.json"
}
}
}

View File

@ -5,12 +5,11 @@
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\class_Student\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\prdb\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.9.2</NuGetToolVersion>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.9.1</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\class_Student\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
<SourceRoot Include="C:\Users\prdb\.nuget\packages\" />
</ItemGroup>
</Project>

View File

@ -8,24 +8,19 @@
"net8.0": []
},
"packageFolders": {
"C:\\Users\\class_Student\\.nuget\\packages\\": {},
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
"C:\\Users\\prdb\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\class_Student\\Source\\Repos\\slarny4\\Demo1\\Demo1.csproj",
"projectUniqueName": "C:\\Users\\prdb\\Source\\Repos\\slarny4\\Demo1\\Demo1.csproj",
"projectName": "Demo1",
"projectPath": "C:\\Users\\class_Student\\Source\\Repos\\slarny4\\Demo1\\Demo1.csproj",
"packagesPath": "C:\\Users\\class_Student\\.nuget\\packages\\",
"outputPath": "C:\\Users\\class_Student\\Source\\Repos\\slarny4\\Demo1\\obj\\",
"projectPath": "C:\\Users\\prdb\\Source\\Repos\\slarny4\\Demo1\\Demo1.csproj",
"packagesPath": "C:\\Users\\prdb\\.nuget\\packages\\",
"outputPath": "C:\\Users\\prdb\\Source\\Repos\\slarny4\\Demo1\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\class_Student\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Users\\prdb\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
@ -33,7 +28,6 @@
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"C:\\Program Files\\dotnet\\library-packs": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
@ -72,7 +66,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.204/PortableRuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.203/PortableRuntimeIdentifierGraph.json"
}
}
}

View File

@ -1,8 +1,8 @@
{
"version": 2,
"dgSpecHash": "w2AQ9bufhayfzTHCnl2ow9D2CtoWJ4HAqBkDoNcbSKD2lmZQ/k0JRgy5fID2BknPulzXAnFoyjXkQhKMewdlLQ==",
"dgSpecHash": "MKsvMEFBZlOYacbOsE3EQuFzAQ4xpAuoe3utlzPRhVh/aHX1gO9yBO/IcbiHqNdf6lPRFQGRzE3l/jJIX8Sk6g==",
"success": true,
"projectFilePath": "C:\\Users\\class_Student\\Source\\Repos\\slarny4\\Demo1\\Demo1.csproj",
"projectFilePath": "C:\\Users\\prdb\\source\\repos\\slarny4\\Demo1\\Demo1.csproj",
"expectedPackageFiles": [],
"logs": []
}