153 lines
6.3 KiB
C#
153 lines
6.3 KiB
C#
using System.Security.Cryptography.X509Certificates;
|
||
using SchoolContracts.BindingModels;
|
||
using SchoolContracts.SearchModels;
|
||
using SchoolContracts.StoragesContracts;
|
||
using SchoolContracts.ViewModels;
|
||
using SchoolDatabaseImplement.Models;
|
||
using Microsoft.EntityFrameworkCore;
|
||
|
||
namespace SchoolDatabaseImplement.Implements
|
||
{
|
||
public class DisciplineStorage : IDisciplineStorage
|
||
{
|
||
private void CheckSearchModel(DisciplineSearchModel model)
|
||
{
|
||
if (model == null)
|
||
throw new ArgumentNullException("Передаваемая модель для поиска равна нулю", nameof(model));
|
||
if (!model.Id.HasValue && !model.ImplementerId.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && model.ClientsIds == null)
|
||
throw new ArgumentException("Все передаваемые поля поисковой модели оказались пусты или равны null");
|
||
if (model.DateFrom.HasValue != model.DateTo.HasValue)
|
||
throw new ArgumentException($"Не указано начало {model.DateFrom} или конец {model.DateTo} периода для поиска по дате.");
|
||
}
|
||
public DisciplineViewModel? Delete(DisciplineBindingModel model)
|
||
{
|
||
using var context = new SchoolDB();
|
||
var element = context.Disciplines.FirstOrDefault(x => x.Id == model.Id);
|
||
if (element != null)
|
||
{
|
||
context.Disciplines.Remove(element);
|
||
context.SaveChanges();
|
||
return element;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Получение списка счетов по клиенту и дисциплине, для получения полной и оплаченной стоимости в бизнес логике
|
||
/// </summary>
|
||
public List<AccountViewModel> GetAccountsFromDisciplineAndClient(DisciplineSearchModel modelDiscipline, StudentSearchModel modelStudent)
|
||
{
|
||
if (!modelDiscipline.Id.HasValue)
|
||
{
|
||
throw new ArgumentNullException(nameof(modelDiscipline), "Получена поисковая модель без Id");
|
||
}
|
||
if (!modelStudent.Id.HasValue)
|
||
{
|
||
throw new ArgumentNullException(nameof(modelStudent), "Получена поисковая модель без Id");
|
||
}
|
||
using var context = new SchoolDB();
|
||
var studentByDiscipline = context.StudentsByDisciplines
|
||
.Include(x => x.Accounts)
|
||
.FirstOrDefault(x => x.ClientId == modelStudent.Id && x.DisciplineId == modelDiscipline.Id);
|
||
if (studentByDiscipline?.Accounts == null)
|
||
{
|
||
throw new InvalidOperationException(
|
||
$"Не существует связи между данным учеников(Id={modelStudent.Id}) и (Id={modelDiscipline.Id})");
|
||
}
|
||
return studentByDiscipline.Accounts.Select(account => (AccountViewModel)account).ToList();
|
||
}
|
||
|
||
public DisciplineViewModel? GetElement(DisciplineSearchModel model)
|
||
{
|
||
using var context = new SchoolDB();
|
||
if (!model.Id.HasValue)
|
||
{
|
||
return null;
|
||
}
|
||
return context.Disciplines
|
||
.Include(x => x.Student)
|
||
.Include(x => x.Students)
|
||
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id);
|
||
}
|
||
|
||
public List<DisciplineViewModel> GetFilteredList(DisciplineSearchModel model)
|
||
{
|
||
CheckSearchModel(model);
|
||
if (model.Id.HasValue)
|
||
{
|
||
var res = GetElement(model);
|
||
return res != null ? new() { res } : new();
|
||
}
|
||
|
||
using var context = new SchoolDB();
|
||
|
||
var query = context.Disciplines.Include(x => x.Student);
|
||
IQueryable<Discipline>? resultQuery = null;
|
||
if (model.ImplementerId.HasValue)
|
||
{
|
||
return query
|
||
.Where(x => model.ImplementerId == x.ImplementerId)
|
||
.Select(x => (DisciplineViewModel)x)
|
||
.ToList();
|
||
}
|
||
|
||
if (model.DateTo.HasValue)
|
||
resultQuery = query
|
||
.Include(x => x.Students)
|
||
.ThenInclude(x => x.Student)
|
||
.Include(x => x.Requirements)
|
||
.ThenInclude(x => x.Requirement)
|
||
.Where(x => model.DateFrom <= x.DateOfReceipt && x.DateOfReceipt <= model.DateTo);
|
||
|
||
else if (model.StudentsIds != null)
|
||
resultQuery = query
|
||
.Include(x => x.Students)
|
||
.ThenInclude(x => x.Student)
|
||
.Where(x => x.Clients.Any(x => model.StudentsIds.Contains(x.StudentId)));
|
||
|
||
return resultQuery?
|
||
.Select(x => (DisciplineViewModel)x)
|
||
.ToList() ?? new();
|
||
}
|
||
|
||
public List<DisciplineViewModel> GetFullList()
|
||
{
|
||
using var context = new SchoolDB();
|
||
return context.Disciplines
|
||
.Include(x => x.Student)
|
||
.Include(x => x.Students)
|
||
.Select(x => (DisciplineViewModel)x)
|
||
.ToList();
|
||
}
|
||
|
||
public DisciplineViewModel? Insert(DisciplineBindingModel model)
|
||
{
|
||
var newDiscipline = Discipline.Create(model);
|
||
if (newDiscipline == null)
|
||
{
|
||
return null;
|
||
}
|
||
using var context = new SchoolDB();
|
||
context.Disciplines.Add(newDiscipline);
|
||
context.SaveChanges();
|
||
newDiscipline.UpdateClients(context, model);
|
||
context.SaveChanges();
|
||
return newDiscipline;
|
||
}
|
||
|
||
public DisciplineViewModel? Update(DisciplineBindingModel model)
|
||
{
|
||
using var context = new SchoolDB();
|
||
var disciplinevisit = context.Disciplines.FirstOrDefault(x => x.Id == model.Id);
|
||
if (disciplinevisit == null)
|
||
{
|
||
return null;
|
||
}
|
||
disciplinevisit.Update(model);
|
||
disciplinevisit.UpdateClients(context, model);
|
||
context.SaveChanges();
|
||
return disciplinevisit;
|
||
}
|
||
}
|
||
}
|