FinalPresenceLexa/data/Repository/SQLPresenceRepository.cs
2025-04-28 11:51:01 +03:00

281 lines
9.9 KiB
C#

using data.RemoteData.RemoteDataBase.DAO;
using data.RemoteData.RemoteDataBase;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
namespace data.Repository
{
public class SQLPresenceRepositoryImpl : IPresenceRepository
{
private readonly RemoteDatabaseContext _remoteDatabaseContext;
public SQLPresenceRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext)
{
_remoteDatabaseContext = remoteDatabaseContext;
}
public List<PresenceDAO> GetAttendanceByGroup(int groupId)
{
return _remoteDatabaseContext.Presences
.Where(p => p.GroupId == groupId)
.ToList();
}
public List<PresenceDAO> GetPresenceForAbsent(DateOnly date, int groupId)
{
return _remoteDatabaseContext.Presences
.Where(p => p.GroupId == groupId && p.Date == date && !p.IsAttendance)
.ToList();
}
public List<PresenceDAO> GetPresenceByDateAndGroup(DateOnly startDate, DateOnly endDate, int groupId)
{
return _remoteDatabaseContext.Presences
.Where(p => p.Date >= startDate && p.Date <= endDate && p.GroupId == groupId)
.ToList();
}
public List<PresenceDAO> GetPresenceByGroup(int groupId)
{
return _remoteDatabaseContext.Presences
.Where(p => p.GroupId == groupId)
.OrderBy(p => p.Date)
.ThenBy(p => p.UserId)
.ToList();
}
public void SavePresence(List<PresenceDAO> presences)
{
_remoteDatabaseContext.Presences.AddRange(presences);
_remoteDatabaseContext.SaveChanges();
}
public void UpdateAtt(int userId, int groupId, int firstLesson, int lastLesson, DateOnly date, bool isAttendance)
{
var presences = _remoteDatabaseContext.Presences
.Where(p => p.UserId == userId &&
p.GroupId == groupId &&
p.LessonNumber >= firstLesson &&
p.LessonNumber <= lastLesson &&
p.Date == date)
.ToList();
foreach (var presence in presences)
{
presence.IsAttendance = isAttendance;
}
_remoteDatabaseContext.SaveChanges();
}
public DateOnly? GetLastDateByGroupId(int groupId)
{
return _remoteDatabaseContext.Presences
.Where(p => p.GroupId == groupId)
.Max(p => (DateOnly?)p.Date);
}
public List<PresenceDAO> PresenceSort(List<PresenceDAO> presences)
{
return presences.OrderBy(p => p.Date).ToList();
}
public GroupAttendanceStatistics GetGeneralPresenceForGroup(int groupId)
{
var presences = _remoteDatabaseContext.Presences
.Where(p => p.GroupId == groupId)
.ToList();
var dates = presences.Select(p => p.Date).Distinct().ToList();
var users = presences.Select(p => p.UserId).Distinct().ToList();
var statistics = new GroupAttendanceStatistics
{
UserCount = users.Count,
TotalLessons = presences.Count / users.Count,
AttendancePercentage = (double)presences.Count(p => p.IsAttendance) / presences.Count * 100
};
foreach (var userId in users)
{
var userPresences = presences.Where(p => p.UserId == userId).ToList();
statistics.UserAttendanceDetails.Add(new UserAttendance
{
UserId = userId,
Attended = userPresences.Count(p => p.IsAttendance),
Missed = userPresences.Count(p => !p.IsAttendance)
});
}
return statistics;
}
public List<AllPresence> AllPresence(int groupId, DateOnly? dateStart, DateOnly? dateEnd, int? userId)
{
var query = _remoteDatabaseContext.Presences
.Where(p => p.GroupId == groupId);
if (dateStart.HasValue && dateEnd.HasValue)
query = query.Where(p => p.Date >= dateStart && p.Date <= dateEnd);
if (userId.HasValue)
query = query.Where(p => p.UserId == userId);
return query.Select(p => new AllPresence
{
GroupName = _remoteDatabaseContext.Groups.First(g => g.Id == p.GroupId).Name,
Users = new UserPresence()
{
FIO = _remoteDatabaseContext.Users.First(u => u.UserId == p.UserId).FIO,
LessonNumber = p.LessonNumber,
Date = p.Date,
isAttendance = p.IsAttendance
}
}).ToList();
}
public void UpdateAttendance(List<AttendanceInput> attendanceList)
{
foreach (var attendance in attendanceList)
{
var existing = _remoteDatabaseContext.Presences.FirstOrDefault(p =>
p.GroupId == attendance.GroupId &&
p.UserId == attendance.UserId &&
p.Date == attendance.Date &&
p.LessonNumber == attendance.LessonNumber);
if (existing != null)
{
existing.IsAttendance = attendance.IsAttendance;
}
else
{
_remoteDatabaseContext.Presences.Add(new PresenceDAO
{
GroupId = attendance.GroupId,
UserId = attendance.UserId,
Date = attendance.Date,
LessonNumber = attendance.LessonNumber,
IsAttendance = attendance.IsAttendance
});
}
}
_remoteDatabaseContext.SaveChanges();
}
public void DeletePresenceByUser(int userId)
{
var records = _remoteDatabaseContext.Presences
.Where(p => p.UserId == userId)
.ToList();
_remoteDatabaseContext.Presences.RemoveRange(records);
_remoteDatabaseContext.SaveChanges();
}
public void DeletePresenceByDateRange(int groupId, DateOnly startDate, DateOnly endDate)
{
var records = _remoteDatabaseContext.Presences
.Where(p => p.GroupId == groupId && p.Date >= startDate && p.Date <= endDate)
.ToList();
_remoteDatabaseContext.Presences.RemoveRange(records);
_remoteDatabaseContext.SaveChanges();
}
public void DeletePresenceByGroup(int groupId)
{
var records = _remoteDatabaseContext.Presences
.Where(p => p.GroupId == groupId)
.ToList();
_remoteDatabaseContext.Presences.RemoveRange(records);
_remoteDatabaseContext.SaveChanges();
}
public List<PresenceDAO> GetPresenceByUserAndGroup(int userId, int groupId)
{
return _remoteDatabaseContext.Presences
.Where(p => p.UserId == userId && p.GroupId == groupId)
.ToList();
}
public List<PresenceDAO> GetPresenceByDateRange(int groupId, DateOnly startDate, DateOnly endDate)
{
return _remoteDatabaseContext.Presences
.Where(p => p.GroupId == groupId && p.Date >= startDate && p.Date <= endDate)
.ToList();
}
public void UpdateAttendance(int userId, int groupId, DateOnly date, int lessonNumber, bool isAttendance)
{
var record = _remoteDatabaseContext.Presences.FirstOrDefault(p =>
p.UserId == userId &&
p.GroupId == groupId &&
p.Date == date &&
p.LessonNumber == lessonNumber);
if (record != null)
{
record.IsAttendance = isAttendance;
_remoteDatabaseContext.SaveChanges();
}
}
public List<PresenceDAO> GetPresence(int groupId, DateOnly? date, int? userId)
{
var query = _remoteDatabaseContext.Presences.Where(p => p.GroupId == groupId);
if (date.HasValue)
query = query.Where(p => p.Date == date.Value);
if (userId.HasValue)
query = query.Where(p => p.UserId == userId.Value);
return query.ToList();
}
public void ClearPresenceByGroup(int groupId)
{
var records = _remoteDatabaseContext.Presences
.Where(p => p.GroupId == groupId)
.ToList();
_remoteDatabaseContext.Presences.RemoveRange(records);
_remoteDatabaseContext.SaveChanges();
}
public void AddPresence(List<PresenceDAO> presenceList)
{
_remoteDatabaseContext.Presences.AddRange(presenceList);
_remoteDatabaseContext.SaveChanges();
}
public void UpdatePresence(List<PresenceDAO> updatedList)
{
foreach (var item in updatedList)
{
var existing = _remoteDatabaseContext.Presences.FirstOrDefault(p =>
p.Date == item.Date &&
p.UserId == item.UserId &&
p.LessonNumber == item.LessonNumber);
if (existing != null)
{
existing.IsAttendance = item.IsAttendance;
}
}
_remoteDatabaseContext.SaveChanges();
}
public List<PresenceDAO> GetPresenceByUserId(int userId)
{
var query = _remoteDatabaseContext.Presences.Where(p => p.UserId == userId);
return query.ToList();
}
}
}