master #1

Merged
XDel merged 3 commits from master into main 2024-11-01 16:13:46 +00:00
34 changed files with 232 additions and 254 deletions
Showing only changes of commit 416f0914dc - Show all commits

View File

@ -10,7 +10,7 @@ namespace Demo.Data.RemoteData.RemoteDataBase.DAO
public class GroupDao public class GroupDao
{ {
public int Id { get; set; } public int Id { get; set; }
public required string Name { get; set; } public string Name { get; set; }
public List<UserDao> Users { get; set; } public List<UserDao> Users { get; set; }
} }
} }

View File

@ -8,6 +8,7 @@ namespace Demo.Data.RemoteData.RemoteDataBase.DAO
{ {
public class PresenceDao public class PresenceDao
{ {
public int PresenceId { get; set; }
public int UserId { get; set; } public int UserId { get; set; }
public bool IsAttedance { get; set; } = true; public bool IsAttedance { get; set; } = true;
public DateOnly Date { get; set; } public DateOnly Date { get; set; }

View File

@ -11,6 +11,6 @@ namespace Demo.Data.RemoteData.RemoteDataBase.DAO
public required string FIO { get; set; } public required string FIO { get; set; }
public required int UserId { get; set; } public required int UserId { get; set; }
public required int GroupId { get; set; } public required int GroupId { get; set; }
public GroupDao Group { get; set; } public GroupDao? Group { get; set; }
} }
} }

View File

@ -27,13 +27,8 @@ namespace Demo.Data.RemoteData.RemoteDataBase
modelBuilder.Entity<GroupDao>().Property(group => group.Id).ValueGeneratedOnAdd(); modelBuilder.Entity<GroupDao>().Property(group => group.Id).ValueGeneratedOnAdd();
modelBuilder.Entity<UserDao>().HasKey(user=>user.UserId); modelBuilder.Entity<UserDao>().HasKey(user=>user.UserId);
modelBuilder.Entity<UserDao>().Property(user=>user.UserId).ValueGeneratedOnAdd(); modelBuilder.Entity<UserDao>().Property(user=>user.UserId).ValueGeneratedOnAdd();
modelBuilder.Entity<PresenceDao>().HasKey(presence => new modelBuilder.Entity<PresenceDao>().HasKey(presence =>presence.PresenceId);
{ modelBuilder.Entity<PresenceDao>().Property(presence=>presence.PresenceId).ValueGeneratedOnAdd();
presence.UserId,
presence.Date,
presence.IsAttedance,
presence.LessonNumber
});
} }
} }

View File

@ -53,11 +53,6 @@ public class GroupRepositoryImpl: IGroupRepository
} }
} }
bool IGroupRepository.RemoveGroupById(int groupID)
{
throw new NotImplementedException();
}
List<GroupDao> IGroupRepository.GetAllGroups() List<GroupDao> IGroupRepository.GetAllGroups()
{ {
throw new NotImplementedException(); throw new NotImplementedException();

View File

@ -11,7 +11,6 @@ namespace Demo.Data.Repository
public interface IGroupRepository public interface IGroupRepository
{ {
List<GroupDao> GetAllGroups(); List<GroupDao> GetAllGroups();
bool RemoveGroupById(int groupID);
bool UpdateGroupById(int groupID, GroupDao updatedGroup); bool UpdateGroupById(int groupID, GroupDao updatedGroup);
GroupDao GetGroupById(int groupID); GroupDao GetGroupById(int groupID);
bool AddGroup(string Name); bool AddGroup(string Name);

View File

@ -15,5 +15,7 @@ namespace Demo.Data.Repository
List<PresenceDao> GetPresenceByDateAndGroup(DateTime date, int groupId); List<PresenceDao> GetPresenceByDateAndGroup(DateTime date, int groupId);
void SavePresence(List<PresenceDao> presences); void SavePresence(List<PresenceDao> presences);
List<PresenceDao> GetPresenceByGroup(int groupId); List<PresenceDao> GetPresenceByGroup(int groupId);
DateOnly? GetLastDateByGroupId(int groupId);
List<PresenceDao> GetPresenceForAbsent(DateTime date, int GroupId);
} }
} }

View File

@ -6,7 +6,7 @@ namespace Demo.Data.Repository
{ {
public interface IUserRepository public interface IUserRepository
{ {
IEnumerable<UserDao> GetAllUsers { get; } List<UserDao> GetAllUsers();
bool RemoveUserById(int userId); bool RemoveUserById(int userId);
UserDao? UpdateUser(UserDao user); UserDao? UpdateUser(UserDao user);
} }

View File

@ -47,5 +47,7 @@ namespace Demo.Data.Repository
{ {
return _presences.Where(p => p.GroupId == groupId).ToList(); return _presences.Where(p => p.GroupId == groupId).ToList();
} }
} }
} }

View File

@ -2,10 +2,13 @@
using Demo.Data.RemoteData.RemoteDataBase; using Demo.Data.RemoteData.RemoteDataBase;
using Demo.Data.RemoteData.RemoteDataBase.DAO; using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Demo.domain.Models; using Demo.domain.Models;
using Microsoft.EntityFrameworkCore;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Demo.Data.Repository namespace Demo.Data.Repository
@ -18,7 +21,10 @@ namespace Demo.Data.Repository
{ {
_remoteDatabaseContext = remoteDatabaseContext; _remoteDatabaseContext = remoteDatabaseContext;
} }
public List<PresenceDao> GetPresenceForAbsent(DateTime date, int GroupId)
{
return _remoteDatabaseContext.PresenceDaos.Where(p => p.GroupId == GroupId && p.Date==DateOnly.FromDateTime(date)).ToList();
}
public List<PresenceDao> GetPresenceByDateAndGroup(DateTime date, int groupId) public List<PresenceDao> GetPresenceByDateAndGroup(DateTime date, int groupId)
{ {
return _remoteDatabaseContext.PresenceDaos.Where(p => p.Date == DateOnly.FromDateTime(date) && return _remoteDatabaseContext.PresenceDaos.Where(p => p.Date == DateOnly.FromDateTime(date) &&
@ -28,10 +34,6 @@ namespace Demo.Data.Repository
// Реализация метода для получения всех данных по группе // Реализация метода для получения всех данных по группе
public List<PresenceDao> GetPresenceByGroup(int groupId) public List<PresenceDao> GetPresenceByGroup(int groupId)
{ {
foreach (var user in _remoteDatabaseContext.PresenceDaos)
{
Console.WriteLine(user);
}
return _remoteDatabaseContext.PresenceDaos.Where(p => p.GroupId == groupId).ToList(); return _remoteDatabaseContext.PresenceDaos.Where(p => p.GroupId == groupId).ToList();
} }
@ -42,10 +44,23 @@ namespace Demo.Data.Repository
Date = it.Date, Date = it.Date,
IsAttedance = it.IsAttedance, IsAttedance = it.IsAttedance,
LessonNumber = it.LessonNumber, LessonNumber = it.LessonNumber,
UserId = it.UserId UserId = it.UserId,
GroupId = it.GroupId
})); }));
_remoteDatabaseContext.SaveChanges(); _remoteDatabaseContext.SaveChanges();
} }
public DateOnly? GetLastDateByGroupId(int groupId)
{
// Проверяем наличие записей о посещаемости в базе данных для данной группы.
var lastDate = _remoteDatabaseContext.PresenceDaos
.Where(p => p.GroupId == groupId)
.OrderByDescending(p => p.Date)
.Select(p => p.Date)
.FirstOrDefault();
return lastDate == default ? (DateOnly?)null : lastDate;
}
} }
} }

View File

@ -18,8 +18,6 @@ namespace Demo.Data.Repository
_remoteDatabaseContext = remoteDatabaseContext; _remoteDatabaseContext = remoteDatabaseContext;
} }
public IEnumerable<UserDao> GetAllUsers => _remoteDatabaseContext.Users;
public bool RemoveUserById(int userId) public bool RemoveUserById(int userId)
{ {
var user = _remoteDatabaseContext.Users.FirstOrDefault(u => u.UserId == userId); var user = _remoteDatabaseContext.Users.FirstOrDefault(u => u.UserId == userId);
@ -34,10 +32,18 @@ namespace Demo.Data.Repository
var existingUser = _remoteDatabaseContext.Users.FirstOrDefault(u => u.UserId == user.UserId); var existingUser = _remoteDatabaseContext.Users.FirstOrDefault(u => u.UserId == user.UserId);
if (existingUser == null) throw new UserNotFoundException(user.UserId); if (existingUser == null) throw new UserNotFoundException(user.UserId);
// Обновляем поля существующего пользователя
existingUser.FIO = user.FIO; existingUser.FIO = user.FIO;
existingUser.GroupId = user.GroupId; existingUser.GroupId = user.GroupId;
_remoteDatabaseContext.SaveChanges();
return existingUser; return existingUser;
} }
public List<UserDao> GetAllUsers()
{
// Возвращаем пользователей, отсортированных по UserId
return _remoteDatabaseContext.Users.OrderBy(u => u.UserId).ToList();
}
} }
} }

View File

@ -29,17 +29,6 @@ namespace Demo.Data.Repository
return true; return true;
} }
public UserLocalEnity? UpdateUser(UserLocalEnity user)
{
var existingUser = _users.FirstOrDefault(u => u.ID == user.ID);
if (existingUser == null) throw new UserNotFoundException(user.ID);
existingUser.FIO = user.FIO;
existingUser.GroupID = user.GroupID;
return existingUser;
}
public UserDao? UpdateUser(UserDao user) public UserDao? UpdateUser(UserDao user)
{ {
throw new NotImplementedException(); throw new NotImplementedException();

View File

@ -19,6 +19,7 @@
<ItemGroup> <ItemGroup>
<Folder Include="Data\RemoteData\RemoteApi\" /> <Folder Include="Data\RemoteData\RemoteApi\" />
<Folder Include="Migrations\" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -91,26 +91,6 @@ namespace Demo.Domain.UseCase
_repositoryGroupImpl.AddGroup(newGroup.Name); _repositoryGroupImpl.AddGroup(newGroup.Name);
} }
public void RemoveGroupById(int groupId)
{
ValidateGroupId(groupId);
var existingGroup = ValidateGroupExistence(groupId);
List<Group> _groups = GetAllGroups();
// Находим группу по ID и удаляем ее
var groupToRemove = _groups.FirstOrDefault(g => g.Id == existingGroup.Id);
if (groupToRemove != null)
{
_groups.Remove(groupToRemove);
_repositoryGroupImpl.RemoveGroupById(existingGroup.Id);
}
else
{
throw new ArgumentException("Группа не найдена.");
// Обработка случая, если группа не найдена (например, выброс исключения)
}
}
// Метод для изменения названия группы // Метод для изменения названия группы
public void UpdateGroup(int groupId, string newGroupName) public void UpdateGroup(int groupId, string newGroupName)

View File

@ -1,6 +1,7 @@
using Demo.Data.RemoteData.RemoteDataBase.DAO; using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Demo.Data.Repository; using Demo.Data.Repository;
using Demo.domain.Models; using Demo.domain.Models;
using Microsoft.EntityFrameworkCore;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -13,6 +14,7 @@ namespace Demo.Domain.UseCase
{ {
public readonly IUserRepository _userRepository; public readonly IUserRepository _userRepository;
public readonly IPresenceRepository _presenceRepository; public readonly IPresenceRepository _presenceRepository;
public UseCaseGeneratePresence(IUserRepository userRepository, IPresenceRepository presenceRepository) public UseCaseGeneratePresence(IUserRepository userRepository, IPresenceRepository presenceRepository)
{ {
@ -28,23 +30,26 @@ namespace Demo.Domain.UseCase
return _presenceRepository.GetPresenceByDateAndGroup(date, groupId); return _presenceRepository.GetPresenceByDateAndGroup(date, groupId);
} }
public void GeneratePresenceDaily(int firstLesson, int lastLesson, int groupId, DateTime currentDate) public void GeneratePresenceDaily(int firstLesson, int lastLesson, int groupId)
{ {
try try
{ {
var users = _userRepository.GetAllUsers.Where(u => u.GroupId == groupId).ToList(); var users = _userRepository.GetAllUsers().Where(u => u.GroupId == groupId).ToList();
// Находим последнюю дату посещаемости для данной группы
DateOnly startDate = _presenceRepository.GetLastDateByGroupId(groupId)?.AddDays(1)
?? DateOnly.FromDateTime(DateTime.Today);
List<PresenceDao> presences = new List<PresenceDao>(); List<PresenceDao> presences = new List<PresenceDao>();
for (int lessonNumber = firstLesson; lessonNumber <= lastLesson; lessonNumber++) for (int lessonNumber = firstLesson; lessonNumber <= lastLesson; lessonNumber++)
{ {
foreach (var user in users) foreach (var user in users)
{ {
Console.WriteLine($"UserId: {user.UserId}, GroupId: {user.GroupId}"); // Выводим информацию о пользователе
var presence = new PresenceDao var presence = new PresenceDao
{ {
UserId = user.UserId, UserId = user.UserId,
GroupId = user.GroupId, GroupId = user.GroupId,
Date = DateOnly.FromDateTime(currentDate), Date = startDate,
LessonNumber = lessonNumber, LessonNumber = lessonNumber,
IsAttedance = true IsAttedance = true
}; };
@ -52,7 +57,7 @@ namespace Demo.Domain.UseCase
try try
{ {
_presenceRepository.SavePresence(new List<PresenceDao> { presence }); _presenceRepository.SavePresence(new List<PresenceDao> { presence });
Console.WriteLine($"Посещаемость добавлена для UserId = {user.UserId}, LessonNumber = {lessonNumber}"); Console.WriteLine($"Посещаемость добавлена для UserId = {user.UserId}, LessonNumber = {lessonNumber} на дату {startDate}");
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -76,12 +81,14 @@ namespace Demo.Domain.UseCase
} }
public void GenerateWeeklyPresence(int firstLesson, int lastLesson, int groupId, DateTime startTime) public void GenerateWeeklyPresence(int firstLesson, int lastLesson, int groupId, DateTime startTime)
{ {
for (int i = 0; i < 7; i++) for (int i = 0; i < 7; i++)
{ {
DateTime currentTime = startTime.AddDays(i); DateTime currentTime = startTime.AddDays(i);
GeneratePresenceDaily(firstLesson, lastLesson, groupId, currentTime); GeneratePresenceDaily(firstLesson, lastLesson, groupId);
} }
} }
@ -90,24 +97,26 @@ namespace Demo.Domain.UseCase
// Отметить пользователя как отсутствующего на диапазоне занятий // Отметить пользователя как отсутствующего на диапазоне занятий
public void MarkUserAbsentForLessons(int userId, int groupId, int firstLesson, int lastLesson, DateTime date) public void MarkUserAbsentForLessons(int userId, int groupId, int firstLesson, int lastLesson, DateTime date)
{ {
var presences = _presenceRepository.GetPresenceByDateAndGroup(date, groupId); List<PresenceDao> presences = _presenceRepository.GetPresenceForAbsent(date, groupId);
// Обновляем состояние присутствия для указанных занятий
foreach (var presence in presences.Where(p => p.UserId == userId && p.LessonNumber >= firstLesson && p.LessonNumber <= lastLesson)) foreach (var presence in presences.Where(p => p.UserId == userId && p.LessonNumber >= firstLesson && p.LessonNumber <= lastLesson))
{ {
presence.IsAttedance = false; presence.IsAttedance = false; // Устанавливаем отсутствие
Console.WriteLine($"PresenceId: {presence.PresenceId}, UserId: {presence.UserId}, Lesson Num: {presence.LessonNumber}, Att: {presence.IsAttedance}");
} }
// Сохраняем изменения в репозитории
_presenceRepository.SavePresence(presences); _presenceRepository.SavePresence(presences);
} }
public List<PresenceDao> GetAllPresenceByGroup(int groupId) public List<PresenceDao> GetAllPresenceByGroup(int groupId)
{ {
return _presenceRepository.GetPresenceByGroup(groupId); return _presenceRepository.GetPresenceByGroup(groupId);
} }
} }
} }

View File

@ -28,7 +28,7 @@ namespace Demo.Domain.UseCase
// Приватный метод для валидации существования пользователя по ID // Приватный метод для валидации существования пользователя по ID
private UserDao ValidateUserExistence(int userId) private UserDao ValidateUserExistence(int userId)
{ {
var user = _repositoryUserImpl.GetAllUsers var user = _repositoryUserImpl.GetAllUsers()
.FirstOrDefault(u => u.UserId == userId); .FirstOrDefault(u => u.UserId == userId);
if (user == null) if (user == null)
@ -54,7 +54,7 @@ namespace Demo.Domain.UseCase
} }
// Вывести всех пользователей // Вывести всех пользователей
public List<User> GetAllUsers() => _repositoryUserImpl.GetAllUsers public List<User> GetAllUsers() => _repositoryUserImpl.GetAllUsers()
.Join(_repositoryGroupImpl.GetAllGroups(), .Join(_repositoryGroupImpl.GetAllGroups(),
user => user.GroupId, // Ключ для пользователей user => user.GroupId, // Ключ для пользователей
group => group.Id, // Ключ для групп group => group.Id, // Ключ для групп
@ -86,47 +86,47 @@ namespace Demo.Domain.UseCase
} }
// Обновить пользователя по id // Обновить пользователя по id
//public User UpdateUser(User user) public UserDao UpdateUser(UserDao user)
//{ {
// ValidateUserFIO(user.FIO); ValidateUserFIO(user.FIO);
// ValidateGroupExistence(user.Group.Id); ValidateGroupExistence(user.GroupId);
// UserDao userDao = new UserDao UserDao userDao = new UserDao
// { {
// FIO = user.FIO, UserId = user.UserId,
// GroupId = user.Group.Id FIO = user.FIO,
// }; GroupId = user.GroupId
};
// UserDao? result = _repositoryUserImpl.UpdateUser(userDao); UserDao? result = _repositoryUserImpl.UpdateUser(userDao);
// if (result == null) if (result == null)
// { {
// throw new Exception("Ошибка при обновлении пользователя."); throw new Exception("Ошибка при обновлении пользователя.");
// } }
// var groupEntity = ValidateGroupExistence(result.GroupId); var groupEntity = ValidateGroupExistence(result.GroupId);
// return new User return new UserDao
// { {
// FIO = result.FIO, UserId=user.UserId,
// Group = new Group FIO = result.FIO,
// { GroupId = result.GroupId
// Id = groupEntity.Id, };
// Name = groupEntity.Name
// } }
// };
//}
// Найти пользователя по id // Найти пользователя по id
public User FindUserById(int userId) public UserDao FindUserById(int userId)
{ {
var user = ValidateUserExistence(userId); var user = ValidateUserExistence(userId);
var group = ValidateGroupExistence(user.GroupId); var group = ValidateGroupExistence(user.GroupId);
return new User return new UserDao
{ {
UserId = user.UserId,
FIO = user.FIO, FIO = user.FIO,
Group = new Group { Id = group.Id, Name = group.Name } GroupId = group.Id
}; };
} }
} }

View File

@ -12,8 +12,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace Demo.Migrations namespace Demo.Migrations
{ {
[DbContext(typeof(RemoteDatabaseContext))] [DbContext(typeof(RemoteDatabaseContext))]
[Migration("20241025085326_InitialCreate")] [Migration("20241101064613_InitialMigration")]
partial class InitialCreate partial class InitialMigration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -44,27 +44,28 @@ namespace Demo.Migrations
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b => modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
{ {
b.Property<int>("UserId") b.Property<int>("PresenceId")
.ValueGeneratedOnAdd()
.HasColumnType("integer"); .HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("PresenceId"));
b.Property<DateOnly>("Date") b.Property<DateOnly>("Date")
.HasColumnType("date"); .HasColumnType("date");
b.Property<int>("GroupId")
.HasColumnType("integer");
b.Property<bool>("IsAttedance") b.Property<bool>("IsAttedance")
.HasColumnType("boolean"); .HasColumnType("boolean");
b.Property<int>("LessonNumber") b.Property<int>("LessonNumber")
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<int>("GroupId") b.Property<int>("UserId")
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<int>("UserDaoUserId") b.HasKey("PresenceId");
.HasColumnType("integer");
b.HasKey("UserId", "Date", "IsAttedance", "LessonNumber");
b.HasIndex("UserDaoUserId");
b.ToTable("PresenceDaos"); b.ToTable("PresenceDaos");
}); });
@ -91,17 +92,6 @@ namespace Demo.Migrations
b.ToTable("Users"); b.ToTable("Users");
}); });
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
{
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", "UserDao")
.WithMany()
.HasForeignKey("UserDaoUserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("UserDao");
});
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b => modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
{ {
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group") b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group")

View File

@ -7,7 +7,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace Demo.Migrations namespace Demo.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class InitialCreate : Migration public partial class InitialMigration : Migration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
@ -25,6 +25,23 @@ namespace Demo.Migrations
table.PrimaryKey("PK_Groups", x => x.Id); table.PrimaryKey("PK_Groups", x => x.Id);
}); });
migrationBuilder.CreateTable(
name: "PresenceDaos",
columns: table => new
{
PresenceId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<int>(type: "integer", nullable: false),
IsAttedance = table.Column<bool>(type: "boolean", nullable: false),
Date = table.Column<DateOnly>(type: "date", nullable: false),
LessonNumber = table.Column<int>(type: "integer", nullable: false),
GroupId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_PresenceDaos", x => x.PresenceId);
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "Users", name: "Users",
columns: table => new columns: table => new
@ -45,33 +62,6 @@ namespace Demo.Migrations
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.CreateTable(
name: "PresenceDaos",
columns: table => new
{
UserId = table.Column<int>(type: "integer", nullable: false),
IsAttedance = table.Column<bool>(type: "boolean", nullable: false),
Date = table.Column<DateOnly>(type: "date", nullable: false),
LessonNumber = table.Column<int>(type: "integer", nullable: false),
UserDaoUserId = table.Column<int>(type: "integer", nullable: false),
GroupId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_PresenceDaos", x => new { x.UserId, x.Date, x.IsAttedance, x.LessonNumber });
table.ForeignKey(
name: "FK_PresenceDaos_Users_UserDaoUserId",
column: x => x.UserDaoUserId,
principalTable: "Users",
principalColumn: "UserId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_PresenceDaos_UserDaoUserId",
table: "PresenceDaos",
column: "UserDaoUserId");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Users_GroupId", name: "IX_Users_GroupId",
table: "Users", table: "Users",

View File

@ -41,27 +41,28 @@ namespace Demo.Migrations
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b => modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
{ {
b.Property<int>("UserId") b.Property<int>("PresenceId")
.ValueGeneratedOnAdd()
.HasColumnType("integer"); .HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("PresenceId"));
b.Property<DateOnly>("Date") b.Property<DateOnly>("Date")
.HasColumnType("date"); .HasColumnType("date");
b.Property<int>("GroupId")
.HasColumnType("integer");
b.Property<bool>("IsAttedance") b.Property<bool>("IsAttedance")
.HasColumnType("boolean"); .HasColumnType("boolean");
b.Property<int>("LessonNumber") b.Property<int>("LessonNumber")
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<int>("GroupId") b.Property<int>("UserId")
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<int>("UserDaoUserId") b.HasKey("PresenceId");
.HasColumnType("integer");
b.HasKey("UserId", "Date", "IsAttedance", "LessonNumber");
b.HasIndex("UserDaoUserId");
b.ToTable("PresenceDaos"); b.ToTable("PresenceDaos");
}); });
@ -88,17 +89,6 @@ namespace Demo.Migrations
b.ToTable("Users"); b.ToTable("Users");
}); });
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
{
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", "UserDao")
.WithMany()
.HasForeignKey("UserDaoUserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("UserDao");
});
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b => modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
{ {
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group") b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group")

View File

@ -47,13 +47,6 @@ namespace Demo.UI
} }
} }
public void RemoveGroup(string groupIdStr)
{
int groupId = int.Parse(groupIdStr);
_groupUseCase.RemoveGroupById(groupId);
Console.WriteLine($"Группа с ID: {groupId} удалена");
}
// Метод для обновления названия группы // Метод для обновления названия группы
public void UpdateGroupName(int groupId, string newGroupName) public void UpdateGroupName(int groupId, string newGroupName)
{ {

View File

@ -1,6 +1,7 @@
using Demo.domain.Models; using Demo.domain.Models;
using Demo.Domain.UseCase; using Demo.Domain.UseCase;
using System; using System;
using System.Globalization;
namespace Demo.UI namespace Demo.UI
{ {
@ -33,16 +34,15 @@ namespace Demo.UI
Console.WriteLine("=-= Команды с Группами =-="); Console.WriteLine("=-= Команды с Группами =-=");
Console.WriteLine("5. Вывести все группы"); Console.WriteLine("5. Вывести все группы");
Console.WriteLine("6. Добавить группу"); Console.WriteLine("6. Добавить группу");
Console.WriteLine("7. Удалить группу"); Console.WriteLine("7. Изменить название группы");
Console.WriteLine("8. Изменить название группы"); Console.WriteLine("8. Поиск группы по ID");
Console.WriteLine("9. Поиск группы по ID");
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("=-= Команды Presence =-="); Console.WriteLine("=-= Команды Presence =-=");
Console.WriteLine("10. Сгенерировать посещаемость на день"); Console.WriteLine("9. Сгенерировать посещаемость на день");
Console.WriteLine("11. Сгенерировать посещаемость на неделю"); Console.WriteLine("10. Сгенерировать посещаемость на неделю");
Console.WriteLine("12. Показать посещаемость"); Console.WriteLine("11. Показать посещаемость");
Console.WriteLine("13. Отметить пользователя как отсутствующего"); Console.WriteLine("12. Отметить пользователя как отсутствующего");
Console.WriteLine("14. Вывести всю посещаемость группы"); Console.WriteLine("13. Вывести всю посещаемость группы");
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("0. Выход"); Console.WriteLine("0. Выход");
@ -71,19 +71,19 @@ namespace Demo.UI
} }
break; break;
//case "3": case "3":
// // Обновление пользователя по ID // Обновление пользователя по ID
// Console.Write("Введите ID пользователя для обновления: "); Console.Write("Введите ID пользователя для обновления: ");
// string updateIdInput = Console.ReadLine(); string updateIdInput = Console.ReadLine();
// if (int.TryParse(updateIdInput, out int updateUserId)) if (int.TryParse(updateIdInput, out int updateUserId))
// { {
// _userConsoleUI.UpdateUserById(updateUserId); _userConsoleUI.UpdateUserById(updateUserId);
// } }
// else else
// { {
// Console.WriteLine("Неверный формат ID"); Console.WriteLine("Неверный формат ID");
// } }
// break; break;
case "4": case "4":
// Поиск пользователя по ID // Поиск пользователя по ID
@ -112,13 +112,6 @@ namespace Demo.UI
break; break;
case "7": case "7":
// Удаление группы
Console.Write("Введите ID группы для удаления: ");
string groupIdForDelete = Console.ReadLine();
_groupConsoleUI.RemoveGroup(groupIdForDelete);
break;
case "8":
// Изменение названия группы // Изменение названия группы
Console.Write("Введите ID группы для изменения: "); Console.Write("Введите ID группы для изменения: ");
if (int.TryParse(Console.ReadLine(), out int groupId)) if (int.TryParse(Console.ReadLine(), out int groupId))
@ -133,7 +126,7 @@ namespace Demo.UI
} }
break; break;
case "9": case "8":
// Поиск группы // Поиск группы
Console.Write("Введите ID группы для поиска : "); Console.Write("Введите ID группы для поиска : ");
if (int.TryParse(Console.ReadLine(), out int IdGroup)) if (int.TryParse(Console.ReadLine(), out int IdGroup))
@ -142,7 +135,7 @@ namespace Demo.UI
} }
break; break;
case "10": case "9":
// Генерация посещаемости на день // Генерация посещаемости на день
Console.Write("Введите номер первого занятия: "); Console.Write("Введите номер первого занятия: ");
int firstLesson = int.Parse(Console.ReadLine()); int firstLesson = int.Parse(Console.ReadLine());
@ -155,7 +148,7 @@ namespace Demo.UI
Console.WriteLine("Посещаемость на день сгенерирована."); Console.WriteLine("Посещаемость на день сгенерирована.");
break; break;
case "11": case "10":
// Генерация посещаемости на неделю // Генерация посещаемости на неделю
Console.Write("Введите номер первого занятия: "); Console.Write("Введите номер первого занятия: ");
int firstLessonForWeek = int.Parse(Console.ReadLine()); int firstLessonForWeek = int.Parse(Console.ReadLine());
@ -168,7 +161,7 @@ namespace Demo.UI
Console.WriteLine("Посещаемость на неделю сгенерирована."); Console.WriteLine("Посещаемость на неделю сгенерирована.");
break; break;
case "12": case "11":
// Отображение посещаемости // Отображение посещаемости
Console.Write("Введите дату (гггг-мм-дд): "); Console.Write("Введите дату (гггг-мм-дд): ");
DateTime date = DateTime.Parse(Console.ReadLine()); DateTime date = DateTime.Parse(Console.ReadLine());
@ -178,7 +171,7 @@ namespace Demo.UI
_presenceConsoleUI.DisplayPresence(date, groupForPresenceView); _presenceConsoleUI.DisplayPresence(date, groupForPresenceView);
break; break;
case "13": case "12":
// Отметить пользователя как отсутствующего // Отметить пользователя как отсутствующего
Console.Write("Введите ID пользователя: "); Console.Write("Введите ID пользователя: ");
userId = int.Parse(Console.ReadLine()); userId = int.Parse(Console.ReadLine());
@ -189,11 +182,22 @@ namespace Demo.UI
Console.Write("Введите ID группы: "); Console.Write("Введите ID группы: ");
int absGroupId = int.Parse(Console.ReadLine()); int absGroupId = int.Parse(Console.ReadLine());
_presenceConsoleUI.MarkUserAbsent(DateTime.Now, absGroupId, userId, firstAbsLesson, lastAbsLesson); Console.Write("Введите дату (дд.мм.гггг): ");
string dateInput = Console.ReadLine();
DateTime absenceDate;
if (!DateTime.TryParseExact(dateInput, "d.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out absenceDate))
{
Console.WriteLine("Ошибка: Введен некорректный формат даты. Пожалуйста, используйте формат дд.мм.гггг.");
return; // Завершает выполнение, если дата некорректна
}
_presenceConsoleUI.MarkUserAbsent(absenceDate, absGroupId, userId, firstAbsLesson, lastAbsLesson);
Console.WriteLine("Пользователь отмечен как отсутствующий."); Console.WriteLine("Пользователь отмечен как отсутствующий.");
break; break;
case "14":
case "13":
Console.Write("Введите ID группы: "); Console.Write("Введите ID группы: ");
int groupIdForAllPresence = int.Parse(Console.ReadLine()); int groupIdForAllPresence = int.Parse(Console.ReadLine());
_presenceConsoleUI.DisplayAllPresenceByGroup(groupIdForAllPresence); _presenceConsoleUI.DisplayAllPresenceByGroup(groupIdForAllPresence);

View File

@ -20,7 +20,7 @@ namespace Demo.UI
{ {
try try
{ {
_presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId, date); _presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId);
Console.WriteLine("Посещаемость на день успешно сгенерирована."); Console.WriteLine("Посещаемость на день успешно сгенерирована.");
} }
catch (Exception ex) catch (Exception ex)
@ -56,26 +56,31 @@ namespace Demo.UI
return; return;
} }
// Сортируем присутствия по номеру занятия и ID пользователя
var sortedPresences = presences.OrderBy(p => p.LessonNumber)
.ThenBy(p => p.UserId);
Console.WriteLine($"\nПосещаемость на {date.ToShortDateString()} для группы с ID {groupId}:"); Console.WriteLine($"\nПосещаемость на {date.ToShortDateString()} для группы с ID {groupId}:");
Console.WriteLine("---------------------------------------------"); Console.WriteLine("---------------------------------------------");
int a = presences[0].LessonNumber;
foreach (var presence in presences) int previousLessonNumber = -1; // Инициализация для сравнения
foreach (var presence in sortedPresences)
{ {
if (a != presence.LessonNumber) if (previousLessonNumber != presence.LessonNumber)
{ {
Console.WriteLine("---------------------------------------------"); Console.WriteLine("---------------------------------------------");
a = presence.LessonNumber; previousLessonNumber = presence.LessonNumber;
} }
string status = presence.IsAttedance ? "Присутствует" : "Отсутствует"; string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
Console.WriteLine($"Пользователь ID: {presence.UserId}, Занятие {presence.LessonNumber}: {status}"); Console.WriteLine($"Пользователь ID: {presence.UserId}, Занятие {presence.LessonNumber}: {status}");
} }
Console.WriteLine("---------------------------------------------"); Console.WriteLine("---------------------------------------------");
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine($"Ошибка при выводе посещаемости: {ex.Message}"); Console.WriteLine($"Ошибка при выводе посещаемости: {ex.Message}");
} }
} }
public void MarkUserAbsent(DateTime date, int groupId, int userId, int firstLesson, int lastLesson) public void MarkUserAbsent(DateTime date, int groupId, int userId, int firstLesson, int lastLesson)
@ -90,35 +95,46 @@ namespace Demo.UI
{ {
try try
{ {
var presences = _presenceUseCase.GetAllPresenceByGroup(groupId); // Получаем все посещения для группы
var presences = _presenceUseCase.GetAllPresenceByGroup(groupId);
if (presences == null || presences.Count == 0)
{
Console.WriteLine($"Посещаемость для группы с ID {groupId} отсутствует.");
return;
}
// Группируем по дате
var groupedPresences = presences.GroupBy(p => p.Date);
if (presences == null || !presences.Any())
{
Console.WriteLine($"Посещаемость для группы с ID {groupId} отсутствует.");
return;
}
int a = presences[0].LessonNumber;
// Группируем по дате
var groupedPresences = presences.GroupBy(p => p.Date);
foreach (var group in groupedPresences) foreach (var group in groupedPresences)
{ {
Console.WriteLine("==================================================="); Console.WriteLine("===================================================");
Console.WriteLine($"Дата: {group.Key.ToString("dd.MM.yyyy")}"); Console.WriteLine($"Дата: {group.Key.ToString("dd.MM.yyyy")}");
Console.WriteLine("==================================================="); Console.WriteLine("===================================================");
foreach (var presence in group) // Группируем по занятию
{ var groupedByLesson = group.GroupBy(p => p.LessonNumber);
if (a != presence.LessonNumber)
{
Console.WriteLine("---------------------------------------------------");
a= presence.LessonNumber;
}
string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
Console.WriteLine($"Пользователь ID: {presence.UserId}, Занятие {presence.LessonNumber}: {status}");
}
Console.WriteLine("---------------------------------------------------"); foreach (var lessonGroup in groupedByLesson)
{
Console.WriteLine($"Занятие {lessonGroup.Key}:");
// Создаем HashSet для уникальных пользователей
var userIds = new HashSet<int>();
foreach (var presence in lessonGroup)
{
// Проверяем, добавляется ли пользователь в HashSet
if (userIds.Add(presence.UserId))
{
string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
Console.WriteLine($"Пользователь ID: {presence.UserId}, Статус: {status}");
}
}
Console.WriteLine("---------------------------------------------------");
}
} }
} }
catch (Exception ex) catch (Exception ex)

View File

@ -36,26 +36,27 @@ namespace Demo.UI
} }
// Метод для обновления пользователя по ID // Метод для обновления пользователя по ID
//public void UpdateUserById(int userId) public void UpdateUserById(int userId)
//{ {
// try try
// { {
// var user = _userUseCase.FindUserById(userId); var user = _userUseCase.FindUserById(userId);
// Console.WriteLine($"Текущие данные: {user.FIO}, {user.Group.Name}");
// Console.Write("\nВведите новое ФИО: ");
// string newFIO = Console.ReadLine();
// user.FIO = newFIO; Console.WriteLine($"Текущие данные: {user.FIO}");
// _userUseCase.UpdateUser(user); Console.Write("\nВведите новое ФИО: ");
string newFIO = Console.ReadLine();
// Console.WriteLine("\nПользователь обновлен.\n"); user.FIO = newFIO;
// } _userUseCase.UpdateUser(user);
// catch (Exception ex)
// { Console.WriteLine("\nПользователь обновлен.\n");
// Console.WriteLine($"Ошибка: {ex.Message}\n"); }
// } catch (Exception ex)
//} {
Console.WriteLine($"Ошибка: {ex.Message}\n");
}
}
// Метод для поиска пользователя по ID // Метод для поиска пользователя по ID
public void FindUserById(int userId) public void FindUserById(int userId)
@ -63,7 +64,7 @@ namespace Demo.UI
var user = _userUseCase.FindUserById(userId); var user = _userUseCase.FindUserById(userId);
if (user != null) if (user != null)
{ {
Console.WriteLine($"\nПользователь найден: {user.ID}, {user.FIO}, {user.Group.Name}\n"); Console.WriteLine($"\nПользователь найден: {user.UserId}, {user.FIO}, {user.Group.Name}\n");
} }
else else
{ {

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("Demo")] [assembly: System.Reflection.AssemblyCompanyAttribute("Demo")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4aa192ee8817fa90eef0a643199a140baea5f367")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5f424596e2b0fa84375965a237d76913c98a016f")]
[assembly: System.Reflection.AssemblyProductAttribute("Demo")] [assembly: System.Reflection.AssemblyProductAttribute("Demo")]
[assembly: System.Reflection.AssemblyTitleAttribute("Demo")] [assembly: System.Reflection.AssemblyTitleAttribute("Demo")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
d0ff50a2b7329f08a99a7d850fd97c7e85ea6c3c244d5b7af843a712fd92af39 e42cc116f635190b7c9988c97519c211c4b2432424ca6ac866ba04673b9f3fa7

View File

@ -1 +1 @@
30504035d845e5616feb21a777025026c55555e88052b83a111a265004d6549d 1e41011bf1bd18b43960533c1b9a8180853e639316cffb41dabd64b373687e5e

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.