2024-04-28 20:12:32 +04:00
|
|
|
|
using System.Security.Cryptography.X509Certificates;
|
|
|
|
|
using BankContracts.BindingModels;
|
|
|
|
|
using BankContracts.SearchModels;
|
|
|
|
|
using BankContracts.StoragesContracts;
|
|
|
|
|
using BankContracts.ViewModels;
|
|
|
|
|
using BankDatabaseImplement.Models;
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
2024-04-28 18:50:40 +04:00
|
|
|
|
|
|
|
|
|
namespace BankDatabaseImplement.Implements
|
|
|
|
|
{
|
2024-04-28 20:12:32 +04:00
|
|
|
|
public class PurchaseStorage : IPurchaseStorage
|
2024-04-28 18:50:40 +04:00
|
|
|
|
{
|
2024-04-28 20:12:32 +04:00
|
|
|
|
private void CheckSearchModel(PurchaseSearchModel model)
|
|
|
|
|
{
|
|
|
|
|
if (model == null)
|
|
|
|
|
throw new ArgumentNullException("Передаваемая модель для поиска равна нулю", nameof(model));
|
|
|
|
|
if (!model.Id.HasValue && !model.ClientId.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && model.OperationsIds == null)
|
|
|
|
|
throw new ArgumentException("Все передаваемые поля поисковой модели оказались пусты или равны null");
|
|
|
|
|
if (model.DateFrom.HasValue != model.DateTo.HasValue)
|
|
|
|
|
throw new ArgumentException($"Не указано начало {model.DateFrom} или конец {model.DateTo} периода для поиска по дате.");
|
|
|
|
|
}
|
|
|
|
|
public PurchaseViewModel? Delete(PurchaseBindingModel model)
|
|
|
|
|
{
|
|
|
|
|
using var context = new BankDB();
|
|
|
|
|
var element = context.Purchases.FirstOrDefault(x => x.Id == model.Id);
|
|
|
|
|
if (element != null)
|
|
|
|
|
{
|
|
|
|
|
context.Purchases.Remove(element);
|
|
|
|
|
context.SaveChanges();
|
|
|
|
|
return element.GetViewModel;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public List<PaymentViewModel> GetPaymentsFromPurchaseAndOperation(PurchaseSearchModel modelPurchase, OperationSearchModel modelOperation)
|
|
|
|
|
{
|
|
|
|
|
if (!modelPurchase.Id.HasValue)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException(nameof(modelPurchase), "Получена поисковая модель без Id");
|
|
|
|
|
}
|
|
|
|
|
if (!modelOperation.Id.HasValue)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException(nameof(modelOperation), "Получена поисковая модель без Id");
|
|
|
|
|
}
|
|
|
|
|
using var context = new BankDB();
|
2024-04-28 21:30:55 +04:00
|
|
|
|
var operationByPurchase = context.OperationByPurchases
|
2024-04-28 20:12:32 +04:00
|
|
|
|
.Include(x => x.Payments)
|
|
|
|
|
.FirstOrDefault(x => x.OperationId == modelOperation.Id && x.PurchaseId == modelPurchase.Id);
|
2024-04-28 21:30:55 +04:00
|
|
|
|
if (operationByPurchase?.Payments == null)
|
2024-04-28 20:12:32 +04:00
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException(
|
|
|
|
|
$"Не существует связи между данной операции(Id={modelOperation.Id}) и покупкой(Id={modelPurchase.Id})");
|
|
|
|
|
}
|
2024-04-28 21:30:55 +04:00
|
|
|
|
return operationByPurchase.Payments.Select(payment => payment.GetViewModel).ToList();
|
2024-04-28 20:12:32 +04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public PurchaseViewModel? GetElement(PurchaseSearchModel model)
|
|
|
|
|
{
|
|
|
|
|
using var context = new BankDB();
|
|
|
|
|
if (!model.Id.HasValue)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
return context.Purchases
|
|
|
|
|
.Include(x => x.Client)
|
|
|
|
|
.Include(x => x.Operations)
|
|
|
|
|
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)?.GetViewModel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<PurchaseViewModel> GetFilteredList(PurchaseSearchModel model)
|
|
|
|
|
{
|
|
|
|
|
CheckSearchModel(model);
|
|
|
|
|
if (model.Id.HasValue)
|
|
|
|
|
{
|
|
|
|
|
var res = GetElement(model);
|
|
|
|
|
return res != null ? new() { res } : new();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using var context = new BankDB();
|
|
|
|
|
|
|
|
|
|
var query = context.Purchases.Include(x => x.Client);
|
|
|
|
|
IQueryable<Purchase>? resultQuery = null;
|
|
|
|
|
if (model.ClientId.HasValue)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
return query
|
|
|
|
|
.Where(x => model.ClientId == x.ClientId)
|
|
|
|
|
.Select(x => x.GetViewModel)
|
|
|
|
|
.ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (model.DateTo.HasValue)
|
|
|
|
|
resultQuery = query
|
|
|
|
|
.Include(x => x.Operations)
|
|
|
|
|
.ThenInclude(x => x.Operation)
|
|
|
|
|
.Include(x => x.Costs)!
|
|
|
|
|
.ThenInclude(x => x.Cost)
|
|
|
|
|
.Where(x => model.DateFrom <= x.DatePurchase && x.DatePurchase <= model.DateTo);
|
|
|
|
|
|
|
|
|
|
else if (model.OperationsIds != null)
|
|
|
|
|
resultQuery = query
|
|
|
|
|
.Where(x => x.Operations.Any(x => model.OperationsIds.Contains(x.OperationId)))
|
|
|
|
|
.Include(x => x.Operations)
|
|
|
|
|
.ThenInclude(x => x.Operation);
|
|
|
|
|
|
|
|
|
|
return resultQuery?
|
|
|
|
|
.Select(x => x.GetViewModel)
|
|
|
|
|
.ToList() ?? new();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<PurchaseViewModel> GetFullList()
|
|
|
|
|
{
|
|
|
|
|
using var context = new BankDB();
|
|
|
|
|
return context.Purchases
|
|
|
|
|
.Include(x => x.Client)
|
|
|
|
|
.Include(x => x.Operations)
|
|
|
|
|
.Select(x => x.GetViewModel)
|
|
|
|
|
.ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public PurchaseViewModel? Insert(PurchaseBindingModel model)
|
|
|
|
|
{
|
|
|
|
|
var newPurchase = Purchase.Create(model);
|
|
|
|
|
if (newPurchase == null)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
using var context = new BankDB();
|
|
|
|
|
context.Purchases.Add(newPurchase);
|
|
|
|
|
context.SaveChanges();
|
|
|
|
|
newPurchase.UpdateOperations(context, model);
|
|
|
|
|
context.SaveChanges();
|
|
|
|
|
return newPurchase.GetViewModel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public PurchaseViewModel? Update(PurchaseBindingModel model)
|
|
|
|
|
{
|
|
|
|
|
using var context = new BankDB();
|
|
|
|
|
var purchase = context.Purchases.FirstOrDefault(x => x.Id == model.Id);
|
|
|
|
|
if (purchase == null)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
purchase.Update(model);
|
|
|
|
|
purchase.UpdateOperations(context, model);
|
|
|
|
|
context.SaveChanges();
|
|
|
|
|
return purchase.GetViewModel;
|
|
|
|
|
}
|
2024-04-28 18:50:40 +04:00
|
|
|
|
}
|
|
|
|
|
}
|