Compare commits

..

5 Commits

143 changed files with 4563 additions and 163 deletions

View File

View File

@ -7,9 +7,9 @@ using System.Threading.Tasks;
namespace Posechaemost.Data.LocalData.Entity
{
public class PresenceLocalEntity{
public DateOnly Date {get; set;}
public required DateOnly Date {get; set;}
public int ClassNumber {get; set;}
public bool IsAttendence {get; set;}
public bool IsAttendence {get; set;} = true;
public required Guid UserGuid {get; set;}
}
}

0
Data/LocalData/Entity/User.cs → Data/Entity/User.cs Normal file → Executable file
View File

7
Data/LocalData/LocalStaticData.cs Normal file → Executable file
View File

@ -27,5 +27,12 @@ namespace Posechaemost.Data.LocalData
new UserLocalEntity{Guid=Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), FIO = "RandomFio4", GroupID = 2 },
new UserLocalEntity{Guid=Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), FIO = "RandomFio5", GroupID = 3 },
};
public static List<PresenceLocalEntity> presences = new List<PresenceLocalEntity>
{
new PresenceLocalEntity{Date= new DateOnly(2024, 12, 31), ClassNumber=1, UserGuid = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9")},
new PresenceLocalEntity{Date= new DateOnly(2024, 12, 31), ClassNumber=2, UserGuid = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9")},
new PresenceLocalEntity{Date= new DateOnly(2024, 12, 31), ClassNumber=3, IsAttendence=false, UserGuid = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9")}
};
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Posechaemost.Data.RemoteData.RemoteDataBase.DAO
{
public class GroupDao
{
public int Id {get; set;}
public required string Name {get; set;}
public IEnumerable<UserDao> User {get; set;}
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Posechaemost.Data.RemoteData.RemoteDataBase.DAO
{
public class PresenceDao
{
public int PresenceId { get; set; }
public DateOnly Date {get; set;}
public int ClassNumber {get; set;}
public bool IsAttendence {get; set;} = true;
public int UserId {get; set;}
public UserDao User {get; set;}
public int GroupId {get; set;}
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Posechaemost.Data.RemoteData.RemoteDataBase.DAO
{
public class UserDao
{
public required string FIO {get; set; }
public int UserId { get; set; }
public required int GroupId {get; set;}
public GroupDao Group {get; set;}
public IEnumerable<PresenceDao> Presences { get; set; }
}
}

View File

@ -0,0 +1,36 @@
using Microsoft.EntityFrameworkCore;
using Posechaemost.Data.RemoteData.RemoteDataBase.DAO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Posechaemost.Data.RemoteData.RemoteDataBase
{
public class RemoteDataBaseContext: DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){
optionsBuilder.UseNpgsql("Host=localhost; Port=5432; Database=presencedb; Username=postgres; Password=123");
}
protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.Entity<GroupDao>().HasKey(group => group.Id);
modelBuilder.Entity<GroupDao>().Property(group => group.Id).ValueGeneratedOnAdd();
modelBuilder.Entity<UserDao>().HasKey(user => user.UserId);
modelBuilder.Entity<UserDao>().Property(user => user.UserId).ValueGeneratedOnAdd();
modelBuilder.Entity<PresenceDao>().HasKey(presence =>presence.PresenceId);
modelBuilder.Entity<PresenceDao>().Property(presence=>presence.PresenceId).ValueGeneratedOnAdd();
modelBuilder.Entity<PresenceDao>()
.HasOne(presence => presence.User)
.WithMany(user => user.Presences)
.HasForeignKey(presence => presence.UserId);
}
public DbSet<GroupDao> Groups { get; set; }
public DbSet<UserDao> Users { get; set; }
public DbSet<PresenceDao> Presences { get; set; }
}
}

115
Data/Repository/GroupRepositoryImpl.cs Normal file → Executable file
View File

@ -1,85 +1,92 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Posechaemost.Data.LocalData;
using Posechaemost.Data.LocalData.Entity;
using Posechaemost.Data.RemoteData.RemoteDataBase;
using Posechaemost.Data.RemoteData.RemoteDataBase.DAO;
namespace Posechaemost.Data.Repository
{
public class GroupRepositoryImpl: IGroupRepository
public class SQLGroupRepositoryImpl : IGroupRepository
{
private readonly RemoteDataBaseContext _remoteDatabaseContext;
public bool AddGroup(String name, String id)
public SQLGroupRepositoryImpl(RemoteDataBaseContext remoteDatabaseContext)
{
GroupLocalEntity? groupLocal = GetAllGroups().FirstOrDefault();
// GroupLocalEntity? group = new GroupLocalEntity();
groupLocal.Name = name;
groupLocal.Id = int.Parse(id);
_remoteDatabaseContext = remoteDatabaseContext;
}
public bool AddGroup(GroupDao group)
{
var groupDao = new GroupDao
{
Name = group.Name
};
_remoteDatabaseContext.Groups.Add(groupDao);
_remoteDatabaseContext.SaveChanges();
return true;
}
public List<GroupLocalEntity> GetAllGroup()
public List<GroupDao> GetAllGroup()
{
throw new NotImplementedException();
return _remoteDatabaseContext.Groups
.Include(g => g.User)
.Select(g => new GroupDao
{
Name = g.Name,
Id = g.Id,
User = g.User.Select(u => new UserDao
{
UserId = u.UserId,
FIO = u.FIO,
GroupId = u.GroupId,
}).ToList()
}).ToList();
}
public List<GroupLocalEntity> GetAllGroups() => LocalStaticData.groups;
public GroupLocalEntity GetGroupById(int groupID)
public GroupDao GetGroupById(int groupID)
{
GroupLocalEntity groupLocal = GetAllGroups()
.Where(x => x.Id == groupID).FirstOrDefault();
var groupLocal = _remoteDatabaseContext.Groups
.Where(g => g.Id == groupID).FirstOrDefault();
if (groupLocal == null) return null;
return groupLocal;
}
public bool RemoveGroupById(int groupID){
GroupLocalEntity? groupLocal = GetAllGroups()
.Where(x => x.Id == groupID).FirstOrDefault();
if (groupLocal == null) return false;
return GetAllGroups().Remove(groupLocal);
}
// public GroupLocalEntity? AddGroup(String name, String id) //не работает
// {
// GroupLocalEntity? groupLocal = GetAllGroups()
// .Where(x => x.Id == groupID).FirstOrDefault();
// if (groupLocal == null) return false;
// return GetAllGroups().Remove(groupLocal);
// }
public bool UpdateGroupById(int groupID, String name)
public bool RemoveGroupById(int groupID)
{
GroupLocalEntity? groupLocal = GetAllGroups()
var groupLocal = _remoteDatabaseContext.Groups
.Where(x => x.Id == groupID).FirstOrDefault();
if (groupLocal == null) return false;
_remoteDatabaseContext.Groups.Remove(groupLocal);
_remoteDatabaseContext.SaveChanges();
return true;
}
public bool UpdateGroupById(int groupID, string name)
{
var groupLocal = _remoteDatabaseContext.Groups
.Include(g => g.User)
.Where(x => x.Id == groupID).FirstOrDefault();
if (groupLocal == null) return false;
groupLocal.Name = name;
groupLocal.User = _remoteDatabaseContext.Users
.Where(x => x.GroupId == groupLocal.Id)
.Select(user => new UserDao
{
UserId = user.UserId,
FIO = user.FIO,
GroupId = user.GroupId
}).ToList();
_remoteDatabaseContext.SaveChanges();
return true;
}
}
}
// {
// public List<GroupLocalEntity> GetAllGroups() => LocalStaticData.groups;
// public GroupLocalEntity? UpdateGroup(String name)
// {
// GroupLocalEntity? groupLocal = GetAllGroups()
// .Where(x => x.Name == name).FirstOrDefault();
// if (groupLocal == null) return null;
// groupLocal.Name = name;
// return groupLocal;
// }
// public GroupLocalEntity? AddGroup(String name, String id)
// {
// GroupLocalEntity? groupLocal = GetAllGroups().FirstOrDefault();
// // GroupLocalEntity? group = new GroupLocalEntity(name, id);
// groupLocal.Name = name;
// groupLocal.Id = int.Parse(id);
// return groupLocal;
// }
// }

7
Data/Repository/IGroupRepository.cs Normal file → Executable file
View File

@ -4,14 +4,15 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Posechaemost.Data.LocalData.Entity;
using Posechaemost.Data.RemoteData.RemoteDataBase.DAO;
namespace Posechaemost.Data.Repository {
public interface IGroupRepository
{
List<GroupLocalEntity> GetAllGroup();
List<GroupDao> GetAllGroup();
bool RemoveGroupById(int groupID);
bool UpdateGroupById(int groupID, String name);
GroupLocalEntity GetGroupById(int groupID);
bool AddGroup(String name, String id);
GroupDao GetGroupById(int groupID);
bool AddGroup(GroupDao group);
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Posechaemost.Data.LocalData.Entity;
using Posechaemost.Data.RemoteData.RemoteDataBase.DAO;
using Posechaemost.Domain.Models;
namespace Posechaemost.Data.Repository
{
public interface IPresenceRepository
{
List<PresenceDao> GetPresenceByGroup(int groupId);
List<PresenceDao> GetPresenceByGroupAndDate(int groupId, DateOnly date);
bool UncheckAttendence(int firstClass, int lastClass, DateOnly date, int userId);
bool AddPresence(PresenceDao presence);
}
}

11
Data/Repository/IUserRepository.cs Normal file → Executable file
View File

@ -4,14 +4,15 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Posechaemost.Data.LocalData.Entity;
using Posechaemost.Data.RemoteData.RemoteDataBase.DAO;
namespace Posechaemost.Data.Repository {
public interface IUserRepository
{
List<UserLocalEntity> GetAllUser();
bool RemoveUserByGuid(Guid userGuid);
UserLocalEntity? GetUserByGuid(Guid userGuid);
UserLocalEntity? UpdateUser(UserLocalEntity userUpdateLocalEnity);
UserLocalEntity? UpdateUserByGuid(Guid userGuid);
List<UserDao> GetAllUser();
bool RemoveUserById(int usesId);
UserDao GetUserById(int userId);
bool UpdateUser(UserDao userUpdate);
bool UpdateUserById(int userId, string fio, int groupId);
}
}

View File

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Posechaemost.Data.LocalData;
using Posechaemost.Data.LocalData.Entity;
using Posechaemost.Data.RemoteData.RemoteDataBase;
using Posechaemost.Data.RemoteData.RemoteDataBase.DAO;
using Posechaemost.Domain.Models;
namespace Posechaemost.Data.Repository
{
public class SQLPresenceRepositoryImpl: IPresenceRepository
{
private readonly RemoteDataBaseContext _remoteDatabaseContext;
public SQLPresenceRepositoryImpl(RemoteDataBaseContext remoteDatabaseContext)
{
_remoteDatabaseContext = remoteDatabaseContext;
}
public bool AddPresence(PresenceDao presence)
{
var presenceDao = new PresenceDao
{
Date = presence.Date,
ClassNumber = presence.ClassNumber,
UserId = presence.UserId,
User = presence.User
};
_remoteDatabaseContext.Presences.Add(presenceDao);
_remoteDatabaseContext.SaveChanges();
return true;
}
public List<PresenceDao> GetPresenceByGroup(int groupId)
{
var listPresences = _remoteDatabaseContext.Presences
.Where(x => x.GroupId == groupId).ToList();
return listPresences;
}
public List<PresenceDao> GetPresenceByGroupAndDate(int groupId, DateOnly date)
{
var listPresences = _remoteDatabaseContext.Presences
.Where(x => x.GroupId == groupId && x.Date == date).ToList();
return listPresences;
}
public bool UncheckAttendence(int firstClass, int lastClass, DateOnly date, int userId)
{
var presToUpdate = _remoteDatabaseContext.Presences
.Where(x => x.UserId == userId && x.ClassNumber >= firstClass
&& x.ClassNumber <= lastClass && x.Date == date).ToList();
foreach (var pres in presToUpdate) {
pres.IsAttendence = false;
}
_remoteDatabaseContext.SaveChanges();
return true;
}
}
}

69
Data/Repository/UserRepositoryImpl.cs Normal file → Executable file
View File

@ -3,58 +3,73 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Posechaemost.Data.LocalData;
using Posechaemost.Data.LocalData.Entity;
using Posechaemost.Data.RemoteData.RemoteDataBase;
using Posechaemost.Data.RemoteData.RemoteDataBase.DAO;
namespace Posechaemost.Data.Repository
{
public class UserRepositoryImpl: IUserRepository
public class SQLUserRepositoryImpl: IUserRepository
{
public UserRepositoryImpl() {
GetAllUsers = LocalStaticData.users;
private readonly RemoteDataBaseContext _remoteDatabaseContext;
public SQLUserRepositoryImpl(RemoteDataBaseContext remoteDatabaseContext)
{
_remoteDatabaseContext = remoteDatabaseContext;
}
public List<UserLocalEntity> GetAllUser()
public List<UserDao> GetAllUser()
{
throw new NotImplementedException();
return _remoteDatabaseContext.Users.Select(u => new UserDao
{
FIO = u.FIO,
UserId = u.UserId,
GroupId = u.GroupId
}).ToList();
}
public List<UserLocalEntity> GetAllUsers
{ get; set; }
public bool RemoveUserByGuid(Guid userGuid)
public bool RemoveUserById(int userId)
{
UserLocalEntity? userLocal = GetAllUsers
.Where(x => x.Guid == userGuid).FirstOrDefault();
var userLocal = _remoteDatabaseContext.Users
.Where(x => x.UserId== userId).FirstOrDefault();
if (userLocal == null) return false;
return GetAllUsers.Remove(userLocal);
_remoteDatabaseContext.Users.Remove(userLocal);
_remoteDatabaseContext.SaveChanges();
return true;
}
public UserLocalEntity? GetUserByGuid(Guid userGuid) {
UserLocalEntity? userLocal = GetAllUsers
.Where(x => x.Guid == userGuid).FirstOrDefault();
public UserDao GetUserById (int userId) {
var userLocal = _remoteDatabaseContext.Users
.Where(x => x.UserId == userId).FirstOrDefault();
if (userLocal == null) return null;
return userLocal;
}
public UserLocalEntity? UpdateUser(UserLocalEntity userUpdateLocalEnity) {
UserLocalEntity? userLocal = GetAllUsers
.Where(x => x.Guid == userUpdateLocalEnity.Guid).FirstOrDefault();
if (userLocal == null) return null;
userLocal.FIO = userUpdateLocalEnity.FIO;
userLocal.GroupID = userUpdateLocalEnity.GroupID;
return userLocal;
public bool UpdateUser(UserDao userUpdate) {
var userLocal = _remoteDatabaseContext.Users
.Where(x => x.UserId == userUpdate.UserId).FirstOrDefault();
if (userLocal == null) return false;
userLocal.FIO = userUpdate.FIO;
userLocal.GroupId = userUpdate.GroupId;
_remoteDatabaseContext.SaveChanges();
return true;
}
public UserLocalEntity? UpdateUserByGuid(Guid userGuid) {
UserLocalEntity? userLocal = GetAllUsers
.Where(x => x.Guid == userGuid).FirstOrDefault();
if (userLocal == null) return null;
return userLocal;
public bool UpdateUserById(int userId, string fio, int groupId) {
var userLocal = _remoteDatabaseContext.Users
.Where(x => x.UserId == userId).FirstOrDefault();
if (userLocal == null) return false;
userLocal.FIO = fio;
userLocal.GroupId = groupId;
_remoteDatabaseContext.SaveChanges();
return true;
}
}
}

0
Domain/Models/Group.cs Normal file → Executable file
View File

2
Domain/Models/Presence.cs Normal file → Executable file
View File

@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace Posechaemost.Domain.Models
{
public class Presence{
public DateOnly Date {get; set;}
public required DateOnly Date {get; set;}
public int ClassNumber {get; set;}
public bool IsAttendence {get; set;}
public required User User {get; set;}

0
Domain/Models/User.cs Normal file → Executable file
View File

11
Domain/UseCase/GroupUseCase.cs Normal file → Executable file
View File

@ -1,4 +1,5 @@
using Posechaemost.Data.LocalData.Entity;
using Posechaemost.Data.RemoteData.RemoteDataBase.DAO;
using Posechaemost.Data.Repository;
using Posechaemost.Domain.Models;
using System;
@ -11,22 +12,22 @@ namespace Posechaemost.Domain.UseCase
{
public class GroupUseCase
{
private GroupRepositoryImpl _repositoryGroupImpl;
private IGroupRepository _repositoryGroupImpl;
public GroupUseCase(GroupRepositoryImpl repositoryGroupImpl)
public GroupUseCase(IGroupRepository repositoryGroupImpl)
{
_repositoryGroupImpl = repositoryGroupImpl;
}
public List<Group> GetAllGroups() => _repositoryGroupImpl.GetAllGroups()
.Select(it => new Group { Id = it.Id, Name = it.Name}).ToList();
public List<GroupDao> GetAllGroups() => _repositoryGroupImpl.GetAllGroup()
.Select(it => new GroupDao { Id = it.Id, Name = it.Name}).ToList();
public bool UpdateGroupName(String id, String name1) {
return _repositoryGroupImpl.UpdateGroupById(int.Parse(id), name1);
}
public bool AddGroup(String name, String id)
{
return _repositoryGroupImpl.AddGroup(name, id);
return _repositoryGroupImpl.AddGroup(new GroupDao { Name = name, Id = int.Parse(id) });
}
}
}

152
Domain/UseCase/PresenceUseCase.cs Executable file
View File

@ -0,0 +1,152 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Posechaemost.Data.LocalData.Entity;
using Posechaemost.Data.RemoteData.RemoteDataBase.DAO;
using Posechaemost.Data.Repository;
using Posechaemost.Domain.Models;
namespace Posechaemost.Domain.UseCase
{
public class PresenceUseCase
{
public readonly IUserRepository _userRepository;
public readonly IPresenceRepository _presenceRepository;
private readonly IGroupRepository _groupRepository;
public PresenceUseCase(IPresenceRepository repositoryImpl,
IUserRepository userRepositoryImpl,
IGroupRepository groupRepositoryImpl) {
_presenceRepository = repositoryImpl;
_userRepository = userRepositoryImpl;
_groupRepository = groupRepositoryImpl;
}
public List<PresenceDao> GetPresenceByGroup(int groupId) {
var users = _userRepository.GetAllUser().Where(x => x.GroupId == groupId).ToList();
var presenceByGroup = _presenceRepository.GetPresenceByGroup(groupId)
.Where(x => users.Any(user => user.UserId == x.UserId))
.Select(presence => new PresenceDao{
User = new UserDao{
UserId = presence.UserId,
GroupId = groupId,
FIO = users.First(user => user.UserId == presence.UserId).FIO,
},
ClassNumber = presence.ClassNumber,
Date = presence.Date,
IsAttendence = presence.IsAttendence
}).ToList();
return presenceByGroup;
}
public List<PresenceDao> GetPresenceByGroupAndDate(int groupId, DateOnly date) {
var users = _userRepository.GetAllUser().Where(x => x.GroupId == groupId).ToList();
var presenceByGroupAndDate = _presenceRepository.GetPresenceByGroupAndDate(groupId, date)
.Where(x => users.Any(user => user.UserId == x.UserId && x.Date == date))
.Select(presence => new PresenceDao{
User = new UserDao{
UserId = presence.UserId,
GroupId = groupId,
FIO = users.First(user => user.UserId == presence.UserId).FIO,
},
ClassNumber = presence.ClassNumber,
Date = presence.Date,
IsAttendence = presence.IsAttendence
}).ToList();
return presenceByGroupAndDate;
}
public bool UncheckAttendence(int firstClass, int lastClass, DateOnly date, int userId) {
return _presenceRepository.UncheckAttendence(firstClass, lastClass, date, userId);
}
public void AddPresence(int firstClass, int lastClass, int groupId,DateOnly date)
{
var users = _userRepository.GetAllUser().Where(x => x.GroupId==groupId).ToList();
List<PresenceDao> presenceList = new List<PresenceDao>();
for (int i = firstClass; i < lastClass; i++)
{
foreach (var user in users)
{
PresenceDao pres = new PresenceDao{ClassNumber = i, Date = date, UserId = user.UserId, User = user};
presenceList.Add(pres);
}
}
}
public Dictionary<string, int> GetPresenceStatsByGroup(int groupId)
{
var stats = new Dictionary<string, int>();
// Получаем всех студентов группы
var users = _userRepository.GetAllUser().Where(x => x.GroupId == groupId).ToList();
stats["Количество студентов"] = users.Count;
// Получаем все записи посещаемости для группы
var presences = _presenceRepository.GetPresenceByGroup(groupId);
// Считаем количество уникальных занятий
var uniqueLessons = presences
.Select(p => new { p.Date, p.ClassNumber })
.Distinct()
.Count();
stats["Количество занятий"] = uniqueLessons;
// Считаем общую посещаемость
var totalAttendances = presences.Count(p => p.IsAttendence);
var totalPossibleAttendances = users.Count * uniqueLessons;
if (totalPossibleAttendances > 0)
{
var attendancePercentage = (totalAttendances * 100) / totalPossibleAttendances;
stats["Процент посещаемости"] = attendancePercentage;
}
else
{
stats["Процент посещаемости"] = 0;
}
return stats;
}
public void GenerateWeeklyPresence(int firstClass, int lastClass, int groupId, DateOnly startDate)
{
// Получаем всех студентов группы
var users = _userRepository.GetAllUser().Where(x => x.GroupId == groupId).ToList();
// Генерируем посещаемость на 7 дней
for (int day = 0; day < 7; day++)
{
var currentDate = startDate.AddDays(day);
// Пропускаем выходные дни (суббота и воскресенье)
if (currentDate.DayOfWeek == DayOfWeek.Saturday ||
currentDate.DayOfWeek == DayOfWeek.Sunday)
{
continue;
}
// Для каждой пары в диапазоне
for (int classNum = firstClass; classNum <= lastClass; classNum++)
{
foreach (var user in users)
{
var presence = new PresenceDao
{
ClassNumber = classNum,
Date = currentDate,
UserId = user.UserId,
User = user,
GroupId = groupId
};
_presenceRepository.AddPresence(presence);
}
}
}
}
}
}

47
Domain/UseCase/UserUseCase.cs Normal file → Executable file
View File

@ -1,4 +1,5 @@
using Posechaemost.Data.LocalData.Entity;
using Posechaemost.Data.RemoteData.RemoteDataBase.DAO;
using Posechaemost.Data.Repository;
using Posechaemost.Domain.Models;
using System;
@ -12,50 +13,44 @@ namespace Posechaemost.Domain.UseCase
public class UserUseCase
{
private readonly UserRepositoryImpl _repositoryUserImpl;
private readonly IUserRepository _repositoryUserImpl;
private readonly IGroupRepository _repositoryGroupImpl;
public UserUseCase(UserRepositoryImpl repositoryImpl, GroupRepositoryImpl repositoryGroupImpl)
public UserUseCase(IUserRepository repositoryImpl, IGroupRepository repositoryGroupImpl)
{
_repositoryUserImpl = repositoryImpl;
_repositoryGroupImpl = repositoryGroupImpl;
}
private List<Group> GetAllGroups() => _repositoryGroupImpl.GetAllGroup()
.Select(it => new Group { Id = it.Id, Name = it.Name}).ToList();
public List<User> GetAllUsers() => _repositoryUserImpl.GetAllUsers
private List<GroupDao> GetAllGroups() => _repositoryGroupImpl.GetAllGroup()
.Select(it => new GroupDao { Id = it.Id, Name = it.Name}).ToList();
public List<UserDao> GetAllUsers() => _repositoryUserImpl.GetAllUser()
.Join(_repositoryGroupImpl.GetAllGroup(),
user => user.GroupID,
user => user.GroupId,
group => group.Id,
(user, group) =>
new User { FIO = user.FIO,
Guid = user.Guid,
GroupId = new Group {Id = group.Id, Name = group.Name } }
new UserDao { FIO = user.FIO,
UserId = user.UserId,
GroupId = group.Id }
).ToList();
public bool RemoveUserByGuid(Guid userGuid) {
return _repositoryUserImpl.RemoveUserByGuid(userGuid);
public bool RemoveUserById(int userId) {
return _repositoryUserImpl.RemoveUserById(userId);
}
public User UpdateUser(User user) {
UserLocalEntity userLocalEnity = new UserLocalEntity { FIO = user.FIO, GroupID = user.GroupId.Id, Guid = user.Guid };
UserLocalEntity? result = _repositoryUserImpl.UpdateUser(userLocalEnity);
if (result == null) throw new Exception("");
Group? group = GetAllGroups().FirstOrDefault(it => it.Id == result!.GroupID);
if (group == null) throw new Exception("");
return new User { FIO = user.FIO, Guid = user.Guid, GroupId = group};
public bool UpdateUser(UserDao user) {
UserDao userDao = new UserDao { FIO = user.FIO, GroupId = user.GroupId };
return _repositoryUserImpl.UpdateUser(userDao);
}
public UserLocalEntity GetUserByGuid(Guid userGuid) {
return _repositoryUserImpl.GetUserByGuid(userGuid);
public UserDao GetUserById(int userId) {
return _repositoryUserImpl.GetUserById(userId);
}
public User UpdateUserByGuid(Guid userGuid, String fio, String groupId) {
UserLocalEntity? result = _repositoryUserImpl.UpdateUserByGuid(userGuid);
if (result == null) throw new Exception("");
Group? group = GetAllGroups().FirstOrDefault(it => it.Id == int.Parse(groupId));
if (group == null) throw new Exception("");
return new User { FIO = fio, GroupId = group, Guid = userGuid };
public bool UpdateUserById(int userId, String fio, int groupId) {
UserDao userDao = new UserDao { FIO = fio, GroupId = groupId };
return _repositoryUserImpl.UpdateUser(userDao);
}
}
}

View File

@ -0,0 +1,131 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using Posechaemost.Data.RemoteData.RemoteDataBase;
#nullable disable
namespace Posechaemost.Migrations
{
[DbContext(typeof(RemoteDataBaseContext))]
[Migration("20241111193458_InitialCreate")]
partial class InitialCreate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.10")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.GroupDao", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Groups");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
{
b.Property<int>("PresenceId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("PresenceId"));
b.Property<int>("ClassNumber")
.HasColumnType("integer");
b.Property<DateOnly>("Date")
.HasColumnType("date");
b.Property<int>("GroupId")
.HasColumnType("integer");
b.Property<bool>("IsAttendence")
.HasColumnType("boolean");
b.Property<int>("UserId")
.HasColumnType("integer");
b.HasKey("PresenceId");
b.HasIndex("UserId");
b.ToTable("Presences");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
{
b.Property<int>("UserId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("UserId"));
b.Property<string>("FIO")
.IsRequired()
.HasColumnType("text");
b.Property<int>("GroupId")
.HasColumnType("integer");
b.HasKey("UserId");
b.HasIndex("GroupId");
b.ToTable("Users");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
{
b.HasOne("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.UserDao", "User")
.WithMany("Presences")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
{
b.HasOne("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group")
.WithMany("User")
.HasForeignKey("GroupId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Group");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.GroupDao", b =>
{
b.Navigation("User");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
{
b.Navigation("Presences");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,95 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace Posechaemost.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Groups",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Groups", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Users",
columns: table => new
{
UserId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
FIO = table.Column<string>(type: "text", nullable: false),
GroupId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Users", x => x.UserId);
table.ForeignKey(
name: "FK_Users_Groups_GroupId",
column: x => x.GroupId,
principalTable: "Groups",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "Presences",
columns: table => new
{
PresenceId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Date = table.Column<DateOnly>(type: "date", nullable: false),
ClassNumber = table.Column<int>(type: "integer", nullable: false),
IsAttendence = table.Column<bool>(type: "boolean", nullable: false),
UserId = table.Column<int>(type: "integer", nullable: false),
GroupId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Presences", x => x.PresenceId);
table.ForeignKey(
name: "FK_Presences_Users_UserId",
column: x => x.UserId,
principalTable: "Users",
principalColumn: "UserId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_Presences_UserId",
table: "Presences",
column: "UserId");
migrationBuilder.CreateIndex(
name: "IX_Users_GroupId",
table: "Users",
column: "GroupId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Presences");
migrationBuilder.DropTable(
name: "Users");
migrationBuilder.DropTable(
name: "Groups");
}
}
}

View File

@ -0,0 +1,128 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using Posechaemost.Data.RemoteData.RemoteDataBase;
#nullable disable
namespace Posechaemost.Migrations
{
[DbContext(typeof(RemoteDataBaseContext))]
partial class RemoteDataBaseContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.10")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.GroupDao", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Groups");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
{
b.Property<int>("PresenceId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("PresenceId"));
b.Property<int>("ClassNumber")
.HasColumnType("integer");
b.Property<DateOnly>("Date")
.HasColumnType("date");
b.Property<int>("GroupId")
.HasColumnType("integer");
b.Property<bool>("IsAttendence")
.HasColumnType("boolean");
b.Property<int>("UserId")
.HasColumnType("integer");
b.HasKey("PresenceId");
b.HasIndex("UserId");
b.ToTable("Presences");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
{
b.Property<int>("UserId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("UserId"));
b.Property<string>("FIO")
.IsRequired()
.HasColumnType("text");
b.Property<int>("GroupId")
.HasColumnType("integer");
b.HasKey("UserId");
b.HasIndex("GroupId");
b.ToTable("Users");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
{
b.HasOne("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.UserDao", "User")
.WithMany("Presences")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
{
b.HasOne("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group")
.WithMany("User")
.HasForeignKey("GroupId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Group");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.GroupDao", b =>
{
b.Navigation("User");
});
modelBuilder.Entity("Posechaemost.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
{
b.Navigation("Presences");
});
#pragma warning restore 612, 618
}
}
}

8
Posechaemost.csproj Normal file → Executable file
View File

@ -8,7 +8,15 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ClosedXML" Version="0.104.1" />
<PackageReference Include="Microsoft.AspNetCore.App" Version="2.2.8" />
<PackageReference Include="Microsoft.EntityFrameworkcore" Version="8.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.10">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" />
</ItemGroup>
</Project>

0
Posechaemost.sln Normal file → Executable file
View File

21
Program.cs Normal file → Executable file
View File

@ -3,17 +3,24 @@ using Posechaemost.Domain.UseCase;
using Posechaemost.UI;
using Microsoft.Extensions.DependencyInjection;
using System.Text.RegularExpressions;
using Posechaemost.Data.RemoteData.RemoteDataBase;
IServiceCollection services = new ServiceCollection();
services
.AddSingleton<IGroupRepository, GroupRepositoryImpl>()
.AddSingleton<UserUseCase>();
.AddDbContext<RemoteDataBaseContext>()
.AddSingleton<IGroupRepository, SQLGroupRepositoryImpl>()
.AddSingleton<IUserRepository, SQLUserRepositoryImpl>()
.AddSingleton<IPresenceRepository, SQLPresenceRepositoryImpl>()
.AddSingleton<UserUseCase>()
.AddSingleton<GroupUseCase>()
.AddSingleton<PresenceUseCase>()
.AddSingleton<PresenceConsoleUI>()
.AddSingleton<MainMenuUI>();
var serviceProvider = services.BuildServiceProvider();
// Создаем пользовательский интерфейс
MainMenuUI mainMenuUI = serviceProvider.GetService<MainMenuUI>();
GroupRepositoryImpl groupRepositoryImpl = new GroupRepositoryImpl();
UserUseCase userUseCase = serviceProvider.GetService<UserUseCase>();
GroupUseCase groupUseCase = new GroupUseCase(groupRepositoryImpl);
MainMenuUI mainMenuUI = new MainMenuUI(userUseCase, groupUseCase);
// Выводим главное меню
mainMenuUI.DisplayMenu();

4
UI/GroupConsole.cs Normal file → Executable file
View File

@ -28,16 +28,12 @@ namespace Posechaemost.UI
public void UpdateGroupName(String name, String name1) {
StringBuilder groupOutput = new StringBuilder();
var group = _groupUseCase.UpdateGroupName(name, name1);
groupOutput.AppendLine($"{group.Id}\t{group.Name}");
Console.WriteLine(groupOutput);
}
public void AddGroup(String name, String id)
{
StringBuilder groupOutput = new StringBuilder();
var group = _groupUseCase.AddGroup(name, id);
groupOutput.AppendLine($"{group.Id}\t{group.Name}");
Console.WriteLine(groupOutput);
}
}
}

21
UI/MainMenu.cs Normal file → Executable file
View File

@ -1,3 +1,4 @@
using Posechaemost.Data.Repository;
using Posechaemost.Domain.UseCase;
using System;
using System.Collections.Generic;
@ -12,30 +13,38 @@ namespace Posechaemost.UI
UserConsoleUI _userConsoleUI;
GroupConsoleUI _groupConsoleUI;
PresenceConsoleUI _presenceConsoleUI;
public MainMenuUI(UserUseCase userUseCase, GroupUseCase groupUseCase)
public MainMenuUI(UserUseCase userUseCase, GroupUseCase groupUseCase, PresenceUseCase presenceUseCase, IPresenceRepository presenceRepository)
{
_userConsoleUI = new UserConsoleUI(userUseCase);
_groupConsoleUI = new GroupConsoleUI(groupUseCase);
_presenceConsoleUI = new PresenceConsoleUI(presenceUseCase, presenceRepository);
DisplayMenu();
}
private void DisplayMenu()
public void DisplayMenu()
{
while (true)
{
switch (Console.ReadLine())
{
case "1": _userConsoleUI.DisplayAllUsers(); break;
case "2": _userConsoleUI.RemoveUserByGuid(Guid.Parse(Console.ReadLine())); break;
case "2": _userConsoleUI.RemoveUserById(int.Parse(Console.ReadLine())); break;
case "3": _groupConsoleUI.DisplayAllGroups(); break;
case "4": _userConsoleUI.GetUserByGuid(Guid.Parse(Console.ReadLine())); break;
case "5": _userConsoleUI.UpdateUserByGuid(Guid.Parse(Console.ReadLine()), Console.ReadLine(), Console.ReadLine()); break;
case "4": _userConsoleUI.GetUserById(int.Parse(Console.ReadLine())); break;
case "5": _userConsoleUI.UpdateUserById(int.Parse(Console.ReadLine()), Console.ReadLine(), int.Parse(Console.ReadLine())); break;
case "6": _groupConsoleUI.UpdateGroupName(Console.ReadLine(), Console.ReadLine()); break;
case "7": _groupConsoleUI.AddGroup(Console.ReadLine(), Console.ReadLine()); break;
case "8": _presenceConsoleUI.GetPresenceByGroup(int.Parse(Console.ReadLine())); break;
case "9": _presenceConsoleUI.GetPresenceByGroupAndDate(int.Parse(Console.ReadLine()), DateOnly.Parse(Console.ReadLine())); break;
case "10": _presenceConsoleUI.UncheckAttendence(int.Parse(Console.ReadLine()), int.Parse(Console.ReadLine()), DateOnly.Parse(Console.ReadLine()), int.Parse(Console.ReadLine())); break;
case "11": _presenceConsoleUI.AddPresence(int.Parse(Console.ReadLine()), int.Parse(Console.ReadLine()), int.Parse(Console.ReadLine()), DateOnly.Parse(Console.ReadLine())); break;
case "12": _presenceConsoleUI.ExportPresenceToExcel(int.Parse(Console.ReadLine()), Console.ReadLine()); break;
case "13": _presenceConsoleUI.GenerateWeeklyPresence(int.Parse(Console.ReadLine()), int.Parse(Console.ReadLine()), int.Parse(Console.ReadLine()), DateOnly.Parse(Console.ReadLine())); break;
default: DisplayMenu();
break;
}

166
UI/PresenceConsole.cs Executable file
View File

@ -0,0 +1,166 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Posechaemost.Domain.UseCase;
using ClosedXML.Excel;
using Posechaemost.Data.Repository;
namespace Posechaemost.UI
{
public class PresenceConsoleUI
{
private readonly PresenceUseCase _presenceUseCase;
private readonly IPresenceRepository _presenceRepository;
public PresenceConsoleUI(PresenceUseCase presenceUseCase, IPresenceRepository presenceRepository)
{
_presenceUseCase = presenceUseCase;
_presenceRepository = presenceRepository;
}
public void GetPresenceByGroup(int groupId)
{
StringBuilder presenceOutput = new StringBuilder();
var presence = _presenceUseCase.GetPresenceByGroup(groupId);
foreach (var p in presence)
{
presenceOutput.AppendLine($"{p.User.UserId}\t{p.User.FIO}\t{p.ClassNumber}\t{p.Date}\t{p.IsAttendence}");
}
Console.WriteLine(presenceOutput);
}
public void GetPresenceByGroupAndDate(int groupId, DateOnly date)
{
StringBuilder presenceOutput = new StringBuilder();
var presence = _presenceUseCase.GetPresenceByGroupAndDate(groupId, date);
foreach (var p in presence)
{
presenceOutput.AppendLine($"{p.User.UserId}\t{p.User.FIO}\t{p.ClassNumber}\t{p.Date}\t{p.IsAttendence}");
}
Console.WriteLine(presenceOutput);
}
public void UncheckAttendence(int firstClass, int lastClass, DateOnly date, int userId)
{
string output = _presenceUseCase.UncheckAttendence(firstClass, lastClass, date, userId) ?
"Посещаемость обновлена" : "Посещаемость не обновлена";
Console.WriteLine(output);
}
public void AddPresence(int firstClass, int lastClass, int groupId, DateOnly date)
{
StringBuilder presenceOutput = new StringBuilder();
_presenceUseCase.AddPresence(firstClass, lastClass, groupId, date);
presenceOutput.AppendLine("Посещаемость добавлена");
Console.WriteLine(presenceOutput);
}
public void GetPresenceStatsByGroup(int groupId)
{
var stats = _presenceUseCase.GetPresenceStatsByGroup(groupId);
StringBuilder output = new StringBuilder();
output.AppendLine($"Информация о группе {groupId}:");
output.AppendLine($"Количество студентов: {stats["Количество студентов"]}");
output.AppendLine($"Количество занятий: {stats["Количество занятий"]}");
output.AppendLine($"Общий процент посещаемости: {stats["Процент посещаемости"]}%");
output.AppendLine("\nСтатистика по студентам:");
var presence = _presenceUseCase.GetPresenceByGroup(groupId);
var students = presence.GroupBy(p => p.User)
.Select(g => new {
Student = g.Key,
Total = stats["Количество занятий"],
Attended = g.Count(p => p.IsAttendence),
Missed = stats["Количество занятий"] - g.Count(p => p.IsAttendence),
Percentage = (g.Count(p => p.IsAttendence) * 100) / stats["Количество занятий"]
});
foreach(var student in students) {
output.AppendLine($"\nСтудент: {student.Student.FIO}");
output.AppendLine($"Посещено занятий: {student.Attended}");
output.AppendLine($"Пропущено занятий: {student.Missed}");
output.AppendLine($"Процент посещаемости: {student.Percentage}%");
}
Console.WriteLine(output.ToString());
}
public void GenerateWeeklyPresence(int firstClass, int lastClass, int groupId, DateOnly startDate)
{
_presenceUseCase.GenerateWeeklyPresence(firstClass, lastClass, groupId, startDate);
Console.WriteLine("Посещаемость на неделю сгенерирована");
}
public void ExportPresenceToExcel(int groupId, string filePath)
{
var presence = _presenceUseCase.GetPresenceByGroup(groupId);
var stats = _presenceUseCase.GetPresenceStatsByGroup(groupId);
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add("Посещаемость");
// Заголовок листа
worksheet.Cell(1, 1).Value = $"Группа {groupId}";
worksheet.Range(1, 1, 1, 3).Merge();
worksheet.Cell(1, 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
// Заголовки столбцов
worksheet.Cell(3, 1).Value = "№";
worksheet.Cell(3, 2).Value = "ФИО";
// Получаем все уникальные даты
var dates = presence.Select(p => p.Date).Distinct().OrderBy(d => d).ToList();
int col = 3;
foreach (var date in dates)
{
worksheet.Cell(3, col).Value = date.ToString("dd.MM.yyyy");
col++;
}
// Группируем данные по студентам
var studentGroups = presence.GroupBy(p => p.User);
int row = 4;
int studentNumber = 1;
foreach (var studentGroup in studentGroups)
{
// Номер и ФИО студента
worksheet.Cell(row, 1).Value = studentNumber++;
worksheet.Cell(row, 2).Value = studentGroup.Key.FIO;
// Заполняем посещаемость по датам
col = 3;
foreach (var date in dates)
{
var presenceOnDate = studentGroup.FirstOrDefault(p => p.Date == date);
worksheet.Cell(row, col).Value = presenceOnDate?.IsAttendence == true ? "+" : "н";
worksheet.Cell(row, col).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
col++;
}
row++;
}
// Форматирование
var tableRange = worksheet.Range(3, 1, row - 1, dates.Count + 2);
tableRange.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
tableRange.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
worksheet.Columns().AdjustToContents();
try
{
workbook.SaveAs(filePath);
Console.WriteLine($"Данные успешно экспортированы в файл: {filePath}");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка при сохранении файла: {ex.Message}");
}
}
}
}
}

17
UI/UserConsole.cs Normal file → Executable file
View File

@ -15,9 +15,9 @@ namespace Posechaemost.UI
_userUseCase = userUseCase;
}
public void RemoveUserByGuid(Guid guidUser) {
public void RemoveUserById(int userId) {
string output = _userUseCase.RemoveUserByGuid(guidUser) ? "Пользователь удален" : "Пользователь не удален";
string output = _userUseCase.RemoveUserById(userId) ? "Пользователь удален" : "Пользователь не удален";
Console.WriteLine(output);
}
@ -26,22 +26,21 @@ namespace Posechaemost.UI
StringBuilder userOutput = new StringBuilder();
foreach (var user in _userUseCase.GetAllUsers())
{
userOutput.AppendLine($"{user.Guid}\t{user.FIO}\t{user.GroupId.Name}");
userOutput.AppendLine($"{user.UserId}\t{user.FIO}\t{user.GroupId}");
}
Console.WriteLine(userOutput);
}
public void GetUserByGuid(Guid userGuid) {
public void GetUserById(int userId) {
StringBuilder userOutput = new StringBuilder();
var user = _userUseCase.GetUserByGuid(userGuid);
userOutput.AppendLine($"{user.Guid}\t{user.FIO}\t{user.GroupID}");
var user = _userUseCase.GetUserById(userId);
userOutput.AppendLine($"{user.UserId}\t{user.FIO}\t{user.GroupId}");
Console.WriteLine(userOutput);
}
public void UpdateUserByGuid(Guid userGuid, String name, String groupId) {
public void UpdateUserById(int userId, String name, int groupId) {
StringBuilder userOutput = new StringBuilder();
var user = _userUseCase.UpdateUserByGuid(userGuid, name, groupId);
userOutput.AppendLine($"{user.Guid}\t{user.FIO}\t{user.GroupId.Name}");
var user = _userUseCase.UpdateUserById(userId, name, groupId) ? "Пользователь обновлен" : "Пользователь не обновлен";
Console.WriteLine(userOutput);
}
}

Binary file not shown.

BIN
bin/Debug/net8.0/ClosedXML.dll Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/Debug/net8.0/Humanizer.dll Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/Debug/net8.0/Npgsql.dll Executable file

Binary file not shown.

Binary file not shown.

905
bin/Debug/net8.0/Posechaemost.deps.json Normal file → Executable file
View File

@ -7,17 +7,922 @@
"targets": {
".NETCoreApp,Version=v8.0": {
"Posechaemost/1.0.0": {
"dependencies": {
"ClosedXML": "0.104.1",
"Microsoft.EntityFrameworkCore.Design": "8.0.10",
"Microsoft.EntityFrameworkCore": "8.0.10",
"Microsoft.Extensions.DependencyInjection": "8.0.1",
"Npgsql.EntityFrameworkCore.PostgreSQL": "8.0.10"
},
"runtime": {
"Posechaemost.dll": {}
}
},
"ClosedXML/0.104.1": {
"dependencies": {
"ClosedXML.Parser": "1.2.0",
"DocumentFormat.OpenXml": "3.0.1",
"ExcelNumberFormat": "1.1.0",
"RBush": "3.2.0",
"SixLabors.Fonts": "1.0.0",
"System.IO.Packaging": "8.0.0"
},
"runtime": {
"lib/netstandard2.1/ClosedXML.dll": {
"assemblyVersion": "0.104.1.0",
"fileVersion": "0.104.1.0"
}
}
},
"ClosedXML.Parser/1.2.0": {
"runtime": {
"lib/netstandard2.1/ClosedXML.Parser.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"DocumentFormat.OpenXml/3.0.1": {
"dependencies": {
"DocumentFormat.OpenXml.Framework": "3.0.1"
},
"runtime": {
"lib/net8.0/DocumentFormat.OpenXml.dll": {
"assemblyVersion": "3.0.1.0",
"fileVersion": "3.0.1.0"
}
}
},
"DocumentFormat.OpenXml.Framework/3.0.1": {
"dependencies": {
"System.IO.Packaging": "8.0.0"
},
"runtime": {
"lib/net8.0/DocumentFormat.OpenXml.Framework.dll": {
"assemblyVersion": "3.0.1.0",
"fileVersion": "3.0.1.0"
}
}
},
"ExcelNumberFormat/1.1.0": {
"runtime": {
"lib/netstandard2.0/ExcelNumberFormat.dll": {
"assemblyVersion": "1.1.0.0",
"fileVersion": "1.1.0.0"
}
}
},
"Humanizer.Core/2.14.1": {
"runtime": {
"lib/net6.0/Humanizer.dll": {
"assemblyVersion": "2.14.0.0",
"fileVersion": "2.14.1.48190"
}
}
},
"Microsoft.Bcl.AsyncInterfaces/6.0.0": {
"runtime": {
"lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.52210"
}
}
},
"Microsoft.CodeAnalysis.Analyzers/3.3.3": {},
"Microsoft.CodeAnalysis.Common/4.5.0": {
"dependencies": {
"Microsoft.CodeAnalysis.Analyzers": "3.3.3",
"System.Collections.Immutable": "6.0.0",
"System.Reflection.Metadata": "6.0.1",
"System.Runtime.CompilerServices.Unsafe": "6.0.0",
"System.Text.Encoding.CodePages": "6.0.0"
},
"runtime": {
"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": {
"assemblyVersion": "4.5.0.0",
"fileVersion": "4.500.23.10905"
}
},
"resources": {
"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": {
"locale": "cs"
},
"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": {
"locale": "de"
},
"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": {
"locale": "es"
},
"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": {
"locale": "fr"
},
"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": {
"locale": "it"
},
"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": {
"locale": "ja"
},
"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": {
"locale": "ko"
},
"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": {
"locale": "pl"
},
"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": {
"locale": "pt-BR"
},
"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": {
"locale": "ru"
},
"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": {
"locale": "tr"
},
"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": {
"locale": "zh-Hans"
},
"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.CodeAnalysis.CSharp/4.5.0": {
"dependencies": {
"Microsoft.CodeAnalysis.Common": "4.5.0"
},
"runtime": {
"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": {
"assemblyVersion": "4.5.0.0",
"fileVersion": "4.500.23.10905"
}
},
"resources": {
"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "cs"
},
"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "de"
},
"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "es"
},
"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "fr"
},
"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "it"
},
"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "ja"
},
"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "ko"
},
"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "pl"
},
"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "pt-BR"
},
"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "ru"
},
"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "tr"
},
"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "zh-Hans"
},
"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.CodeAnalysis.CSharp.Workspaces/4.5.0": {
"dependencies": {
"Humanizer.Core": "2.14.1",
"Microsoft.CodeAnalysis.CSharp": "4.5.0",
"Microsoft.CodeAnalysis.Common": "4.5.0",
"Microsoft.CodeAnalysis.Workspaces.Common": "4.5.0"
},
"runtime": {
"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.Workspaces.dll": {
"assemblyVersion": "4.5.0.0",
"fileVersion": "4.500.23.10905"
}
},
"resources": {
"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "cs"
},
"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "de"
},
"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "es"
},
"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "fr"
},
"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "it"
},
"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "ja"
},
"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "ko"
},
"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "pl"
},
"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "pt-BR"
},
"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "ru"
},
"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "tr"
},
"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "zh-Hans"
},
"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.CodeAnalysis.Workspaces.Common/4.5.0": {
"dependencies": {
"Humanizer.Core": "2.14.1",
"Microsoft.Bcl.AsyncInterfaces": "6.0.0",
"Microsoft.CodeAnalysis.Common": "4.5.0",
"System.Composition": "6.0.0",
"System.IO.Pipelines": "6.0.3",
"System.Threading.Channels": "6.0.0"
},
"runtime": {
"lib/netcoreapp3.1/Microsoft.CodeAnalysis.Workspaces.dll": {
"assemblyVersion": "4.5.0.0",
"fileVersion": "4.500.23.10905"
}
},
"resources": {
"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "cs"
},
"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "de"
},
"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "es"
},
"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "fr"
},
"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "it"
},
"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "ja"
},
"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "ko"
},
"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "pl"
},
"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "pt-BR"
},
"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "ru"
},
"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "tr"
},
"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "zh-Hans"
},
"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.EntityFrameworkCore/8.0.10": {
"dependencies": {
"Microsoft.EntityFrameworkCore.Abstractions": "8.0.10",
"Microsoft.EntityFrameworkCore.Analyzers": "8.0.10",
"Microsoft.Extensions.Caching.Memory": "8.0.1",
"Microsoft.Extensions.Logging": "8.0.1"
},
"runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.dll": {
"assemblyVersion": "8.0.10.0",
"fileVersion": "8.0.1024.46708"
}
}
},
"Microsoft.EntityFrameworkCore.Abstractions/8.0.10": {
"runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": {
"assemblyVersion": "8.0.10.0",
"fileVersion": "8.0.1024.46708"
}
}
},
"Microsoft.EntityFrameworkCore.Analyzers/8.0.10": {},
"Microsoft.EntityFrameworkCore.Design/8.0.10": {
"dependencies": {
"Humanizer.Core": "2.14.1",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0",
"Microsoft.EntityFrameworkCore.Relational": "8.0.10",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Mono.TextTemplating": "2.2.1"
},
"runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.Design.dll": {
"assemblyVersion": "8.0.10.0",
"fileVersion": "8.0.1024.46708"
}
}
},
"Microsoft.EntityFrameworkCore.Relational/8.0.10": {
"dependencies": {
"Microsoft.EntityFrameworkCore": "8.0.10",
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.Relational.dll": {
"assemblyVersion": "8.0.10.0",
"fileVersion": "8.0.1024.46708"
}
}
},
"Microsoft.Extensions.Caching.Abstractions/8.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "8.0.0"
}
},
"Microsoft.Extensions.Caching.Memory/8.0.1": {
"dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "8.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2",
"Microsoft.Extensions.Primitives": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Caching.Memory.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Configuration.Abstractions/8.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "8.0.0"
}
},
"Microsoft.Extensions.DependencyInjection/8.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
"runtime": {
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.DependencyModel/8.0.2": {
"runtime": {
"lib/net8.0/Microsoft.Extensions.DependencyModel.dll": {
"assemblyVersion": "8.0.0.2",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging/8.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "8.0.1",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging.Abstractions/8.0.2": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Options/8.0.2": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Primitives": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Options.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.224.6711"
}
}
},
"Microsoft.Extensions.Primitives/8.0.0": {},
"Mono.TextTemplating/2.2.1": {
"dependencies": {
"System.CodeDom": "4.4.0"
},
"runtime": {
"lib/netstandard2.0/Mono.TextTemplating.dll": {
"assemblyVersion": "2.2.0.0",
"fileVersion": "2.2.1.1"
}
}
},
"Npgsql/8.0.5": {
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "8.0.2"
},
"runtime": {
"lib/net8.0/Npgsql.dll": {
"assemblyVersion": "8.0.5.0",
"fileVersion": "8.0.5.0"
}
}
},
"Npgsql.EntityFrameworkCore.PostgreSQL/8.0.10": {
"dependencies": {
"Microsoft.EntityFrameworkCore": "8.0.10",
"Microsoft.EntityFrameworkCore.Abstractions": "8.0.10",
"Microsoft.EntityFrameworkCore.Relational": "8.0.10",
"Npgsql": "8.0.5"
},
"runtime": {
"lib/net8.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": {
"assemblyVersion": "8.0.10.0",
"fileVersion": "8.0.10.0"
}
}
},
"RBush/3.2.0": {
"runtime": {
"lib/net6.0/RBush.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.2.0.0"
}
}
},
"SixLabors.Fonts/1.0.0": {
"runtime": {
"lib/netcoreapp3.1/SixLabors.Fonts.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"System.CodeDom/4.4.0": {
"runtime": {
"lib/netstandard2.0/System.CodeDom.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.6.25519.3"
}
}
},
"System.Collections.Immutable/6.0.0": {
"dependencies": {
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"System.Composition/6.0.0": {
"dependencies": {
"System.Composition.AttributedModel": "6.0.0",
"System.Composition.Convention": "6.0.0",
"System.Composition.Hosting": "6.0.0",
"System.Composition.Runtime": "6.0.0",
"System.Composition.TypedParts": "6.0.0"
}
},
"System.Composition.AttributedModel/6.0.0": {
"runtime": {
"lib/net6.0/System.Composition.AttributedModel.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.52210"
}
}
},
"System.Composition.Convention/6.0.0": {
"dependencies": {
"System.Composition.AttributedModel": "6.0.0"
},
"runtime": {
"lib/net6.0/System.Composition.Convention.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.52210"
}
}
},
"System.Composition.Hosting/6.0.0": {
"dependencies": {
"System.Composition.Runtime": "6.0.0"
},
"runtime": {
"lib/net6.0/System.Composition.Hosting.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.52210"
}
}
},
"System.Composition.Runtime/6.0.0": {
"runtime": {
"lib/net6.0/System.Composition.Runtime.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.52210"
}
}
},
"System.Composition.TypedParts/6.0.0": {
"dependencies": {
"System.Composition.AttributedModel": "6.0.0",
"System.Composition.Hosting": "6.0.0",
"System.Composition.Runtime": "6.0.0"
},
"runtime": {
"lib/net6.0/System.Composition.TypedParts.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.52210"
}
}
},
"System.IO.Packaging/8.0.0": {
"runtime": {
"lib/net8.0/System.IO.Packaging.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.23.53103"
}
}
},
"System.IO.Pipelines/6.0.3": {},
"System.Reflection.Metadata/6.0.1": {
"dependencies": {
"System.Collections.Immutable": "6.0.0"
}
},
"System.Runtime.CompilerServices.Unsafe/6.0.0": {},
"System.Text.Encoding.CodePages/6.0.0": {
"dependencies": {
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"System.Threading.Channels/6.0.0": {}
}
},
"libraries": {
"Posechaemost/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"ClosedXML/0.104.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-RVm2fUNWJlBJlg07shrfeWzrHPG5ypI/vARqdUOUbUdaog8yBw8l4IbCHf2MXt0AXtzaZqGNqhFaCAHigCBdfw==",
"path": "closedxml/0.104.1",
"hashPath": "closedxml.0.104.1.nupkg.sha512"
},
"ClosedXML.Parser/1.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-w+/0tsxABS3lkSH8EUlA7IGme+mq5T/Puf3DbOiTckmSuUpAUO2LK29oXYByCcWkBv6wcRHxgWlQb1lxkwI0Tw==",
"path": "closedxml.parser/1.2.0",
"hashPath": "closedxml.parser.1.2.0.nupkg.sha512"
},
"DocumentFormat.OpenXml/3.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-DCK1cwFUJ1FGGyYyo++HWl9H1RkqMWIu+FGOLRy6E4L4y0/HIhlJ7N/n1HKboFfOwKn1cMBRxt1RCuDbIEy5YQ==",
"path": "documentformat.openxml/3.0.1",
"hashPath": "documentformat.openxml.3.0.1.nupkg.sha512"
},
"DocumentFormat.OpenXml.Framework/3.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ifyI7OW7sggz7LQMIAD2aUsY/zVUON9QaHrpZ4MK33iVMeHlTG4uhUE2aLWb31nry+LCs2ALDAwf8OfUJGjgBg==",
"path": "documentformat.openxml.framework/3.0.1",
"hashPath": "documentformat.openxml.framework.3.0.1.nupkg.sha512"
},
"ExcelNumberFormat/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-R3BVHPs9O+RkExbZYTGT0+9HLbi8ZrNij1Yziyw6znd3J7P3uoIR07uwTLGOogtz1p6+0sna66eBoXu7tBiVQA==",
"path": "excelnumberformat/1.1.0",
"hashPath": "excelnumberformat.1.1.0.nupkg.sha512"
},
"Humanizer.Core/2.14.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==",
"path": "humanizer.core/2.14.1",
"hashPath": "humanizer.core.2.14.1.nupkg.sha512"
},
"Microsoft.Bcl.AsyncInterfaces/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==",
"path": "microsoft.bcl.asyncinterfaces/6.0.0",
"hashPath": "microsoft.bcl.asyncinterfaces.6.0.0.nupkg.sha512"
},
"Microsoft.CodeAnalysis.Analyzers/3.3.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==",
"path": "microsoft.codeanalysis.analyzers/3.3.3",
"hashPath": "microsoft.codeanalysis.analyzers.3.3.3.nupkg.sha512"
},
"Microsoft.CodeAnalysis.Common/4.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==",
"path": "microsoft.codeanalysis.common/4.5.0",
"hashPath": "microsoft.codeanalysis.common.4.5.0.nupkg.sha512"
},
"Microsoft.CodeAnalysis.CSharp/4.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==",
"path": "microsoft.codeanalysis.csharp/4.5.0",
"hashPath": "microsoft.codeanalysis.csharp.4.5.0.nupkg.sha512"
},
"Microsoft.CodeAnalysis.CSharp.Workspaces/4.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==",
"path": "microsoft.codeanalysis.csharp.workspaces/4.5.0",
"hashPath": "microsoft.codeanalysis.csharp.workspaces.4.5.0.nupkg.sha512"
},
"Microsoft.CodeAnalysis.Workspaces.Common/4.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==",
"path": "microsoft.codeanalysis.workspaces.common/4.5.0",
"hashPath": "microsoft.codeanalysis.workspaces.common.4.5.0.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore/8.0.10": {
"type": "package",
"serviceable": true,
"sha512": "sha512-PPkQdIqfR1nU3n6YgGGDk8G+eaYbaAKM1AzIQtlPNTKf10Osg3N9T+iK9AlnSA/ujsK00flPpFHVfJrbuBFS1A==",
"path": "microsoft.entityframeworkcore/8.0.10",
"hashPath": "microsoft.entityframeworkcore.8.0.10.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Abstractions/8.0.10": {
"type": "package",
"serviceable": true,
"sha512": "sha512-FV0QlcX9INY4kAD2o72uPtyOh0nZut2jB11Jf9mNYBtHay8gDLe+x4AbXFwuQg+eSvofjT7naV82e827zGfyMg==",
"path": "microsoft.entityframeworkcore.abstractions/8.0.10",
"hashPath": "microsoft.entityframeworkcore.abstractions.8.0.10.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Analyzers/8.0.10": {
"type": "package",
"serviceable": true,
"sha512": "sha512-51KkPIc0EMv/gVXhPIUi6cwJE9Mvh+PLr4Lap4naLcsoGZ0lF2SvOPgUUprwRV3MnN7nyD1XPhT5RJ/p+xFAXw==",
"path": "microsoft.entityframeworkcore.analyzers/8.0.10",
"hashPath": "microsoft.entityframeworkcore.analyzers.8.0.10.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Design/8.0.10": {
"type": "package",
"serviceable": true,
"sha512": "sha512-uGNjfKvAsql2KHRqxlK5wHo8mMC60G/FecrFKEjJgeIxtUAbSXGOgKGw/gD9flO5Fzzt1C7uxfIcr6ZsMmFkeg==",
"path": "microsoft.entityframeworkcore.design/8.0.10",
"hashPath": "microsoft.entityframeworkcore.design.8.0.10.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Relational/8.0.10": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OefBEE47kGKPRPV3OT+FAW6o5BFgLk2D9EoeWVy7NbOepzUneayLQxbVE098FfedTyMwxvZQoDD9LrvZc3MadA==",
"path": "microsoft.entityframeworkcore.relational/8.0.10",
"hashPath": "microsoft.entityframeworkcore.relational.8.0.10.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Abstractions/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==",
"path": "microsoft.extensions.caching.abstractions/8.0.0",
"hashPath": "microsoft.extensions.caching.abstractions.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Memory/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HFDnhYLccngrzyGgHkjEDU5FMLn4MpOsr5ElgsBMC4yx6lJh4jeWO7fHS8+TXPq+dgxCmUa/Trl8svObmwW4QA==",
"path": "microsoft.extensions.caching.memory/8.0.1",
"hashPath": "microsoft.extensions.caching.memory.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Abstractions/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==",
"path": "microsoft.extensions.configuration.abstractions/8.0.0",
"hashPath": "microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==",
"path": "microsoft.extensions.dependencyinjection/8.0.1",
"hashPath": "microsoft.extensions.dependencyinjection.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==",
"path": "microsoft.extensions.dependencyinjection.abstractions/8.0.2",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512"
},
"Microsoft.Extensions.DependencyModel/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==",
"path": "microsoft.extensions.dependencymodel/8.0.2",
"hashPath": "microsoft.extensions.dependencymodel.8.0.2.nupkg.sha512"
},
"Microsoft.Extensions.Logging/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==",
"path": "microsoft.extensions.logging/8.0.1",
"hashPath": "microsoft.extensions.logging.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==",
"path": "microsoft.extensions.logging.abstractions/8.0.2",
"hashPath": "microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512"
},
"Microsoft.Extensions.Options/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==",
"path": "microsoft.extensions.options/8.0.2",
"hashPath": "microsoft.extensions.options.8.0.2.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==",
"path": "microsoft.extensions.primitives/8.0.0",
"hashPath": "microsoft.extensions.primitives.8.0.0.nupkg.sha512"
},
"Mono.TextTemplating/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==",
"path": "mono.texttemplating/2.2.1",
"hashPath": "mono.texttemplating.2.2.1.nupkg.sha512"
},
"Npgsql/8.0.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-zRG5V8cyeZLpzJlKzFKjEwkRMYIYnHWJvEor2lWXeccS2E1G2nIWYYhnukB51iz5XsWSVEtqg3AxTWM0QJ6vfg==",
"path": "npgsql/8.0.5",
"hashPath": "npgsql.8.0.5.nupkg.sha512"
},
"Npgsql.EntityFrameworkCore.PostgreSQL/8.0.10": {
"type": "package",
"serviceable": true,
"sha512": "sha512-gFPl9Dmxih7Yi4tZ3bITzZFzbxFMBx04gqTqcjoL2r5VEW+O2TA5UVw/wm/XW26NAJ7sg59Je0+9QrwiZt6MPQ==",
"path": "npgsql.entityframeworkcore.postgresql/8.0.10",
"hashPath": "npgsql.entityframeworkcore.postgresql.8.0.10.nupkg.sha512"
},
"RBush/3.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ijGh9N0zZ7JfXk3oQkWCwK8SwSSByexbyh/MjbCjNxOft9eG5ZqKC1vdgiYq78h4IZRFmN4s3JZ/b10Jipud5w==",
"path": "rbush/3.2.0",
"hashPath": "rbush.3.2.0.nupkg.sha512"
},
"SixLabors.Fonts/1.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-LFQsCZlV0xlUyXAOMUo5kkSl+8zAQXXbbdwWchtk0B4o7zotZhQsQOcJUELGHdfPfm/xDAsz6hONAuV25bJaAg==",
"path": "sixlabors.fonts/1.0.0",
"hashPath": "sixlabors.fonts.1.0.0.nupkg.sha512"
},
"System.CodeDom/4.4.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==",
"path": "system.codedom/4.4.0",
"hashPath": "system.codedom.4.4.0.nupkg.sha512"
},
"System.Collections.Immutable/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==",
"path": "system.collections.immutable/6.0.0",
"hashPath": "system.collections.immutable.6.0.0.nupkg.sha512"
},
"System.Composition/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==",
"path": "system.composition/6.0.0",
"hashPath": "system.composition.6.0.0.nupkg.sha512"
},
"System.Composition.AttributedModel/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==",
"path": "system.composition.attributedmodel/6.0.0",
"hashPath": "system.composition.attributedmodel.6.0.0.nupkg.sha512"
},
"System.Composition.Convention/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==",
"path": "system.composition.convention/6.0.0",
"hashPath": "system.composition.convention.6.0.0.nupkg.sha512"
},
"System.Composition.Hosting/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==",
"path": "system.composition.hosting/6.0.0",
"hashPath": "system.composition.hosting.6.0.0.nupkg.sha512"
},
"System.Composition.Runtime/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==",
"path": "system.composition.runtime/6.0.0",
"hashPath": "system.composition.runtime.6.0.0.nupkg.sha512"
},
"System.Composition.TypedParts/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==",
"path": "system.composition.typedparts/6.0.0",
"hashPath": "system.composition.typedparts.6.0.0.nupkg.sha512"
},
"System.IO.Packaging/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8g1V4YRpdGAxFcK8v9OjuMdIOJSpF30Zb1JGicwVZhly3I994WFyBdV6mQEo8d3T+URQe55/M0U0eIH0Hts1bg==",
"path": "system.io.packaging/8.0.0",
"hashPath": "system.io.packaging.8.0.0.nupkg.sha512"
},
"System.IO.Pipelines/6.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==",
"path": "system.io.pipelines/6.0.3",
"hashPath": "system.io.pipelines.6.0.3.nupkg.sha512"
},
"System.Reflection.Metadata/6.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==",
"path": "system.reflection.metadata/6.0.1",
"hashPath": "system.reflection.metadata.6.0.1.nupkg.sha512"
},
"System.Runtime.CompilerServices.Unsafe/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==",
"path": "system.runtime.compilerservices.unsafe/6.0.0",
"hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512"
},
"System.Text.Encoding.CodePages/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==",
"path": "system.text.encoding.codepages/6.0.0",
"hashPath": "system.text.encoding.codepages.6.0.0.nupkg.sha512"
},
"System.Threading.Channels/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==",
"path": "system.threading.channels/6.0.0",
"hashPath": "system.threading.channels.6.0.0.nupkg.sha512"
}
}
}

BIN
bin/Debug/net8.0/Posechaemost.dll Normal file → Executable file

Binary file not shown.

BIN
bin/Debug/net8.0/Posechaemost.pdb Normal file → Executable file

Binary file not shown.

9
bin/Debug/net8.0/Posechaemost.runtimeconfig.json Normal file → Executable file
View File

@ -1,11 +1,18 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "8.0.0"
}
],
"configProperties": {
"System.Reflection.NullabilityInfoContext.IsSupported": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}

BIN
bin/Debug/net8.0/RBush.dll Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More