Подправил Html и комментики
This commit is contained in:
parent
0f70b85ca6
commit
2791d89c9d
@ -9,6 +9,10 @@
|
|||||||
<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.EntityFrameworkCore.Design" Version="7.0.18">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
|
||||||
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
|
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -6,9 +6,15 @@ 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,9 +57,10 @@ 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);
|
||||||
@ -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);
|
||||||
@ -173,7 +185,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
|||||||
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)
|
||||||
@ -181,41 +193,42 @@ 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.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,9 +7,15 @@ 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,6 +58,7 @@ 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}",
|
||||||
@ -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)
|
||||||
@ -43,6 +52,7 @@ 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}",
|
||||||
@ -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,9 +7,15 @@ 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,6 +57,7 @@ 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}",
|
||||||
@ -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,37 +8,110 @@ 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 ILogger _logger;
|
||||||
|
|
||||||
private readonly ICardStorage _cardStorage;
|
private readonly ICardStorage _cardStorage;
|
||||||
|
|
||||||
private readonly IAccountLogic _accountLogic;
|
private readonly IAccountLogic _accountLogic;
|
||||||
|
|
||||||
private readonly IDebitingLogic _debitingLogic;
|
private readonly IDebitingLogic _debitingLogic;
|
||||||
|
|
||||||
private readonly ICreditingLogic _creditingLogic;
|
private readonly ICreditingLogic _creditingLogic;
|
||||||
|
|
||||||
|
// Конструктор
|
||||||
public CardLogic(ILogger<CardLogic> logger, ICardStorage cardStorage, IAccountLogic accountLogic,
|
public CardLogic(ILogger<CardLogic> logger, ICardStorage cardStorage, IAccountLogic accountLogic,
|
||||||
IDebitingLogic debitingLogic, ICreditingLogic creditingLogic) {
|
IDebitingLogic debitingLogic, ICreditingLogic creditingLogic)
|
||||||
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
|
||||||
_cardStorage = cardStorage;
|
_cardStorage = cardStorage;
|
||||||
_accountLogic = accountLogic;
|
_accountLogic = accountLogic;
|
||||||
_debitingLogic = debitingLogic;
|
_debitingLogic = debitingLogic;
|
||||||
_creditingLogic = creditingLogic;
|
_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)
|
if (_cardStorage.Insert(model) == null)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Insert operation failed");
|
_logger.LogWarning("Insert operation failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Обновление банковской карты
|
||||||
|
public bool Update(CardBindingModel model)
|
||||||
|
{
|
||||||
|
CheckModel(model);
|
||||||
|
|
||||||
|
if (_cardStorage.Update(model) == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Update operation failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Удаление банковской карты
|
||||||
public bool Delete(CardBindingModel model)
|
public bool Delete(CardBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model, false);
|
CheckModel(model, false);
|
||||||
@ -51,55 +124,16 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CardViewModel? ReadElement(CardSearchModel model)
|
// Бизнес-логика для диаграмм, для получения информации по месяцам
|
||||||
|
public List<ClientDiagramElementsViewModel> GetMonthInfo(int CardId)
|
||||||
{
|
{
|
||||||
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);
|
|
||||||
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 Update(CardBindingModel model)
|
|
||||||
{
|
|
||||||
CheckModel(model);
|
|
||||||
if (_cardStorage.Update(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Update operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ClientDiagramElementsViewModel> GetMonthInfo(int CardId) {
|
|
||||||
|
|
||||||
Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel()
|
Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel()
|
||||||
{
|
{
|
||||||
CardId = CardId,
|
CardId = CardId,
|
||||||
Status = StatusEnum.Закрыта
|
Status = StatusEnum.Закрыта
|
||||||
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
|
}).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));
|
.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> creditings = _creditingLogic.ReadList(new CreditingSearchModel()
|
Dictionary<(int?, int?), int> creditings = _creditingLogic.ReadList(new CreditingSearchModel()
|
||||||
{
|
{
|
||||||
CardId = CardId,
|
CardId = CardId,
|
||||||
@ -108,42 +142,63 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
.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<ClientDiagramElementsViewModel> result = new();
|
List<ClientDiagramElementsViewModel> result = new();
|
||||||
foreach (var key in debitings.Keys.Union(creditings.Keys).OrderBy(x => x.Item1 * 12 + x.Item2)) {
|
|
||||||
|
foreach (var key in debitings.Keys.Union(creditings.Keys).OrderBy(x => x.Item1 * 12 + x.Item2))
|
||||||
|
{
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key);
|
if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key);
|
||||||
if (creditings.ContainsKey(key)) sum += creditings.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 });
|
result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum });
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||||
private void CheckModel(CardBindingModel model, bool withParams = true)
|
private void CheckModel(CardBindingModel model, bool withParams = true)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Так как при удалении передаём как параметр false
|
||||||
if (!withParams)
|
if (!withParams)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие номера у банковской карты
|
||||||
if (string.IsNullOrEmpty(model.Number) || model.Number.Length != 16)
|
if (string.IsNullOrEmpty(model.Number) || model.Number.Length != 16)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Неправильный номер карты", nameof(model.Number));
|
throw new ArgumentNullException("Неправильный номер карты", nameof(model.Number));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие CVC кода у банковской карты
|
||||||
if (string.IsNullOrEmpty(model.CVC) || model.CVC.Length != 3)
|
if (string.IsNullOrEmpty(model.CVC) || model.CVC.Length != 3)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Неправильный СVC карты", nameof(model.CVC));
|
throw new ArgumentNullException("Неправильный СVC карты", nameof(model.CVC));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Проверка на конкретный период действия карты
|
||||||
if (model.Period < DateTime.Now)
|
if (model.Period < DateTime.Now)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Нет периода действия", nameof(model.Period));
|
throw new ArgumentNullException("Нет периода действия", nameof(model.Period));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие id клиента, получившего карту (лишним не будет)
|
||||||
|
if (model.ClientID < 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("Некорректный Id клиента, открывшего счёт", nameof(model.ClientID));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Для проверка на наличие такой же банковской карты
|
||||||
var cardElement = _cardStorage.GetElement(new CardSearchModel
|
var cardElement = _cardStorage.GetElement(new CardSearchModel
|
||||||
{
|
{
|
||||||
Number = model.Number,
|
Number = model.Number,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Если элемент найден и его Id не совпадает с Id переданного объекта
|
||||||
if (cardElement != null && cardElement.Id != model.Id)
|
if (cardElement != null && cardElement.Id != model.Id)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("Карта с таким ноиером уже есть");
|
throw new InvalidOperationException("Карта с таким ноиером уже есть");
|
||||||
@ -155,6 +210,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
ClientId = model.ClientID
|
ClientId = model.ClientID
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Проверка привязан ли счёт к данному клиенту
|
||||||
if (accountElement != null && accountElement.ClientId != model.ClientID)
|
if (accountElement != null && accountElement.ClientId != model.ClientID)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("Это не счёт данного клиента");
|
throw new InvalidOperationException("Это не счёт данного клиента");
|
||||||
|
@ -4,123 +4,186 @@ 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 ILogger _logger;
|
||||||
|
|
||||||
private readonly IClientStorage _clientStorage;
|
private readonly IClientStorage _clientStorage;
|
||||||
|
|
||||||
public ClientLogic(ILogger<ClientLogic> logger, IClientStorage clientStorage) {
|
// Конструктор
|
||||||
|
public ClientLogic(ILogger<ClientLogic> logger, IClientStorage clientStorage)
|
||||||
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_clientStorage = clientStorage;
|
_clientStorage = clientStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Create(ClientBindingModel model)
|
// Вывод конкретного клиента
|
||||||
{
|
|
||||||
CheckModel(model);
|
|
||||||
if (_clientStorage.Insert(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Insert 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ClientViewModel? ReadElement(ClientSearchModel model)
|
public ClientViewModel? ReadElement(ClientSearchModel model)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(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);
|
_logger.LogInformation("ReadElement. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Id:{ Id}", model.Name, model.Surname, model.Patronymic, model.Id);
|
||||||
|
|
||||||
var element = _clientStorage.GetElement(model);
|
var element = _clientStorage.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<ClientViewModel>? ReadList(ClientSearchModel? model)
|
public List<ClientViewModel>? ReadList(ClientSearchModel? model)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("ReadList. ClientId:{Id}", model?.Id);
|
_logger.LogInformation("ReadList. ClientId:{Id}", model?.Id);
|
||||||
|
|
||||||
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
var list = model == null ? _clientStorage.GetFullList() : _clientStorage.GetFilteredList(model);
|
var list = model == null ? _clientStorage.GetFullList() : _clientStorage.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 Create(ClientBindingModel model)
|
||||||
|
{
|
||||||
|
CheckModel(model);
|
||||||
|
|
||||||
|
if (_clientStorage.Insert(model) == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Insert operation failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обновление клиента
|
||||||
public bool Update(ClientBindingModel model)
|
public bool Update(ClientBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
|
|
||||||
if (_clientStorage.Update(model) == null)
|
if (_clientStorage.Update(model) == null)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Update operation failed");
|
_logger.LogWarning("Update operation failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
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)
|
private void CheckModel(ClientBindingModel model, bool withParams = true)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// При удалении параметру withParams передаём 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.Surname));
|
throw new ArgumentNullException("Нет фамилии пользователя", nameof(model.Surname));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие отчества клиента
|
||||||
if (string.IsNullOrEmpty(model.Patronymic))
|
if (string.IsNullOrEmpty(model.Patronymic))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Нет отчества пользователя", nameof(model.Patronymic));
|
throw new ArgumentNullException("Нет отчества пользователя", nameof(model.Patronymic));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие электронной почты
|
||||||
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.Password))
|
if (string.IsNullOrEmpty(model.Password))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Нет пароля пользователя", nameof(model.Password));
|
throw new ArgumentNullException("Нет пароля пользователя", nameof(model.Password));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Проверка на наличие мобильного телефона
|
||||||
if (string.IsNullOrEmpty(model.Telephone))
|
if (string.IsNullOrEmpty(model.Telephone))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Нет телефона пользователя", nameof(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}",
|
_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);
|
model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Telephone, model.Id);
|
||||||
|
|
||||||
|
// Для проверка на наличие такого же аккаунта
|
||||||
var element = _clientStorage.GetElement(new ClientSearchModel
|
var element = _clientStorage.GetElement(new ClientSearchModel
|
||||||
{
|
{
|
||||||
Email = model.Email,
|
Email = model.Email,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Если элемент найден и его Id не совпадает с Id переданного объекта
|
||||||
if (element != null && element.Id != model.Id)
|
if (element != null && element.Id != model.Id)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("Клиент с такой почтой уже есть");
|
throw new InvalidOperationException("Клиент с такой почтой уже есть");
|
||||||
|
@ -5,21 +5,73 @@ 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 CreditingViewModel? ReadElement(CreditingSearchModel model)
|
||||||
|
{
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(model));
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("ReadElement. CreditingId:{ Id }", model.Id);
|
||||||
|
|
||||||
|
var element = _creditingStorage.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<CreditingViewModel>? ReadList(CreditingSearchModel? model)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("ReadList. CreditingId:{Id}", model?.Id);
|
||||||
|
|
||||||
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
|
var list = model == null ? _creditingStorage.GetFullList() : _creditingStorage.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(CreditingBindingModel model)
|
public bool Create(CreditingBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -43,73 +95,57 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
return true;
|
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)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(model));
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadElement. CreditingId:{ Id }", model.Id);
|
|
||||||
var element = _creditingStorage.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<CreditingViewModel>? ReadList(CreditingSearchModel? model)
|
|
||||||
{
|
|
||||||
_logger.LogInformation("ReadList. CreditingId:{Id}", model?.Id);
|
|
||||||
var list = model == null ? _creditingStorage.GetFullList() : _creditingStorage.GetFilteredList(model);
|
|
||||||
if (list == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("ReadList return null list");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Update(CreditingBindingModel model)
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Удаление операции на пополнение
|
||||||
|
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)
|
private void CheckModel(CreditingBindingModel model, bool withParams = true)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Так как при удалении передаём как параметр false
|
||||||
if (!withParams)
|
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,9 +5,15 @@ 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,12 +22,56 @@ 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 DebitingViewModel? ReadElement(DebitingSearchModel model)
|
||||||
|
{
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(model));
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("ReadElement. DebitingId:{ Id }", model.Id);
|
||||||
|
|
||||||
|
var element = _debitingStorage.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<DebitingViewModel>? ReadList(DebitingSearchModel? model)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("ReadList. DebitingId:{Id}", model?.Id);
|
||||||
|
|
||||||
|
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||||
|
var list = model == null ? _debitingStorage.GetFullList() : _debitingStorage.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(DebitingBindingModel model)
|
public bool Create(DebitingBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -44,48 +94,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
return true;
|
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)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(model));
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadElement. DebitingId:{ Id }", model.Id);
|
|
||||||
var element = _debitingStorage.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<DebitingViewModel>? ReadList(DebitingSearchModel? model)
|
|
||||||
{
|
|
||||||
_logger.LogInformation("ReadList. DebitingId:{Id}", model?.Id);
|
|
||||||
var list = model == null ? _debitingStorage.GetFullList() : _debitingStorage.GetFilteredList(model);
|
|
||||||
if (list == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("ReadList return null list");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Update(DebitingBindingModel model)
|
public bool Update(DebitingBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
@ -100,20 +109,43 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
|||||||
return true;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||||
private void CheckModel(DebitingBindingModel model, bool withParams = true)
|
private void CheckModel(DebitingBindingModel model, bool withParams = true)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Так как при удалении передаём как параметр false
|
||||||
if (!withParams)
|
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,13 +14,15 @@ 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;
|
||||||
@ -28,7 +30,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
|
|
||||||
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,
|
||||||
@ -47,7 +49,7 @@ 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 })
|
||||||
@ -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();
|
||||||
@ -107,7 +109,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
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,7 +120,7 @@ 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);
|
||||||
@ -205,7 +207,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
TypeDoc = TypeDocEnum.PDF
|
TypeDoc = TypeDocEnum.PDF
|
||||||
});
|
});
|
||||||
|
|
||||||
//возврат полученных списков для отображения на вебе
|
// Возврат полученных списков для отображения на вебе
|
||||||
return new ReportCashierViewModelForHTML
|
return new ReportCashierViewModelForHTML
|
||||||
{
|
{
|
||||||
ReportCashWithdrawal = listCashWithdrawals,
|
ReportCashWithdrawal = listCashWithdrawals,
|
||||||
|
@ -12,16 +12,23 @@ 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 ICardStorage _cardStorage;
|
||||||
|
private readonly IClientStorage _clientStorage;
|
||||||
|
|
||||||
private readonly ICreditingStorage _creditingStorage;
|
private readonly ICreditingStorage _creditingStorage;
|
||||||
private readonly IDebitingStorage _debitingStorage;
|
private readonly IDebitingStorage _debitingStorage;
|
||||||
private readonly ICardStorage _cardStorage;
|
|
||||||
private readonly IMoneyTransferStorage _moneyTransferStorage;
|
private readonly IMoneyTransferStorage _moneyTransferStorage;
|
||||||
private readonly IClientStorage _clientStorage;
|
|
||||||
|
|
||||||
private readonly AbstractSaveToExcel _saveToExcel;
|
private readonly AbstractSaveToExcel _saveToExcel;
|
||||||
private readonly AbstractSaveToWord _saveToWord;
|
private readonly AbstractSaveToWord _saveToWord;
|
||||||
@ -47,6 +54,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
_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
|
||||||
@ -62,6 +70,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Информация о снятиях для отчёта
|
||||||
public List<ReportClientViewModel>? GetDebiting(ReportBindingModel model)
|
public List<ReportClientViewModel>? GetDebiting(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
return _debitingStorage.GetFilteredList(new DebitingSearchModel
|
return _debitingStorage.GetFilteredList(new DebitingSearchModel
|
||||||
@ -77,10 +86,10 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
}).ToList();
|
}).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)
|
||||||
@ -106,7 +115,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
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();
|
||||||
@ -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,6 +151,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
return totalList;
|
return totalList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Сохранение в файл-Excel для клиентов
|
||||||
public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
||||||
{
|
{
|
||||||
byte[] excel = Array.Empty<byte>();
|
byte[] excel = Array.Empty<byte>();
|
||||||
@ -199,6 +209,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Сохранение в файл-Word для клиентов
|
||||||
public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
||||||
{
|
{
|
||||||
byte[] word = Array.Empty<byte>();
|
byte[] word = Array.Empty<byte>();
|
||||||
@ -256,7 +267,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//отчёт в формате PDF для клиента
|
// Сохранение в файл-Pdf для клиента
|
||||||
public ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model)
|
public ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model)
|
||||||
{
|
{
|
||||||
var listCreditings = GetCrediting(model);
|
var listCreditings = GetCrediting(model);
|
||||||
@ -287,7 +298,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
|||||||
|
|
||||||
File.Delete("../BankRestAPI/Отчёт_по_картам.pdf");
|
File.Delete("../BankRestAPI/Отчёт_по_картам.pdf");
|
||||||
|
|
||||||
//возврат полученных списков для отображения на вебе
|
// Возврат полученных списков для отображения на вебе
|
||||||
return new ReportClientViewModelForHTML
|
return new ReportClientViewModelForHTML
|
||||||
{
|
{
|
||||||
ReportCrediting = listCreditings,
|
ReportCrediting = listCreditings,
|
||||||
|
@ -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,6 +29,7 @@ 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;
|
||||||
|
@ -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