Подправил Html и комментики

This commit is contained in:
nikbel2004@outlook.com 2024-05-29 19:26:01 +04:00
parent 0f70b85ca6
commit 2791d89c9d
24 changed files with 895 additions and 593 deletions

View File

@ -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>

View File

@ -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,11 +57,12 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return element; return element;
} }
// Вывод всего списка счетов
public List<AccountViewModel>? ReadList(AccountSearchModel? model) public List<AccountViewModel>? ReadList(AccountSearchModel? model)
{ {
//_logger.LogInformation("ReadList. AccountNumber:{AccountNumber}. Id:{Id}", model.AccountNumber, model?.Id); _logger.LogInformation("ReadList. AccountNumber:{AccountNumber}. Id:{Id}", model.AccountNumber, model?.Id);
//list хранит весь список в случае, если model пришло со значением null на вход метода // list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _accountStorage.GetFullList() : _accountStorage.GetFilteredList(model); var list = model == null ? _accountStorage.GetFullList() : _accountStorage.GetFilteredList(model);
if (list == null) if (list == null)
@ -67,10 +76,10 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return list; return list;
} }
//метод, отвечающий за изменение баланса счёта // Метод, отвечающий за изменение баланса на банковском счёте
public bool ChangeBalance(AccountSearchModel? model, int sum) public bool ChangeBalance(AccountSearchModel? model, int sum)
{ {
//ищем счёт // Ищем счёт
var account = ReadElement(model); var account = ReadElement(model);
if (account == null) if (account == null)
@ -78,13 +87,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
throw new ArgumentNullException("Счёт не найден", nameof(account)); throw new ArgumentNullException("Счёт не найден", nameof(account));
} }
//проверяем возможность операции снятия (sum может быть отрицательной) // Проверяем возможность операции снятия (sum может быть отрицательной)
if (sum + account.Balance < 0) if (sum + account.Balance < 0)
{ {
return false; return false;
} }
//обновляем балланс счёта // Обновляем балланс счёта
_accountStorage.Update(new AccountBindingModel _accountStorage.Update(new AccountBindingModel
{ {
Id = account.Id, Id = account.Id,
@ -94,6 +103,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Создание счёта
public bool Create(AccountBindingModel model) public bool Create(AccountBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -108,6 +118,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Обновление счёта
public bool Update(AccountBindingModel model) public bool Update(AccountBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -122,6 +133,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Удаление счёта
public bool Delete(AccountBindingModel model) public bool Delete(AccountBindingModel model)
{ {
CheckModel(model, false); CheckModel(model, false);
@ -144,7 +156,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
Dictionary<(int, int), int> cashWithdrawals = _cashWithdrawalLogic.ReadList(new CashWithdrawalSearchModel() Dictionary<(int, int), int> cashWithdrawals = _cashWithdrawalLogic.ReadList(new CashWithdrawalSearchModel()
{ {
AccountId = AccountId, AccountId = AccountId,
}).Where(x => x.DebitingStatus == StatusEnum.Закрыта ).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year }) }).Where(x => x.DebitingStatus == StatusEnum.Закрыта).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum)); .Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
Dictionary<(int, int), int> moneyTransfers = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel() Dictionary<(int, int), int> moneyTransfers = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
@ -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("Счёт с таким номером уже существует");

View File

@ -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,12 +58,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return element; return element;
} }
// Вывод всего списка операций
public List<CashWithdrawalViewModel>? ReadList(CashWithdrawalSearchModel? model) public List<CashWithdrawalViewModel>? ReadList(CashWithdrawalSearchModel? model)
{ {
_logger.LogInformation("ReadElement. AccountId:{AccountId}. Sum:{Sum}. DateOperation:{DateOperation}. Id:{Id}", _logger.LogInformation("ReadElement. AccountId:{AccountId}. Sum:{Sum}. DateOperation:{DateOperation}. Id:{Id}",
model?.AccountId, model?.Sum, model?.DateTo, model?.Id); model?.AccountId, model?.Sum, model?.DateTo, model?.Id);
//list хранит весь список в случае, если model пришло со значением null на вход метода // list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _cashWithdrawalStorage.GetFullList() : _cashWithdrawalStorage.GetFilteredList(model); var list = model == null ? _cashWithdrawalStorage.GetFullList() : _cashWithdrawalStorage.GetFilteredList(model);
if (list == null) if (list == null)
@ -69,6 +78,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return list; return list;
} }
// Создание операции
public bool Create(CashWithdrawalBindingModel model, bool flag) public bool Create(CashWithdrawalBindingModel model, bool flag)
{ {
CheckModel(model); CheckModel(model);
@ -102,6 +112,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Обновление операции
public bool Update(CashWithdrawalBindingModel model) public bool Update(CashWithdrawalBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -116,6 +127,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Удаление операции
public bool Delete(CashWithdrawalBindingModel model) public bool Delete(CashWithdrawalBindingModel model)
{ {
CheckModel(model, false); CheckModel(model, false);
@ -132,7 +144,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
//проверка входного аргумента для методов Insert, Update и Delete // Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(CashWithdrawalBindingModel model, bool withParams = true) private void CheckModel(CashWithdrawalBindingModel model, bool withParams = true)
{ {
if (model == null) if (model == null)
@ -140,25 +152,25 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
//так как при удалении передаём как параметр false // Так как при удалении передаём как параметр false
if (!withParams) if (!withParams)
{ {
return; return;
} }
//проверка на корректность Id счёта // Проверка на корректность Id счёта
if (model.AccountId < 0) if (model.AccountId < 0)
{ {
throw new ArgumentNullException("Некорректный Id счёта", nameof(model.AccountId)); throw new ArgumentNullException("Некорректный Id счёта", nameof(model.AccountId));
} }
//проверка на корректность снимаемой суммы // Проверка на корректность снимаемой суммы
if (model.Sum <= 0) if (model.Sum <= 0)
{ {
throw new ArgumentNullException("Снимаемая сумма не может раняться нулю или быть меньше его", nameof(model.Sum)); throw new ArgumentNullException("Снимаемая сумма не может раняться нулю или быть меньше его", nameof(model.Sum));
} }
//проверка на корректную дату операции // Проверка на корректную дату операции
if (model.DateOperation > DateTime.Now) if (model.DateOperation > DateTime.Now)
{ {
throw new ArgumentNullException("Дата операции не может быть позднее текущей", nameof(model.DateOperation)); throw new ArgumentNullException("Дата операции не может быть позднее текущей", nameof(model.DateOperation));

View File

@ -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,12 +52,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return element; return element;
} }
// Вывод отфильтрованного списка
public List<CashierViewModel>? ReadList(CashierSearchModel? model) public List<CashierViewModel>? ReadList(CashierSearchModel? model)
{ {
_logger.LogInformation("ReadList. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. Id:{Id}", _logger.LogInformation("ReadList. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. Id:{Id}",
model.Name, model.Surname, model.Patronymic, model?.Id); model.Name, model.Surname, model.Patronymic, model?.Id);
//list хранит весь список в случае, если model пришло со значением null на вход метода // list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _cashierStorage.GetFullList() : _cashierStorage.GetFilteredList(model); var list = model == null ? _cashierStorage.GetFullList() : _cashierStorage.GetFilteredList(model);
if (list == null) if (list == null)
@ -62,6 +72,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return list; return list;
} }
// Создание кассира
public bool Create(CashierBindingModel model) public bool Create(CashierBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -76,6 +87,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Обновление кассира
public bool Update(CashierBindingModel model) public bool Update(CashierBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -90,6 +102,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Удаление кассира
public bool Delete(CashierBindingModel model) public bool Delete(CashierBindingModel model)
{ {
CheckModel(model, false); CheckModel(model, false);
@ -106,7 +119,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
//проверка входного аргумента для методов Insert, Update и Delete // Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(CashierBindingModel model, bool withParams = true) private void CheckModel(CashierBindingModel model, bool withParams = true)
{ {
if (model == null) if (model == null)
@ -114,53 +127,70 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
//так как при удалении передаём как параметр false // Так как при удалении передаём как параметр false
if (!withParams) if (!withParams)
{ {
return; return;
} }
//проверка на наличие имени // Проверка на наличие имени
if (string.IsNullOrEmpty(model.Name)) if (string.IsNullOrEmpty(model.Name))
{ {
throw new ArgumentNullException("Отсутствие имени в учётной записи", nameof(model.Name)); throw new ArgumentNullException("Отсутствие имени в учётной записи", nameof(model.Name));
} }
//проверка на наличие фамилия // Проверка на наличие фамилия
if (string.IsNullOrEmpty(model.Surname)) if (string.IsNullOrEmpty(model.Surname))
{ {
throw new ArgumentNullException("Отсутствие фамилии в учётной записи", nameof(model.Name)); throw new ArgumentNullException("Отсутствие фамилии в учётной записи", nameof(model.Name));
} }
//проверка на наличие отчество // Проверка на наличие отчество
if (string.IsNullOrEmpty(model.Patronymic)) if (string.IsNullOrEmpty(model.Patronymic))
{ {
throw new ArgumentNullException("Отсутствие отчества в учётной записи", nameof(model.Name)); throw new ArgumentNullException("Отсутствие отчества в учётной записи", nameof(model.Name));
} }
//проверка на наличие почты // Проверка на наличие почты
if (string.IsNullOrEmpty(model.Email)) if (string.IsNullOrEmpty(model.Email))
{ {
throw new ArgumentNullException("Отсутствие почты в учётной записи (логина)", nameof(model.Email)); throw new ArgumentNullException("Отсутствие почты в учётной записи (логина)", nameof(model.Email));
} }
//проверка на наличие пароля // Проверка на наличие мобильного телефона
if (string.IsNullOrEmpty(model.Telephone))
{
throw new ArgumentNullException("Нет моб.телефона пользователя", nameof(model.Telephone));
}
// Проверка на наличие пароля
if (string.IsNullOrEmpty(model.Password)) if (string.IsNullOrEmpty(model.Password))
{ {
throw new ArgumentNullException("Отсутствие пароля в учётной записи", nameof(model.Password)); throw new ArgumentNullException("Отсутствие пароля в учётной записи", nameof(model.Password));
} }
if (!Regex.IsMatch(model.Email, @"^[a-zA-Z0-9.!#$%&*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$", RegexOptions.IgnoreCase))
{
throw new ArgumentException("Некорректная почта", nameof(model.Email));
}
if (!Regex.IsMatch(model.Password, @"^((\w+\d+\W+)|(\w+\W+\d+)|(\d+\w+\W+)|(\d+\W+\w+)|(\W+\w+\d+)|(\W+\d+\w+))[\w\d\W]*$", RegexOptions.IgnoreCase)
&& model.Password.Length < 10 && model.Password.Length > 50)
{
throw new ArgumentException("Необходимо придумать другой пароль", nameof(model.Password));
}
_logger.LogInformation("Cashier. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. " + _logger.LogInformation("Cashier. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. " +
"Email:{Email}. Password:{Password}. Id:{Id}", "Email:{Email}. Password:{Password}. Id:{Id}",
model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Id); model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Id);
//для проверка на наличие такого же аккаунта // Для проверки на наличие такого же аккаунта
var element = _cashierStorage.GetElement(new CashierSearchModel var element = _cashierStorage.GetElement(new CashierSearchModel
{ {
Email = model.Email, Email = model.Email,
}); });
//если элемент найден и его Id не совпадает с Id переданного объекта // Если элемент найден и его Id не совпадает с Id переданного объекта
if (element != null && element.Id != model.Id) if (element != null && element.Id != model.Id)
{ {
throw new InvalidOperationException("Аккаунт с таким логином уже есть"); throw new InvalidOperationException("Аккаунт с таким логином уже есть");

View File

@ -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,12 +57,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return element; return element;
} }
// Вывод всего списка операций на перевод наличных
public List<MoneyTransferViewModel>? ReadList(MoneyTransferSearchModel? model) public List<MoneyTransferViewModel>? ReadList(MoneyTransferSearchModel? model)
{ {
_logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}", _logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}",
model?.AccountSenderId, model?.AccountPayeeId, model?.Sum, model?.Id); model?.AccountSenderId, model?.AccountPayeeId, model?.Sum, model?.Id);
//list хранит весь список в случае, если model пришло со значением null на вход метода // list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _moneyTransferStorage.GetFullList() : _moneyTransferStorage.GetFilteredList(model); var list = model == null ? _moneyTransferStorage.GetFullList() : _moneyTransferStorage.GetFilteredList(model);
if (list == null) if (list == null)
@ -68,6 +77,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return list; return list;
} }
// Создание операции на перевод
public bool Create(MoneyTransferBindingModel model) public bool Create(MoneyTransferBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -79,7 +89,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return false; return false;
} }
//проверка на то, что это зачисление на карту, а не перевод между счетами // Проверка на то, что это зачисление на карту, а не перевод между счетами
if (model.CreditingId.HasValue) if (model.CreditingId.HasValue)
{ {
_creditingStorage.Update(new CreditingBindingModel _creditingStorage.Update(new CreditingBindingModel
@ -94,6 +104,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Обновление операции на перевод
public bool Update(MoneyTransferBindingModel model) public bool Update(MoneyTransferBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -108,6 +119,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Удаление операции на перевод
public bool Delete(MoneyTransferBindingModel model) public bool Delete(MoneyTransferBindingModel model)
{ {
CheckModel(model, false); CheckModel(model, false);
@ -124,7 +136,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
//проверка входного аргумента для методов Insert, Update и Delete // Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(MoneyTransferBindingModel model, bool withParams = true) private void CheckModel(MoneyTransferBindingModel model, bool withParams = true)
{ {
if (model == null) if (model == null)
@ -132,31 +144,31 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
//так как при удалении передаём как параметр false // Так как при удалении передаём как параметр false
if (!withParams) if (!withParams)
{ {
return; return;
} }
//проверка корректности Id счёта отправителя // Проверка корректности Id счёта отправителя
if (model.AccountSenderId < 0) if (model.AccountSenderId < 0)
{ {
throw new ArgumentNullException("Отсутствие Id у счёта отправителя", nameof(model.AccountSenderId)); throw new ArgumentNullException("Отсутствие Id у счёта отправителя", nameof(model.AccountSenderId));
} }
//проверка корректности Id счёта получателя // Проверка корректности Id счёта получателя
if (model.AccountPayeeId < 0) if (model.AccountPayeeId < 0)
{ {
throw new ArgumentNullException("Отсутствие Id у счёта получателя", nameof(model.AccountPayeeId)); throw new ArgumentNullException("Отсутствие Id у счёта получателя", nameof(model.AccountPayeeId));
} }
//проверка на корректную сумму перевода // Проверка на корректную сумму перевода
if (model.Sum <= 0) if (model.Sum <= 0)
{ {
throw new ArgumentNullException("Сумма перевода не может раняться нулю или быть меньше его", nameof(model.Sum)); throw new ArgumentNullException("Сумма перевода не может раняться нулю или быть меньше его", nameof(model.Sum));
} }
//проверка на корректную дату открытия счёта // Проверка на корректную дату открытия счёта
if (model.DateOperation > DateTime.Now) if (model.DateOperation > DateTime.Now)
{ {
throw new ArgumentNullException("Дата операции не может быть ранее текущей", nameof(model.DateOperation)); throw new ArgumentNullException("Дата операции не может быть ранее текущей", nameof(model.DateOperation));

View File

@ -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("Это не счёт данного клиента");

View File

@ -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("Клиент с такой почтой уже есть");

View File

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

View File

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

View File

@ -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,10 +49,10 @@ namespace BankBusinessLogic.BusinessLogics.Reports
_mailKitWorker = mailKitWorker; _mailKitWorker = mailKitWorker;
} }
//формирование списка переводов между счетами за период // Формирование списка переводов между счетами за период
public List<ReportCashierViewModel>? GetMoneyTransfers(ReportBindingModel model) public List<ReportCashierViewModel>? GetMoneyTransfers(ReportBindingModel model)
{ {
return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo}) return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
.Select(x => new ReportCashierViewModel .Select(x => new ReportCashierViewModel
{ {
OperationId = x.Id, OperationId = x.Id,
@ -62,7 +64,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
.ToList(); .ToList();
} }
//формирование списка выдаци наличных со счёта за период // Формирование списка выдачи наличных со счёта за период
public List<ReportCashierViewModel>? GetCashWithrawals(ReportBindingModel model) public List<ReportCashierViewModel>? GetCashWithrawals(ReportBindingModel model)
{ {
return _cashWithdrawalStorage.GetFilteredList(new CashWithdrawalSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo }) return _cashWithdrawalStorage.GetFilteredList(new CashWithdrawalSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
@ -77,7 +79,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
.ToList(); .ToList();
} }
//формирование списка выдаци наличных со счёта за период // Формирование списка выдачи наличных со счёта за период
public List<DebitingViewModel>? GetDebitings(ReportBindingModel model) public List<DebitingViewModel>? GetDebitings(ReportBindingModel model)
{ {
List<int> CardIdList = new(); List<int> CardIdList = new();
@ -87,14 +89,14 @@ namespace BankBusinessLogic.BusinessLogics.Reports
AccountId = model.AccountId AccountId = model.AccountId
}); });
foreach(var index in list) foreach (var index in list)
{ {
CardIdList.Add(index.Id); CardIdList.Add(index.Id);
} }
List<DebitingViewModel> totalList = new(); List<DebitingViewModel> totalList = new();
foreach(var index in CardIdList) foreach (var index in CardIdList)
{ {
var result = _debitingStorage.GetFilteredList(new DebitingSearchModel var result = _debitingStorage.GetFilteredList(new DebitingSearchModel
{ {
@ -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,

View File

@ -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,15 +86,15 @@ 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)
{ {
accountId.Add(_cardStorage.GetElement(new CardSearchModel { Id = index}).AccountId); accountId.Add(_cardStorage.GetElement(new CardSearchModel { Id = index }).AccountId);
} }
var list = accountId.ToHashSet().ToList(); var list = accountId.ToHashSet().ToList();
@ -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,

View File

@ -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;
@ -58,9 +59,9 @@ namespace BankBusinessLogic.MailWorker
MemoryStream ms = new(info.File); MemoryStream ms = new(info.File);
if(info.Role == MailsEnum.Клиент) if (info.Role == MailsEnum.Клиент)
{ {
if(info.TypeDoc == TypeDocEnum.PDF) if (info.TypeDoc == TypeDocEnum.PDF)
{ {
objMailMessage.Attachments.Add(new Attachment(ms, "Отчёт_для_клиента.pdf", "application/pdf")); objMailMessage.Attachments.Add(new Attachment(ms, "Отчёт_для_клиента.pdf", "application/pdf"));
} }

View File

@ -25,7 +25,7 @@ namespace BankСlientApp
ErrorMessage = error; ErrorMessage = error;
} }
//Get-запрос // Get-запрос
public static T? GetRequest<T>(string requestUrl) public static T? GetRequest<T>(string requestUrl)
{ {
var response = _client.GetAsync(requestUrl); var response = _client.GetAsync(requestUrl);
@ -42,7 +42,7 @@ namespace BankСlientApp
} }
} }
//Post-запрос // Post-запрос
public static void PostRequest<T>(string requestUrl, T model) public static void PostRequest<T>(string requestUrl, T model)
{ {
var json = JsonConvert.SerializeObject(model); var json = JsonConvert.SerializeObject(model);
@ -58,7 +58,7 @@ namespace BankСlientApp
} }
} }
//Post-запрос для получения данных // Post-запрос для получения данных
public static T? PostRequestReport<T, U>(string requestUrl, U model) public static T? PostRequestReport<T, U>(string requestUrl, U model)
{ {
var json = JsonConvert.SerializeObject(model); var json = JsonConvert.SerializeObject(model);

View File

@ -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">

View File

@ -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>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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