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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|