Подправил Html и комментики
This commit is contained in:
parent
0f70b85ca6
commit
2791d89c9d
@ -1,22 +1,26 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" />
|
<PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" />
|
||||||
<PackageReference Include="MailKit" Version="4.5.0" />
|
<PackageReference Include="MailKit" Version="4.5.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.18">
|
||||||
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
|
<PrivateAssets>all</PrivateAssets>
|
||||||
</ItemGroup>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
|
||||||
|
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\BankContracts\BankContracts.csproj" />
|
<ProjectReference Include="..\BankContracts\BankContracts.csproj" />
|
||||||
<ProjectReference Include="..\BankDatabaseImplement\BankDatabaseImplement.csproj" />
|
<ProjectReference Include="..\BankDatabaseImplement\BankDatabaseImplement.csproj" />
|
||||||
<ProjectReference Include="..\BankDataModels\BankDataModels.csproj" />
|
<ProjectReference Include="..\BankDataModels\BankDataModels.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -6,10 +6,16 @@ using BankContracts.ViewModels.Cashier.Diagram;
|
|||||||
using BankContracts.ViewModels.Cashier.ViewModels;
|
using BankContracts.ViewModels.Cashier.ViewModels;
|
||||||
using BankDataModels.Enums;
|
using BankDataModels.Enums;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace BankBusinessLogic.BusinessLogics.Cashier
|
namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||||
{
|
{
|
||||||
public class AccountLogic : IAccountLogic
|
// Класс, реализующий бизнес-логику для счетов
|
||||||
|
public class AccountLogic : IAccountLogic
|
||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
@ -17,6 +23,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
private readonly ICashWithdrawalLogic _cashWithdrawalLogic;
|
private readonly ICashWithdrawalLogic _cashWithdrawalLogic;
|
||||||
private readonly IMoneyTransferLogic _moneyTransferLogic;
|
private readonly IMoneyTransferLogic _moneyTransferLogic;
|
||||||
|
|
||||||
|
// Конструктор
|
||||||
public AccountLogic(ILogger<AccountLogic> logger, IAccountStorage accountStorage,
|
public AccountLogic(ILogger<AccountLogic> logger, IAccountStorage accountStorage,
|
||||||
ICashWithdrawalLogic cashWithdrawalLogic, IMoneyTransferLogic moneyTransferLogic)
|
ICashWithdrawalLogic cashWithdrawalLogic, IMoneyTransferLogic moneyTransferLogic)
|
||||||
{
|
{
|
||||||
@ -26,6 +33,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
_moneyTransferLogic = moneyTransferLogic;
|
_moneyTransferLogic = moneyTransferLogic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Вывод конкретного счёта
|
||||||
public AccountViewModel? ReadElement(AccountSearchModel model)
|
public AccountViewModel? ReadElement(AccountSearchModel model)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
@ -49,11 +57,12 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Вывод всего списка счетов
|
||||||
public List<AccountViewModel>? ReadList(AccountSearchModel? model)
|
public List<AccountViewModel>? ReadList(AccountSearchModel? model)
|
||||||
{
|
{
|
||||||
//_logger.LogInformation("ReadList. AccountNumber:{AccountNumber}. Id:{Id}", model.AccountNumber, model?.Id);
|
_logger.LogInformation("ReadList. AccountNumber:{AccountNumber}. Id:{Id}", model.AccountNumber, model?.Id);
|
||||||
|
|
||||||
//list хранит весь список в случае, если model пришло со значением null на вход метода
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
var list = model == null ? _accountStorage.GetFullList() : _accountStorage.GetFilteredList(model);
|
var list = model == null ? _accountStorage.GetFullList() : _accountStorage.GetFilteredList(model);
|
||||||
|
|
||||||
if (list == null)
|
if (list == null)
|
||||||
@ -67,10 +76,10 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
//метод, отвечающий за изменение баланса счёта
|
// Метод, отвечающий за изменение баланса на банковском счёте
|
||||||
public bool ChangeBalance(AccountSearchModel? model, int sum)
|
public bool ChangeBalance(AccountSearchModel? model, int sum)
|
||||||
{
|
{
|
||||||
//ищем счёт
|
// Ищем счёт
|
||||||
var account = ReadElement(model);
|
var account = ReadElement(model);
|
||||||
|
|
||||||
if (account == null)
|
if (account == null)
|
||||||
@ -78,13 +87,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
throw new ArgumentNullException("Счёт не найден", nameof(account));
|
throw new ArgumentNullException("Счёт не найден", nameof(account));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверяем возможность операции снятия (sum может быть отрицательной)
|
// Проверяем возможность операции снятия (sum может быть отрицательной)
|
||||||
if (sum + account.Balance < 0)
|
if (sum + account.Balance < 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//обновляем балланс счёта
|
// Обновляем балланс счёта
|
||||||
_accountStorage.Update(new AccountBindingModel
|
_accountStorage.Update(new AccountBindingModel
|
||||||
{
|
{
|
||||||
Id = account.Id,
|
Id = account.Id,
|
||||||
@ -94,6 +103,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Создание счёта
|
||||||
public bool Create(AccountBindingModel model)
|
public bool Create(AccountBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -108,6 +118,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Обновление счёта
|
||||||
public bool Update(AccountBindingModel model)
|
public bool Update(AccountBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -122,6 +133,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Удаление счёта
|
||||||
public bool Delete(AccountBindingModel model)
|
public bool Delete(AccountBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model, false);
|
CheckModel(model, false);
|
||||||
@ -138,84 +150,85 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<CashierDiagramElementsViewModel> GetMonthInfo(int AccountId)
|
public List<CashierDiagramElementsViewModel> GetMonthInfo(int AccountId)
|
||||||
{
|
{
|
||||||
|
|
||||||
Dictionary<(int, int), int> cashWithdrawals = _cashWithdrawalLogic.ReadList(new CashWithdrawalSearchModel()
|
Dictionary<(int, int), int> cashWithdrawals = _cashWithdrawalLogic.ReadList(new CashWithdrawalSearchModel()
|
||||||
{
|
{
|
||||||
AccountId = AccountId,
|
AccountId = AccountId,
|
||||||
}).Where(x => x.DebitingStatus == StatusEnum.Закрыта ).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
}).Where(x => x.DebitingStatus == StatusEnum.Закрыта).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
||||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||||
|
|
||||||
Dictionary<(int, int), int> moneyTransfers = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
|
Dictionary<(int, int), int> moneyTransfers = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
|
||||||
{
|
{
|
||||||
AccountPayeeId = AccountId,
|
AccountPayeeId = AccountId,
|
||||||
}).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
}).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
||||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||||
|
|
||||||
Dictionary<(int, int), int> moneyTransfersDebiting = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
|
Dictionary<(int, int), int> moneyTransfersDebiting = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
|
||||||
{
|
{
|
||||||
AccountSenderId = AccountId,
|
AccountSenderId = AccountId,
|
||||||
}).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
}).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
||||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||||
|
|
||||||
List<CashierDiagramElementsViewModel> result = new();
|
List<CashierDiagramElementsViewModel> result = new();
|
||||||
|
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
|
|
||||||
foreach (var key in cashWithdrawals.Keys.Union(moneyTransfers.Keys).Union(moneyTransfers.Keys).OrderBy(x => x.Item1 * 12 + x.Item2))
|
foreach (var key in cashWithdrawals.Keys.Union(moneyTransfers.Keys).Union(moneyTransfers.Keys).OrderBy(x => x.Item1 * 12 + x.Item2))
|
||||||
{
|
{
|
||||||
if (cashWithdrawals.ContainsKey(key)) sum += cashWithdrawals.GetValueOrDefault(key);
|
if (cashWithdrawals.ContainsKey(key)) sum += cashWithdrawals.GetValueOrDefault(key);
|
||||||
if (moneyTransfers.ContainsKey(key)) sum += moneyTransfers.GetValueOrDefault(key);
|
if (moneyTransfers.ContainsKey(key)) sum += moneyTransfers.GetValueOrDefault(key);
|
||||||
if (moneyTransfers.ContainsKey(key)) sum -= moneyTransfersDebiting.GetValueOrDefault(key);
|
if (moneyTransfers.ContainsKey(key)) sum -= moneyTransfersDebiting.GetValueOrDefault(key);
|
||||||
result.Add(new CashierDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum });
|
result.Add(new CashierDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum });
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка входного аргумента для методов Insert, Update и Delete
|
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||||
private void CheckModel(AccountBindingModel model, bool withParams = true)
|
private void CheckModel(AccountBindingModel model, bool withParams = true)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
//так как при удалении передаём как параметр false
|
// Так как при удалении передаём как параметр false
|
||||||
if (!withParams)
|
if (!withParams)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на наличие номера счёта
|
// Проверка на наличие номера счёта
|
||||||
if (string.IsNullOrEmpty(model.AccountNumber))
|
if (string.IsNullOrEmpty(model.AccountNumber))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Отсутствие номера у счёта", nameof(model.AccountNumber));
|
throw new ArgumentNullException("Отсутствие номера у счёта", nameof(model.AccountNumber));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на наличие id владельца
|
// Проверка на наличие id владельца
|
||||||
if (model.CashierId < 0)
|
if (model.CashierId < 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Некорректный Id владельца счёта", nameof(model.CashierId));
|
throw new ArgumentNullException("Некорректный Id владельца счёта", nameof(model.CashierId));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на наличие id кассира, создавшего счёт
|
// Проверка на наличие id кассира, создавшего счёт
|
||||||
if (model.CashierId < 0)
|
if (model.CashierId < 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Некорректный Id кассира, открывшего счёт", nameof(model.CashierId));
|
throw new ArgumentNullException("Некорректный Id кассира, открывшего счёт", nameof(model.CashierId));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на наличие пароля счёта
|
// Проверка на наличие пароля счёта
|
||||||
if (string.IsNullOrEmpty(model.PasswordAccount) )
|
if (string.IsNullOrEmpty(model.PasswordAccount))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Некорректный пароль счёта", nameof(model.PasswordAccount));
|
throw new ArgumentNullException("Некорректный пароль счёта", nameof(model.PasswordAccount));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (model.Balance < 0) {
|
if (model.Balance < 0)
|
||||||
throw new ArgumentNullException("Изначальный баланс аккаунта не может быть < 0", nameof(model.Balance));
|
{
|
||||||
}
|
throw new ArgumentNullException("Изначальный баланс аккаунта не может быть < 0", nameof(model.Balance));
|
||||||
|
}
|
||||||
|
|
||||||
//проверка на корректную дату открытия счёта
|
// Проверка на корректную дату открытия счёта
|
||||||
if (model.DateOpen > DateTime.Now)
|
if (model.DateOpen > DateTime.Now)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Дата открытия счёта не может быть ранее текущей", nameof(model.DateOpen));
|
throw new ArgumentNullException("Дата открытия счёта не может быть ранее текущей", nameof(model.DateOpen));
|
||||||
@ -225,13 +238,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
"CashierId:{CashierId}. DateOpen:{DateOpen}. Id:{Id}",
|
"CashierId:{CashierId}. DateOpen:{DateOpen}. Id:{Id}",
|
||||||
model.AccountNumber, model.PasswordAccount, model.ClientId, model.CashierId, model.DateOpen, model.Id);
|
model.AccountNumber, model.PasswordAccount, model.ClientId, model.CashierId, model.DateOpen, model.Id);
|
||||||
|
|
||||||
//для проверка на наличие такого же счёта
|
// Для проверка на наличие такого же счёта
|
||||||
var element = _accountStorage.GetElement(new AccountSearchModel
|
var element = _accountStorage.GetElement(new AccountSearchModel
|
||||||
{
|
{
|
||||||
AccountNumber = model.AccountNumber,
|
AccountNumber = model.AccountNumber,
|
||||||
});
|
});
|
||||||
|
|
||||||
//если элемент найден и его Id не совпадает с Id переданного объекта
|
// Если элемент найден и его Id не совпадает с Id переданного объекта
|
||||||
if (element != null && element.Id != model.Id)
|
if (element != null && element.Id != model.Id)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("Счёт с таким номером уже существует");
|
throw new InvalidOperationException("Счёт с таким номером уже существует");
|
||||||
|
@ -7,10 +7,16 @@ using BankContracts.StoragesContracts.Client;
|
|||||||
using BankContracts.ViewModels.Cashier.ViewModels;
|
using BankContracts.ViewModels.Cashier.ViewModels;
|
||||||
using BankDataModels.Enums;
|
using BankDataModels.Enums;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace BankBusinessLogic.BusinessLogics.Cashier
|
namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||||
{
|
{
|
||||||
public class CashWithdrawalLogic : ICashWithdrawalLogic
|
// Класс, реализующий бизнес-логику для снятия наличных
|
||||||
|
public class CashWithdrawalLogic : ICashWithdrawalLogic
|
||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
@ -18,6 +24,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
|
|
||||||
private readonly IDebitingStorage _debitingStorage;
|
private readonly IDebitingStorage _debitingStorage;
|
||||||
|
|
||||||
|
// Конструктор
|
||||||
public CashWithdrawalLogic(ILogger<CashWithdrawalLogic> logger, ICashWithdrawalStorage cashWithdrawalStorage,
|
public CashWithdrawalLogic(ILogger<CashWithdrawalLogic> logger, ICashWithdrawalStorage cashWithdrawalStorage,
|
||||||
IDebitingStorage debitingStorage)
|
IDebitingStorage debitingStorage)
|
||||||
{
|
{
|
||||||
@ -26,6 +33,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
_debitingStorage = debitingStorage;
|
_debitingStorage = debitingStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Вывод конкретной операции
|
||||||
public CashWithdrawalViewModel? ReadElement(CashWithdrawalSearchModel model)
|
public CashWithdrawalViewModel? ReadElement(CashWithdrawalSearchModel model)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
@ -50,12 +58,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Вывод всего списка операций
|
||||||
public List<CashWithdrawalViewModel>? ReadList(CashWithdrawalSearchModel? model)
|
public List<CashWithdrawalViewModel>? ReadList(CashWithdrawalSearchModel? model)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("ReadElement. AccountId:{AccountId}. Sum:{Sum}. DateOperation:{DateOperation}. Id:{Id}",
|
_logger.LogInformation("ReadElement. AccountId:{AccountId}. Sum:{Sum}. DateOperation:{DateOperation}. Id:{Id}",
|
||||||
model?.AccountId, model?.Sum, model?.DateTo, model?.Id);
|
model?.AccountId, model?.Sum, model?.DateTo, model?.Id);
|
||||||
|
|
||||||
//list хранит весь список в случае, если model пришло со значением null на вход метода
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
var list = model == null ? _cashWithdrawalStorage.GetFullList() : _cashWithdrawalStorage.GetFilteredList(model);
|
var list = model == null ? _cashWithdrawalStorage.GetFullList() : _cashWithdrawalStorage.GetFilteredList(model);
|
||||||
|
|
||||||
if (list == null)
|
if (list == null)
|
||||||
@ -69,6 +78,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Создание операции
|
||||||
public bool Create(CashWithdrawalBindingModel model, bool flag)
|
public bool Create(CashWithdrawalBindingModel model, bool flag)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -102,6 +112,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Обновление операции
|
||||||
public bool Update(CashWithdrawalBindingModel model)
|
public bool Update(CashWithdrawalBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -116,6 +127,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Удаление операции
|
||||||
public bool Delete(CashWithdrawalBindingModel model)
|
public bool Delete(CashWithdrawalBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model, false);
|
CheckModel(model, false);
|
||||||
@ -132,7 +144,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка входного аргумента для методов Insert, Update и Delete
|
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||||
private void CheckModel(CashWithdrawalBindingModel model, bool withParams = true)
|
private void CheckModel(CashWithdrawalBindingModel model, bool withParams = true)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
@ -140,25 +152,25 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
//так как при удалении передаём как параметр false
|
// Так как при удалении передаём как параметр false
|
||||||
if (!withParams)
|
if (!withParams)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на корректность Id счёта
|
// Проверка на корректность Id счёта
|
||||||
if (model.AccountId < 0)
|
if (model.AccountId < 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Некорректный Id счёта", nameof(model.AccountId));
|
throw new ArgumentNullException("Некорректный Id счёта", nameof(model.AccountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на корректность снимаемой суммы
|
// Проверка на корректность снимаемой суммы
|
||||||
if (model.Sum <= 0)
|
if (model.Sum <= 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Снимаемая сумма не может раняться нулю или быть меньше его", nameof(model.Sum));
|
throw new ArgumentNullException("Снимаемая сумма не может раняться нулю или быть меньше его", nameof(model.Sum));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на корректную дату операции
|
// Проверка на корректную дату операции
|
||||||
if (model.DateOperation > DateTime.Now)
|
if (model.DateOperation > DateTime.Now)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Дата операции не может быть позднее текущей", nameof(model.DateOperation));
|
throw new ArgumentNullException("Дата операции не может быть позднее текущей", nameof(model.DateOperation));
|
||||||
|
@ -4,21 +4,30 @@ using BankContracts.SearchModels.Cashier;
|
|||||||
using BankContracts.StoragesContracts.Cashier;
|
using BankContracts.StoragesContracts.Cashier;
|
||||||
using BankContracts.ViewModels.Cashier.ViewModels;
|
using BankContracts.ViewModels.Cashier.ViewModels;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace BankBusinessLogic.BusinessLogics.Cashier
|
namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||||
{
|
{
|
||||||
public class CashierLogic : ICashierLogic
|
// Класс, реализующий бизнес-логику для кассиров
|
||||||
|
public class CashierLogic : ICashierLogic
|
||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
private readonly ICashierStorage _cashierStorage;
|
private readonly ICashierStorage _cashierStorage;
|
||||||
|
|
||||||
|
// Конструктор
|
||||||
public CashierLogic(ILogger<CashierLogic> logger, ICashierStorage cashierStorage)
|
public CashierLogic(ILogger<CashierLogic> logger, ICashierStorage cashierStorage)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_cashierStorage = cashierStorage;
|
_cashierStorage = cashierStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Вывод конкретного клиента
|
||||||
public CashierViewModel? ReadElement(CashierSearchModel model)
|
public CashierViewModel? ReadElement(CashierSearchModel model)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
@ -26,7 +35,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("ReadElement. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. Id:{Id}",
|
_logger.LogInformation("ReadElement. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. Id:{Id}",
|
||||||
model.Name, model.Surname, model.Patronymic, model?.Id);
|
model.Name, model.Surname, model.Patronymic, model?.Id);
|
||||||
|
|
||||||
var element = _cashierStorage.GetElement(model);
|
var element = _cashierStorage.GetElement(model);
|
||||||
@ -43,12 +52,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Вывод отфильтрованного списка
|
||||||
public List<CashierViewModel>? ReadList(CashierSearchModel? model)
|
public List<CashierViewModel>? ReadList(CashierSearchModel? model)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("ReadList. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. Id:{Id}",
|
_logger.LogInformation("ReadList. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. Id:{Id}",
|
||||||
model.Name, model.Surname, model.Patronymic, model?.Id);
|
model.Name, model.Surname, model.Patronymic, model?.Id);
|
||||||
|
|
||||||
//list хранит весь список в случае, если model пришло со значением null на вход метода
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
var list = model == null ? _cashierStorage.GetFullList() : _cashierStorage.GetFilteredList(model);
|
var list = model == null ? _cashierStorage.GetFullList() : _cashierStorage.GetFilteredList(model);
|
||||||
|
|
||||||
if (list == null)
|
if (list == null)
|
||||||
@ -62,6 +72,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Создание кассира
|
||||||
public bool Create(CashierBindingModel model)
|
public bool Create(CashierBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -76,6 +87,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Обновление кассира
|
||||||
public bool Update(CashierBindingModel model)
|
public bool Update(CashierBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -90,6 +102,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Удаление кассира
|
||||||
public bool Delete(CashierBindingModel model)
|
public bool Delete(CashierBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model, false);
|
CheckModel(model, false);
|
||||||
@ -106,7 +119,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка входного аргумента для методов Insert, Update и Delete
|
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||||
private void CheckModel(CashierBindingModel model, bool withParams = true)
|
private void CheckModel(CashierBindingModel model, bool withParams = true)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
@ -114,53 +127,70 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
//так как при удалении передаём как параметр false
|
// Так как при удалении передаём как параметр false
|
||||||
if (!withParams)
|
if (!withParams)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на наличие имени
|
// Проверка на наличие имени
|
||||||
if (string.IsNullOrEmpty(model.Name))
|
if (string.IsNullOrEmpty(model.Name))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Отсутствие имени в учётной записи", nameof(model.Name));
|
throw new ArgumentNullException("Отсутствие имени в учётной записи", nameof(model.Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на наличие фамилия
|
// Проверка на наличие фамилия
|
||||||
if (string.IsNullOrEmpty(model.Surname))
|
if (string.IsNullOrEmpty(model.Surname))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Отсутствие фамилии в учётной записи", nameof(model.Name));
|
throw new ArgumentNullException("Отсутствие фамилии в учётной записи", nameof(model.Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на наличие отчество
|
// Проверка на наличие отчество
|
||||||
if (string.IsNullOrEmpty(model.Patronymic))
|
if (string.IsNullOrEmpty(model.Patronymic))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Отсутствие отчества в учётной записи", nameof(model.Name));
|
throw new ArgumentNullException("Отсутствие отчества в учётной записи", nameof(model.Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на наличие почты
|
// Проверка на наличие почты
|
||||||
if (string.IsNullOrEmpty(model.Email))
|
if (string.IsNullOrEmpty(model.Email))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Отсутствие почты в учётной записи (логина)", nameof(model.Email));
|
throw new ArgumentNullException("Отсутствие почты в учётной записи (логина)", nameof(model.Email));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на наличие пароля
|
// Проверка на наличие мобильного телефона
|
||||||
|
if (string.IsNullOrEmpty(model.Telephone))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Нет моб.телефона пользователя", nameof(model.Telephone));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие пароля
|
||||||
if (string.IsNullOrEmpty(model.Password))
|
if (string.IsNullOrEmpty(model.Password))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Отсутствие пароля в учётной записи", nameof(model.Password));
|
throw new ArgumentNullException("Отсутствие пароля в учётной записи", nameof(model.Password));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!Regex.IsMatch(model.Email, @"^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$", RegexOptions.IgnoreCase))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Некорректная почта", nameof(model.Email));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Regex.IsMatch(model.Password, @"^((\w+\d+\W+)|(\w+\W+\d+)|(\d+\w+\W+)|(\d+\W+\w+)|(\W+\w+\d+)|(\W+\d+\w+))[\w\d\W]*$", RegexOptions.IgnoreCase)
|
||||||
|
&& model.Password.Length < 10 && model.Password.Length > 50)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Необходимо придумать другой пароль", nameof(model.Password));
|
||||||
|
}
|
||||||
|
|
||||||
_logger.LogInformation("Cashier. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. " +
|
_logger.LogInformation("Cashier. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. " +
|
||||||
"Email:{Email}. Password:{Password}. Id:{Id}",
|
"Email:{Email}. Password:{Password}. Id:{Id}",
|
||||||
model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Id);
|
model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Id);
|
||||||
|
|
||||||
//для проверка на наличие такого же аккаунта
|
// Для проверки на наличие такого же аккаунта
|
||||||
var element = _cashierStorage.GetElement(new CashierSearchModel
|
var element = _cashierStorage.GetElement(new CashierSearchModel
|
||||||
{
|
{
|
||||||
Email = model.Email,
|
Email = model.Email,
|
||||||
});
|
});
|
||||||
|
|
||||||
//если элемент найден и его Id не совпадает с Id переданного объекта
|
// Если элемент найден и его Id не совпадает с Id переданного объекта
|
||||||
if (element != null && element.Id != model.Id)
|
if (element != null && element.Id != model.Id)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("Аккаунт с таким логином уже есть");
|
throw new InvalidOperationException("Аккаунт с таким логином уже есть");
|
||||||
|
@ -7,10 +7,16 @@ using BankContracts.StoragesContracts.Client;
|
|||||||
using BankContracts.ViewModels.Cashier.ViewModels;
|
using BankContracts.ViewModels.Cashier.ViewModels;
|
||||||
using BankDataModels.Enums;
|
using BankDataModels.Enums;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace BankBusinessLogic.BusinessLogics.Cashier
|
namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||||
{
|
{
|
||||||
public class MoneyTransferLogic : IMoneyTransferLogic
|
// Класс, реализующий бизнес-логику для перевода наличных
|
||||||
|
public class MoneyTransferLogic : IMoneyTransferLogic
|
||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
@ -18,6 +24,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
|
|
||||||
public readonly ICreditingStorage _creditingStorage;
|
public readonly ICreditingStorage _creditingStorage;
|
||||||
|
|
||||||
|
// Конструктор
|
||||||
public MoneyTransferLogic(ILogger<MoneyTransferLogic> logger, IMoneyTransferStorage moneyTransferStorage, ICreditingStorage creditingStorage)
|
public MoneyTransferLogic(ILogger<MoneyTransferLogic> logger, IMoneyTransferStorage moneyTransferStorage, ICreditingStorage creditingStorage)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
@ -25,6 +32,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
_creditingStorage = creditingStorage;
|
_creditingStorage = creditingStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Вывод конкретной операции
|
||||||
public MoneyTransferViewModel? ReadElement(MoneyTransferSearchModel model)
|
public MoneyTransferViewModel? ReadElement(MoneyTransferSearchModel model)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
@ -49,12 +57,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Вывод всего списка операций на перевод наличных
|
||||||
public List<MoneyTransferViewModel>? ReadList(MoneyTransferSearchModel? model)
|
public List<MoneyTransferViewModel>? ReadList(MoneyTransferSearchModel? model)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}",
|
_logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}",
|
||||||
model?.AccountSenderId, model?.AccountPayeeId, model?.Sum, model?.Id);
|
model?.AccountSenderId, model?.AccountPayeeId, model?.Sum, model?.Id);
|
||||||
|
|
||||||
//list хранит весь список в случае, если model пришло со значением null на вход метода
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
var list = model == null ? _moneyTransferStorage.GetFullList() : _moneyTransferStorage.GetFilteredList(model);
|
var list = model == null ? _moneyTransferStorage.GetFullList() : _moneyTransferStorage.GetFilteredList(model);
|
||||||
|
|
||||||
if (list == null)
|
if (list == null)
|
||||||
@ -68,6 +77,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Создание операции на перевод
|
||||||
public bool Create(MoneyTransferBindingModel model)
|
public bool Create(MoneyTransferBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -79,7 +89,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на то, что это зачисление на карту, а не перевод между счетами
|
// Проверка на то, что это зачисление на карту, а не перевод между счетами
|
||||||
if (model.CreditingId.HasValue)
|
if (model.CreditingId.HasValue)
|
||||||
{
|
{
|
||||||
_creditingStorage.Update(new CreditingBindingModel
|
_creditingStorage.Update(new CreditingBindingModel
|
||||||
@ -94,6 +104,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Обновление операции на перевод
|
||||||
public bool Update(MoneyTransferBindingModel model)
|
public bool Update(MoneyTransferBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -108,6 +119,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Удаление операции на перевод
|
||||||
public bool Delete(MoneyTransferBindingModel model)
|
public bool Delete(MoneyTransferBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model, false);
|
CheckModel(model, false);
|
||||||
@ -124,7 +136,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка входного аргумента для методов Insert, Update и Delete
|
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||||
private void CheckModel(MoneyTransferBindingModel model, bool withParams = true)
|
private void CheckModel(MoneyTransferBindingModel model, bool withParams = true)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
@ -132,31 +144,31 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
//так как при удалении передаём как параметр false
|
// Так как при удалении передаём как параметр false
|
||||||
if (!withParams)
|
if (!withParams)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка корректности Id счёта отправителя
|
// Проверка корректности Id счёта отправителя
|
||||||
if (model.AccountSenderId < 0)
|
if (model.AccountSenderId < 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Отсутствие Id у счёта отправителя", nameof(model.AccountSenderId));
|
throw new ArgumentNullException("Отсутствие Id у счёта отправителя", nameof(model.AccountSenderId));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка корректности Id счёта получателя
|
// Проверка корректности Id счёта получателя
|
||||||
if (model.AccountPayeeId < 0)
|
if (model.AccountPayeeId < 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Отсутствие Id у счёта получателя", nameof(model.AccountPayeeId));
|
throw new ArgumentNullException("Отсутствие Id у счёта получателя", nameof(model.AccountPayeeId));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на корректную сумму перевода
|
// Проверка на корректную сумму перевода
|
||||||
if (model.Sum <= 0)
|
if (model.Sum <= 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Сумма перевода не может раняться нулю или быть меньше его", nameof(model.Sum));
|
throw new ArgumentNullException("Сумма перевода не может раняться нулю или быть меньше его", nameof(model.Sum));
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка на корректную дату открытия счёта
|
// Проверка на корректную дату открытия счёта
|
||||||
if (model.DateOperation > DateTime.Now)
|
if (model.DateOperation > DateTime.Now)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Дата операции не может быть ранее текущей", nameof(model.DateOperation));
|
throw new ArgumentNullException("Дата операции не может быть ранее текущей", nameof(model.DateOperation));
|
||||||
|
@ -8,160 +8,216 @@ using BankContracts.BindingModels.Client;
|
|||||||
using BankContracts.SearchModels.Client;
|
using BankContracts.SearchModels.Client;
|
||||||
using BankContracts.ViewModels.Client.ViewModels;
|
using BankContracts.ViewModels.Client.ViewModels;
|
||||||
using BankContracts.SearchModels.Cashier;
|
using BankContracts.SearchModels.Cashier;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace BankBusinessLogic.BusinessLogics.Client
|
namespace BankBusinessLogic.BusinessLogics.Client
|
||||||
{
|
{
|
||||||
public class CardLogic : ICardLogic
|
// Класс, реализующий бизнес-логику для банковских карт
|
||||||
{
|
public class CardLogic : ICardLogic
|
||||||
private readonly ILogger _logger;
|
{
|
||||||
private readonly ICardStorage _cardStorage;
|
private readonly ILogger _logger;
|
||||||
private readonly IAccountLogic _accountLogic;
|
|
||||||
private readonly IDebitingLogic _debitingLogic;
|
|
||||||
private readonly ICreditingLogic _creditingLogic;
|
|
||||||
|
|
||||||
public CardLogic(ILogger<CardLogic> logger, ICardStorage cardStorage, IAccountLogic accountLogic,
|
private readonly ICardStorage _cardStorage;
|
||||||
IDebitingLogic debitingLogic, ICreditingLogic creditingLogic) {
|
|
||||||
_logger = logger;
|
|
||||||
_cardStorage = cardStorage;
|
|
||||||
_accountLogic = accountLogic;
|
|
||||||
_debitingLogic = debitingLogic;
|
|
||||||
_creditingLogic = creditingLogic;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
private readonly IAccountLogic _accountLogic;
|
||||||
|
|
||||||
|
private readonly IDebitingLogic _debitingLogic;
|
||||||
|
|
||||||
|
private readonly ICreditingLogic _creditingLogic;
|
||||||
|
|
||||||
|
// Конструктор
|
||||||
|
public CardLogic(ILogger<CardLogic> logger, ICardStorage cardStorage, IAccountLogic accountLogic,
|
||||||
|
IDebitingLogic debitingLogic, ICreditingLogic creditingLogic)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
|
||||||
|
_cardStorage = cardStorage;
|
||||||
|
_accountLogic = accountLogic;
|
||||||
|
_debitingLogic = debitingLogic;
|
||||||
|
_creditingLogic = creditingLogic;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Вывод конкретной банковской карты
|
||||||
|
public CardViewModel? ReadElement(CardSearchModel model)
|
||||||
|
{
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(model));
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("ReadElement. CardNumber:{Number}.Id:{ Id}", model.Number, model.Id);
|
||||||
|
|
||||||
|
var element = _cardStorage.GetElement(model);
|
||||||
|
|
||||||
|
if (element == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("ReadElement element not found");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
||||||
|
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Вывод всего списка банковских карт
|
||||||
|
public List<CardViewModel>? ReadList(CardSearchModel? model)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("ReadList. CardId:{Id}", model?.Id);
|
||||||
|
|
||||||
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
|
var list = model == null ? _cardStorage.GetFullList() : _cardStorage.GetFilteredList(model);
|
||||||
|
|
||||||
|
if (list == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("ReadList return null list");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Создание банковской карты
|
||||||
public bool Create(CardBindingModel model)
|
public bool Create(CardBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
if (_cardStorage.Insert(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Insert operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Delete(CardBindingModel model)
|
if (_cardStorage.Insert(model) == null)
|
||||||
{
|
{
|
||||||
CheckModel(model, false);
|
_logger.LogWarning("Insert operation failed");
|
||||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
return false;
|
||||||
if (_cardStorage.Delete(model) == null)
|
}
|
||||||
{
|
|
||||||
_logger.LogWarning("Delete operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CardViewModel? ReadElement(CardSearchModel model)
|
return true;
|
||||||
{
|
}
|
||||||
if (model == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(model));
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadElement. CardNumber:{Number}.Id:{ Id}", model.Number, model.Id);
|
|
||||||
var element = _cardStorage.GetElement(model);
|
|
||||||
if (element == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("ReadElement element not found");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
|
||||||
return element;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<CardViewModel>? ReadList(CardSearchModel? model)
|
// Обновление банковской карты
|
||||||
{
|
public bool Update(CardBindingModel model)
|
||||||
_logger.LogInformation("ReadList. CardId:{Id}", model?.Id);
|
{
|
||||||
var list = model == null ? _cardStorage.GetFullList() : _cardStorage.GetFilteredList(model);
|
CheckModel(model);
|
||||||
if (list == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("ReadList return null list");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Update(CardBindingModel model)
|
if (_cardStorage.Update(model) == null)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
_logger.LogWarning("Update operation failed");
|
||||||
if (_cardStorage.Update(model) == null)
|
return false;
|
||||||
{
|
}
|
||||||
_logger.LogWarning("Update operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ClientDiagramElementsViewModel> GetMonthInfo(int CardId) {
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel()
|
// Удаление банковской карты
|
||||||
{
|
public bool Delete(CardBindingModel model)
|
||||||
CardId = CardId,
|
{
|
||||||
Status = StatusEnum.Закрыта
|
CheckModel(model, false);
|
||||||
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
|
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum()}).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
if (_cardStorage.Delete(model) == null)
|
||||||
Dictionary<(int?, int?), int> creditings = _creditingLogic.ReadList(new CreditingSearchModel()
|
{
|
||||||
{
|
_logger.LogWarning("Delete operation failed");
|
||||||
CardId = CardId,
|
return false;
|
||||||
Status = StatusEnum.Закрыта
|
}
|
||||||
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
|
return true;
|
||||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
}
|
||||||
|
|
||||||
List<ClientDiagramElementsViewModel> result = new();
|
// Бизнес-логика для диаграмм, для получения информации по месяцам
|
||||||
foreach (var key in debitings.Keys.Union(creditings.Keys).OrderBy(x => x.Item1 * 12 + x.Item2)) {
|
public List<ClientDiagramElementsViewModel> GetMonthInfo(int CardId)
|
||||||
int sum = 0;
|
{
|
||||||
if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key);
|
Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel()
|
||||||
if (creditings.ContainsKey(key)) sum += creditings.GetValueOrDefault(key);
|
{
|
||||||
result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum});
|
CardId = CardId,
|
||||||
}
|
Status = StatusEnum.Закрыта
|
||||||
return result;
|
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
|
||||||
}
|
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||||
|
|
||||||
private void CheckModel(CardBindingModel model, bool withParams = true)
|
Dictionary<(int?, int?), int> creditings = _creditingLogic.ReadList(new CreditingSearchModel()
|
||||||
{
|
{
|
||||||
if (model == null)
|
CardId = CardId,
|
||||||
{
|
Status = StatusEnum.Закрыта
|
||||||
throw new ArgumentNullException(nameof(model));
|
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
|
||||||
}
|
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||||
if (!withParams)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (string.IsNullOrEmpty(model.Number) || model.Number.Length != 16)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("Неправильный номер карты", nameof(model.Number));
|
|
||||||
}
|
|
||||||
if (string.IsNullOrEmpty(model.CVC) || model.CVC.Length != 3)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("Неправильный СVC карты", nameof(model.CVC));
|
|
||||||
}
|
|
||||||
if (model.Period < DateTime.Now)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("Нет периода действия", nameof(model.Period));
|
|
||||||
}
|
|
||||||
var cardElement = _cardStorage.GetElement(new CardSearchModel
|
|
||||||
{
|
|
||||||
Number = model.Number,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (cardElement != null && cardElement.Id != model.Id)
|
List<ClientDiagramElementsViewModel> result = new();
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Карта с таким ноиером уже есть");
|
|
||||||
}
|
|
||||||
|
|
||||||
var accountElement = _accountLogic.ReadElement(new AccountSearchModel
|
foreach (var key in debitings.Keys.Union(creditings.Keys).OrderBy(x => x.Item1 * 12 + x.Item2))
|
||||||
{
|
{
|
||||||
Id = model.AccountId,
|
int sum = 0;
|
||||||
ClientId = model.ClientID
|
if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key);
|
||||||
});
|
if (creditings.ContainsKey(key)) sum += creditings.GetValueOrDefault(key);
|
||||||
|
result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum });
|
||||||
|
}
|
||||||
|
|
||||||
if (accountElement != null && accountElement.ClientId != model.ClientID)
|
return result;
|
||||||
{
|
}
|
||||||
|
|
||||||
|
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||||
|
private void CheckModel(CardBindingModel model, bool withParams = true)
|
||||||
|
{
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(model));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Так как при удалении передаём как параметр false
|
||||||
|
if (!withParams)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие номера у банковской карты
|
||||||
|
if (string.IsNullOrEmpty(model.Number) || model.Number.Length != 16)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Неправильный номер карты", nameof(model.Number));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие CVC кода у банковской карты
|
||||||
|
if (string.IsNullOrEmpty(model.CVC) || model.CVC.Length != 3)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Неправильный СVC карты", nameof(model.CVC));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на конкретный период действия карты
|
||||||
|
if (model.Period < DateTime.Now)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Нет периода действия", nameof(model.Period));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие id клиента, получившего карту (лишним не будет)
|
||||||
|
if (model.ClientID < 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Некорректный Id клиента, открывшего счёт", nameof(model.ClientID));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Для проверка на наличие такой же банковской карты
|
||||||
|
var cardElement = _cardStorage.GetElement(new CardSearchModel
|
||||||
|
{
|
||||||
|
Number = model.Number,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Если элемент найден и его Id не совпадает с Id переданного объекта
|
||||||
|
if (cardElement != null && cardElement.Id != model.Id)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Карта с таким ноиером уже есть");
|
||||||
|
}
|
||||||
|
|
||||||
|
var accountElement = _accountLogic.ReadElement(new AccountSearchModel
|
||||||
|
{
|
||||||
|
Id = model.AccountId,
|
||||||
|
ClientId = model.ClientID
|
||||||
|
});
|
||||||
|
|
||||||
|
// Проверка привязан ли счёт к данному клиенту
|
||||||
|
if (accountElement != null && accountElement.ClientId != model.ClientID)
|
||||||
|
{
|
||||||
throw new InvalidOperationException("Это не счёт данного клиента");
|
throw new InvalidOperationException("Это не счёт данного клиента");
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("Card. Number:{Number}.CVC:{CVC}.ClientId:{ClientID}.Patronymic:{Period}.Id:{Id}",
|
_logger.LogInformation("Card. Number:{Number}.CVC:{CVC}.ClientId:{ClientID}.Patronymic:{Period}.Id:{Id}",
|
||||||
model.Number, model.CVC, model.Period.ToString(), model.ClientID, model.Id);
|
model.Number, model.CVC, model.Period.ToString(), model.ClientID, model.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,127 +4,190 @@ using BankContracts.SearchModels.Client;
|
|||||||
using BankContracts.StoragesContracts.Client;
|
using BankContracts.StoragesContracts.Client;
|
||||||
using BankContracts.ViewModels.Client.ViewModels;
|
using BankContracts.ViewModels.Client.ViewModels;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace BankBusinessLogic.BusinessLogics.Client
|
namespace BankBusinessLogic.BusinessLogics.Client
|
||||||
{
|
{
|
||||||
public class ClientLogic : IClientLogic
|
// Класс, реализующий бизнес-логику для клиентов
|
||||||
{
|
public class ClientLogic : IClientLogic
|
||||||
private readonly ILogger _logger;
|
{
|
||||||
private readonly IClientStorage _clientStorage;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
public ClientLogic(ILogger<ClientLogic> logger, IClientStorage clientStorage) {
|
private readonly IClientStorage _clientStorage;
|
||||||
_logger = logger;
|
|
||||||
_clientStorage = clientStorage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Create(ClientBindingModel model)
|
// Конструктор
|
||||||
{
|
public ClientLogic(ILogger<ClientLogic> logger, IClientStorage clientStorage)
|
||||||
CheckModel(model);
|
{
|
||||||
if (_clientStorage.Insert(model) == null)
|
_logger = logger;
|
||||||
{
|
_clientStorage = clientStorage;
|
||||||
_logger.LogWarning("Insert operation failed");
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Delete(ClientBindingModel model)
|
// Вывод конкретного клиента
|
||||||
{
|
public ClientViewModel? ReadElement(ClientSearchModel model)
|
||||||
CheckModel(model, false);
|
{
|
||||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
if (model == null)
|
||||||
if (_clientStorage.Delete(model) == null)
|
{
|
||||||
{
|
throw new ArgumentNullException(nameof(model));
|
||||||
_logger.LogWarning("Delete operation failed");
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ClientViewModel? ReadElement(ClientSearchModel model)
|
_logger.LogInformation("ReadElement. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Id:{ Id}", model.Name, model.Surname, model.Patronymic, model.Id);
|
||||||
{
|
|
||||||
if (model == null)
|
var element = _clientStorage.GetElement(model);
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(model));
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadElement. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Id:{ Id}", model.Name, model.Surname, model.Patronymic, model.Id);
|
|
||||||
var element = _clientStorage.GetElement(model);
|
|
||||||
if (element == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("ReadElement element not found");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
|
||||||
return element;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ClientViewModel>? ReadList(ClientSearchModel? model)
|
if (element == null)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("ReadList. ClientId:{Id}", model?.Id);
|
_logger.LogWarning("ReadElement element not found");
|
||||||
var list = model == null ? _clientStorage.GetFullList() : _clientStorage.GetFilteredList(model);
|
return null;
|
||||||
if (list == null)
|
}
|
||||||
{
|
|
||||||
_logger.LogWarning("ReadList return null list");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Update(ClientBindingModel model)
|
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
||||||
{
|
|
||||||
CheckModel(model);
|
|
||||||
if (_clientStorage.Update(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Update operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CheckModel(ClientBindingModel model, bool withParams = true)
|
return element;
|
||||||
{
|
}
|
||||||
if (model == null)
|
|
||||||
{
|
// Вывод отфильтрованного списка
|
||||||
throw new ArgumentNullException(nameof(model));
|
public List<ClientViewModel>? ReadList(ClientSearchModel? model)
|
||||||
}
|
{
|
||||||
if (!withParams)
|
_logger.LogInformation("ReadList. ClientId:{Id}", model?.Id);
|
||||||
{
|
|
||||||
return;
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
}
|
var list = model == null ? _clientStorage.GetFullList() : _clientStorage.GetFilteredList(model);
|
||||||
if (string.IsNullOrEmpty(model.Name))
|
|
||||||
{
|
if (list == null)
|
||||||
throw new ArgumentNullException("Нет имени пользователя", nameof(model.Name));
|
{
|
||||||
}
|
_logger.LogWarning("ReadList return null list");
|
||||||
if (string.IsNullOrEmpty(model.Surname))
|
return null;
|
||||||
{
|
}
|
||||||
throw new ArgumentNullException("Нет фамилии пользователя", nameof(model.Surname));
|
|
||||||
}
|
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
||||||
if (string.IsNullOrEmpty(model.Patronymic))
|
|
||||||
{
|
return list;
|
||||||
throw new ArgumentNullException("Нет отчества пользователя", nameof(model.Patronymic));
|
}
|
||||||
}
|
|
||||||
if (string.IsNullOrEmpty(model.Email))
|
// Создание клиента
|
||||||
{
|
public bool Create(ClientBindingModel model)
|
||||||
throw new ArgumentNullException("Нет почты пользователя", nameof(model.Email));
|
{
|
||||||
}
|
CheckModel(model);
|
||||||
if (string.IsNullOrEmpty(model.Password))
|
|
||||||
{
|
if (_clientStorage.Insert(model) == null)
|
||||||
throw new ArgumentNullException("Нет пароля пользователя", nameof(model.Password));
|
{
|
||||||
}
|
_logger.LogWarning("Insert operation failed");
|
||||||
if (string.IsNullOrEmpty(model.Telephone))
|
return false;
|
||||||
{
|
}
|
||||||
throw new ArgumentNullException("Нет телефона пользователя", nameof(model.Telephone));
|
|
||||||
}
|
return true;
|
||||||
_logger.LogInformation("Client. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Email:{Email}.Password:{Password}.Telephone:{Telephone}.Id:{Id}",
|
}
|
||||||
model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Telephone, model.Id);
|
|
||||||
var element = _clientStorage.GetElement(new ClientSearchModel
|
// Обновление клиента
|
||||||
{
|
public bool Update(ClientBindingModel model)
|
||||||
Email = model.Email,
|
{
|
||||||
});
|
CheckModel(model);
|
||||||
if (element != null && element.Id != model.Id)
|
|
||||||
{
|
if (_clientStorage.Update(model) == null)
|
||||||
throw new InvalidOperationException("Клиент с такой почтой уже есть");
|
{
|
||||||
}
|
_logger.LogWarning("Update operation failed");
|
||||||
}
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Удаление клиента
|
||||||
|
public bool Delete(ClientBindingModel model)
|
||||||
|
{
|
||||||
|
CheckModel(model, false);
|
||||||
|
|
||||||
|
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||||
|
|
||||||
|
if (_clientStorage.Delete(model) == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Delete operation failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||||
|
private void CheckModel(ClientBindingModel model, bool withParams = true)
|
||||||
|
{
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(model));
|
||||||
|
}
|
||||||
|
|
||||||
|
// При удалении параметру withParams передаём false
|
||||||
|
if (!withParams)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие имени клиента
|
||||||
|
if (string.IsNullOrEmpty(model.Name))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Нет имени пользователя", nameof(model.Name));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие фамилии клиента
|
||||||
|
if (string.IsNullOrEmpty(model.Surname))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Нет фамилии пользователя", nameof(model.Surname));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие отчества клиента
|
||||||
|
if (string.IsNullOrEmpty(model.Patronymic))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Нет отчества пользователя", nameof(model.Patronymic));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие электронной почты
|
||||||
|
if (string.IsNullOrEmpty(model.Email))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Нет почты пользователя", nameof(model.Email));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие пароля
|
||||||
|
if (string.IsNullOrEmpty(model.Password))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Нет пароля пользователя", nameof(model.Password));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие мобильного телефона
|
||||||
|
if (string.IsNullOrEmpty(model.Telephone))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Нет моб.телефона пользователя", nameof(model.Telephone));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Regex.IsMatch(model.Email, @"^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$", RegexOptions.IgnoreCase))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Некорректная почта", nameof(model.Email));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Regex.IsMatch(model.Password, @"^((\w+\d+\W+)|(\w+\W+\d+)|(\d+\w+\W+)|(\d+\W+\w+)|(\W+\w+\d+)|(\W+\d+\w+))[\w\d\W]*$", RegexOptions.IgnoreCase)
|
||||||
|
&& model.Password.Length < 10 && model.Password.Length > 50)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Необходимо придумать другой пароль", nameof(model.Password));
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("Client. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Email:{Email}.Password:{Password}.Telephone:{Telephone}.Id:{Id}",
|
||||||
|
model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Telephone, model.Id);
|
||||||
|
|
||||||
|
// Для проверка на наличие такого же аккаунта
|
||||||
|
var element = _clientStorage.GetElement(new ClientSearchModel
|
||||||
|
{
|
||||||
|
Email = model.Email,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Если элемент найден и его Id не совпадает с Id переданного объекта
|
||||||
|
if (element != null && element.Id != model.Id)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Клиент с такой почтой уже есть");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,112 +5,148 @@ using BankContracts.StoragesContracts.Client;
|
|||||||
using BankContracts.BindingModels.Client;
|
using BankContracts.BindingModels.Client;
|
||||||
using BankContracts.ViewModels.Client.ViewModels;
|
using BankContracts.ViewModels.Client.ViewModels;
|
||||||
using BankContracts.SearchModels.Client;
|
using BankContracts.SearchModels.Client;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace BankBusinessLogic.BusinessLogics.Client
|
namespace BankBusinessLogic.BusinessLogics.Client
|
||||||
{
|
{
|
||||||
public class CreditingLogic : ICreditingLogic
|
// Класс, реализующий бизнес-логику для пополнения карты
|
||||||
|
public class CreditingLogic : ICreditingLogic
|
||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
private readonly ICreditingStorage _creditingStorage;
|
private readonly ICreditingStorage _creditingStorage;
|
||||||
|
|
||||||
private readonly ICardStorage _cardStorage;
|
private readonly ICardStorage _cardStorage;
|
||||||
|
|
||||||
public CreditingLogic(ILogger<CreditingLogic> logger, ICreditingStorage creditingStorage, ICardStorage cardStorage) {
|
// Конструктор
|
||||||
|
public CreditingLogic(ILogger<CreditingLogic> logger, ICreditingStorage creditingStorage, ICardStorage cardStorage) {
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_creditingStorage = creditingStorage;
|
_creditingStorage = creditingStorage;
|
||||||
_cardStorage = cardStorage;
|
_cardStorage = cardStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Create(CreditingBindingModel model)
|
// Вывод конкретной операции на пополнение
|
||||||
{
|
public CreditingViewModel? ReadElement(CreditingSearchModel model)
|
||||||
CheckModel(model);
|
|
||||||
|
|
||||||
if (!CheckCardPeriod(model))
|
|
||||||
{
|
|
||||||
model.Status = StatusEnum.Карта_просрочена;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
model.Status = StatusEnum.Открыта;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_creditingStorage.Insert(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Insert operation failed");
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Delete(CreditingBindingModel model)
|
|
||||||
{
|
|
||||||
CheckModel(model, false);
|
|
||||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
|
||||||
if (_creditingStorage.Delete(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Delete operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CreditingViewModel? ReadElement(CreditingSearchModel model)
|
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("ReadElement. CreditingId:{ Id }", model.Id);
|
_logger.LogInformation("ReadElement. CreditingId:{ Id }", model.Id);
|
||||||
|
|
||||||
var element = _creditingStorage.GetElement(model);
|
var element = _creditingStorage.GetElement(model);
|
||||||
|
|
||||||
if (element == null)
|
if (element == null)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("ReadElement element not found");
|
_logger.LogWarning("ReadElement element not found");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
||||||
|
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<CreditingViewModel>? ReadList(CreditingSearchModel? model)
|
// Вывод всего списка операций на пополнение
|
||||||
|
public List<CreditingViewModel>? ReadList(CreditingSearchModel? model)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("ReadList. CreditingId:{Id}", model?.Id);
|
_logger.LogInformation("ReadList. CreditingId:{Id}", model?.Id);
|
||||||
var list = model == null ? _creditingStorage.GetFullList() : _creditingStorage.GetFilteredList(model);
|
|
||||||
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
|
var list = model == null ? _creditingStorage.GetFullList() : _creditingStorage.GetFilteredList(model);
|
||||||
|
|
||||||
if (list == null)
|
if (list == null)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("ReadList return null list");
|
_logger.LogWarning("ReadList return null list");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Update(CreditingBindingModel model)
|
// Создание операции на пополнение
|
||||||
|
public bool Create(CreditingBindingModel model)
|
||||||
|
{
|
||||||
|
CheckModel(model);
|
||||||
|
|
||||||
|
if (!CheckCardPeriod(model))
|
||||||
|
{
|
||||||
|
model.Status = StatusEnum.Карта_просрочена;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
model.Status = StatusEnum.Открыта;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_creditingStorage.Insert(model) == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Insert operation failed");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обновление операции на пополнение
|
||||||
|
public bool Update(CreditingBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
|
|
||||||
if (_creditingStorage.Update(model) == null)
|
if (_creditingStorage.Update(model) == null)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Update operation failed");
|
_logger.LogWarning("Update operation failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckModel(CreditingBindingModel model, bool withParams = true)
|
// Удаление операции на пополнение
|
||||||
|
public bool Delete(CreditingBindingModel model)
|
||||||
|
{
|
||||||
|
CheckModel(model, false);
|
||||||
|
|
||||||
|
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||||
|
|
||||||
|
if (_creditingStorage.Delete(model) == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Delete operation failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||||
|
private void CheckModel(CreditingBindingModel model, bool withParams = true)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
if (!withParams)
|
|
||||||
|
// Так как при удалении передаём как параметр false
|
||||||
|
if (!withParams)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (model.Sum <= 0)
|
|
||||||
|
// Проверка на корректность суммы пополнения
|
||||||
|
if (model.Sum <= 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum));
|
throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum));
|
||||||
}
|
}
|
||||||
if (model.DateOpen > DateTime.Now)
|
|
||||||
|
// Проверка на корректную дату операции
|
||||||
|
if (model.DateOpen > DateTime.Now)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Дата не может быть меньше текущего времени", nameof(model.DateOpen));
|
throw new ArgumentNullException("Дата не может быть меньше текущего времени", nameof(model.DateOpen));
|
||||||
}
|
}
|
||||||
@ -119,7 +155,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
model.Sum, model.CardId, model.DateOpen.ToString(), model.Id);
|
model.Sum, model.CardId, model.DateOpen.ToString(), model.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка карты на просроченность
|
// Проверка карты на просроченность
|
||||||
bool CheckCardPeriod(CreditingBindingModel model)
|
bool CheckCardPeriod(CreditingBindingModel model)
|
||||||
{
|
{
|
||||||
var card = _cardStorage.GetElement(new CardSearchModel
|
var card = _cardStorage.GetElement(new CardSearchModel
|
||||||
@ -127,13 +163,12 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
Id = model.CardId
|
Id = model.CardId
|
||||||
});
|
});
|
||||||
|
|
||||||
//если карта просрочена
|
// Если карта просрочена
|
||||||
if (card.Period < DateTime.Now)
|
if (card.Period < DateTime.Now)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,16 @@ using BankContracts.StoragesContracts.Client;
|
|||||||
using BankContracts.BindingModels.Client;
|
using BankContracts.BindingModels.Client;
|
||||||
using BankContracts.SearchModels.Client;
|
using BankContracts.SearchModels.Client;
|
||||||
using BankContracts.ViewModels.Client.ViewModels;
|
using BankContracts.ViewModels.Client.ViewModels;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace BankBusinessLogic.BusinessLogics.Client
|
namespace BankBusinessLogic.BusinessLogics.Client
|
||||||
{
|
{
|
||||||
public class DebitingLogic : IDebitingLogic
|
// Класс, реализующий бизнес-логику для снятия наличных с карты
|
||||||
|
public class DebitingLogic : IDebitingLogic
|
||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
@ -16,77 +22,80 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
|
|
||||||
private readonly ICardStorage _cardStorage;
|
private readonly ICardStorage _cardStorage;
|
||||||
|
|
||||||
|
// Конструктор
|
||||||
public DebitingLogic(ILogger<DebitingLogic> logger, IDebitingStorage debitingStorage, ICardStorage cardStorage) {
|
public DebitingLogic(ILogger<DebitingLogic> logger, IDebitingStorage debitingStorage, ICardStorage cardStorage) {
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_debitingStorage = debitingStorage;
|
_debitingStorage = debitingStorage;
|
||||||
_cardStorage = cardStorage;
|
_cardStorage = cardStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Create(DebitingBindingModel model)
|
// Вывод конкретной операции на снятие наличных
|
||||||
{
|
public DebitingViewModel? ReadElement(DebitingSearchModel model)
|
||||||
CheckModel(model);
|
|
||||||
|
|
||||||
if (!CheckCardPeriod(model))
|
|
||||||
{
|
|
||||||
model.Status = StatusEnum.Карта_просрочена;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
model.Status = StatusEnum.Открыта;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_debitingStorage.Insert(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Insert operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Delete(DebitingBindingModel model)
|
|
||||||
{
|
|
||||||
CheckModel(model, false);
|
|
||||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
|
||||||
if (_debitingStorage.Delete(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Delete operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DebitingViewModel? ReadElement(DebitingSearchModel model)
|
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("ReadElement. DebitingId:{ Id }", model.Id);
|
_logger.LogInformation("ReadElement. DebitingId:{ Id }", model.Id);
|
||||||
|
|
||||||
var element = _debitingStorage.GetElement(model);
|
var element = _debitingStorage.GetElement(model);
|
||||||
|
|
||||||
if (element == null)
|
if (element == null)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("ReadElement element not found");
|
_logger.LogWarning("ReadElement element not found");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
||||||
|
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<DebitingViewModel>? ReadList(DebitingSearchModel? model)
|
// Вывод всего списка операций на снятие наличных
|
||||||
|
public List<DebitingViewModel>? ReadList(DebitingSearchModel? model)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("ReadList. DebitingId:{Id}", model?.Id);
|
_logger.LogInformation("ReadList. DebitingId:{Id}", model?.Id);
|
||||||
var list = model == null ? _debitingStorage.GetFullList() : _debitingStorage.GetFilteredList(model);
|
|
||||||
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
|
var list = model == null ? _debitingStorage.GetFullList() : _debitingStorage.GetFilteredList(model);
|
||||||
|
|
||||||
if (list == null)
|
if (list == null)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("ReadList return null list");
|
_logger.LogWarning("ReadList return null list");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Update(DebitingBindingModel model)
|
// Создание операции на снятие наличных
|
||||||
|
public bool Create(DebitingBindingModel model)
|
||||||
|
{
|
||||||
|
CheckModel(model);
|
||||||
|
|
||||||
|
if (!CheckCardPeriod(model))
|
||||||
|
{
|
||||||
|
model.Status = StatusEnum.Карта_просрочена;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
model.Status = StatusEnum.Открыта;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_debitingStorage.Insert(model) == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Insert operation failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обновление операции на снятие наличных
|
||||||
|
public bool Update(DebitingBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
|
|
||||||
@ -100,21 +109,44 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckModel(DebitingBindingModel model, bool withParams = true)
|
// Удаление операции на снятие наличных
|
||||||
|
public bool Delete(DebitingBindingModel model)
|
||||||
|
{
|
||||||
|
CheckModel(model, false);
|
||||||
|
|
||||||
|
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||||
|
|
||||||
|
if (_debitingStorage.Delete(model) == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Delete operation failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||||
|
private void CheckModel(DebitingBindingModel model, bool withParams = true)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
if (!withParams)
|
|
||||||
|
// Так как при удалении передаём как параметр false
|
||||||
|
if (!withParams)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (model.Sum <= 0)
|
|
||||||
|
// Проверка на корректность снятия суммы
|
||||||
|
if (model.Sum <= 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum));
|
throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum));
|
||||||
}
|
}
|
||||||
if (model.DateClose < model.DateOpen)
|
|
||||||
|
// Проверка на корректную дату операции
|
||||||
|
if (model.DateClose < model.DateOpen)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Дата закрытия не может быть меньше даты открытия", nameof(model.DateClose));
|
throw new ArgumentNullException("Дата закрытия не может быть меньше даты открытия", nameof(model.DateClose));
|
||||||
}
|
}
|
||||||
@ -123,7 +155,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
model.Sum, model.CardId, model.DateOpen.ToString(), model.DateClose.ToString(), model.Id);
|
model.Sum, model.CardId, model.DateOpen.ToString(), model.DateClose.ToString(), model.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
//проверка карты на просроченность
|
// Проверка карты на просроченность
|
||||||
bool CheckCardPeriod(DebitingBindingModel model)
|
bool CheckCardPeriod(DebitingBindingModel model)
|
||||||
{
|
{
|
||||||
var card = _cardStorage.GetElement(new CardSearchModel
|
var card = _cardStorage.GetElement(new CardSearchModel
|
||||||
@ -131,7 +163,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
Id = model.CardId
|
Id = model.CardId
|
||||||
});
|
});
|
||||||
|
|
||||||
//если карта просрочена
|
// Если карта просрочена
|
||||||
if (card.Period < DateTime.Now)
|
if (card.Period < DateTime.Now)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -14,24 +14,26 @@ using BankDataModels.Enums;
|
|||||||
|
|
||||||
namespace BankBusinessLogic.BusinessLogics.Reports
|
namespace BankBusinessLogic.BusinessLogics.Reports
|
||||||
{
|
{
|
||||||
public class ReportCashierLogic : IReportCashierLogic
|
// Реализация бизнес-логики отчётов по кассиру
|
||||||
|
public class ReportCashierLogic : IReportCashierLogic
|
||||||
{
|
{
|
||||||
|
private readonly ICardStorage _cardStorage;
|
||||||
|
private readonly IClientStorage _clientStorage;
|
||||||
|
|
||||||
private readonly IMoneyTransferStorage _moneyTransferStorage;
|
private readonly IMoneyTransferStorage _moneyTransferStorage;
|
||||||
private readonly ICashWithdrawalStorage _cashWithdrawalStorage;
|
private readonly ICashWithdrawalStorage _cashWithdrawalStorage;
|
||||||
private readonly IClientStorage _clientStorage;
|
|
||||||
private readonly IDebitingStorage _debitingStorage;
|
private readonly IDebitingStorage _debitingStorage;
|
||||||
private readonly ICardStorage _cardStorage;
|
|
||||||
|
|
||||||
private readonly AbstractSaveToExcel _saveToExcel;
|
private readonly AbstractSaveToExcel _saveToExcel;
|
||||||
private readonly AbstractSaveToWord _saveToWord;
|
private readonly AbstractSaveToWord _saveToWord;
|
||||||
private readonly AbstractSaveToPdf _saveToPdf;
|
private readonly AbstractSaveToPdf _saveToPdf;
|
||||||
|
|
||||||
private readonly MailKitWorker _mailKitWorker;
|
private readonly MailKitWorker _mailKitWorker;
|
||||||
|
|
||||||
//инициализируем поля класса через контейнер
|
// Конструктор (Инициализируем поля класса через контейнер)
|
||||||
public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage,
|
public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage,
|
||||||
IClientStorage clientStorage, AbstractSaveToExcel saveToExcel,
|
IClientStorage clientStorage, AbstractSaveToExcel saveToExcel,
|
||||||
AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
|
AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
|
||||||
IDebitingStorage debitingStorage, ICardStorage cardStorage, MailKitWorker mailKitWorker)
|
IDebitingStorage debitingStorage, ICardStorage cardStorage, MailKitWorker mailKitWorker)
|
||||||
{
|
{
|
||||||
_moneyTransferStorage = moneyTransferStorage;
|
_moneyTransferStorage = moneyTransferStorage;
|
||||||
@ -47,10 +49,10 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
_mailKitWorker = mailKitWorker;
|
_mailKitWorker = mailKitWorker;
|
||||||
}
|
}
|
||||||
|
|
||||||
//формирование списка переводов между счетами за период
|
// Формирование списка переводов между счетами за период
|
||||||
public List<ReportCashierViewModel>? GetMoneyTransfers(ReportBindingModel model)
|
public List<ReportCashierViewModel>? GetMoneyTransfers(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo})
|
return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
|
||||||
.Select(x => new ReportCashierViewModel
|
.Select(x => new ReportCashierViewModel
|
||||||
{
|
{
|
||||||
OperationId = x.Id,
|
OperationId = x.Id,
|
||||||
@ -62,7 +64,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
//формирование списка выдаци наличных со счёта за период
|
// Формирование списка выдачи наличных со счёта за период
|
||||||
public List<ReportCashierViewModel>? GetCashWithrawals(ReportBindingModel model)
|
public List<ReportCashierViewModel>? GetCashWithrawals(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
return _cashWithdrawalStorage.GetFilteredList(new CashWithdrawalSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
|
return _cashWithdrawalStorage.GetFilteredList(new CashWithdrawalSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
|
||||||
@ -77,7 +79,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
//формирование списка выдаци наличных со счёта за период
|
// Формирование списка выдачи наличных со счёта за период
|
||||||
public List<DebitingViewModel>? GetDebitings(ReportBindingModel model)
|
public List<DebitingViewModel>? GetDebitings(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
List<int> CardIdList = new();
|
List<int> CardIdList = new();
|
||||||
@ -87,14 +89,14 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
AccountId = model.AccountId
|
AccountId = model.AccountId
|
||||||
});
|
});
|
||||||
|
|
||||||
foreach(var index in list)
|
foreach (var index in list)
|
||||||
{
|
{
|
||||||
CardIdList.Add(index.Id);
|
CardIdList.Add(index.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<DebitingViewModel> totalList = new();
|
List<DebitingViewModel> totalList = new();
|
||||||
|
|
||||||
foreach(var index in CardIdList)
|
foreach (var index in CardIdList)
|
||||||
{
|
{
|
||||||
var result = _debitingStorage.GetFilteredList(new DebitingSearchModel
|
var result = _debitingStorage.GetFilteredList(new DebitingSearchModel
|
||||||
{
|
{
|
||||||
@ -102,12 +104,12 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
});
|
});
|
||||||
|
|
||||||
totalList.AddRange(result);
|
totalList.AddRange(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return totalList;
|
return totalList;
|
||||||
}
|
}
|
||||||
|
|
||||||
//формирование полного имени клиента для отчёта
|
// Формирование полного имени клиента для отчёта
|
||||||
public string GetFullName(ReportBindingModel model)
|
public string GetFullName(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
var client = _clientStorage.GetElement(new ClientSearchModel
|
var client = _clientStorage.GetElement(new ClientSearchModel
|
||||||
@ -118,8 +120,8 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
return client.Surname + " " + client.Name + " " + client.Patronymic;
|
return client.Surname + " " + client.Name + " " + client.Patronymic;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Сохранение мороженных в файл-Word
|
// Сохранение банковских счетов в файл-Word
|
||||||
public void SaveAccountsToWordFile(ReportBindingModel model)
|
public void SaveAccountsToWordFile(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
_saveToWord.CreateDoc(new WordInfo
|
_saveToWord.CreateDoc(new WordInfo
|
||||||
{
|
{
|
||||||
@ -130,9 +132,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
Debiting = GetDebitings(model)
|
Debiting = GetDebitings(model)
|
||||||
}, OfficeOperationEnum.Для_кассира);
|
}, OfficeOperationEnum.Для_кассира);
|
||||||
|
|
||||||
byte[] word = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по зявкам на снятие.docx");
|
byte[] word = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по заявкам на снятие.docx");
|
||||||
|
|
||||||
File.Delete("../BankRestAPI/Отчёт по зявкам на снятие.docx");
|
File.Delete("../BankRestAPI/Отчёт по заявкам на снятие.docx");
|
||||||
|
|
||||||
_mailKitWorker.SendMailAsync(new()
|
_mailKitWorker.SendMailAsync(new()
|
||||||
{
|
{
|
||||||
@ -145,7 +147,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//Сохранение заготовок с указаеним изделий в файл-Excel
|
// Сохранение банковских счетов с указаением операций по ним в файл-Excel
|
||||||
public void SaveAccountsToExcelFile(ReportBindingModel model)
|
public void SaveAccountsToExcelFile(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
_saveToExcel.CreateReport(new ExcelInfo
|
_saveToExcel.CreateReport(new ExcelInfo
|
||||||
@ -157,9 +159,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
Debiting = GetDebitings(model)
|
Debiting = GetDebitings(model)
|
||||||
}, OfficeOperationEnum.Для_кассира);
|
}, OfficeOperationEnum.Для_кассира);
|
||||||
|
|
||||||
byte[] excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по зявкам на снятие.xlsx");
|
byte[] excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по заявкам на снятие.xlsx");
|
||||||
|
|
||||||
File.Delete("../BankRestAPI/Отчёт по зявкам на снятие.xlsx");
|
File.Delete("../BankRestAPI/Отчёт по заявкам на снятие.xlsx");
|
||||||
|
|
||||||
_mailKitWorker.SendMailAsync(new()
|
_mailKitWorker.SendMailAsync(new()
|
||||||
{
|
{
|
||||||
@ -172,7 +174,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//Сохранение заказов в файл-Pdf
|
// Сохранение Банковских счетов с переводами по ним в файл-Pdf
|
||||||
public ReportCashierViewModelForHTML SaveAccountsToPdfFile(ReportBindingModel model)
|
public ReportCashierViewModelForHTML SaveAccountsToPdfFile(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
var listMoneyTransfers = GetMoneyTransfers(model);
|
var listMoneyTransfers = GetMoneyTransfers(model);
|
||||||
@ -190,23 +192,23 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
ReportCashWithdrawal = listCashWithdrawals
|
ReportCashWithdrawal = listCashWithdrawals
|
||||||
});
|
});
|
||||||
|
|
||||||
byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_счетам.pdf");
|
byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_счетам.pdf");
|
||||||
|
|
||||||
File.Delete("../BankRestAPI/Отчёт_по_счетам.pdf");
|
File.Delete("../BankRestAPI/Отчёт_по_счетам.pdf");
|
||||||
|
|
||||||
_mailKitWorker.SendMailAsync(new()
|
_mailKitWorker.SendMailAsync(new()
|
||||||
{
|
{
|
||||||
MailAddress = model.Email,
|
MailAddress = model.Email,
|
||||||
Subject = "Отчёт по счетам",
|
Subject = "Отчёт по счетам",
|
||||||
Text = $"За период с {model.DateFrom} " +
|
Text = $"За период с {model.DateFrom} " +
|
||||||
$"по {model.DateTo}.",
|
$"по {model.DateTo}.",
|
||||||
File = pdf,
|
File = pdf,
|
||||||
Role = model.Role,
|
Role = model.Role,
|
||||||
TypeDoc = TypeDocEnum.PDF
|
TypeDoc = TypeDocEnum.PDF
|
||||||
});
|
});
|
||||||
|
|
||||||
//возврат полученных списков для отображения на вебе
|
// Возврат полученных списков для отображения на вебе
|
||||||
return new ReportCashierViewModelForHTML
|
return new ReportCashierViewModelForHTML
|
||||||
{
|
{
|
||||||
ReportCashWithdrawal = listCashWithdrawals,
|
ReportCashWithdrawal = listCashWithdrawals,
|
||||||
|
|
||||||
|
@ -12,103 +12,112 @@ using BankContracts.ViewModels.Cashier.ViewModels;
|
|||||||
using BankContracts.SearchModels.Cashier;
|
using BankContracts.SearchModels.Cashier;
|
||||||
using BankContracts.ViewModels.Client.ViewModels;
|
using BankContracts.ViewModels.Client.ViewModels;
|
||||||
using BankContracts.ViewModels.Reports;
|
using BankContracts.ViewModels.Reports;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace BankBusinessLogic.BusinessLogics.Reports
|
namespace BankBusinessLogic.BusinessLogics.Reports
|
||||||
{
|
{
|
||||||
public class ReportClientLogic : IReportClientLogic
|
// Реализация бизнес-логики отчётов по клиенту
|
||||||
{
|
public class ReportClientLogic : IReportClientLogic
|
||||||
private readonly ICreditingStorage _creditingStorage;
|
{
|
||||||
private readonly IDebitingStorage _debitingStorage;
|
private readonly ICardStorage _cardStorage;
|
||||||
private readonly ICardStorage _cardStorage;
|
private readonly IClientStorage _clientStorage;
|
||||||
private readonly IMoneyTransferStorage _moneyTransferStorage;
|
|
||||||
private readonly IClientStorage _clientStorage;
|
|
||||||
|
|
||||||
private readonly AbstractSaveToExcel _saveToExcel;
|
private readonly ICreditingStorage _creditingStorage;
|
||||||
private readonly AbstractSaveToWord _saveToWord;
|
private readonly IDebitingStorage _debitingStorage;
|
||||||
private readonly AbstractSaveToPdf _saveToPdf;
|
private readonly IMoneyTransferStorage _moneyTransferStorage;
|
||||||
|
|
||||||
private readonly MailKitWorker _mailKitWorker;
|
private readonly AbstractSaveToExcel _saveToExcel;
|
||||||
|
private readonly AbstractSaveToWord _saveToWord;
|
||||||
|
private readonly AbstractSaveToPdf _saveToPdf;
|
||||||
|
|
||||||
public ReportClientLogic(ICreditingStorage creditingStorage, IDebitingStorage debitingStorage,
|
private readonly MailKitWorker _mailKitWorker;
|
||||||
AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
|
|
||||||
ICardStorage cardStorage, IMoneyTransferStorage moneyTransferStorage,
|
|
||||||
MailKitWorker mailKitWorker, IClientStorage clientStorage)
|
|
||||||
{
|
|
||||||
_creditingStorage = creditingStorage;
|
|
||||||
_debitingStorage = debitingStorage;
|
|
||||||
_cardStorage = cardStorage;
|
|
||||||
_moneyTransferStorage = moneyTransferStorage;
|
|
||||||
_clientStorage = clientStorage;
|
|
||||||
|
|
||||||
_saveToExcel = saveToExcel;
|
public ReportClientLogic(ICreditingStorage creditingStorage, IDebitingStorage debitingStorage,
|
||||||
_saveToWord = saveToWord;
|
AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
|
||||||
_saveToPdf = saveToPdf;
|
ICardStorage cardStorage, IMoneyTransferStorage moneyTransferStorage,
|
||||||
|
MailKitWorker mailKitWorker, IClientStorage clientStorage)
|
||||||
|
{
|
||||||
|
_creditingStorage = creditingStorage;
|
||||||
|
_debitingStorage = debitingStorage;
|
||||||
|
_cardStorage = cardStorage;
|
||||||
|
_moneyTransferStorage = moneyTransferStorage;
|
||||||
|
_clientStorage = clientStorage;
|
||||||
|
|
||||||
|
_saveToExcel = saveToExcel;
|
||||||
|
_saveToWord = saveToWord;
|
||||||
|
_saveToPdf = saveToPdf;
|
||||||
|
|
||||||
_mailKitWorker = mailKitWorker;
|
_mailKitWorker = mailKitWorker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ReportClientViewModel>? GetCrediting(ReportBindingModel model)
|
// Информация о пополнениях для отчёта
|
||||||
{
|
public List<ReportClientViewModel>? GetCrediting(ReportBindingModel model)
|
||||||
return _creditingStorage.GetFilteredList(new CreditingSearchModel
|
{
|
||||||
{
|
return _creditingStorage.GetFilteredList(new CreditingSearchModel
|
||||||
DateFrom = model.DateFrom,
|
{
|
||||||
DateTo = model.DateTo,
|
DateFrom = model.DateFrom,
|
||||||
}).Select(x => new ReportClientViewModel
|
DateTo = model.DateTo,
|
||||||
{
|
}).Select(x => new ReportClientViewModel
|
||||||
OperationId = x.Id,
|
{
|
||||||
|
OperationId = x.Id,
|
||||||
CardNumber = x.CardNumber,
|
CardNumber = x.CardNumber,
|
||||||
SumOperation = x.Sum,
|
SumOperation = x.Sum,
|
||||||
DateComplite = x.DateOpen
|
DateComplite = x.DateOpen
|
||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ReportClientViewModel>? GetDebiting(ReportBindingModel model)
|
// Информация о снятиях для отчёта
|
||||||
{
|
public List<ReportClientViewModel>? GetDebiting(ReportBindingModel model)
|
||||||
return _debitingStorage.GetFilteredList(new DebitingSearchModel
|
{
|
||||||
{
|
return _debitingStorage.GetFilteredList(new DebitingSearchModel
|
||||||
DateTo = model.DateFrom,
|
{
|
||||||
DateFrom = model.DateTo,
|
DateTo = model.DateFrom,
|
||||||
}).Select(x => new ReportClientViewModel
|
DateFrom = model.DateTo,
|
||||||
{
|
}).Select(x => new ReportClientViewModel
|
||||||
OperationId = x.Id,
|
{
|
||||||
CardNumber = x.CardNumber,
|
OperationId = x.Id,
|
||||||
SumOperation = x.Sum,
|
CardNumber = x.CardNumber,
|
||||||
DateComplite = x.DateClose
|
SumOperation = x.Sum,
|
||||||
}).ToList();
|
DateComplite = x.DateClose
|
||||||
}
|
}).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
//для excel отчёта по переводам между счетов
|
// Для Excel отчёта по переводам между счетов
|
||||||
public List<MoneyTransferViewModel>? GetMoneyTransfer(ReportBindingModel model)
|
public List<MoneyTransferViewModel>? GetMoneyTransfer(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
//список счетов по выбранным картам
|
// Список счетов по выбранным картам
|
||||||
List<int> accountId = new();
|
List<int> accountId = new();
|
||||||
|
|
||||||
foreach(var index in model.CardList)
|
foreach (var index in model.CardList)
|
||||||
{
|
{
|
||||||
accountId.Add(_cardStorage.GetElement(new CardSearchModel { Id = index}).AccountId);
|
accountId.Add(_cardStorage.GetElement(new CardSearchModel { Id = index }).AccountId);
|
||||||
}
|
}
|
||||||
|
|
||||||
var list = accountId.ToHashSet().ToList();
|
var list = accountId.ToHashSet().ToList();
|
||||||
|
|
||||||
List<MoneyTransferViewModel> totalList = new();
|
List<MoneyTransferViewModel> totalList = new();
|
||||||
|
|
||||||
foreach (var index in list)
|
foreach (var index in list)
|
||||||
{
|
{
|
||||||
var result = _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel
|
var result = _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel
|
||||||
{
|
{
|
||||||
AccountSenderId = index,
|
AccountSenderId = index,
|
||||||
AccountPayeeId = index
|
AccountPayeeId = index
|
||||||
}).OrderBy(x => x.AccountSenderId).ToList();
|
}).OrderBy(x => x.AccountSenderId).ToList();
|
||||||
|
|
||||||
totalList.AddRange(result);
|
totalList.AddRange(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return totalList;
|
return totalList;
|
||||||
}
|
}
|
||||||
|
|
||||||
//для excel отчёта по пополнениям карты
|
// Для Excel отчёта по пополнениям карты
|
||||||
public List<CreditingViewModel> GetExcelCrediting(ReportBindingModel model)
|
public List<CreditingViewModel> GetExcelCrediting(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
List<CreditingViewModel> totalList = new();
|
List<CreditingViewModel> totalList = new();
|
||||||
|
|
||||||
foreach (var index in model.CardList)
|
foreach (var index in model.CardList)
|
||||||
@ -124,7 +133,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
return totalList;
|
return totalList;
|
||||||
}
|
}
|
||||||
|
|
||||||
//для excel отчёта по снятиям с карты
|
// Для Excel отчёта по снятиям с карты
|
||||||
public List<DebitingViewModel> GetExcelDebiting(ReportBindingModel model)
|
public List<DebitingViewModel> GetExcelDebiting(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
List<DebitingViewModel> totalList = new();
|
List<DebitingViewModel> totalList = new();
|
||||||
@ -142,16 +151,17 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
return totalList;
|
return totalList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
// Сохранение в файл-Excel для клиентов
|
||||||
{
|
public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
||||||
|
{
|
||||||
byte[] excel = Array.Empty<byte>();
|
byte[] excel = Array.Empty<byte>();
|
||||||
|
|
||||||
if (operationEnum == OfficeOperationEnum.Между_cчетами)
|
if (operationEnum == OfficeOperationEnum.Между_cчетами)
|
||||||
{
|
{
|
||||||
_saveToExcel.CreateReport(new ExcelInfo
|
_saveToExcel.CreateReport(new ExcelInfo
|
||||||
{
|
{
|
||||||
FileName = model.FileName,
|
FileName = model.FileName,
|
||||||
Title = "Отчёт по переводам",
|
Title = "Отчёт по переводам",
|
||||||
MoneyTransfer = GetMoneyTransfer(model)
|
MoneyTransfer = GetMoneyTransfer(model)
|
||||||
}, operationEnum);
|
}, operationEnum);
|
||||||
|
|
||||||
@ -162,12 +172,12 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
|
|
||||||
if (operationEnum == OfficeOperationEnum.Пополнение_карт)
|
if (operationEnum == OfficeOperationEnum.Пополнение_карт)
|
||||||
{
|
{
|
||||||
_saveToExcel.CreateReport(new ExcelInfo
|
_saveToExcel.CreateReport(new ExcelInfo
|
||||||
{
|
{
|
||||||
FileName = model.FileName,
|
FileName = model.FileName,
|
||||||
Title = "Отчёт по пополнениям (переводам из налички на карту)",
|
Title = "Отчёт по пополнениям (переводам из налички на карту)",
|
||||||
Crediting = GetExcelCrediting(model)
|
Crediting = GetExcelCrediting(model)
|
||||||
}, operationEnum);
|
}, operationEnum);
|
||||||
|
|
||||||
excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по пополнениям.xlsx");
|
excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по пополнениям.xlsx");
|
||||||
|
|
||||||
@ -199,8 +209,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
// Сохранение в файл-Word для клиентов
|
||||||
{
|
public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
||||||
|
{
|
||||||
byte[] word = Array.Empty<byte>();
|
byte[] word = Array.Empty<byte>();
|
||||||
|
|
||||||
if (operationEnum == OfficeOperationEnum.Между_cчетами)
|
if (operationEnum == OfficeOperationEnum.Между_cчетами)
|
||||||
@ -256,11 +267,11 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//отчёт в формате PDF для клиента
|
// Сохранение в файл-Pdf для клиента
|
||||||
public ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model)
|
public ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
var listCreditings = GetCrediting(model);
|
var listCreditings = GetCrediting(model);
|
||||||
var listDebitings = GetDebiting(model);
|
var listDebitings = GetDebiting(model);
|
||||||
|
|
||||||
_saveToPdf.CreateDoc(new PdfInfo
|
_saveToPdf.CreateDoc(new PdfInfo
|
||||||
{
|
{
|
||||||
@ -269,31 +280,31 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
DateFrom = model.DateFrom!.Value,
|
DateFrom = model.DateFrom!.Value,
|
||||||
DateTo = model.DateTo!.Value,
|
DateTo = model.DateTo!.Value,
|
||||||
ReportCrediting = listCreditings,
|
ReportCrediting = listCreditings,
|
||||||
ReportDebiting = listDebitings
|
ReportDebiting = listDebitings
|
||||||
});
|
});
|
||||||
|
|
||||||
byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_картам.pdf");
|
byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_картам.pdf");
|
||||||
|
|
||||||
_mailKitWorker.SendMailAsync(new()
|
_mailKitWorker.SendMailAsync(new()
|
||||||
{
|
{
|
||||||
MailAddress = model.Email,
|
MailAddress = model.Email,
|
||||||
Subject = "Отчёт по картам",
|
Subject = "Отчёт по картам",
|
||||||
Text = $"За период с {model.DateFrom} " +
|
Text = $"За период с {model.DateFrom} " +
|
||||||
$"по {model.DateTo}.",
|
$"по {model.DateTo}.",
|
||||||
File = pdf,
|
File = pdf,
|
||||||
Role = model.Role,
|
Role = model.Role,
|
||||||
TypeDoc = TypeDocEnum.PDF
|
TypeDoc = TypeDocEnum.PDF
|
||||||
});
|
});
|
||||||
|
|
||||||
File.Delete("../BankRestAPI/Отчёт_по_картам.pdf");
|
File.Delete("../BankRestAPI/Отчёт_по_картам.pdf");
|
||||||
|
|
||||||
//возврат полученных списков для отображения на вебе
|
// Возврат полученных списков для отображения на вебе
|
||||||
return new ReportClientViewModelForHTML
|
return new ReportClientViewModelForHTML
|
||||||
{
|
{
|
||||||
ReportCrediting = listCreditings,
|
ReportCrediting = listCreditings,
|
||||||
|
|
||||||
ReportDebiting = listDebitings
|
ReportDebiting = listDebitings
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ using BankContracts.BindingModels.Messages;
|
|||||||
|
|
||||||
namespace BankBusinessLogic.MailWorker
|
namespace BankBusinessLogic.MailWorker
|
||||||
{
|
{
|
||||||
//класс, отвечающий за отправку письма
|
// Класс, отвечающий за отправку письма на почту
|
||||||
public class MailKitWorker
|
public class MailKitWorker
|
||||||
{
|
{
|
||||||
private string _mailLogin = string.Empty;
|
private string _mailLogin = string.Empty;
|
||||||
@ -29,7 +29,8 @@ namespace BankBusinessLogic.MailWorker
|
|||||||
|
|
||||||
private readonly ILogger logger;
|
private readonly ILogger logger;
|
||||||
|
|
||||||
public MailKitWorker(ILogger<MailKitWorker> logger)
|
// Конструктор
|
||||||
|
public MailKitWorker(ILogger<MailKitWorker> logger)
|
||||||
{
|
{
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
}
|
}
|
||||||
@ -58,9 +59,9 @@ namespace BankBusinessLogic.MailWorker
|
|||||||
|
|
||||||
MemoryStream ms = new(info.File);
|
MemoryStream ms = new(info.File);
|
||||||
|
|
||||||
if(info.Role == MailsEnum.Клиент)
|
if (info.Role == MailsEnum.Клиент)
|
||||||
{
|
{
|
||||||
if(info.TypeDoc == TypeDocEnum.PDF)
|
if (info.TypeDoc == TypeDocEnum.PDF)
|
||||||
{
|
{
|
||||||
objMailMessage.Attachments.Add(new Attachment(ms, "Отчёт_для_клиента.pdf", "application/pdf"));
|
objMailMessage.Attachments.Add(new Attachment(ms, "Отчёт_для_клиента.pdf", "application/pdf"));
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ namespace BankСlientApp
|
|||||||
ErrorMessage = error;
|
ErrorMessage = error;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Get-запрос
|
// Get-запрос
|
||||||
public static T? GetRequest<T>(string requestUrl)
|
public static T? GetRequest<T>(string requestUrl)
|
||||||
{
|
{
|
||||||
var response = _client.GetAsync(requestUrl);
|
var response = _client.GetAsync(requestUrl);
|
||||||
@ -42,7 +42,7 @@ namespace BankСlientApp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Post-запрос
|
// Post-запрос
|
||||||
public static void PostRequest<T>(string requestUrl, T model)
|
public static void PostRequest<T>(string requestUrl, T model)
|
||||||
{
|
{
|
||||||
var json = JsonConvert.SerializeObject(model);
|
var json = JsonConvert.SerializeObject(model);
|
||||||
@ -58,7 +58,7 @@ namespace BankСlientApp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Post-запрос для получения данных
|
// Post-запрос для получения данных
|
||||||
public static T? PostRequestReport<T, U>(string requestUrl, U model)
|
public static T? PostRequestReport<T, U>(string requestUrl, U model)
|
||||||
{
|
{
|
||||||
var json = JsonConvert.SerializeObject(model);
|
var json = JsonConvert.SerializeObject(model);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<h1 class="display-4">Карты</h1>
|
<h1 class="display-4">Банковские карты</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
ViewData["Title"] = "Создание карты";
|
ViewData["Title"] = "Создание карты";
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="text-center">
|
<div class="text-center mb-2">
|
||||||
<h2 class="display-4">Создание карты</h2>
|
<h2 class="display-4">Создание банковской карты</h2>
|
||||||
</div>
|
</div>
|
||||||
<form method="post">
|
<form method="post">
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
@ -30,7 +30,7 @@
|
|||||||
<input type="date" class="form-control" name="period" id="period" required />
|
<input type="date" class="form-control" name="period" id="period" required />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-2">
|
<div class="row mb-2 mt-2">
|
||||||
<input type="submit" value="Создание" style="width: 100%" class="btn btn-warning" />
|
<input type="submit" value="Создание" style="width: 100%" class="btn btn-warning" />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -7,9 +7,10 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace BankDataModels.Models.Cashier
|
namespace BankDataModels.Models.Cashier
|
||||||
{
|
{
|
||||||
//банковский счёт
|
// Интерфейс, отвечающий за банковский cчёт
|
||||||
public interface IAccountModel : IId
|
public interface IAccountModel : IId
|
||||||
{
|
{
|
||||||
|
// Номер счёта
|
||||||
string AccountNumber { get; }
|
string AccountNumber { get; }
|
||||||
|
|
||||||
int CashierId { get; }
|
int CashierId { get; }
|
||||||
@ -18,8 +19,10 @@ namespace BankDataModels.Models.Cashier
|
|||||||
|
|
||||||
string PasswordAccount { get; }
|
string PasswordAccount { get; }
|
||||||
|
|
||||||
|
// Сумма на счёте
|
||||||
double Balance { get; }
|
double Balance { get; }
|
||||||
|
|
||||||
|
// Дата открытия
|
||||||
DateTime DateOpen { get; }
|
DateTime DateOpen { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace BankDataModels.Models.Cashier
|
namespace BankDataModels.Models.Cashier
|
||||||
{
|
{
|
||||||
//выдача наличных
|
// Интерфейс, отвечающий за выдачу наличных
|
||||||
public interface ICashWithdrawalModel : IId
|
public interface ICashWithdrawalModel : IId
|
||||||
{
|
{
|
||||||
int DebitingId { get; }
|
int DebitingId { get; }
|
||||||
@ -15,8 +15,10 @@ namespace BankDataModels.Models.Cashier
|
|||||||
|
|
||||||
int CashierId { get; }
|
int CashierId { get; }
|
||||||
|
|
||||||
|
// Сумма наличисления наличных
|
||||||
int Sum { get; }
|
int Sum { get; }
|
||||||
|
|
||||||
|
// Дата выдачи наличных
|
||||||
DateTime DateOperation { get; }
|
DateTime DateOperation { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,19 +6,25 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace BankDataModels.Models.Cashier
|
namespace BankDataModels.Models.Cashier
|
||||||
{
|
{
|
||||||
//клиент
|
// Интерфейс, отвечающий за кассира
|
||||||
public interface ICashierModel : IId
|
public interface ICashierModel : IId
|
||||||
{
|
{
|
||||||
|
// Пароль от аккаунта кассира
|
||||||
string Password { get; }
|
string Password { get; }
|
||||||
|
|
||||||
|
// Имя кассира
|
||||||
string Name { get; }
|
string Name { get; }
|
||||||
|
|
||||||
|
// Фамилия кассира
|
||||||
string Surname { get; }
|
string Surname { get; }
|
||||||
|
|
||||||
|
// Отчество кассира
|
||||||
string Patronymic { get; }
|
string Patronymic { get; }
|
||||||
|
|
||||||
|
// Отчество кассира
|
||||||
string Email { get; }
|
string Email { get; }
|
||||||
|
|
||||||
|
// Мобильный телефон кассира
|
||||||
string Telephone { get; }
|
string Telephone { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,15 +6,17 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace BankDataModels.Models.Cashier
|
namespace BankDataModels.Models.Cashier
|
||||||
{
|
{
|
||||||
//перевод денег
|
// Интерфейс, отвечающий за перевод денег
|
||||||
public interface IMoneyTransferModel : IId
|
public interface IMoneyTransferModel : IId
|
||||||
{
|
{
|
||||||
|
// Сумма перевода
|
||||||
int Sum { get; }
|
int Sum { get; }
|
||||||
|
|
||||||
int? AccountSenderId { get; }
|
int? AccountSenderId { get; }
|
||||||
|
|
||||||
int AccountPayeeId { get; }
|
int AccountPayeeId { get; }
|
||||||
|
|
||||||
|
// Дата перевода
|
||||||
DateTime DateOperation { get; }
|
DateTime DateOperation { get; }
|
||||||
|
|
||||||
int? CreditingId { get; }
|
int? CreditingId { get; }
|
||||||
|
@ -7,17 +7,21 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace BankDataModels.Models.Client
|
namespace BankDataModels.Models.Client
|
||||||
{
|
{
|
||||||
//пополнение карты
|
// Интерфейс, отвечающий за пополнение карты
|
||||||
public interface ICreditingModel : IId
|
public interface ICreditingModel : IId
|
||||||
{
|
{
|
||||||
int CardId { get; }
|
int CardId { get; }
|
||||||
|
|
||||||
|
// Сумма на пополнение карты
|
||||||
int Sum { get; }
|
int Sum { get; }
|
||||||
|
|
||||||
|
// Дата открытия заявки на пополнение
|
||||||
DateTime DateOpen { get; }
|
DateTime DateOpen { get; }
|
||||||
|
|
||||||
DateTime? DateClose { get; }
|
// Дата пополнения карты
|
||||||
|
DateTime? DateClose { get; }
|
||||||
|
|
||||||
|
// Статус заявки
|
||||||
StatusEnum Status { get; }
|
StatusEnum Status { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,17 +7,21 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace BankDataModels.Models.Client
|
namespace BankDataModels.Models.Client
|
||||||
{
|
{
|
||||||
//снятие денег с карты
|
// Интерфейс, отвечающий за получение наличных по карте
|
||||||
public interface IDebitingModel : IId
|
public interface IDebitingModel : IId
|
||||||
{
|
{
|
||||||
int CardId { get; }
|
int CardId { get; }
|
||||||
|
|
||||||
int Sum { get; }
|
// Сумма снятия с карты
|
||||||
|
int Sum { get; }
|
||||||
|
|
||||||
|
// Дата открытия заявки
|
||||||
DateTime DateOpen { get; }
|
DateTime DateOpen { get; }
|
||||||
|
|
||||||
|
// Дата снятия денег
|
||||||
DateTime? DateClose { get; }
|
DateTime? DateClose { get; }
|
||||||
|
|
||||||
|
// Статус заявки
|
||||||
StatusEnum Status { get; }
|
StatusEnum Status { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,17 +6,20 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace BankDataModels.Models.Client
|
namespace BankDataModels.Models.Client
|
||||||
{
|
{
|
||||||
//банковская карта
|
// Интерфейс, отвечающий за банковскую карту
|
||||||
public interface ICardModel : IId
|
public interface ICardModel : IId
|
||||||
{
|
{
|
||||||
int ClientID { get; }
|
int ClientID { get; }
|
||||||
|
|
||||||
int AccountId { get; }
|
int AccountId { get; }
|
||||||
|
|
||||||
|
// Номер банковской карты
|
||||||
string Number { get; }
|
string Number { get; }
|
||||||
|
|
||||||
|
// Код CVC
|
||||||
string CVC { get; }
|
string CVC { get; }
|
||||||
|
|
||||||
|
// Период пользования картой
|
||||||
DateTime Period { get; }
|
DateTime Period { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,19 +6,25 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace BankDataModels.Models.Client
|
namespace BankDataModels.Models.Client
|
||||||
{
|
{
|
||||||
//клиент
|
// Интерфейс, отвечающий за клиента
|
||||||
public interface IClientModel : IId
|
public interface IClientModel : IId
|
||||||
{
|
{
|
||||||
|
// Пароль от аккаунта клиента
|
||||||
string Password { get; }
|
string Password { get; }
|
||||||
|
|
||||||
|
// Имя клиента
|
||||||
string Name { get; }
|
string Name { get; }
|
||||||
|
|
||||||
|
// Фамилия клиента
|
||||||
string Surname { get; }
|
string Surname { get; }
|
||||||
|
|
||||||
|
// Отчество клиента
|
||||||
string Patronymic { get; }
|
string Patronymic { get; }
|
||||||
|
|
||||||
|
// Электронная почта клиента
|
||||||
string Email { get; }
|
string Email { get; }
|
||||||
|
|
||||||
|
// Мобильный телефон клиента
|
||||||
string Telephone { get; }
|
string Telephone { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace BankDataModels.Models
|
namespace BankDataModels.Models
|
||||||
{
|
{
|
||||||
|
// Интерфейс, отвечающий за сообщения (на почту)
|
||||||
public interface IMessageInfoModel : IId
|
public interface IMessageInfoModel : IId
|
||||||
{
|
{
|
||||||
string MessageId { get; }
|
string MessageId { get; }
|
||||||
|
Loading…
Reference in New Issue
Block a user