117 lines
5.1 KiB
C#
117 lines
5.1 KiB
C#
using SchoolContracts.BusinessLogicContracts;
|
||
using SchoolContracts.BindingModels;
|
||
using SchoolContracts.SearchModels;
|
||
using SchoolContracts.ViewModels;
|
||
using Microsoft.Extensions.Logging;
|
||
using SchoolContracts.StoragesContracts;
|
||
|
||
namespace SchoolBusinessLogics.BusinessLogics
|
||
{
|
||
public class AccountLogic : IAccountLogic
|
||
{
|
||
private readonly ILogger _logger;
|
||
private readonly IAccountStorage _accountStorage;
|
||
private readonly IDisciplineLogic _disciplineStorage;
|
||
|
||
public AccountLogic(ILogger<AccountLogic> logger, IAccountStorage accountStorage, IDisciplineLogic disciplineStorage)
|
||
{
|
||
_logger = logger;
|
||
_accountStorage = accountStorage;
|
||
_disciplineStorage = disciplineStorage;
|
||
}
|
||
public List<AccountViewModel> ReadList(AccountSearchModel? model)
|
||
{
|
||
try
|
||
{
|
||
var results = model != null ? _accountStorage.GetFilteredList(model) : _accountStorage.GetFullList();
|
||
_logger.LogDebug("Список полученных счетов: {@accounts}", results);
|
||
_logger.LogInformation("Извлечение списка в количестве {Count} c счетовой по модели: {@AccountSearchModel}", results.Count, model);
|
||
return results;
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
_logger.LogError(e, "Произошла ошибка при попытки получить список по модели: {@AccountSearchModel}", model);
|
||
throw;
|
||
}
|
||
}
|
||
public AccountViewModel ReadElement(AccountSearchModel model)
|
||
{
|
||
try
|
||
{
|
||
var result = _accountStorage.GetElement(model);
|
||
if (result == null)
|
||
{
|
||
throw new ArgumentNullException($"Результат получения элемента с айди {model.Id} оказался нулевым");
|
||
}
|
||
_logger.LogInformation("Извлечение счета {@AccountViewModel} по модели: {@AccountSearchModel}", result, model);
|
||
return result;
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
_logger.LogError(e, "Произошла ошибка при попытки получить элемент по модели: {@AccountSearchModel}", model);
|
||
throw;
|
||
}
|
||
}
|
||
public bool Create(AccountBindingModel model)
|
||
{
|
||
try
|
||
{
|
||
CheckModel(model);
|
||
var result = _accountStorage.Insert(model);
|
||
if (result == null)
|
||
{
|
||
throw new ArgumentNullException($"Результат создания счета оказался нулевым");
|
||
}
|
||
_logger.LogInformation("Была создана сущность: {@AccountViewModel}", result);
|
||
return true;
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
_logger.LogError(e, "Произошла ошибка при попытки создать элемент по модели: {@AccountBindingModel}", model);
|
||
throw;
|
||
}
|
||
}
|
||
private void CheckModel(AccountBindingModel model, bool withParams = true)
|
||
{
|
||
const string txt = "Произошла ошибка на уровне проверки AccountBindingModel.";
|
||
if (model == null)
|
||
{
|
||
throw new ArgumentNullException(nameof(model), txt);
|
||
}
|
||
if (!withParams)
|
||
{
|
||
return;
|
||
}
|
||
if (model.Price < 0)
|
||
{
|
||
throw new ArgumentNullException(nameof(model.Price), txt + "Оплаченная стоимость не может быть отрицательной");
|
||
}
|
||
}
|
||
public bool GetAccountInfo(AccountSearchModel model,
|
||
out double currentBalance,
|
||
out double paidPrice)
|
||
{
|
||
try
|
||
{
|
||
var accounts = ReadList(model); // Вызываем метод из бизнес логики, чтобы залогировать доп информацию
|
||
paidPrice = 0;
|
||
if (accounts == null || accounts.Count == 0)
|
||
{
|
||
currentBalance = 0;
|
||
return true;
|
||
}
|
||
currentBalance = accounts.Sum(x => x.Price);
|
||
_logger.LogInformation(
|
||
"По дисциплине({Id}) и клиенту({Id}) получена полная стоимостиь {fullPrice} и оплаченная стоимость {paidPrice}",
|
||
model.DisciplineId, model.ClientId, currentBalance, paidPrice);
|
||
return true;
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
_logger.LogError(e, "При попытке получения счетов по {@searchModel} произошла ошибка", model);
|
||
throw;
|
||
}
|
||
}
|
||
}
|
||
}
|