new
This commit is contained in:
commit
202f236834
25
Demo.sln
Normal file
25
Demo.sln
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.11.35327.3
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Demo", "presence_new\Demo.csproj", "{31E5FFCB-821D-4C62-90AF-73CF0FED2F38}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{31E5FFCB-821D-4C62-90AF-73CF0FED2F38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{31E5FFCB-821D-4C62-90AF-73CF0FED2F38}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{31E5FFCB-821D-4C62-90AF-73CF0FED2F38}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{31E5FFCB-821D-4C62-90AF-73CF0FED2F38}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {F3A9BD62-7626-4D6A-BEE1-35A21784C59F}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
10
presence_new/Data/Exceptions/GroupNotFoundException.cs
Normal file
10
presence_new/Data/Exceptions/GroupNotFoundException.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Demo.Data.Exceptions
|
||||||
|
{
|
||||||
|
public class GroupNotFoundException : RepositoryException
|
||||||
|
{
|
||||||
|
public GroupNotFoundException(int groupId)
|
||||||
|
: base($"Группа с ID {groupId} не найдена.") { }
|
||||||
|
}
|
||||||
|
}
|
9
presence_new/Data/Exceptions/RepositoryException.cs
Normal file
9
presence_new/Data/Exceptions/RepositoryException.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Demo.Data.Exceptions
|
||||||
|
{
|
||||||
|
public class RepositoryException : Exception
|
||||||
|
{
|
||||||
|
public RepositoryException(string message) : base(message) { }
|
||||||
|
}
|
||||||
|
}
|
10
presence_new/Data/Exceptions/UserNotFoundException.cs
Normal file
10
presence_new/Data/Exceptions/UserNotFoundException.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Demo.Data.Exceptions
|
||||||
|
{
|
||||||
|
public class UserNotFoundException : RepositoryException
|
||||||
|
{
|
||||||
|
public UserNotFoundException(Guid userGuid)
|
||||||
|
: base($"Пользователь с GUID {userGuid} не найден.") { }
|
||||||
|
}
|
||||||
|
}
|
15
presence_new/Data/LocalData/Entity/Group.cs
Normal file
15
presence_new/Data/LocalData/Entity/Group.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.domain.Models
|
||||||
|
{
|
||||||
|
public class GroupLocalEntity
|
||||||
|
{
|
||||||
|
public required int Id { get; set; }
|
||||||
|
public required string Name { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
8
presence_new/Data/LocalData/Entity/Presence.cs
Normal file
8
presence_new/Data/LocalData/Entity/Presence.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
public class PresenceLocalEntity
|
||||||
|
{
|
||||||
|
public Guid UserGuid { get; set; } // Замените int на Guid
|
||||||
|
public int GroupId { get; set; }
|
||||||
|
public int LessonNumber { get; set; }
|
||||||
|
public DateTime Date { get; set; }
|
||||||
|
public bool IsAttedance { get; set; }
|
||||||
|
}
|
25
presence_new/Data/LocalData/Entity/User.cs
Normal file
25
presence_new/Data/LocalData/Entity/User.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.domain.Models
|
||||||
|
{
|
||||||
|
public class UserLocalEnity : IEquatable<UserLocalEnity>
|
||||||
|
{
|
||||||
|
|
||||||
|
public required string FIO { get; set; }
|
||||||
|
public Guid Guid { get; set; }
|
||||||
|
|
||||||
|
public required int GroupID { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public bool Equals(UserLocalEnity? other)
|
||||||
|
{
|
||||||
|
if (other == null) return false;
|
||||||
|
return this.Guid.Equals(other.Guid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36
presence_new/Data/LocalData/LocalStaticData.cs
Normal file
36
presence_new/Data/LocalData/LocalStaticData.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using Demo.domain.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.NetworkInformation;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.Data.LocalData
|
||||||
|
{
|
||||||
|
public static class LocalStaticData
|
||||||
|
{
|
||||||
|
public static List<GroupLocalEntity> groups => new List<GroupLocalEntity>
|
||||||
|
|
||||||
|
{
|
||||||
|
new GroupLocalEntity{ Id = 1, Name = "ИП1-21" },
|
||||||
|
new GroupLocalEntity{ Id = 2, Name = "ИП1-22" },
|
||||||
|
new GroupLocalEntity{ Id = 3, Name = "ИП1-23" },
|
||||||
|
};
|
||||||
|
|
||||||
|
public static List<UserLocalEnity> users => new List<UserLocalEnity>
|
||||||
|
{
|
||||||
|
new UserLocalEnity{Guid=Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), FIO = "RandomFio", GroupID = 1 },
|
||||||
|
new UserLocalEnity{Guid=Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), FIO = "RandomFio1", GroupID = 2 },
|
||||||
|
new UserLocalEnity{Guid=Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), FIO = "RandomFio2", GroupID = 3 },
|
||||||
|
new UserLocalEnity{Guid=Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), FIO = "RandomFio3", GroupID = 1 },
|
||||||
|
new UserLocalEnity{Guid=Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), FIO = "RandomFio4", GroupID = 2 },
|
||||||
|
new UserLocalEnity{Guid=Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), FIO = "RandomFio5", GroupID = 3 },
|
||||||
|
};
|
||||||
|
|
||||||
|
public static List<PresenceLocalEntity> presences => new List<PresenceLocalEntity>
|
||||||
|
{
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
15
presence_new/Data/RemoteData/RemoteDataBase/DAO/Group.cs
Normal file
15
presence_new/Data/RemoteData/RemoteDataBase/DAO/Group.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
|
||||||
|
{
|
||||||
|
public class GroupDao
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public required string Name { get; set; }
|
||||||
|
public virtual IEnumerable<UserDao> Users { get; set; }
|
||||||
|
}
|
||||||
|
}
|
17
presence_new/Data/RemoteData/RemoteDataBase/DAO/Presence.cs
Normal file
17
presence_new/Data/RemoteData/RemoteDataBase/DAO/Presence.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
|
||||||
|
{
|
||||||
|
public class PresenceDao
|
||||||
|
{
|
||||||
|
public Guid UserGuid { get; set; }
|
||||||
|
public bool IsAttedance { get; set; } = true;
|
||||||
|
public DateOnly Date { get; set; }
|
||||||
|
public int LessonNumber { get; set; }
|
||||||
|
public virtual UserDao UserDao { get; set; }
|
||||||
|
}
|
||||||
|
}
|
18
presence_new/Data/RemoteData/RemoteDataBase/DAO/User.cs
Normal file
18
presence_new/Data/RemoteData/RemoteDataBase/DAO/User.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
|
||||||
|
{
|
||||||
|
public class UserDao
|
||||||
|
{
|
||||||
|
public required string FIO { get; set; }
|
||||||
|
public Guid Guid { get; set; }
|
||||||
|
|
||||||
|
public required int GroupID { get; set; }
|
||||||
|
|
||||||
|
public GroupDao Group { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace Demo.Data.RemoteData.RemoteDataBase
|
||||||
|
{
|
||||||
|
public class RemoteDatabaseContext : DbContext
|
||||||
|
{
|
||||||
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||||
|
{
|
||||||
|
optionsBuilder.UseNpgsql("Host=45.67.56.214;Port=5421;Username=user15;Database=user15;Password=3XkvwMOb");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
// Настройка ключа и автоматической генерации для GroupDao
|
||||||
|
modelBuilder.Entity<GroupDao>().HasKey(group => group.Id);
|
||||||
|
modelBuilder.Entity<GroupDao>().Property(group => group.Id).ValueGeneratedOnAdd();
|
||||||
|
|
||||||
|
// Настройка ключа и автоматической генерации для UserDao
|
||||||
|
modelBuilder.Entity<UserDao>().HasKey(user => user.Guid);
|
||||||
|
modelBuilder.Entity<UserDao>().Property(user => user.Guid).ValueGeneratedOnAdd();
|
||||||
|
|
||||||
|
// Настройка составного ключа для PresenceDao
|
||||||
|
modelBuilder.Entity<PresenceDao>().HasKey(presense => new
|
||||||
|
{
|
||||||
|
presense.UserGuid,
|
||||||
|
presense.Date,
|
||||||
|
presense.IsAttedance,
|
||||||
|
presense.LessonNumber
|
||||||
|
});
|
||||||
|
|
||||||
|
// Настройка связи UserDao с PresenceDao
|
||||||
|
modelBuilder.Entity<PresenceDao>()
|
||||||
|
.HasOne(p => p.UserDao)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey(p => p.UserGuid)
|
||||||
|
.OnDelete(DeleteBehavior.Cascade);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DbSet<GroupDao> Groups { get; set; }
|
||||||
|
public DbSet<UserDao> Users { get; set; }
|
||||||
|
public DbSet<PresenceDao> PresenceDaos { get; set; }
|
||||||
|
}
|
||||||
|
}
|
53
presence_new/Data/Repository/GroupRepositoryImpl.cs
Normal file
53
presence_new/Data/Repository/GroupRepositoryImpl.cs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
using Demo.Data.Exceptions;
|
||||||
|
using Demo.Data.LocalData;
|
||||||
|
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||||
|
using Demo.Data.Repository;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
public class GroupRepositoryImpl : IGroupRepository
|
||||||
|
{
|
||||||
|
private List<GroupLocalEntity> _groups = LocalStaticData.groups;
|
||||||
|
|
||||||
|
public GroupLocalEntity? GetGroupById(int groupId)
|
||||||
|
{
|
||||||
|
return _groups.FirstOrDefault(g => g.Id == groupId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для получения всех групп
|
||||||
|
public List<GroupLocalEntity> GetAllGroup() => _groups;
|
||||||
|
|
||||||
|
// Метод для добавления новой группы
|
||||||
|
public bool AddGroup(GroupLocalEntity group)
|
||||||
|
{
|
||||||
|
if (_groups.Any(g => g.Id == group.Id))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
group.Id = _groups.Any() ? _groups.Max(g => g.Id) + 1 : 1;
|
||||||
|
_groups.Add(group);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для обновления существующей группы
|
||||||
|
public bool UpdateGroupById(int groupID, GroupLocalEntity updatedGroup)
|
||||||
|
{
|
||||||
|
var existingGroup = GetGroupById(groupID);
|
||||||
|
if (existingGroup == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
existingGroup.Name = updatedGroup.Name;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public bool RemoveGroupById(int groupID)
|
||||||
|
{
|
||||||
|
var existingGroup = GetGroupById(groupID);
|
||||||
|
if (existingGroup == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
_groups.Remove(existingGroup);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
19
presence_new/Data/Repository/IGroupRepository.cs
Normal file
19
presence_new/Data/Repository/IGroupRepository.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.Data.Repository
|
||||||
|
{
|
||||||
|
public interface IGroupRepository
|
||||||
|
{
|
||||||
|
List<GroupLocalEntity> GetAllGroup();
|
||||||
|
bool RemoveGroupById(int groupID);
|
||||||
|
bool UpdateGroupById(int groupID, GroupLocalEntity updatedGroup);
|
||||||
|
GroupLocalEntity GetGroupById(int groupID);
|
||||||
|
bool AddGroup(GroupLocalEntity newGroup);
|
||||||
|
}
|
||||||
|
}
|
16
presence_new/Data/Repository/IPresenceRepository.cs
Normal file
16
presence_new/Data/Repository/IPresenceRepository.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Demo.Data.Repository
|
||||||
|
{
|
||||||
|
public interface IPresenceRepository
|
||||||
|
{
|
||||||
|
void SavePresence(List<PresenceLocalEntity> presences);
|
||||||
|
List<PresenceLocalEntity> GetPresenceByGroup(int groupId);
|
||||||
|
List<PresenceLocalEntity> GetPresenceByGroupAndDate(int groupId, DateTime date);
|
||||||
|
void MarkUserAsAbsent(Guid userGuid, int groupId, int firstLessonNumber, int lastLessonNumber);
|
||||||
|
void AddPresence(PresenceLocalEntity presence);
|
||||||
|
}
|
||||||
|
}
|
18
presence_new/Data/Repository/IUserRepository.cs
Normal file
18
presence_new/Data/Repository/IUserRepository.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.Data.Repository
|
||||||
|
{
|
||||||
|
public interface IUserRepository
|
||||||
|
{
|
||||||
|
IEnumerable<UserLocalEnity> GetAllUsers { get; }
|
||||||
|
bool RemoveUserById(Guid userGuid);
|
||||||
|
UserLocalEnity? UpdateUser(UserLocalEnity user);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
62
presence_new/Data/Repository/PresenceRepositoryImpl.cs
Normal file
62
presence_new/Data/Repository/PresenceRepositoryImpl.cs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Demo.Data.Repository
|
||||||
|
{
|
||||||
|
public class PresenceRepositoryImpl : IPresenceRepository
|
||||||
|
{
|
||||||
|
private readonly List<PresenceLocalEntity> _presences = new List<PresenceLocalEntity>();
|
||||||
|
|
||||||
|
public void SavePresence(List<PresenceLocalEntity> presences)
|
||||||
|
{
|
||||||
|
foreach (var presence in presences)
|
||||||
|
{
|
||||||
|
var existing = _presences.FirstOrDefault(p =>
|
||||||
|
p.Date == presence.Date &&
|
||||||
|
p.UserGuid == presence.UserGuid &&
|
||||||
|
p.LessonNumber == presence.LessonNumber);
|
||||||
|
|
||||||
|
if (existing == null)
|
||||||
|
{
|
||||||
|
_presences.Add(presence);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
existing.IsAttedance = presence.IsAttedance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddPresence(PresenceLocalEntity presence)
|
||||||
|
{
|
||||||
|
if (presence == null) throw new ArgumentNullException(nameof(presence));
|
||||||
|
|
||||||
|
_presences.Add(presence);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PresenceLocalEntity> GetPresenceByGroup(int groupId)
|
||||||
|
{
|
||||||
|
return _presences.Where(p => p.GroupId == groupId).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PresenceLocalEntity> GetPresenceByGroupAndDate(int groupId, DateTime date)
|
||||||
|
{
|
||||||
|
return _presences.Where(p => p.GroupId == groupId && p.Date.Date == date.Date).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MarkUserAsAbsent(Guid userGuid, int groupId, int firstLessonNumber, int lastLessonNumber)
|
||||||
|
{
|
||||||
|
foreach (var lesson in Enumerable.Range(firstLessonNumber, lastLessonNumber - firstLessonNumber + 1))
|
||||||
|
{
|
||||||
|
var presence = _presences.FirstOrDefault(p => p.UserGuid == userGuid && p.GroupId == groupId && p.LessonNumber == lesson);
|
||||||
|
if (presence != null)
|
||||||
|
{
|
||||||
|
presence.IsAttedance = false; // Помечаем как отсутствующего
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
69
presence_new/Data/Repository/SQLGroupRepositoryImpl.cs
Normal file
69
presence_new/Data/Repository/SQLGroupRepositoryImpl.cs
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
using Demo.Data.Exceptions;
|
||||||
|
using Demo.Data.LocalData;
|
||||||
|
using Demo.Data.RemoteData.RemoteDataBase;
|
||||||
|
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||||
|
using Demo.Data.Repository;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
public class SQLGroupRepositoryImpl : IGroupRepository
|
||||||
|
{
|
||||||
|
private readonly RemoteDatabaseContext _remoteDatabaseContext;
|
||||||
|
|
||||||
|
public SQLGroupRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext)
|
||||||
|
{
|
||||||
|
_remoteDatabaseContext = remoteDatabaseContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для получения группы по ID
|
||||||
|
public GroupLocalEntity? GetGroupById(int groupId)
|
||||||
|
{
|
||||||
|
var groupDao = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupId);
|
||||||
|
return groupDao != null ? new GroupLocalEntity { Id = groupDao.Id, Name = groupDao.Name } : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для получения всех групп
|
||||||
|
public List<GroupLocalEntity> GetAllGroup()
|
||||||
|
{
|
||||||
|
return _remoteDatabaseContext.Groups
|
||||||
|
.Select(g => new GroupLocalEntity { Id = g.Id, Name = g.Name })
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для добавления новой группы
|
||||||
|
public bool AddGroup(GroupLocalEntity group)
|
||||||
|
{
|
||||||
|
if (_remoteDatabaseContext.Groups.Any(g => g.Id == group.Id))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var groupDao = new GroupDao { Id = group.Id, Name = group.Name };
|
||||||
|
_remoteDatabaseContext.Groups.Add(groupDao);
|
||||||
|
_remoteDatabaseContext.SaveChanges();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для обновления существующей группы
|
||||||
|
public bool UpdateGroupById(int groupID, GroupLocalEntity updatedGroup)
|
||||||
|
{
|
||||||
|
var existingGroup = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupID);
|
||||||
|
if (existingGroup == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
existingGroup.Name = updatedGroup.Name;
|
||||||
|
_remoteDatabaseContext.SaveChanges();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для удаления группы по ID
|
||||||
|
public bool RemoveGroupById(int groupID)
|
||||||
|
{
|
||||||
|
var existingGroup = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupID);
|
||||||
|
if (existingGroup == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
_remoteDatabaseContext.Groups.Remove(existingGroup);
|
||||||
|
_remoteDatabaseContext.SaveChanges();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
87
presence_new/Data/Repository/SQLPresenceRepositoryImpl.cs
Normal file
87
presence_new/Data/Repository/SQLPresenceRepositoryImpl.cs
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
using Demo.Data.RemoteData.RemoteDataBase;
|
||||||
|
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
|
||||||
|
namespace Demo.Data.Repository
|
||||||
|
{
|
||||||
|
public class SQLPresenceRepositoryImpl : IPresenceRepository
|
||||||
|
{
|
||||||
|
private readonly RemoteDatabaseContext _remoteDatabaseContext;
|
||||||
|
|
||||||
|
public SQLPresenceRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext)
|
||||||
|
{
|
||||||
|
_remoteDatabaseContext = remoteDatabaseContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SavePresence(List<PresenceLocalEntity> presences)
|
||||||
|
{
|
||||||
|
_remoteDatabaseContext.PresenceDaos.AddRange(presences.Select(it => new PresenceDao {
|
||||||
|
Date = DateOnly.FromDateTime(it.Date),
|
||||||
|
IsAttedance = it.IsAttedance,
|
||||||
|
LessonNumber = it.LessonNumber,
|
||||||
|
UserGuid = it.UserGuid }));
|
||||||
|
_remoteDatabaseContext.SaveChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddPresence(PresenceLocalEntity presence)
|
||||||
|
{
|
||||||
|
if (presence == null) throw new ArgumentNullException(nameof(presence));
|
||||||
|
|
||||||
|
var newPresence = new PresenceDao
|
||||||
|
{
|
||||||
|
Date = DateOnly.FromDateTime(presence.Date),
|
||||||
|
UserGuid = presence.UserGuid,
|
||||||
|
LessonNumber = presence.LessonNumber,
|
||||||
|
IsAttedance = presence.IsAttedance
|
||||||
|
};
|
||||||
|
_remoteDatabaseContext.PresenceDaos.Add(newPresence);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PresenceLocalEntity> GetPresenceByGroup(int groupId)
|
||||||
|
{
|
||||||
|
return _remoteDatabaseContext.PresenceDaos
|
||||||
|
.Where(p => p.UserDao != null && p.UserDao.GroupID == groupId) // Проверяем на null перед использованием
|
||||||
|
.Select(p => new PresenceLocalEntity
|
||||||
|
{
|
||||||
|
Date = p.Date.ToDateTime(TimeOnly.MinValue),
|
||||||
|
UserGuid = p.UserGuid,
|
||||||
|
LessonNumber = p.LessonNumber,
|
||||||
|
IsAttedance = p.IsAttedance
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PresenceLocalEntity> GetPresenceByGroupAndDate(int groupId, DateTime date)
|
||||||
|
{
|
||||||
|
return _remoteDatabaseContext.PresenceDaos
|
||||||
|
.Where(p => p.UserDao != null && p.UserDao.GroupID == groupId && p.Date == DateOnly.FromDateTime(date))
|
||||||
|
.Select(p => new PresenceLocalEntity
|
||||||
|
{
|
||||||
|
Date = p.Date.ToDateTime(TimeOnly.MinValue),
|
||||||
|
UserGuid = p.UserGuid,
|
||||||
|
LessonNumber = p.LessonNumber,
|
||||||
|
IsAttedance = p.IsAttedance
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MarkUserAsAbsent(Guid userGuid, int groupId, int firstLessonNumber, int lastLessonNumber)
|
||||||
|
{
|
||||||
|
foreach (var lesson in Enumerable.Range(firstLessonNumber, lastLessonNumber - firstLessonNumber + 1))
|
||||||
|
{
|
||||||
|
var presence = _remoteDatabaseContext.PresenceDaos.FirstOrDefault(p =>
|
||||||
|
p.UserGuid == userGuid &&
|
||||||
|
p.UserDao != null && p.UserDao.GroupID == groupId &&
|
||||||
|
p.LessonNumber == lesson);
|
||||||
|
|
||||||
|
if (presence != null)
|
||||||
|
{
|
||||||
|
presence.IsAttedance = false; // Помечаем как отсутствующего
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
63
presence_new/Data/Repository/SQLUserRepositoryImpl.cs
Normal file
63
presence_new/Data/Repository/SQLUserRepositoryImpl.cs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
using Demo.Data.Exceptions;
|
||||||
|
using Demo.Data.RemoteData.RemoteDataBase;
|
||||||
|
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Demo.Data.Repository
|
||||||
|
{
|
||||||
|
public class SQLUserRepositoryImpl : IUserRepository
|
||||||
|
{
|
||||||
|
private readonly RemoteDatabaseContext _remoteDatabaseContext;
|
||||||
|
|
||||||
|
public SQLUserRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext)
|
||||||
|
{
|
||||||
|
_remoteDatabaseContext = remoteDatabaseContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для получения всех пользователей
|
||||||
|
public IEnumerable<UserLocalEnity> GetAllUsers => _remoteDatabaseContext.Users
|
||||||
|
.Select(u => new UserLocalEnity
|
||||||
|
{
|
||||||
|
Guid = u.Guid,
|
||||||
|
FIO = u.FIO,
|
||||||
|
GroupID = u.GroupID
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
// Метод для удаления пользователя по GUID
|
||||||
|
public bool RemoveUserById(Guid userGuid)
|
||||||
|
{
|
||||||
|
var user = _remoteDatabaseContext.Users.FirstOrDefault(u => u.Guid == userGuid);
|
||||||
|
if (user == null) throw new UserNotFoundException(userGuid);
|
||||||
|
|
||||||
|
_remoteDatabaseContext.Users.Remove(user);
|
||||||
|
_remoteDatabaseContext.SaveChanges(); // Сохранение изменений в базе данных
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для обновления данных пользователя
|
||||||
|
public UserLocalEnity? UpdateUser(UserLocalEnity user)
|
||||||
|
{
|
||||||
|
var existingUser = _remoteDatabaseContext.Users.FirstOrDefault(u => u.Guid == user.Guid);
|
||||||
|
if (existingUser == null) throw new UserNotFoundException(user.Guid);
|
||||||
|
|
||||||
|
existingUser.FIO = user.FIO;
|
||||||
|
existingUser.GroupID = user.GroupID;
|
||||||
|
_remoteDatabaseContext.SaveChanges(); // Сохранение изменений в базе данных
|
||||||
|
|
||||||
|
// Возвращаем обновленный объект UserLocalEnity
|
||||||
|
return new UserLocalEnity
|
||||||
|
{
|
||||||
|
Guid = existingUser.Guid,
|
||||||
|
FIO = existingUser.FIO,
|
||||||
|
GroupID = existingUser.GroupID
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Дополнительный метод для DAO, если требуется
|
||||||
|
public IEnumerable<RemoteData.RemoteDataBase.DAO.UserDao> GetAllUsersDao => _remoteDatabaseContext.Users.ToList();
|
||||||
|
}
|
||||||
|
}
|
41
presence_new/Data/Repository/UserRepositoryImpl.cs
Normal file
41
presence_new/Data/Repository/UserRepositoryImpl.cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
using Demo.Data.Exceptions;
|
||||||
|
using Demo.Data.LocalData;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Demo.Data.Repository
|
||||||
|
{
|
||||||
|
public class UserRepositoryImpl : IUserRepository
|
||||||
|
{
|
||||||
|
private List<UserLocalEnity> _users;
|
||||||
|
|
||||||
|
public UserRepositoryImpl()
|
||||||
|
{
|
||||||
|
_users = LocalStaticData.users;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<UserLocalEnity> GetAllUsers => _users;
|
||||||
|
|
||||||
|
public bool RemoveUserById(Guid userGuid) // Оставил Guid
|
||||||
|
{
|
||||||
|
var user = _users.FirstOrDefault(u => u.Guid == userGuid);
|
||||||
|
if (user == null) throw new UserNotFoundException(userGuid);
|
||||||
|
|
||||||
|
_users.Remove(user);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserLocalEnity? UpdateUser(UserLocalEnity user)
|
||||||
|
{
|
||||||
|
var existingUser = _users.FirstOrDefault(u => u.Guid == user.Guid);
|
||||||
|
if (existingUser == null) throw new UserNotFoundException(user.Guid);
|
||||||
|
|
||||||
|
existingUser.FIO = user.FIO;
|
||||||
|
existingUser.GroupID = user.GroupID;
|
||||||
|
|
||||||
|
return existingUser;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
presence_new/Demo.csproj
Normal file
26
presence_new/Demo.csproj
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="ClosedXML" Version="0.104.1" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.10" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.10">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
|
||||||
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Data\RemoteData\RemoteApi\" />
|
||||||
|
<Folder Include="Migrations\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
14
presence_new/Domain/Models/Group.cs
Normal file
14
presence_new/Domain/Models/Group.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.domain.Models
|
||||||
|
{
|
||||||
|
public class Group
|
||||||
|
{
|
||||||
|
public required int Id { get; set; }
|
||||||
|
public required string Name { get; set; }
|
||||||
|
}
|
||||||
|
}
|
19
presence_new/Domain/Models/Presence.cs
Normal file
19
presence_new/Domain/Models/Presence.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.domain.Models
|
||||||
|
{
|
||||||
|
public class Presence
|
||||||
|
{
|
||||||
|
|
||||||
|
public required User User { get; set; }
|
||||||
|
public required int GroupId { get; set; }
|
||||||
|
public bool IsAttedance { get; set; } = true;
|
||||||
|
public required DateTime Date { get; set; }
|
||||||
|
|
||||||
|
public required int LessonNumber { get; set; }
|
||||||
|
}
|
||||||
|
}
|
15
presence_new/Domain/Models/User.cs
Normal file
15
presence_new/Domain/Models/User.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.domain.Models
|
||||||
|
{
|
||||||
|
public class User
|
||||||
|
{
|
||||||
|
public required string FIO { get; set; }
|
||||||
|
public Guid Guid { get; set; }
|
||||||
|
public required Group Group { get; set; }
|
||||||
|
}
|
||||||
|
}
|
78
presence_new/Domain/UseCase/GroupAttendanceService.cs
Normal file
78
presence_new/Domain/UseCase/GroupAttendanceService.cs
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
using Demo.Data.Repository;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Demo.Domain.UseCase
|
||||||
|
{
|
||||||
|
public class GroupAttendanceService
|
||||||
|
{
|
||||||
|
private readonly IPresenceRepository _presenceRepository;
|
||||||
|
private readonly IUserRepository _userRepository; // Добавляем репозиторий пользователей
|
||||||
|
|
||||||
|
public GroupAttendanceService(IPresenceRepository presenceRepository, IUserRepository userRepository)
|
||||||
|
{
|
||||||
|
_presenceRepository = presenceRepository;
|
||||||
|
_userRepository = userRepository; // Инициализируем репозиторий пользователей
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisplayGroupAttendanceInfo(int groupId)
|
||||||
|
{
|
||||||
|
var presences = _presenceRepository.GetPresenceByGroup(groupId);
|
||||||
|
if (presences == null || !presences.Any())
|
||||||
|
{
|
||||||
|
Console.WriteLine("Нет данных о посещаемости для группы с ID: " + groupId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Вычисление количества студентов
|
||||||
|
var totalStudents = presences.Select(p => p.UserGuid).Distinct().Count(); // Предполагается, что в PresenceLocalEntity есть UserGuid
|
||||||
|
|
||||||
|
// Вычисление количества проведенных занятий
|
||||||
|
var totalSessions = presences.Select(p => p.Date).Distinct().Count();
|
||||||
|
|
||||||
|
// Общее количество присутствий
|
||||||
|
var totalAttendance = presences.Count(p => p.IsAttedance);
|
||||||
|
|
||||||
|
// Общий процент посещаемости
|
||||||
|
double overallAttendancePercentage = totalSessions > 0
|
||||||
|
? (double)totalAttendance / (totalSessions * totalStudents) * 100
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
Console.WriteLine($"Группа ID: {groupId}");
|
||||||
|
Console.WriteLine($"Количество студентов: {totalStudents}");
|
||||||
|
Console.WriteLine($"Количество проведенных занятий: {totalSessions}");
|
||||||
|
Console.WriteLine($"Общий процент посещаемости: {overallAttendancePercentage:F2}%");
|
||||||
|
Console.WriteLine("Студенты:");
|
||||||
|
|
||||||
|
// Вывод информации по каждому студенту
|
||||||
|
var studentAttendances = presences
|
||||||
|
.GroupBy(p => p.UserGuid) // Здесь также нужно использовать UserGuid
|
||||||
|
.Select(g => new
|
||||||
|
{
|
||||||
|
StudentName = GetStudentNameByGuid(g.Key), // Функция для получения имени студента по его GUID
|
||||||
|
AttendedCount = g.Count(p => p.IsAttedance),
|
||||||
|
MissedCount = g.Count(p => !p.IsAttedance)
|
||||||
|
});
|
||||||
|
|
||||||
|
foreach (var student in studentAttendances)
|
||||||
|
{
|
||||||
|
// Процент посещаемости студента
|
||||||
|
double attendancePercentage = totalSessions > 0
|
||||||
|
? (double)student.AttendedCount / totalSessions * 100
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
var attendanceColor = attendancePercentage < 40 ? "\u001b[31m" : "\u001b[0m"; // Красный для низкого процента
|
||||||
|
Console.WriteLine($"{attendanceColor}{student.StudentName} - Посещено: {student.AttendedCount}, Пропущено: {student.MissedCount}, Процент посещаемости: {attendancePercentage:F2}%\u001b[0m");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для получения имени студента по его GUID
|
||||||
|
private string GetStudentNameByGuid(Guid userGuid)
|
||||||
|
{
|
||||||
|
var user = _userRepository.GetAllUsers.FirstOrDefault(u => u.Guid == userGuid);
|
||||||
|
return user != null ? user.FIO : "Неизвестный студент"; // Возвращаем имя студента или "Неизвестный студент"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
129
presence_new/Domain/UseCase/GroupUseCase.cs
Normal file
129
presence_new/Domain/UseCase/GroupUseCase.cs
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
using Demo.Data.LocalData;
|
||||||
|
using Demo.Data.Repository;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
|
||||||
|
namespace Demo.Domain.UseCase
|
||||||
|
{
|
||||||
|
public class GroupUseCase
|
||||||
|
{
|
||||||
|
private readonly IGroupRepository _repositoryGroupImpl;
|
||||||
|
|
||||||
|
public GroupUseCase(IGroupRepository repositoryGroupImpl)
|
||||||
|
{
|
||||||
|
_repositoryGroupImpl = repositoryGroupImpl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Приватный метод для валидации имени группы
|
||||||
|
private void ValidateGroupName(string groupName)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(groupName))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Имя группы не может быть пустым.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ValidateGroupId(int GroupId)
|
||||||
|
{
|
||||||
|
if (GroupId < 1)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Введите корректный ID группы.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Приватный метод для валидации существования группы по ID
|
||||||
|
private GroupLocalEntity ValidateGroupExistence(int groupId)
|
||||||
|
{
|
||||||
|
var existingGroup = _repositoryGroupImpl.GetAllGroup()
|
||||||
|
.FirstOrDefault(g => g.Id == groupId);
|
||||||
|
|
||||||
|
if (existingGroup == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Группа не найдена.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return existingGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Метод для получения списка всех групп
|
||||||
|
public List<Group> GetAllGroups()
|
||||||
|
{
|
||||||
|
return [.. _repositoryGroupImpl.GetAllGroup()
|
||||||
|
.Select(it => new Group { Id = it.Id, Name = it.Name })];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void FindGroupById(int IdGroup)
|
||||||
|
{
|
||||||
|
List<Group> GetAllGroups()
|
||||||
|
{
|
||||||
|
return [.. _repositoryGroupImpl
|
||||||
|
.GetAllGroup()
|
||||||
|
.Select(
|
||||||
|
it => new Group
|
||||||
|
{ Id = it.Id, Name = it.Name }
|
||||||
|
)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
foreach (var group in GetAllGroups())
|
||||||
|
{
|
||||||
|
if (IdGroup == group.Id)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"ID группы: {group.Id} Название группы: {group.Name}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Метод для добавления новой группы
|
||||||
|
public void AddGroup(string groupName)
|
||||||
|
{
|
||||||
|
ValidateGroupName(groupName);
|
||||||
|
|
||||||
|
var newId = _repositoryGroupImpl.GetAllGroup().Any()
|
||||||
|
? _repositoryGroupImpl.GetAllGroup().Max(g => g.Id) + 1
|
||||||
|
: 1;
|
||||||
|
|
||||||
|
GroupLocalEntity newGroup = new GroupLocalEntity
|
||||||
|
{
|
||||||
|
Id = newId,
|
||||||
|
Name = groupName
|
||||||
|
};
|
||||||
|
|
||||||
|
_repositoryGroupImpl.AddGroup(newGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
ValidateGroupName(newGroupName);
|
||||||
|
var existingGroup = ValidateGroupExistence(groupId);
|
||||||
|
|
||||||
|
existingGroup.Name = newGroupName;
|
||||||
|
_repositoryGroupImpl.UpdateGroupById(existingGroup.Id, existingGroup);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
84
presence_new/Domain/UseCase/UseCaseGeneratePresence.cs
Normal file
84
presence_new/Domain/UseCase/UseCaseGeneratePresence.cs
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
using Demo.Data.Repository;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Demo.Domain.UseCase
|
||||||
|
{
|
||||||
|
public class UseCaseGeneratePresence
|
||||||
|
{
|
||||||
|
public readonly IUserRepository _userRepository;
|
||||||
|
public readonly IPresenceRepository _presenceRepository;
|
||||||
|
|
||||||
|
public UseCaseGeneratePresence(IUserRepository userRepository, IPresenceRepository presenceRepository)
|
||||||
|
{
|
||||||
|
_userRepository = userRepository;
|
||||||
|
_presenceRepository = presenceRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PresenceLocalEntity> GetPresenceByDateAndGroup(int groupId, DateTime date)
|
||||||
|
{
|
||||||
|
return _presenceRepository.GetPresenceByGroupAndDate(groupId, date);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void GeneratePresenceDaily(int firstLesson, int lastLesson, int groupId, DateTime currentDate)
|
||||||
|
{
|
||||||
|
var users = _userRepository.GetAllUsers.Where(u => u.GroupID == groupId).ToList();
|
||||||
|
List<PresenceLocalEntity> presences = new List<PresenceLocalEntity>();
|
||||||
|
for (int lessonNumber = firstLesson; lessonNumber <= lastLesson; lessonNumber++)
|
||||||
|
{
|
||||||
|
foreach (var user in users)
|
||||||
|
{
|
||||||
|
presences.Add(new PresenceLocalEntity
|
||||||
|
{
|
||||||
|
UserGuid = user.Guid,
|
||||||
|
Date = currentDate,
|
||||||
|
LessonNumber = lessonNumber,
|
||||||
|
IsAttedance = true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_presenceRepository.SavePresence(presences);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GenerateWeeklyPresence(int firstLesson, int lastLesson, int groupId, DateTime startTime)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 7; i++)
|
||||||
|
{
|
||||||
|
DateTime currentTime = startTime.AddDays(i);
|
||||||
|
GeneratePresenceDaily(firstLesson, lastLesson, groupId, currentTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Отметить пользователя как отсутствующего на диапазоне занятий
|
||||||
|
public void MarkUserAbsentForLessons(Guid userGuid, int groupId, int firstLesson, int lastLesson, DateTime date)
|
||||||
|
{
|
||||||
|
var presences = _presenceRepository.GetPresenceByGroupAndDate(groupId, date);
|
||||||
|
foreach (var presence in presences.Where(p => p.UserGuid == userGuid && p.LessonNumber >= firstLesson && p.LessonNumber <= lastLesson))
|
||||||
|
{
|
||||||
|
presence.IsAttedance = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
_presenceRepository.SavePresence(presences);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public List<PresenceLocalEntity> GetAllPresenceByGroup(int groupId)
|
||||||
|
{
|
||||||
|
return _presenceRepository.GetPresenceByGroup(groupId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
135
presence_new/Domain/UseCase/UserUseCase.cs
Normal file
135
presence_new/Domain/UseCase/UserUseCase.cs
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
using Demo.Data.Exceptions;
|
||||||
|
using Demo.Data.Repository;
|
||||||
|
using Demo.domain.Models;
|
||||||
|
|
||||||
|
namespace Demo.Domain.UseCase
|
||||||
|
{
|
||||||
|
public class UserUseCase
|
||||||
|
{
|
||||||
|
private readonly IUserRepository _repositoryUserImpl;
|
||||||
|
private readonly IGroupRepository _repositoryGroupImpl;
|
||||||
|
|
||||||
|
public UserUseCase(IUserRepository repositoryImpl, IGroupRepository repositoryGroupImpl)
|
||||||
|
{
|
||||||
|
_repositoryUserImpl = repositoryImpl;
|
||||||
|
_repositoryGroupImpl = repositoryGroupImpl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Приватный метод для валидации ФИО пользователя
|
||||||
|
private void ValidateUserFIO(string fio)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(fio))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("ФИО не может быть пустым.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Приватный метод для валидации существования пользователя по ID
|
||||||
|
private UserLocalEnity ValidateUserExistence(Guid userGuid)
|
||||||
|
{
|
||||||
|
var user = _repositoryUserImpl.GetAllUsers
|
||||||
|
.FirstOrDefault(u => u.Guid == userGuid);
|
||||||
|
|
||||||
|
if (user == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Пользователь не найден.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Приватный метод для валидации существования группы по ID
|
||||||
|
private GroupLocalEntity ValidateGroupExistence(int groupId)
|
||||||
|
{
|
||||||
|
var group = _repositoryGroupImpl.GetAllGroup()
|
||||||
|
.FirstOrDefault(g => g.Id == groupId);
|
||||||
|
|
||||||
|
if (group == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Группа не найдена.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Вывести всех пользователей
|
||||||
|
public List<User> GetAllUsers() => _repositoryUserImpl.GetAllUsers
|
||||||
|
.Join(_repositoryGroupImpl.GetAllGroup(),
|
||||||
|
user => user.GroupID,
|
||||||
|
group => group.Id,
|
||||||
|
(user, group) =>
|
||||||
|
new User
|
||||||
|
{
|
||||||
|
FIO = user.FIO,
|
||||||
|
Guid = user.Guid,
|
||||||
|
Group = new Group { Id = group.Id, Name = group.Name }
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
|
// Удалить пользователя по id
|
||||||
|
public bool RemoveUserById(Guid userGuid)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return _repositoryUserImpl.RemoveUserById(userGuid);
|
||||||
|
}
|
||||||
|
catch (UserNotFoundException ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Ошибка: {ex.Message}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (RepositoryException ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Ошибка в репозитории: {ex.Message}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обновить пользователя по guid
|
||||||
|
public User UpdateUser(User user)
|
||||||
|
{
|
||||||
|
ValidateUserFIO(user.FIO);
|
||||||
|
ValidateGroupExistence(user.Group.Id);
|
||||||
|
|
||||||
|
UserLocalEnity userLocalEnity = new UserLocalEnity
|
||||||
|
{
|
||||||
|
FIO = user.FIO,
|
||||||
|
GroupID = user.Group.Id,
|
||||||
|
Guid = user.Guid
|
||||||
|
};
|
||||||
|
|
||||||
|
UserLocalEnity? result = _repositoryUserImpl.UpdateUser(userLocalEnity);
|
||||||
|
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Ошибка при обновлении пользователя.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var groupEntity = ValidateGroupExistence(result.GroupID);
|
||||||
|
|
||||||
|
return new User
|
||||||
|
{
|
||||||
|
FIO = result.FIO,
|
||||||
|
Guid = result.Guid,
|
||||||
|
Group = new Group
|
||||||
|
{
|
||||||
|
Id = groupEntity.Id,
|
||||||
|
Name = groupEntity.Name
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Найти пользователя по id
|
||||||
|
public User FindUserById(Guid userGuid)
|
||||||
|
{
|
||||||
|
var user = ValidateUserExistence(userGuid);
|
||||||
|
var group = ValidateGroupExistence(user.GroupID);
|
||||||
|
|
||||||
|
return new User
|
||||||
|
{
|
||||||
|
FIO = user.FIO,
|
||||||
|
Guid = user.Guid,
|
||||||
|
Group = new Group { Id = group.Id, Name = group.Name }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
113
presence_new/Migrations/20241031104932_Init.Designer.cs
generated
Normal file
113
presence_new/Migrations/20241031104932_Init.Designer.cs
generated
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Demo.Data.RemoteData.RemoteDataBase;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Demo.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(RemoteDatabaseContext))]
|
||||||
|
[Migration("20241031104932_Init")]
|
||||||
|
partial class Init
|
||||||
|
{
|
||||||
|
/// <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("Demo.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("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("UserGuid")
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<DateOnly>("Date")
|
||||||
|
.HasColumnType("date");
|
||||||
|
|
||||||
|
b.Property<bool>("IsAttedance")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<int>("LessonNumber")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.HasKey("UserGuid", "Date", "IsAttedance", "LessonNumber");
|
||||||
|
|
||||||
|
b.ToTable("PresenceDaos");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Guid")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<string>("FIO")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<int>("GroupID")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.HasKey("Guid");
|
||||||
|
|
||||||
|
b.HasIndex("GroupID");
|
||||||
|
|
||||||
|
b.ToTable("Users");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", "UserDao")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserGuid")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("UserDao");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group")
|
||||||
|
.WithMany("Users")
|
||||||
|
.HasForeignKey("GroupID")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Group");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Users");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
86
presence_new/Migrations/20241031104932_Init.cs
Normal file
86
presence_new/Migrations/20241031104932_Init.cs
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Demo.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class Init : 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
|
||||||
|
{
|
||||||
|
Guid = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
FIO = table.Column<string>(type: "text", nullable: false),
|
||||||
|
GroupID = table.Column<int>(type: "integer", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Users", x => x.Guid);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Users_Groups_GroupID",
|
||||||
|
column: x => x.GroupID,
|
||||||
|
principalTable: "Groups",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "PresenceDaos",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
UserGuid = table.Column<Guid>(type: "uuid", 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)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_PresenceDaos", x => new { x.UserGuid, x.Date, x.IsAttedance, x.LessonNumber });
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_PresenceDaos_Users_UserGuid",
|
||||||
|
column: x => x.UserGuid,
|
||||||
|
principalTable: "Users",
|
||||||
|
principalColumn: "Guid",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Users_GroupID",
|
||||||
|
table: "Users",
|
||||||
|
column: "GroupID");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "PresenceDaos");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Users");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Groups");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
110
presence_new/Migrations/RemoteDatabaseContextModelSnapshot.cs
Normal file
110
presence_new/Migrations/RemoteDatabaseContextModelSnapshot.cs
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Demo.Data.RemoteData.RemoteDataBase;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Demo.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("Demo.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("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("UserGuid")
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<DateOnly>("Date")
|
||||||
|
.HasColumnType("date");
|
||||||
|
|
||||||
|
b.Property<bool>("IsAttedance")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<int>("LessonNumber")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.HasKey("UserGuid", "Date", "IsAttedance", "LessonNumber");
|
||||||
|
|
||||||
|
b.ToTable("PresenceDaos");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Guid")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<string>("FIO")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<int>("GroupID")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.HasKey("Guid");
|
||||||
|
|
||||||
|
b.HasIndex("GroupID");
|
||||||
|
|
||||||
|
b.ToTable("Users");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", "UserDao")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserGuid")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("UserDao");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group")
|
||||||
|
.WithMany("Users")
|
||||||
|
.HasForeignKey("GroupID")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Group");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Users");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
32
presence_new/Program.cs
Normal file
32
presence_new/Program.cs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
using Demo.Data.RemoteData.RemoteDataBase;
|
||||||
|
using Demo.Data.Repository;
|
||||||
|
using Demo.Domain.UseCase;
|
||||||
|
using Demo.UI;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
// Создаем экземпляр репозиториев
|
||||||
|
|
||||||
|
IServiceCollection services = new ServiceCollection();
|
||||||
|
|
||||||
|
services
|
||||||
|
.AddDbContext<RemoteDatabaseContext>()
|
||||||
|
.AddSingleton<IGroupRepository, SQLGroupRepositoryImpl>()
|
||||||
|
.AddSingleton<IUserRepository, SQLUserRepositoryImpl>()
|
||||||
|
.AddSingleton<IPresenceRepository, SQLPresenceRepositoryImpl>()
|
||||||
|
.AddSingleton<UserUseCase>()
|
||||||
|
.AddSingleton<GroupUseCase>()
|
||||||
|
.AddSingleton<UseCaseGeneratePresence>()
|
||||||
|
.AddSingleton<GroupConsoleUI>()
|
||||||
|
.AddSingleton<GroupAttendanceService>()
|
||||||
|
.AddSingleton<PresenceConsole>()
|
||||||
|
.AddSingleton<MainMenuUI>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var serviceProvider = services.BuildServiceProvider();
|
||||||
|
// Создаем пользовательский интерфейс
|
||||||
|
MainMenuUI mainMenuUI = serviceProvider.GetService<MainMenuUI>();
|
||||||
|
|
||||||
|
// Выводим главное меню
|
||||||
|
mainMenuUI.DisplayMenu();
|
64
presence_new/UI/GroupConsole.cs
Normal file
64
presence_new/UI/GroupConsole.cs
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
using Demo.Domain.UseCase;
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Demo.UI
|
||||||
|
{
|
||||||
|
public class GroupConsoleUI
|
||||||
|
{
|
||||||
|
private readonly GroupUseCase _groupUseCase;
|
||||||
|
|
||||||
|
public GroupConsoleUI(GroupUseCase groupUseCase)
|
||||||
|
{
|
||||||
|
_groupUseCase = groupUseCase;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void FindGroupById(int IdGroup)
|
||||||
|
{
|
||||||
|
_groupUseCase.FindGroupById(IdGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для отображения всех групп
|
||||||
|
public void DisplayAllGroups()
|
||||||
|
{
|
||||||
|
Console.WriteLine("\n=== Список всех групп ===");
|
||||||
|
StringBuilder groupOutput = new StringBuilder();
|
||||||
|
|
||||||
|
foreach (var group in _groupUseCase.GetAllGroups())
|
||||||
|
{
|
||||||
|
groupOutput.AppendLine($"{group.Id}\t{group.Name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine(groupOutput);
|
||||||
|
Console.WriteLine("===========================\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для добавления новой группы
|
||||||
|
public void AddGroup(string groupName)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_groupUseCase.AddGroup(groupName);
|
||||||
|
Console.WriteLine($"\nГруппа {groupName} добавлена.\n");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Ошибка: {ex.Message}\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveGroup(string groupIdStr)
|
||||||
|
{
|
||||||
|
int groupId = int.Parse(groupIdStr);
|
||||||
|
_groupUseCase.RemoveGroupById(groupId);
|
||||||
|
Console.WriteLine($"Группа с ID: {groupId} удалена");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для обновления названия группы
|
||||||
|
public void UpdateGroupName(int groupId, string newGroupName)
|
||||||
|
{
|
||||||
|
_groupUseCase.UpdateGroup(groupId, newGroupName);
|
||||||
|
Console.WriteLine($"\nНазвание группы с ID {groupId} изменено на {newGroupName}.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
226
presence_new/UI/MainMenu.cs
Normal file
226
presence_new/UI/MainMenu.cs
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
using Demo.domain.Models;
|
||||||
|
using Demo.Domain.UseCase;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Demo.UI
|
||||||
|
{
|
||||||
|
public class MainMenuUI
|
||||||
|
{
|
||||||
|
private readonly UserConsoleUI _userConsoleUI;
|
||||||
|
private readonly GroupConsoleUI _groupConsoleUI;
|
||||||
|
private readonly PresenceConsole _presenceConsoleUI;
|
||||||
|
|
||||||
|
public MainMenuUI(UserUseCase userUseCase, GroupUseCase groupUseCase, UseCaseGeneratePresence presenceUseCase, GroupAttendanceService groupAttendanceService)
|
||||||
|
{
|
||||||
|
_userConsoleUI = new UserConsoleUI(userUseCase);
|
||||||
|
_groupConsoleUI = new GroupConsoleUI(groupUseCase);
|
||||||
|
_presenceConsoleUI = new PresenceConsole(presenceUseCase, groupAttendanceService); // Передаем GroupAttendanceService
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void DisplayMenu()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
Console.WriteLine("\n==================== Главная Панель ====================\n");
|
||||||
|
|
||||||
|
Console.WriteLine("~~~~~~~~~~~~~~~ УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ ~~~~~~~~~~~~~~~");
|
||||||
|
Console.WriteLine("1. Показать список всех пользователей");
|
||||||
|
Console.WriteLine("2. Удалить пользователя по его ID");
|
||||||
|
Console.WriteLine("3. Обновить данные пользователя по ID");
|
||||||
|
Console.WriteLine("4. Найти пользователя по его ID");
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
Console.WriteLine("~~~~~~~~~~~~~~~ УПРАВЛЕНИЕ ГРУППАМИ ~~~~~~~~~~~~~~~");
|
||||||
|
Console.WriteLine("5. Показать список всех групп");
|
||||||
|
Console.WriteLine("6. Создать новую группу");
|
||||||
|
Console.WriteLine("7. Удалить группу по ID");
|
||||||
|
Console.WriteLine("8. Изменить название существующей группы");
|
||||||
|
Console.WriteLine("9. Найти группу по ее ID");
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
Console.WriteLine("~~~~~~~~~~~~~~~ УПРАВЛЕНИЕ ПОСЕЩАЕМОСТЬЮ ~~~~~~~~~~~~~~~");
|
||||||
|
Console.WriteLine("10. Сгенерировать посещаемость на текущий день");
|
||||||
|
Console.WriteLine("11. Сгенерировать посещаемость на текущую неделю");
|
||||||
|
Console.WriteLine("12. Показать посещаемость всех пользователей");
|
||||||
|
Console.WriteLine("13. Отметить пользователя как отсутствующего");
|
||||||
|
Console.WriteLine("14. Вывести посещаемость группы по ID");
|
||||||
|
Console.WriteLine("15. Показать информацию о посещаемости группы");
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
Console.WriteLine("========================================================");
|
||||||
|
Console.WriteLine("0. Выход из программы");
|
||||||
|
|
||||||
|
Console.Write("\nВыберите команду: ");
|
||||||
|
string command = Console.ReadLine();
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
switch (command)
|
||||||
|
{
|
||||||
|
case "1":
|
||||||
|
_userConsoleUI.DisplayAllUsers();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "2":
|
||||||
|
Console.Write("Введите ID пользователя для удаления: ");
|
||||||
|
if (Guid.TryParse(Console.ReadLine(), out Guid userGuid))
|
||||||
|
{
|
||||||
|
_userConsoleUI.RemoveUserById(userGuid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Неверный формат ID");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "3":
|
||||||
|
Console.Write("Введите ID пользователя для обновления: ");
|
||||||
|
if (Guid.TryParse(Console.ReadLine(), out Guid updateUserGuid))
|
||||||
|
{
|
||||||
|
_userConsoleUI.UpdateUserById(updateUserGuid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Неверный формат ID");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "4":
|
||||||
|
Console.Write("Введите ID пользователя для поиска: ");
|
||||||
|
if (Guid.TryParse(Console.ReadLine(), out Guid findUserGuid))
|
||||||
|
{
|
||||||
|
_userConsoleUI.FindUserById(findUserGuid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Неверный формат ID");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "5":
|
||||||
|
_groupConsoleUI.DisplayAllGroups();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "6":
|
||||||
|
Console.Write("Введите название новой группы: ");
|
||||||
|
string newGroupName = Console.ReadLine();
|
||||||
|
_groupConsoleUI.AddGroup(newGroupName);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "7":
|
||||||
|
Console.Write("Введите ID группы для удаления: ");
|
||||||
|
string groupIdForDeleteStr = Console.ReadLine(); // Считываем ID как строку
|
||||||
|
if (!string.IsNullOrWhiteSpace(groupIdForDeleteStr) && int.TryParse(groupIdForDeleteStr, out int groupIdForDelete)) // Проверяем, что строка не пустая и может быть преобразована в int
|
||||||
|
{
|
||||||
|
_groupConsoleUI.RemoveGroup(groupIdForDeleteStr); // Передаем строку в метод
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Неверный формат ID группы");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "8":
|
||||||
|
Console.Write("Введите ID группы для изменения: ");
|
||||||
|
if (int.TryParse(Console.ReadLine(), out int groupIdToUpdate))
|
||||||
|
{
|
||||||
|
Console.Write("Введите новое название группы: ");
|
||||||
|
string newName = Console.ReadLine();
|
||||||
|
_groupConsoleUI.UpdateGroupName(groupIdToUpdate, newName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Неверный формат ID группы");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "9":
|
||||||
|
Console.Write("Введите ID группы для поиска: ");
|
||||||
|
if (int.TryParse(Console.ReadLine(), out int idGroupToFind))
|
||||||
|
{
|
||||||
|
_groupConsoleUI.FindGroupById(idGroupToFind);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Неверный формат ID группы");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "10":
|
||||||
|
Console.Write("Введите номер первого занятия: ");
|
||||||
|
int firstLesson = int.Parse(Console.ReadLine());
|
||||||
|
Console.Write("Введите номер последнего занятия: ");
|
||||||
|
int lastLesson = int.Parse(Console.ReadLine());
|
||||||
|
Console.Write("Введите ID группы: ");
|
||||||
|
int groupIdForPresence = int.Parse(Console.ReadLine());
|
||||||
|
|
||||||
|
_presenceConsoleUI.GeneratePresenceForDay(DateTime.Now, groupIdForPresence, firstLesson, lastLesson);
|
||||||
|
Console.WriteLine("Посещаемость на день сгенерирована.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "11":
|
||||||
|
Console.Write("Введите номер первого занятия: ");
|
||||||
|
int firstLessonForWeek = int.Parse(Console.ReadLine());
|
||||||
|
Console.Write("Введите номер последнего занятия: ");
|
||||||
|
int lastLessonForWeek = int.Parse(Console.ReadLine());
|
||||||
|
Console.Write("Введите ID группы: ");
|
||||||
|
int groupIdForWeekPresence = int.Parse(Console.ReadLine());
|
||||||
|
|
||||||
|
_presenceConsoleUI.GeneratePresenceForWeek(DateTime.Now, groupIdForWeekPresence, firstLessonForWeek, lastLessonForWeek);
|
||||||
|
Console.WriteLine("Посещаемость на неделю сгенерирована.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "12":
|
||||||
|
Console.Write("Введите дату (гггг-мм-дд): ");
|
||||||
|
DateTime date = DateTime.Parse(Console.ReadLine());
|
||||||
|
Console.Write("Введите ID группы: ");
|
||||||
|
int groupForPresenceView = int.Parse(Console.ReadLine());
|
||||||
|
|
||||||
|
_presenceConsoleUI.DisplayPresence(date, groupForPresenceView);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "13":
|
||||||
|
Console.Write("Введите ID пользователя: ");
|
||||||
|
userGuid = Guid.Parse(Console.ReadLine());
|
||||||
|
Console.Write("Введите номер первого занятия: ");
|
||||||
|
int firstAbsLesson = int.Parse(Console.ReadLine());
|
||||||
|
Console.Write("Введите номер последнего занятия: ");
|
||||||
|
int lastAbsLesson = int.Parse(Console.ReadLine());
|
||||||
|
Console.Write("Введите ID группы: ");
|
||||||
|
int absGroupId = int.Parse(Console.ReadLine());
|
||||||
|
|
||||||
|
_presenceConsoleUI.MarkUserAbsent(DateTime.Now, absGroupId, userGuid, firstAbsLesson, lastAbsLesson);
|
||||||
|
Console.WriteLine("Пользователь отмечен как отсутствующий.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "14":
|
||||||
|
Console.Write("Введите ID группы: ");
|
||||||
|
int groupIdForAllPresence = int.Parse(Console.ReadLine());
|
||||||
|
_presenceConsoleUI.DisplayAllPresenceByGroup(groupIdForAllPresence);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "15":
|
||||||
|
Console.Write("Введите ID группы для отображения информации о посещаемости: ");
|
||||||
|
if (int.TryParse(Console.ReadLine(), out int groupIdForAttendanceInfo))
|
||||||
|
{
|
||||||
|
_presenceConsoleUI.DisplayGroupAttendanceInfo(groupIdForAttendanceInfo);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Неверный формат ID группы");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "0":
|
||||||
|
Console.WriteLine("Выход...");
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Console.WriteLine("Неверный выбор, попробуйте снова.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Console.WriteLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
164
presence_new/UI/PresenceConsole.cs
Normal file
164
presence_new/UI/PresenceConsole.cs
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
using Demo.domain.Models;
|
||||||
|
using Demo.Domain.UseCase;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Demo.UI
|
||||||
|
{
|
||||||
|
public class PresenceConsole
|
||||||
|
{
|
||||||
|
private readonly UseCaseGeneratePresence _presenceUseCase;
|
||||||
|
private readonly GroupAttendanceService _groupAttendanceService; // Добавляем GroupAttendanceService
|
||||||
|
|
||||||
|
public PresenceConsole(UseCaseGeneratePresence presenceUseCase, GroupAttendanceService groupAttendanceService)
|
||||||
|
{
|
||||||
|
_presenceUseCase = presenceUseCase;
|
||||||
|
_groupAttendanceService = groupAttendanceService; // Инициализируем GroupAttendanceService
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для генерации посещаемости на день
|
||||||
|
public void GeneratePresenceForDay(DateTime date, int groupId, int firstLesson, int lastLesson)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId, date);
|
||||||
|
Console.WriteLine("Посещаемость на день успешно сгенерирована.");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для генерации посещаемости на неделю
|
||||||
|
public void GeneratePresenceForWeek(DateTime date, int groupId, int firstLesson, int lastLesson)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_presenceUseCase.GenerateWeeklyPresence(firstLesson, lastLesson, groupId, date);
|
||||||
|
Console.WriteLine("Посещаемость на неделю успешно сгенерирована.");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для отображения посещаемости на конкретную дату и группу
|
||||||
|
public void DisplayPresence(DateTime date, int groupId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
List<PresenceLocalEntity> presences = _presenceUseCase.GetPresenceByDateAndGroup(groupId, date);
|
||||||
|
|
||||||
|
if (presences == null || presences.Count == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Нет данных о посещаемости на выбранную дату.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine($"\n Посещаемость на {date:dd.MM.yyyy} ");
|
||||||
|
Console.WriteLine("-----------------------------------------------------");
|
||||||
|
|
||||||
|
// Сохраняем номер занятия для сравнения
|
||||||
|
int previousLessonNumber = -1;
|
||||||
|
|
||||||
|
foreach (var presence in presences)
|
||||||
|
{
|
||||||
|
// Проверяем, изменился ли номер занятия
|
||||||
|
if (previousLessonNumber != presence.LessonNumber)
|
||||||
|
{
|
||||||
|
Console.WriteLine("-----------------------------------------------------");
|
||||||
|
Console.WriteLine($" Занятие: {presence.LessonNumber} ");
|
||||||
|
Console.WriteLine("-----------------------------------------------------");
|
||||||
|
previousLessonNumber = presence.LessonNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Форматируем статус присутствия
|
||||||
|
string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
|
||||||
|
Console.WriteLine($"Пользователь (ID: {presence.UserGuid}) - Статус: {status}");
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("-----------------------------------------------------");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Ошибка при отображении посещаемости: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void MarkUserAbsent(DateTime date, int groupId, Guid userGuid, int firstLesson, int lastLesson)
|
||||||
|
{
|
||||||
|
_presenceUseCase.MarkUserAbsentForLessons(userGuid, groupId, firstLesson, lastLesson, date);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void DisplayAllPresenceByGroup(int groupId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var presences = _presenceUseCase.GetAllPresenceByGroup(groupId);
|
||||||
|
|
||||||
|
if (presences == null || !presences.Any())
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Нет данных о посещаемости для группы с ID: {groupId}.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Группируем записи посещаемости по дате
|
||||||
|
var groupedPresences = presences.GroupBy(p => p.Date);
|
||||||
|
|
||||||
|
foreach (var group in groupedPresences)
|
||||||
|
{
|
||||||
|
Console.WriteLine("===================================================");
|
||||||
|
Console.WriteLine($" Дата: {group.Key:dd.MM.yyyy} ");
|
||||||
|
Console.WriteLine("===================================================");
|
||||||
|
|
||||||
|
// Сохраняем номер занятия для сравнения
|
||||||
|
int previousLessonNumber = -1;
|
||||||
|
|
||||||
|
foreach (var presence in group)
|
||||||
|
{
|
||||||
|
// Проверяем, изменился ли номер занятия
|
||||||
|
if (previousLessonNumber != presence.LessonNumber)
|
||||||
|
{
|
||||||
|
Console.WriteLine("---------------------------------------------------");
|
||||||
|
Console.WriteLine($" Занятие: {presence.LessonNumber} ");
|
||||||
|
Console.WriteLine("---------------------------------------------------");
|
||||||
|
previousLessonNumber = presence.LessonNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Форматируем статус присутствия
|
||||||
|
string status = presence.IsAttedance ? "✅ Присутствует" : "❌ Отсутствует";
|
||||||
|
Console.WriteLine($"Пользователь (ID: {presence.UserGuid}) - Статус: {status}");
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("---------------------------------------------------");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Ошибка при отображении посещаемости: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisplayGroupAttendanceInfo(int groupId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_groupAttendanceService.DisplayGroupAttendanceInfo(groupId);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Ошибка при отображении информации о посещаемости: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
74
presence_new/UI/UserConsole.cs
Normal file
74
presence_new/UI/UserConsole.cs
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
using Demo.Domain.UseCase;
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Demo.UI
|
||||||
|
{
|
||||||
|
public class UserConsoleUI
|
||||||
|
{
|
||||||
|
private readonly UserUseCase _userUseCase;
|
||||||
|
|
||||||
|
public UserConsoleUI(UserUseCase userUseCase)
|
||||||
|
{
|
||||||
|
_userUseCase = userUseCase;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для отображения всех пользователей
|
||||||
|
public void DisplayAllUsers()
|
||||||
|
{
|
||||||
|
Console.WriteLine("\n=== Список всех пользователей ===");
|
||||||
|
StringBuilder userOutput = new StringBuilder();
|
||||||
|
|
||||||
|
foreach (var user in _userUseCase.GetAllUsers())
|
||||||
|
{
|
||||||
|
userOutput.AppendLine($"{user.Guid}\t{user.FIO}\t{user.Group.Name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine(userOutput);
|
||||||
|
Console.WriteLine("===============================\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для удаления пользователя по ID
|
||||||
|
public void RemoveUserById(Guid userGuid)
|
||||||
|
{
|
||||||
|
string output = _userUseCase.RemoveUserById(userGuid) ? "Пользователь удален" : "Пользователь не найден";
|
||||||
|
Console.WriteLine($"\n{output}\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для обновления пользователя по ID
|
||||||
|
public void UpdateUserById(Guid userGuid)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var user = _userUseCase.FindUserById(userGuid);
|
||||||
|
|
||||||
|
Console.WriteLine($"Текущие данные: {user.FIO}, {user.Group.Name}");
|
||||||
|
Console.Write("\nВведите новое ФИО: ");
|
||||||
|
string newFIO = Console.ReadLine();
|
||||||
|
|
||||||
|
user.FIO = newFIO;
|
||||||
|
_userUseCase.UpdateUser(user);
|
||||||
|
|
||||||
|
Console.WriteLine("\nПользователь обновлен.\n");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Ошибка: {ex.Message}\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Метод для поиска пользователя по ID
|
||||||
|
public void FindUserById(Guid userGuid)
|
||||||
|
{
|
||||||
|
var user = _userUseCase.FindUserById(userGuid);
|
||||||
|
if (user != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"\nПользователь найден: {user.Guid}, {user.FIO}, {user.Group.Name}\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("\nПользователь не найден.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
presence_new/bin/Debug/net8.0/ClosedXML.Parser.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/ClosedXML.Parser.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/ClosedXML.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/ClosedXML.dll
Normal file
Binary file not shown.
954
presence_new/bin/Debug/net8.0/Demo.deps.json
Normal file
954
presence_new/bin/Debug/net8.0/Demo.deps.json
Normal file
@ -0,0 +1,954 @@
|
|||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v8.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v8.0": {
|
||||||
|
"Demo/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"ClosedXML": "0.104.1",
|
||||||
|
"Microsoft.EntityFrameworkCore": "8.0.10",
|
||||||
|
"Microsoft.EntityFrameworkCore.Design": "8.0.10",
|
||||||
|
"Microsoft.Extensions.DependencyInjection": "8.0.1",
|
||||||
|
"Npgsql.EntityFrameworkCore.PostgreSQL": "8.0.10"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"Demo.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"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Caching.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "8.0.0.0",
|
||||||
|
"fileVersion": "8.0.23.53103"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "8.0.0.0",
|
||||||
|
"fileVersion": "8.0.23.53103"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Primitives.dll": {
|
||||||
|
"assemblyVersion": "8.0.0.0",
|
||||||
|
"fileVersion": "8.0.23.53103"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/System.IO.Pipelines.dll": {
|
||||||
|
"assemblyVersion": "6.0.0.0",
|
||||||
|
"fileVersion": "6.0.522.21309"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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": {
|
||||||
|
"Demo/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
presence_new/bin/Debug/net8.0/Demo.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/Demo.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/Demo.exe
Normal file
BIN
presence_new/bin/Debug/net8.0/Demo.exe
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/Demo.pdb
Normal file
BIN
presence_new/bin/Debug/net8.0/Demo.pdb
Normal file
Binary file not shown.
13
presence_new/bin/Debug/net8.0/Demo.runtimeconfig.json
Normal file
13
presence_new/bin/Debug/net8.0/Demo.runtimeconfig.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"runtimeOptions": {
|
||||||
|
"tfm": "net8.0",
|
||||||
|
"framework": {
|
||||||
|
"name": "Microsoft.NETCore.App",
|
||||||
|
"version": "8.0.0"
|
||||||
|
},
|
||||||
|
"configProperties": {
|
||||||
|
"System.Reflection.NullabilityInfoContext.IsSupported": true,
|
||||||
|
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/DocumentFormat.OpenXml.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/DocumentFormat.OpenXml.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/ExcelNumberFormat.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/ExcelNumberFormat.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/Humanizer.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/Humanizer.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/Microsoft.Bcl.AsyncInterfaces.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/Microsoft.Bcl.AsyncInterfaces.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/Microsoft.CodeAnalysis.CSharp.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/Microsoft.CodeAnalysis.CSharp.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/Microsoft.CodeAnalysis.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/Microsoft.CodeAnalysis.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/Microsoft.EntityFrameworkCore.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/Microsoft.EntityFrameworkCore.dll
Normal 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.
BIN
presence_new/bin/Debug/net8.0/Microsoft.Extensions.Logging.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/Microsoft.Extensions.Logging.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/Microsoft.Extensions.Options.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/Microsoft.Extensions.Options.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/Mono.TextTemplating.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/Mono.TextTemplating.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/Npgsql.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/Npgsql.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/RBush.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/RBush.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/SixLabors.Fonts.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/SixLabors.Fonts.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/System.CodeDom.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/System.CodeDom.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/System.Composition.Convention.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/System.Composition.Convention.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/System.Composition.Hosting.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/System.Composition.Hosting.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/System.Composition.Runtime.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/System.Composition.Runtime.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/System.Composition.TypedParts.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/System.Composition.TypedParts.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/System.IO.Packaging.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/System.IO.Packaging.dll
Normal file
Binary file not shown.
BIN
presence_new/bin/Debug/net8.0/System.IO.Pipelines.dll
Normal file
BIN
presence_new/bin/Debug/net8.0/System.IO.Pipelines.dll
Normal 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.
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
Loading…
Reference in New Issue
Block a user