From 2791d89c9d170c5e71d24d1ebff9b66d0fe529c4 Mon Sep 17 00:00:00 2001 From: "nikbel2004@outlook.com" Date: Wed, 29 May 2024 19:26:01 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20Html=20=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankBusinessLogic.csproj | 36 +- .../BusinessLogic/Cashier/AccountLogic.cs | 109 +++--- .../Cashier/CashWithdrawalLogic.cs | 26 +- .../BusinessLogic/Cashier/CashierLogic.cs | 56 ++- .../Cashier/MoneyTransferLogic.cs | 30 +- .../BusinessLogic/Client/CardLogic.cs | 328 ++++++++++-------- .../BusinessLogic/Client/ClientLogic.cs | 289 +++++++++------ .../BusinessLogic/Client/CreditingLogic.cs | 131 ++++--- .../BusinessLogic/Client/DebitingLogic.cs | 122 ++++--- .../Reports/ReportCashierLogic.cs | 72 ++-- .../Reports/ReportClientLogic.cs | 213 ++++++------ .../MailWorker/MailKitWorker.cs | 9 +- Bank/BankClientApp/APIClient.cs | 6 +- .../BankClientApp/Views/Home/CardsList.cshtml | 2 +- .../Views/Home/CreateCard.cshtml | 6 +- .../Models/Cashier/IAccountModel.cs | 5 +- .../Models/Cashier/ICashWithdrawalModel.cs | 4 +- .../Models/Cashier/ICashierModel.cs | 8 +- .../Models/Cashier/IMoneyTransferModel.cs | 4 +- .../Models/Client/ICreditingModel.cs | 8 +- .../Models/Client/IDebitingModel.cs | 8 +- .../Models/Client/IСardModel.cs | 7 +- .../Models/Client/IСlientModel.cs | 8 +- .../Models/IMessageInfoModel.cs | 1 + 24 files changed, 895 insertions(+), 593 deletions(-) diff --git a/Bank/BankBusinessLogic/BankBusinessLogic.csproj b/Bank/BankBusinessLogic/BankBusinessLogic.csproj index d7c0e65..35493a5 100644 --- a/Bank/BankBusinessLogic/BankBusinessLogic.csproj +++ b/Bank/BankBusinessLogic/BankBusinessLogic.csproj @@ -1,22 +1,26 @@ - - net6.0 - enable - enable - + + net6.0 + enable + enable + - - - - - - + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + - - - - - + + + + + diff --git a/Bank/BankBusinessLogic/BusinessLogic/Cashier/AccountLogic.cs b/Bank/BankBusinessLogic/BusinessLogic/Cashier/AccountLogic.cs index ac23881..aeaec84 100644 --- a/Bank/BankBusinessLogic/BusinessLogic/Cashier/AccountLogic.cs +++ b/Bank/BankBusinessLogic/BusinessLogic/Cashier/AccountLogic.cs @@ -6,10 +6,16 @@ using BankContracts.ViewModels.Cashier.Diagram; using BankContracts.ViewModels.Cashier.ViewModels; using BankDataModels.Enums; using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace BankBusinessLogic.BusinessLogics.Cashier { - public class AccountLogic : IAccountLogic + // Класс, реализующий бизнес-логику для счетов + public class AccountLogic : IAccountLogic { private readonly ILogger _logger; @@ -17,6 +23,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier private readonly ICashWithdrawalLogic _cashWithdrawalLogic; private readonly IMoneyTransferLogic _moneyTransferLogic; + // Конструктор public AccountLogic(ILogger logger, IAccountStorage accountStorage, ICashWithdrawalLogic cashWithdrawalLogic, IMoneyTransferLogic moneyTransferLogic) { @@ -26,6 +33,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier _moneyTransferLogic = moneyTransferLogic; } + // Вывод конкретного счёта public AccountViewModel? ReadElement(AccountSearchModel model) { if (model == null) @@ -49,11 +57,12 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return element; } + // Вывод всего списка счетов public List? 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); if (list == null) @@ -67,10 +76,10 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return list; } - //метод, отвечающий за изменение баланса счёта + // Метод, отвечающий за изменение баланса на банковском счёте public bool ChangeBalance(AccountSearchModel? model, int sum) { - //ищем счёт + // Ищем счёт var account = ReadElement(model); if (account == null) @@ -78,13 +87,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier throw new ArgumentNullException("Счёт не найден", nameof(account)); } - //проверяем возможность операции снятия (sum может быть отрицательной) + // Проверяем возможность операции снятия (sum может быть отрицательной) if (sum + account.Balance < 0) { return false; } - //обновляем балланс счёта + // Обновляем балланс счёта _accountStorage.Update(new AccountBindingModel { Id = account.Id, @@ -94,6 +103,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } + // Создание счёта public bool Create(AccountBindingModel model) { CheckModel(model); @@ -108,6 +118,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } + // Обновление счёта public bool Update(AccountBindingModel model) { CheckModel(model); @@ -122,6 +133,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } + // Удаление счёта public bool Delete(AccountBindingModel model) { CheckModel(model, false); @@ -138,84 +150,85 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } - public List GetMonthInfo(int AccountId) - { + public List GetMonthInfo(int AccountId) + { - Dictionary<(int, int), int> cashWithdrawals = _cashWithdrawalLogic.ReadList(new CashWithdrawalSearchModel() - { - AccountId = AccountId, - }).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)); + Dictionary<(int, int), int> cashWithdrawals = _cashWithdrawalLogic.ReadList(new CashWithdrawalSearchModel() + { + AccountId = AccountId, + }).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)); - Dictionary<(int, int), int> moneyTransfers = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel() - { - AccountPayeeId = AccountId, - }).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)); + Dictionary<(int, int), int> moneyTransfers = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel() + { + AccountPayeeId = AccountId, + }).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)); - Dictionary<(int, int), int> moneyTransfersDebiting = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel() - { - AccountSenderId = AccountId, - }).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)); + Dictionary<(int, int), int> moneyTransfersDebiting = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel() + { + AccountSenderId = AccountId, + }).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)); - List result = new(); + List result = new(); int sum = 0; foreach (var key in cashWithdrawals.Keys.Union(moneyTransfers.Keys).Union(moneyTransfers.Keys).OrderBy(x => x.Item1 * 12 + x.Item2)) - { - if (cashWithdrawals.ContainsKey(key)) sum += cashWithdrawals.GetValueOrDefault(key); - if (moneyTransfers.ContainsKey(key)) sum += moneyTransfers.GetValueOrDefault(key); - if (moneyTransfers.ContainsKey(key)) sum -= moneyTransfersDebiting.GetValueOrDefault(key); - result.Add(new CashierDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum }); - } - return result; - } + { + if (cashWithdrawals.ContainsKey(key)) sum += cashWithdrawals.GetValueOrDefault(key); + if (moneyTransfers.ContainsKey(key)) sum += moneyTransfers.GetValueOrDefault(key); + if (moneyTransfers.ContainsKey(key)) sum -= moneyTransfersDebiting.GetValueOrDefault(key); + result.Add(new CashierDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum }); + } + return result; + } - //проверка входного аргумента для методов Insert, Update и Delete - private void CheckModel(AccountBindingModel model, bool withParams = true) + // Проверка входного аргумента для методов Insert, Update и Delete + private void CheckModel(AccountBindingModel model, bool withParams = true) { if (model == null) { throw new ArgumentNullException(nameof(model)); } - //так как при удалении передаём как параметр false + // Так как при удалении передаём как параметр false if (!withParams) { return; } - //проверка на наличие номера счёта + // Проверка на наличие номера счёта if (string.IsNullOrEmpty(model.AccountNumber)) { throw new ArgumentNullException("Отсутствие номера у счёта", nameof(model.AccountNumber)); } - //проверка на наличие id владельца - if (model.CashierId < 0) + // Проверка на наличие id владельца + if (model.CashierId < 0) { throw new ArgumentNullException("Некорректный Id владельца счёта", nameof(model.CashierId)); } - //проверка на наличие id кассира, создавшего счёт + // Проверка на наличие id кассира, создавшего счёт if (model.CashierId < 0) { throw new ArgumentNullException("Некорректный Id кассира, открывшего счёт", nameof(model.CashierId)); } - //проверка на наличие пароля счёта - if (string.IsNullOrEmpty(model.PasswordAccount) ) + // Проверка на наличие пароля счёта + if (string.IsNullOrEmpty(model.PasswordAccount)) { throw new ArgumentNullException("Некорректный пароль счёта", nameof(model.PasswordAccount)); } - if (model.Balance < 0) { - throw new ArgumentNullException("Изначальный баланс аккаунта не может быть < 0", nameof(model.Balance)); - } + if (model.Balance < 0) + { + throw new ArgumentNullException("Изначальный баланс аккаунта не может быть < 0", nameof(model.Balance)); + } - //проверка на корректную дату открытия счёта + // Проверка на корректную дату открытия счёта if (model.DateOpen > DateTime.Now) { throw new ArgumentNullException("Дата открытия счёта не может быть ранее текущей", nameof(model.DateOpen)); @@ -225,13 +238,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier "CashierId:{CashierId}. DateOpen:{DateOpen}. Id:{Id}", model.AccountNumber, model.PasswordAccount, model.ClientId, model.CashierId, model.DateOpen, model.Id); - //для проверка на наличие такого же счёта + // Для проверка на наличие такого же счёта var element = _accountStorage.GetElement(new AccountSearchModel { AccountNumber = model.AccountNumber, }); - //если элемент найден и его Id не совпадает с Id переданного объекта + // Если элемент найден и его Id не совпадает с Id переданного объекта if (element != null && element.Id != model.Id) { throw new InvalidOperationException("Счёт с таким номером уже существует"); diff --git a/Bank/BankBusinessLogic/BusinessLogic/Cashier/CashWithdrawalLogic.cs b/Bank/BankBusinessLogic/BusinessLogic/Cashier/CashWithdrawalLogic.cs index f4828fe..f55646c 100644 --- a/Bank/BankBusinessLogic/BusinessLogic/Cashier/CashWithdrawalLogic.cs +++ b/Bank/BankBusinessLogic/BusinessLogic/Cashier/CashWithdrawalLogic.cs @@ -7,10 +7,16 @@ using BankContracts.StoragesContracts.Client; using BankContracts.ViewModels.Cashier.ViewModels; using BankDataModels.Enums; using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace BankBusinessLogic.BusinessLogics.Cashier { - public class CashWithdrawalLogic : ICashWithdrawalLogic + // Класс, реализующий бизнес-логику для снятия наличных + public class CashWithdrawalLogic : ICashWithdrawalLogic { private readonly ILogger _logger; @@ -18,6 +24,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier private readonly IDebitingStorage _debitingStorage; + // Конструктор public CashWithdrawalLogic(ILogger logger, ICashWithdrawalStorage cashWithdrawalStorage, IDebitingStorage debitingStorage) { @@ -26,6 +33,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier _debitingStorage = debitingStorage; } + // Вывод конкретной операции public CashWithdrawalViewModel? ReadElement(CashWithdrawalSearchModel model) { if (model == null) @@ -50,12 +58,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return element; } + // Вывод всего списка операций public List? ReadList(CashWithdrawalSearchModel? model) { _logger.LogInformation("ReadElement. AccountId:{AccountId}. Sum:{Sum}. DateOperation:{DateOperation}. Id:{Id}", model?.AccountId, model?.Sum, model?.DateTo, model?.Id); - //list хранит весь список в случае, если model пришло со значением null на вход метода + // list хранит весь список в случае, если model пришло со значением null на вход метода var list = model == null ? _cashWithdrawalStorage.GetFullList() : _cashWithdrawalStorage.GetFilteredList(model); if (list == null) @@ -69,6 +78,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return list; } + // Создание операции public bool Create(CashWithdrawalBindingModel model, bool flag) { CheckModel(model); @@ -102,6 +112,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } + // Обновление операции public bool Update(CashWithdrawalBindingModel model) { CheckModel(model); @@ -116,6 +127,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } + // Удаление операции public bool Delete(CashWithdrawalBindingModel model) { CheckModel(model, false); @@ -132,7 +144,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } - //проверка входного аргумента для методов Insert, Update и Delete + // Проверка входного аргумента для методов Insert, Update и Delete private void CheckModel(CashWithdrawalBindingModel model, bool withParams = true) { if (model == null) @@ -140,25 +152,25 @@ namespace BankBusinessLogic.BusinessLogics.Cashier throw new ArgumentNullException(nameof(model)); } - //так как при удалении передаём как параметр false + // Так как при удалении передаём как параметр false if (!withParams) { return; } - //проверка на корректность Id счёта + // Проверка на корректность Id счёта if (model.AccountId < 0) { throw new ArgumentNullException("Некорректный Id счёта", nameof(model.AccountId)); } - //проверка на корректность снимаемой суммы + // Проверка на корректность снимаемой суммы if (model.Sum <= 0) { throw new ArgumentNullException("Снимаемая сумма не может раняться нулю или быть меньше его", nameof(model.Sum)); } - //проверка на корректную дату операции + // Проверка на корректную дату операции if (model.DateOperation > DateTime.Now) { throw new ArgumentNullException("Дата операции не может быть позднее текущей", nameof(model.DateOperation)); diff --git a/Bank/BankBusinessLogic/BusinessLogic/Cashier/CashierLogic.cs b/Bank/BankBusinessLogic/BusinessLogic/Cashier/CashierLogic.cs index fabd8e3..a9ea1db 100644 --- a/Bank/BankBusinessLogic/BusinessLogic/Cashier/CashierLogic.cs +++ b/Bank/BankBusinessLogic/BusinessLogic/Cashier/CashierLogic.cs @@ -4,21 +4,30 @@ using BankContracts.SearchModels.Cashier; using BankContracts.StoragesContracts.Cashier; using BankContracts.ViewModels.Cashier.ViewModels; 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 { - public class CashierLogic : ICashierLogic + // Класс, реализующий бизнес-логику для кассиров + public class CashierLogic : ICashierLogic { private readonly ILogger _logger; private readonly ICashierStorage _cashierStorage; + // Конструктор public CashierLogic(ILogger logger, ICashierStorage cashierStorage) { _logger = logger; _cashierStorage = cashierStorage; } + // Вывод конкретного клиента public CashierViewModel? ReadElement(CashierSearchModel model) { if (model == null) @@ -26,7 +35,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier throw new ArgumentNullException(nameof(model)); } - _logger.LogInformation("ReadElement. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. Id:{Id}", + _logger.LogInformation("ReadElement. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. Id:{Id}", model.Name, model.Surname, model.Patronymic, model?.Id); var element = _cashierStorage.GetElement(model); @@ -43,12 +52,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return element; } + // Вывод отфильтрованного списка public List? 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); - //list хранит весь список в случае, если model пришло со значением null на вход метода + // list хранит весь список в случае, если model пришло со значением null на вход метода var list = model == null ? _cashierStorage.GetFullList() : _cashierStorage.GetFilteredList(model); if (list == null) @@ -62,6 +72,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return list; } + // Создание кассира public bool Create(CashierBindingModel model) { CheckModel(model); @@ -76,6 +87,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } + // Обновление кассира public bool Update(CashierBindingModel model) { CheckModel(model); @@ -90,6 +102,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } + // Удаление кассира public bool Delete(CashierBindingModel model) { CheckModel(model, false); @@ -106,7 +119,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } - //проверка входного аргумента для методов Insert, Update и Delete + // Проверка входного аргумента для методов Insert, Update и Delete private void CheckModel(CashierBindingModel model, bool withParams = true) { if (model == null) @@ -114,53 +127,70 @@ namespace BankBusinessLogic.BusinessLogics.Cashier throw new ArgumentNullException(nameof(model)); } - //так как при удалении передаём как параметр false + // Так как при удалении передаём как параметр false if (!withParams) { return; } - //проверка на наличие имени + // Проверка на наличие имени if (string.IsNullOrEmpty(model.Name)) { throw new ArgumentNullException("Отсутствие имени в учётной записи", nameof(model.Name)); } - //проверка на наличие фамилия + // Проверка на наличие фамилия if (string.IsNullOrEmpty(model.Surname)) { throw new ArgumentNullException("Отсутствие фамилии в учётной записи", nameof(model.Name)); } - //проверка на наличие отчество + // Проверка на наличие отчество if (string.IsNullOrEmpty(model.Patronymic)) { throw new ArgumentNullException("Отсутствие отчества в учётной записи", nameof(model.Name)); } - //проверка на наличие почты + // Проверка на наличие почты if (string.IsNullOrEmpty(model.Email)) { throw new ArgumentNullException("Отсутствие почты в учётной записи (логина)", nameof(model.Email)); } - //проверка на наличие пароля + // Проверка на наличие мобильного телефона + if (string.IsNullOrEmpty(model.Telephone)) + { + throw new ArgumentNullException("Нет моб.телефона пользователя", nameof(model.Telephone)); + } + + // Проверка на наличие пароля if (string.IsNullOrEmpty(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}. " + "Email:{Email}. Password:{Password}. Id:{Id}", model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Id); - //для проверка на наличие такого же аккаунта + // Для проверки на наличие такого же аккаунта var element = _cashierStorage.GetElement(new CashierSearchModel { Email = model.Email, }); - //если элемент найден и его Id не совпадает с Id переданного объекта + // Если элемент найден и его Id не совпадает с Id переданного объекта if (element != null && element.Id != model.Id) { throw new InvalidOperationException("Аккаунт с таким логином уже есть"); diff --git a/Bank/BankBusinessLogic/BusinessLogic/Cashier/MoneyTransferLogic.cs b/Bank/BankBusinessLogic/BusinessLogic/Cashier/MoneyTransferLogic.cs index e3714db..69de54c 100644 --- a/Bank/BankBusinessLogic/BusinessLogic/Cashier/MoneyTransferLogic.cs +++ b/Bank/BankBusinessLogic/BusinessLogic/Cashier/MoneyTransferLogic.cs @@ -7,10 +7,16 @@ using BankContracts.StoragesContracts.Client; using BankContracts.ViewModels.Cashier.ViewModels; using BankDataModels.Enums; using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace BankBusinessLogic.BusinessLogics.Cashier { - public class MoneyTransferLogic : IMoneyTransferLogic + // Класс, реализующий бизнес-логику для перевода наличных + public class MoneyTransferLogic : IMoneyTransferLogic { private readonly ILogger _logger; @@ -18,6 +24,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier public readonly ICreditingStorage _creditingStorage; + // Конструктор public MoneyTransferLogic(ILogger logger, IMoneyTransferStorage moneyTransferStorage, ICreditingStorage creditingStorage) { _logger = logger; @@ -25,6 +32,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier _creditingStorage = creditingStorage; } + // Вывод конкретной операции public MoneyTransferViewModel? ReadElement(MoneyTransferSearchModel model) { if (model == null) @@ -49,12 +57,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return element; } + // Вывод всего списка операций на перевод наличных public List? ReadList(MoneyTransferSearchModel? model) { _logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}", model?.AccountSenderId, model?.AccountPayeeId, model?.Sum, model?.Id); - //list хранит весь список в случае, если model пришло со значением null на вход метода + // list хранит весь список в случае, если model пришло со значением null на вход метода var list = model == null ? _moneyTransferStorage.GetFullList() : _moneyTransferStorage.GetFilteredList(model); if (list == null) @@ -68,6 +77,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return list; } + // Создание операции на перевод public bool Create(MoneyTransferBindingModel model) { CheckModel(model); @@ -79,7 +89,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return false; } - //проверка на то, что это зачисление на карту, а не перевод между счетами + // Проверка на то, что это зачисление на карту, а не перевод между счетами if (model.CreditingId.HasValue) { _creditingStorage.Update(new CreditingBindingModel @@ -94,6 +104,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } + // Обновление операции на перевод public bool Update(MoneyTransferBindingModel model) { CheckModel(model); @@ -108,6 +119,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } + // Удаление операции на перевод public bool Delete(MoneyTransferBindingModel model) { CheckModel(model, false); @@ -124,7 +136,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier return true; } - //проверка входного аргумента для методов Insert, Update и Delete + // Проверка входного аргумента для методов Insert, Update и Delete private void CheckModel(MoneyTransferBindingModel model, bool withParams = true) { if (model == null) @@ -132,31 +144,31 @@ namespace BankBusinessLogic.BusinessLogics.Cashier throw new ArgumentNullException(nameof(model)); } - //так как при удалении передаём как параметр false + // Так как при удалении передаём как параметр false if (!withParams) { return; } - //проверка корректности Id счёта отправителя + // Проверка корректности Id счёта отправителя if (model.AccountSenderId < 0) { throw new ArgumentNullException("Отсутствие Id у счёта отправителя", nameof(model.AccountSenderId)); } - //проверка корректности Id счёта получателя + // Проверка корректности Id счёта получателя if (model.AccountPayeeId < 0) { throw new ArgumentNullException("Отсутствие Id у счёта получателя", nameof(model.AccountPayeeId)); } - //проверка на корректную сумму перевода + // Проверка на корректную сумму перевода if (model.Sum <= 0) { throw new ArgumentNullException("Сумма перевода не может раняться нулю или быть меньше его", nameof(model.Sum)); } - //проверка на корректную дату открытия счёта + // Проверка на корректную дату открытия счёта if (model.DateOperation > DateTime.Now) { throw new ArgumentNullException("Дата операции не может быть ранее текущей", nameof(model.DateOperation)); diff --git a/Bank/BankBusinessLogic/BusinessLogic/Client/CardLogic.cs b/Bank/BankBusinessLogic/BusinessLogic/Client/CardLogic.cs index 4ad7c21..4ddf2e8 100644 --- a/Bank/BankBusinessLogic/BusinessLogic/Client/CardLogic.cs +++ b/Bank/BankBusinessLogic/BusinessLogic/Client/CardLogic.cs @@ -8,160 +8,216 @@ using BankContracts.BindingModels.Client; using BankContracts.SearchModels.Client; using BankContracts.ViewModels.Client.ViewModels; using BankContracts.SearchModels.Cashier; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace BankBusinessLogic.BusinessLogics.Client { - public class CardLogic : ICardLogic - { - private readonly ILogger _logger; - private readonly ICardStorage _cardStorage; - private readonly IAccountLogic _accountLogic; - private readonly IDebitingLogic _debitingLogic; - private readonly ICreditingLogic _creditingLogic; + // Класс, реализующий бизнес-логику для банковских карт + public class CardLogic : ICardLogic + { + private readonly ILogger _logger; - public CardLogic(ILogger logger, ICardStorage cardStorage, IAccountLogic accountLogic, - IDebitingLogic debitingLogic, ICreditingLogic creditingLogic) { - _logger = logger; - _cardStorage = cardStorage; - _accountLogic = accountLogic; - _debitingLogic = debitingLogic; - _creditingLogic = creditingLogic; - } + private readonly ICardStorage _cardStorage; + private readonly IAccountLogic _accountLogic; + + private readonly IDebitingLogic _debitingLogic; + + private readonly ICreditingLogic _creditingLogic; + + // Конструктор + public CardLogic(ILogger logger, ICardStorage cardStorage, IAccountLogic accountLogic, + IDebitingLogic debitingLogic, ICreditingLogic creditingLogic) + { + _logger = logger; + + _cardStorage = cardStorage; + _accountLogic = accountLogic; + _debitingLogic = debitingLogic; + _creditingLogic = creditingLogic; + } + + // Вывод конкретной банковской карты + public CardViewModel? ReadElement(CardSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + _logger.LogInformation("ReadElement. CardNumber:{Number}.Id:{ Id}", model.Number, model.Id); + + var element = _cardStorage.GetElement(model); + + if (element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + + _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); + + return element; + } + + // Вывод всего списка банковских карт + public List? 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) - { - CheckModel(model); - if (_cardStorage.Insert(model) == null) - { - _logger.LogWarning("Insert operation failed"); - return false; - } - return true; - } + { + CheckModel(model); - public bool Delete(CardBindingModel model) - { - CheckModel(model, false); - _logger.LogInformation("Delete. Id:{Id}", model.Id); - if (_cardStorage.Delete(model) == null) - { - _logger.LogWarning("Delete operation failed"); - return false; - } - return true; - } + if (_cardStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } - 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; - } + return true; + } - public List? 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); - public bool Update(CardBindingModel model) - { - CheckModel(model); - if (_cardStorage.Update(model) == null) - { - _logger.LogWarning("Update operation failed"); - return false; - } - return true; - } + if (_cardStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } - public List GetMonthInfo(int CardId) { + return true; + } - Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel() - { - CardId = CardId, - Status = StatusEnum.Закрыта - }).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)); - Dictionary<(int?, int?), int> creditings = _creditingLogic.ReadList(new CreditingSearchModel() - { - CardId = CardId, - Status = StatusEnum.Закрыта - }).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)); + // Удаление банковской карты + public bool Delete(CardBindingModel model) + { + CheckModel(model, false); + _logger.LogInformation("Delete. Id:{Id}", model.Id); + if (_cardStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; + } - List result = new(); - foreach (var key in debitings.Keys.Union(creditings.Keys).OrderBy(x => x.Item1 * 12 + x.Item2)) { - int sum = 0; - if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key); - if (creditings.ContainsKey(key)) sum += creditings.GetValueOrDefault(key); - result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum}); - } - return result; - } + // Бизнес-логика для диаграмм, для получения информации по месяцам + public List GetMonthInfo(int CardId) + { + Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel() + { + CardId = CardId, + Status = StatusEnum.Закрыта + }).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year }) + .Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum)); - private void CheckModel(CardBindingModel model, bool withParams = true) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - if (!withParams) - { - return; - } - if (string.IsNullOrEmpty(model.Number) || model.Number.Length != 16) - { - throw new ArgumentNullException("Неправильный номер карты", nameof(model.Number)); - } - if (string.IsNullOrEmpty(model.CVC) || model.CVC.Length != 3) - { - throw new ArgumentNullException("Неправильный СVC карты", nameof(model.CVC)); - } - if (model.Period < DateTime.Now) - { - throw new ArgumentNullException("Нет периода действия", nameof(model.Period)); - } - var cardElement = _cardStorage.GetElement(new CardSearchModel - { - Number = model.Number, - }); + Dictionary<(int?, int?), int> creditings = _creditingLogic.ReadList(new CreditingSearchModel() + { + CardId = CardId, + Status = StatusEnum.Закрыта + }).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year }) + .Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum)); - if (cardElement != null && cardElement.Id != model.Id) - { - throw new InvalidOperationException("Карта с таким ноиером уже есть"); - } + List result = new(); - var accountElement = _accountLogic.ReadElement(new AccountSearchModel - { - Id = model.AccountId, - ClientId = model.ClientID - }); + foreach (var key in debitings.Keys.Union(creditings.Keys).OrderBy(x => x.Item1 * 12 + x.Item2)) + { + int sum = 0; + if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key); + if (creditings.ContainsKey(key)) sum += creditings.GetValueOrDefault(key); + result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum }); + } - if (accountElement != null && accountElement.ClientId != model.ClientID) - { + return result; + } + + // Проверка входного аргумента для методов Insert, Update и Delete + private void CheckModel(CardBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + // Так как при удалении передаём как параметр false + if (!withParams) + { + return; + } + + // Проверка на наличие номера у банковской карты + if (string.IsNullOrEmpty(model.Number) || model.Number.Length != 16) + { + throw new ArgumentNullException("Неправильный номер карты", nameof(model.Number)); + } + + // Проверка на наличие CVC кода у банковской карты + if (string.IsNullOrEmpty(model.CVC) || model.CVC.Length != 3) + { + throw new ArgumentNullException("Неправильный СVC карты", nameof(model.CVC)); + } + + // Проверка на конкретный период действия карты + if (model.Period < DateTime.Now) + { + throw new ArgumentNullException("Нет периода действия", nameof(model.Period)); + } + + // Проверка на наличие id клиента, получившего карту (лишним не будет) + if (model.ClientID < 0) + { + throw new ArgumentNullException("Некорректный Id клиента, открывшего счёт", nameof(model.ClientID)); + } + + // Для проверка на наличие такой же банковской карты + var cardElement = _cardStorage.GetElement(new CardSearchModel + { + Number = model.Number, + }); + + // Если элемент найден и его Id не совпадает с Id переданного объекта + if (cardElement != null && cardElement.Id != model.Id) + { + throw new InvalidOperationException("Карта с таким ноиером уже есть"); + } + + var accountElement = _accountLogic.ReadElement(new AccountSearchModel + { + Id = model.AccountId, + ClientId = model.ClientID + }); + + // Проверка привязан ли счёт к данному клиенту + if (accountElement != null && accountElement.ClientId != model.ClientID) + { throw new InvalidOperationException("Это не счёт данного клиента"); } - _logger.LogInformation("Card. Number:{Number}.CVC:{CVC}.ClientId:{ClientID}.Patronymic:{Period}.Id:{Id}", - model.Number, model.CVC, model.Period.ToString(), model.ClientID, model.Id); - } - } + _logger.LogInformation("Card. Number:{Number}.CVC:{CVC}.ClientId:{ClientID}.Patronymic:{Period}.Id:{Id}", + model.Number, model.CVC, model.Period.ToString(), model.ClientID, model.Id); + } + } } diff --git a/Bank/BankBusinessLogic/BusinessLogic/Client/ClientLogic.cs b/Bank/BankBusinessLogic/BusinessLogic/Client/ClientLogic.cs index ceac6d0..8f16c03 100644 --- a/Bank/BankBusinessLogic/BusinessLogic/Client/ClientLogic.cs +++ b/Bank/BankBusinessLogic/BusinessLogic/Client/ClientLogic.cs @@ -4,127 +4,190 @@ using BankContracts.SearchModels.Client; using BankContracts.StoragesContracts.Client; using BankContracts.ViewModels.Client.ViewModels; 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 { - public class ClientLogic : IClientLogic - { - private readonly ILogger _logger; - private readonly IClientStorage _clientStorage; + // Класс, реализующий бизнес-логику для клиентов + public class ClientLogic : IClientLogic + { + private readonly ILogger _logger; - public ClientLogic(ILogger logger, IClientStorage clientStorage) { - _logger = logger; - _clientStorage = clientStorage; - } + private readonly IClientStorage _clientStorage; - public bool Create(ClientBindingModel model) - { - CheckModel(model); - if (_clientStorage.Insert(model) == null) - { - _logger.LogWarning("Insert operation failed"); - return false; - } - return true; - } + // Конструктор + public ClientLogic(ILogger logger, IClientStorage clientStorage) + { + _logger = logger; + _clientStorage = clientStorage; + } - 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) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } - public ClientViewModel? ReadElement(ClientSearchModel model) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - _logger.LogInformation("ReadElement. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Id:{ Id}", model.Name, model.Surname, model.Patronymic, model.Id); - var element = _clientStorage.GetElement(model); - if (element == null) - { - _logger.LogWarning("ReadElement element not found"); - return null; - } - _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); - return element; - } + _logger.LogInformation("ReadElement. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Id:{ Id}", model.Name, model.Surname, model.Patronymic, model.Id); + + var element = _clientStorage.GetElement(model); - public List? ReadList(ClientSearchModel? model) - { - _logger.LogInformation("ReadList. ClientId:{Id}", model?.Id); - var list = model == null ? _clientStorage.GetFullList() : _clientStorage.GetFilteredList(model); - if (list == null) - { - _logger.LogWarning("ReadList return null list"); - return null; - } - _logger.LogInformation("ReadList. Count:{Count}", list.Count); - return list; - } + if (element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } - public bool Update(ClientBindingModel model) - { - CheckModel(model); - if (_clientStorage.Update(model) == null) - { - _logger.LogWarning("Update operation failed"); - return false; - } - return true; - } + _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); - private void CheckModel(ClientBindingModel model, bool withParams = true) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - if (!withParams) - { - return; - } - if (string.IsNullOrEmpty(model.Name)) - { - throw new ArgumentNullException("Нет имени пользователя", nameof(model.Name)); - } - if (string.IsNullOrEmpty(model.Surname)) - { - throw new ArgumentNullException("Нет фамилии пользователя", nameof(model.Surname)); - } - if (string.IsNullOrEmpty(model.Patronymic)) - { - throw new ArgumentNullException("Нет отчества пользователя", nameof(model.Patronymic)); - } - if (string.IsNullOrEmpty(model.Email)) - { - throw new ArgumentNullException("Нет почты пользователя", nameof(model.Email)); - } - if (string.IsNullOrEmpty(model.Password)) - { - throw new ArgumentNullException("Нет пароля пользователя", nameof(model.Password)); - } - if (string.IsNullOrEmpty(model.Telephone)) - { - throw new ArgumentNullException("Нет телефона пользователя", nameof(model.Telephone)); - } - _logger.LogInformation("Client. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Email:{Email}.Password:{Password}.Telephone:{Telephone}.Id:{Id}", - model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Telephone, model.Id); - var element = _clientStorage.GetElement(new ClientSearchModel - { - Email = model.Email, - }); - if (element != null && element.Id != model.Id) - { - throw new InvalidOperationException("Клиент с такой почтой уже есть"); - } - } - } + return element; + } + + // Вывод отфильтрованного списка + public List? ReadList(ClientSearchModel? model) + { + _logger.LogInformation("ReadList. ClientId:{Id}", model?.Id); + + // list хранит весь список в случае, если model пришло со значением null на вход метода + var list = model == null ? _clientStorage.GetFullList() : _clientStorage.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(ClientBindingModel model) + { + CheckModel(model); + + if (_clientStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + + return true; + } + + // Обновление клиента + public bool Update(ClientBindingModel model) + { + CheckModel(model); + + if (_clientStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + + return true; + } + + // Удаление клиента + public bool Delete(ClientBindingModel model) + { + CheckModel(model, false); + + _logger.LogInformation("Delete. Id:{Id}", model.Id); + + if (_clientStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + + return true; + } + + // Проверка входного аргумента для методов Insert, Update и Delete + private void CheckModel(ClientBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + // При удалении параметру withParams передаём false + if (!withParams) + { + return; + } + + // Проверка на наличие имени клиента + if (string.IsNullOrEmpty(model.Name)) + { + throw new ArgumentNullException("Нет имени пользователя", nameof(model.Name)); + } + + // Проверка на наличие фамилии клиента + if (string.IsNullOrEmpty(model.Surname)) + { + throw new ArgumentNullException("Нет фамилии пользователя", nameof(model.Surname)); + } + + // Проверка на наличие отчества клиента + if (string.IsNullOrEmpty(model.Patronymic)) + { + throw new ArgumentNullException("Нет отчества пользователя", nameof(model.Patronymic)); + } + + // Проверка на наличие электронной почты + if (string.IsNullOrEmpty(model.Email)) + { + throw new ArgumentNullException("Нет почты пользователя", nameof(model.Email)); + } + + // Проверка на наличие пароля + if (string.IsNullOrEmpty(model.Password)) + { + throw new ArgumentNullException("Нет пароля пользователя", nameof(model.Password)); + } + + // Проверка на наличие мобильного телефона + if (string.IsNullOrEmpty(model.Telephone)) + { + throw new ArgumentNullException("Нет моб.телефона пользователя", nameof(model.Telephone)); + } + + if (!Regex.IsMatch(model.Email, @"^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$", RegexOptions.IgnoreCase)) + { + throw new ArgumentException("Некорректная почта", nameof(model.Email)); + } + + if (!Regex.IsMatch(model.Password, @"^((\w+\d+\W+)|(\w+\W+\d+)|(\d+\w+\W+)|(\d+\W+\w+)|(\W+\w+\d+)|(\W+\d+\w+))[\w\d\W]*$", RegexOptions.IgnoreCase) + && model.Password.Length < 10 && model.Password.Length > 50) + { + throw new ArgumentException("Необходимо придумать другой пароль", nameof(model.Password)); + } + + _logger.LogInformation("Client. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Email:{Email}.Password:{Password}.Telephone:{Telephone}.Id:{Id}", + model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Telephone, model.Id); + + // Для проверка на наличие такого же аккаунта + var element = _clientStorage.GetElement(new ClientSearchModel + { + Email = model.Email, + }); + + // Если элемент найден и его Id не совпадает с Id переданного объекта + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Клиент с такой почтой уже есть"); + } + } + } } diff --git a/Bank/BankBusinessLogic/BusinessLogic/Client/CreditingLogic.cs b/Bank/BankBusinessLogic/BusinessLogic/Client/CreditingLogic.cs index ba30bdc..518b22f 100644 --- a/Bank/BankBusinessLogic/BusinessLogic/Client/CreditingLogic.cs +++ b/Bank/BankBusinessLogic/BusinessLogic/Client/CreditingLogic.cs @@ -5,112 +5,148 @@ using BankContracts.StoragesContracts.Client; using BankContracts.BindingModels.Client; using BankContracts.ViewModels.Client.ViewModels; using BankContracts.SearchModels.Client; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace BankBusinessLogic.BusinessLogics.Client { - public class CreditingLogic : ICreditingLogic + // Класс, реализующий бизнес-логику для пополнения карты + public class CreditingLogic : ICreditingLogic { private readonly ILogger _logger; + private readonly ICreditingStorage _creditingStorage; + private readonly ICardStorage _cardStorage; - public CreditingLogic(ILogger logger, ICreditingStorage creditingStorage, ICardStorage cardStorage) { + // Конструктор + public CreditingLogic(ILogger logger, ICreditingStorage creditingStorage, ICardStorage cardStorage) { _logger = logger; _creditingStorage = creditingStorage; _cardStorage = cardStorage; } - public bool Create(CreditingBindingModel model) - { - CheckModel(model); - - if (!CheckCardPeriod(model)) - { - model.Status = StatusEnum.Карта_просрочена; - } - else - { - model.Status = StatusEnum.Открыта; - } - - if (_creditingStorage.Insert(model) == null) - { - _logger.LogWarning("Insert operation failed"); - - return false; - } - - return true; - } - - public bool 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) + // Вывод конкретной операции на пополнение + 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? ReadList(CreditingSearchModel? model) + // Вывод всего списка операций на пополнение + public List? ReadList(CreditingSearchModel? model) { _logger.LogInformation("ReadList. CreditingId:{Id}", model?.Id); - var list = model == null ? _creditingStorage.GetFullList() : _creditingStorage.GetFilteredList(model); + + // list хранит весь список в случае, если model пришло со значением null на вход метода + var list = model == null ? _creditingStorage.GetFullList() : _creditingStorage.GetFilteredList(model); + if (list == null) { _logger.LogWarning("ReadList return null list"); return null; } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; } - public bool Update(CreditingBindingModel model) + // Создание операции на пополнение + public bool Create(CreditingBindingModel model) + { + CheckModel(model); + + if (!CheckCardPeriod(model)) + { + model.Status = StatusEnum.Карта_просрочена; + } + else + { + model.Status = StatusEnum.Открыта; + } + + if (_creditingStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + + return false; + } + + return true; + } + + // Обновление операции на пополнение + public bool Update(CreditingBindingModel model) { CheckModel(model); + if (_creditingStorage.Update(model) == null) { _logger.LogWarning("Update operation failed"); return false; } + return true; } - private void CheckModel(CreditingBindingModel model, bool withParams = true) + // Удаление операции на пополнение + public bool Delete(CreditingBindingModel model) + { + CheckModel(model, false); + + _logger.LogInformation("Delete. Id:{Id}", model.Id); + + if (_creditingStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + + return true; + } + + // Проверка входного аргумента для методов Insert, Update и Delete + private void CheckModel(CreditingBindingModel model, bool withParams = true) { if (model == null) { throw new ArgumentNullException(nameof(model)); } - if (!withParams) + + // Так как при удалении передаём как параметр false + if (!withParams) { return; } - if (model.Sum <= 0) + + // Проверка на корректность суммы пополнения + if (model.Sum <= 0) { throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum)); } - if (model.DateOpen > DateTime.Now) + + // Проверка на корректную дату операции + if (model.DateOpen > DateTime.Now) { throw new ArgumentNullException("Дата не может быть меньше текущего времени", nameof(model.DateOpen)); } @@ -119,7 +155,7 @@ namespace BankBusinessLogic.BusinessLogics.Client model.Sum, model.CardId, model.DateOpen.ToString(), model.Id); } - //проверка карты на просроченность + // Проверка карты на просроченность bool CheckCardPeriod(CreditingBindingModel model) { var card = _cardStorage.GetElement(new CardSearchModel @@ -127,13 +163,12 @@ namespace BankBusinessLogic.BusinessLogics.Client Id = model.CardId }); - //если карта просрочена + // Если карта просрочена if (card.Period < DateTime.Now) { return false; } - return true; } } diff --git a/Bank/BankBusinessLogic/BusinessLogic/Client/DebitingLogic.cs b/Bank/BankBusinessLogic/BusinessLogic/Client/DebitingLogic.cs index 436eb8d..1ac878e 100644 --- a/Bank/BankBusinessLogic/BusinessLogic/Client/DebitingLogic.cs +++ b/Bank/BankBusinessLogic/BusinessLogic/Client/DebitingLogic.cs @@ -5,10 +5,16 @@ using BankContracts.StoragesContracts.Client; using BankContracts.BindingModels.Client; using BankContracts.SearchModels.Client; 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 { - public class DebitingLogic : IDebitingLogic + // Класс, реализующий бизнес-логику для снятия наличных с карты + public class DebitingLogic : IDebitingLogic { private readonly ILogger _logger; @@ -16,77 +22,80 @@ namespace BankBusinessLogic.BusinessLogics.Client private readonly ICardStorage _cardStorage; + // Конструктор public DebitingLogic(ILogger logger, IDebitingStorage debitingStorage, ICardStorage cardStorage) { _logger = logger; _debitingStorage = debitingStorage; _cardStorage = cardStorage; } - public bool Create(DebitingBindingModel model) - { - CheckModel(model); - - if (!CheckCardPeriod(model)) - { - model.Status = StatusEnum.Карта_просрочена; - } - else - { - model.Status = StatusEnum.Открыта; - } - - if (_debitingStorage.Insert(model) == null) - { - _logger.LogWarning("Insert operation failed"); - return false; - } - - return true; - } - - public bool 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) + // Вывод конкретной операции на снятие наличных + 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? ReadList(DebitingSearchModel? model) + // Вывод всего списка операций на снятие наличных + public List? ReadList(DebitingSearchModel? model) { _logger.LogInformation("ReadList. DebitingId:{Id}", model?.Id); - var list = model == null ? _debitingStorage.GetFullList() : _debitingStorage.GetFilteredList(model); + + // list хранит весь список в случае, если model пришло со значением null на вход метода + var list = model == null ? _debitingStorage.GetFullList() : _debitingStorage.GetFilteredList(model); + if (list == null) { _logger.LogWarning("ReadList return null list"); return null; } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; } - public bool Update(DebitingBindingModel model) + // Создание операции на снятие наличных + public bool Create(DebitingBindingModel model) + { + CheckModel(model); + + if (!CheckCardPeriod(model)) + { + model.Status = StatusEnum.Карта_просрочена; + } + else + { + model.Status = StatusEnum.Открыта; + } + + if (_debitingStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + + return true; + } + + // Обновление операции на снятие наличных + public bool Update(DebitingBindingModel model) { CheckModel(model); @@ -100,21 +109,44 @@ namespace BankBusinessLogic.BusinessLogics.Client return true; } - private void CheckModel(DebitingBindingModel model, bool withParams = true) + // Удаление операции на снятие наличных + public bool Delete(DebitingBindingModel model) + { + CheckModel(model, false); + + _logger.LogInformation("Delete. Id:{Id}", model.Id); + + if (_debitingStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + + return true; + } + + // Проверка входного аргумента для методов Insert, Update и Delete + private void CheckModel(DebitingBindingModel model, bool withParams = true) { if (model == null) { throw new ArgumentNullException(nameof(model)); } - if (!withParams) + + // Так как при удалении передаём как параметр false + if (!withParams) { return; } - if (model.Sum <= 0) + + // Проверка на корректность снятия суммы + if (model.Sum <= 0) { throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum)); } - if (model.DateClose < model.DateOpen) + + // Проверка на корректную дату операции + if (model.DateClose < model.DateOpen) { 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); } - //проверка карты на просроченность + // Проверка карты на просроченность bool CheckCardPeriod(DebitingBindingModel model) { var card = _cardStorage.GetElement(new CardSearchModel @@ -131,7 +163,7 @@ namespace BankBusinessLogic.BusinessLogics.Client Id = model.CardId }); - //если карта просрочена + // Если карта просрочена if (card.Period < DateTime.Now) { return false; diff --git a/Bank/BankBusinessLogic/BusinessLogic/Reports/ReportCashierLogic.cs b/Bank/BankBusinessLogic/BusinessLogic/Reports/ReportCashierLogic.cs index 17ebf9a..823bc4e 100644 --- a/Bank/BankBusinessLogic/BusinessLogic/Reports/ReportCashierLogic.cs +++ b/Bank/BankBusinessLogic/BusinessLogic/Reports/ReportCashierLogic.cs @@ -14,24 +14,26 @@ using BankDataModels.Enums; 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 ICashWithdrawalStorage _cashWithdrawalStorage; - private readonly IClientStorage _clientStorage; private readonly IDebitingStorage _debitingStorage; - private readonly ICardStorage _cardStorage; private readonly AbstractSaveToExcel _saveToExcel; private readonly AbstractSaveToWord _saveToWord; private readonly AbstractSaveToPdf _saveToPdf; - private readonly MailKitWorker _mailKitWorker; + private readonly MailKitWorker _mailKitWorker; - //инициализируем поля класса через контейнер - public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage, - IClientStorage clientStorage, AbstractSaveToExcel saveToExcel, - AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf, + // Конструктор (Инициализируем поля класса через контейнер) + public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage, + IClientStorage clientStorage, AbstractSaveToExcel saveToExcel, + AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf, IDebitingStorage debitingStorage, ICardStorage cardStorage, MailKitWorker mailKitWorker) { _moneyTransferStorage = moneyTransferStorage; @@ -47,10 +49,10 @@ namespace BankBusinessLogic.BusinessLogics.Reports _mailKitWorker = mailKitWorker; } - //формирование списка переводов между счетами за период + // Формирование списка переводов между счетами за период public List? 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 { OperationId = x.Id, @@ -62,7 +64,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports .ToList(); } - //формирование списка выдаци наличных со счёта за период + // Формирование списка выдачи наличных со счёта за период public List? GetCashWithrawals(ReportBindingModel model) { return _cashWithdrawalStorage.GetFilteredList(new CashWithdrawalSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo }) @@ -77,7 +79,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports .ToList(); } - //формирование списка выдаци наличных со счёта за период + // Формирование списка выдачи наличных со счёта за период public List? GetDebitings(ReportBindingModel model) { List CardIdList = new(); @@ -87,14 +89,14 @@ namespace BankBusinessLogic.BusinessLogics.Reports AccountId = model.AccountId }); - foreach(var index in list) + foreach (var index in list) { CardIdList.Add(index.Id); } List totalList = new(); - foreach(var index in CardIdList) + foreach (var index in CardIdList) { var result = _debitingStorage.GetFilteredList(new DebitingSearchModel { @@ -102,12 +104,12 @@ namespace BankBusinessLogic.BusinessLogics.Reports }); totalList.AddRange(result); - } + } return totalList; } - //формирование полного имени клиента для отчёта + // Формирование полного имени клиента для отчёта public string GetFullName(ReportBindingModel model) { var client = _clientStorage.GetElement(new ClientSearchModel @@ -118,8 +120,8 @@ namespace BankBusinessLogic.BusinessLogics.Reports return client.Surname + " " + client.Name + " " + client.Patronymic; } - //Сохранение мороженных в файл-Word - public void SaveAccountsToWordFile(ReportBindingModel model) + // Сохранение банковских счетов в файл-Word + public void SaveAccountsToWordFile(ReportBindingModel model) { _saveToWord.CreateDoc(new WordInfo { @@ -130,9 +132,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports Debiting = GetDebitings(model) }, 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() { @@ -145,7 +147,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports }); } - //Сохранение заготовок с указаеним изделий в файл-Excel + // Сохранение банковских счетов с указаением операций по ним в файл-Excel public void SaveAccountsToExcelFile(ReportBindingModel model) { _saveToExcel.CreateReport(new ExcelInfo @@ -157,9 +159,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports Debiting = GetDebitings(model) }, 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() { @@ -172,7 +174,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports }); } - //Сохранение заказов в файл-Pdf + // Сохранение Банковских счетов с переводами по ним в файл-Pdf public ReportCashierViewModelForHTML SaveAccountsToPdfFile(ReportBindingModel model) { var listMoneyTransfers = GetMoneyTransfers(model); @@ -190,23 +192,23 @@ namespace BankBusinessLogic.BusinessLogics.Reports ReportCashWithdrawal = listCashWithdrawals }); - byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_счетам.pdf"); + byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_счетам.pdf"); File.Delete("../BankRestAPI/Отчёт_по_счетам.pdf"); _mailKitWorker.SendMailAsync(new() - { - MailAddress = model.Email, - Subject = "Отчёт по счетам", - Text = $"За период с {model.DateFrom} " + - $"по {model.DateTo}.", - File = pdf, - Role = model.Role, + { + MailAddress = model.Email, + Subject = "Отчёт по счетам", + Text = $"За период с {model.DateFrom} " + + $"по {model.DateTo}.", + File = pdf, + Role = model.Role, TypeDoc = TypeDocEnum.PDF - }); + }); - //возврат полученных списков для отображения на вебе - return new ReportCashierViewModelForHTML + // Возврат полученных списков для отображения на вебе + return new ReportCashierViewModelForHTML { ReportCashWithdrawal = listCashWithdrawals, diff --git a/Bank/BankBusinessLogic/BusinessLogic/Reports/ReportClientLogic.cs b/Bank/BankBusinessLogic/BusinessLogic/Reports/ReportClientLogic.cs index 05d96c1..7f056a8 100644 --- a/Bank/BankBusinessLogic/BusinessLogic/Reports/ReportClientLogic.cs +++ b/Bank/BankBusinessLogic/BusinessLogic/Reports/ReportClientLogic.cs @@ -12,103 +12,112 @@ using BankContracts.ViewModels.Cashier.ViewModels; using BankContracts.SearchModels.Cashier; using BankContracts.ViewModels.Client.ViewModels; using BankContracts.ViewModels.Reports; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace BankBusinessLogic.BusinessLogics.Reports { - public class ReportClientLogic : IReportClientLogic - { - private readonly ICreditingStorage _creditingStorage; - private readonly IDebitingStorage _debitingStorage; - private readonly ICardStorage _cardStorage; - private readonly IMoneyTransferStorage _moneyTransferStorage; - private readonly IClientStorage _clientStorage; + // Реализация бизнес-логики отчётов по клиенту + public class ReportClientLogic : IReportClientLogic + { + private readonly ICardStorage _cardStorage; + private readonly IClientStorage _clientStorage; - private readonly AbstractSaveToExcel _saveToExcel; - private readonly AbstractSaveToWord _saveToWord; - private readonly AbstractSaveToPdf _saveToPdf; + private readonly ICreditingStorage _creditingStorage; + private readonly IDebitingStorage _debitingStorage; + private readonly IMoneyTransferStorage _moneyTransferStorage; - private readonly MailKitWorker _mailKitWorker; + private readonly AbstractSaveToExcel _saveToExcel; + private readonly AbstractSaveToWord _saveToWord; + private readonly AbstractSaveToPdf _saveToPdf; - public ReportClientLogic(ICreditingStorage creditingStorage, IDebitingStorage debitingStorage, - AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf, - ICardStorage cardStorage, IMoneyTransferStorage moneyTransferStorage, - MailKitWorker mailKitWorker, IClientStorage clientStorage) - { - _creditingStorage = creditingStorage; - _debitingStorage = debitingStorage; - _cardStorage = cardStorage; - _moneyTransferStorage = moneyTransferStorage; - _clientStorage = clientStorage; + private readonly MailKitWorker _mailKitWorker; - _saveToExcel = saveToExcel; - _saveToWord = saveToWord; - _saveToPdf = saveToPdf; + public ReportClientLogic(ICreditingStorage creditingStorage, IDebitingStorage debitingStorage, + AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf, + ICardStorage cardStorage, IMoneyTransferStorage moneyTransferStorage, + MailKitWorker mailKitWorker, IClientStorage clientStorage) + { + _creditingStorage = creditingStorage; + _debitingStorage = debitingStorage; + _cardStorage = cardStorage; + _moneyTransferStorage = moneyTransferStorage; + _clientStorage = clientStorage; + + _saveToExcel = saveToExcel; + _saveToWord = saveToWord; + _saveToPdf = saveToPdf; _mailKitWorker = mailKitWorker; - } + } - public List? GetCrediting(ReportBindingModel model) - { - return _creditingStorage.GetFilteredList(new CreditingSearchModel - { - DateFrom = model.DateFrom, - DateTo = model.DateTo, - }).Select(x => new ReportClientViewModel - { - OperationId = x.Id, + // Информация о пополнениях для отчёта + public List? GetCrediting(ReportBindingModel model) + { + return _creditingStorage.GetFilteredList(new CreditingSearchModel + { + DateFrom = model.DateFrom, + DateTo = model.DateTo, + }).Select(x => new ReportClientViewModel + { + OperationId = x.Id, CardNumber = x.CardNumber, SumOperation = x.Sum, - DateComplite = x.DateOpen - }).ToList(); - } + DateComplite = x.DateOpen + }).ToList(); + } - public List? GetDebiting(ReportBindingModel model) - { - return _debitingStorage.GetFilteredList(new DebitingSearchModel - { - DateTo = model.DateFrom, - DateFrom = model.DateTo, - }).Select(x => new ReportClientViewModel - { - OperationId = x.Id, - CardNumber = x.CardNumber, - SumOperation = x.Sum, - DateComplite = x.DateClose - }).ToList(); - } + // Информация о снятиях для отчёта + public List? GetDebiting(ReportBindingModel model) + { + return _debitingStorage.GetFilteredList(new DebitingSearchModel + { + DateTo = model.DateFrom, + DateFrom = model.DateTo, + }).Select(x => new ReportClientViewModel + { + OperationId = x.Id, + CardNumber = x.CardNumber, + SumOperation = x.Sum, + DateComplite = x.DateClose + }).ToList(); + } - //для excel отчёта по переводам между счетов - public List? GetMoneyTransfer(ReportBindingModel model) - { - //список счетов по выбранным картам - List accountId = new(); + // Для Excel отчёта по переводам между счетов + public List? GetMoneyTransfer(ReportBindingModel model) + { + // Список счетов по выбранным картам + List accountId = new(); - foreach(var index in model.CardList) - { - accountId.Add(_cardStorage.GetElement(new CardSearchModel { Id = index}).AccountId); - } + foreach (var index in model.CardList) + { + accountId.Add(_cardStorage.GetElement(new CardSearchModel { Id = index }).AccountId); + } - var list = accountId.ToHashSet().ToList(); + var list = accountId.ToHashSet().ToList(); - List totalList = new(); + List totalList = new(); - foreach (var index in list) - { + foreach (var index in list) + { var result = _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { AccountSenderId = index, - AccountPayeeId = index + AccountPayeeId = index }).OrderBy(x => x.AccountSenderId).ToList(); - totalList.AddRange(result); + totalList.AddRange(result); } - return totalList; - } + return totalList; + } - //для excel отчёта по пополнениям карты + // Для Excel отчёта по пополнениям карты public List GetExcelCrediting(ReportBindingModel model) - { + { List totalList = new(); foreach (var index in model.CardList) @@ -124,7 +133,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports return totalList; } - //для excel отчёта по снятиям с карты + // Для Excel отчёта по снятиям с карты public List GetExcelDebiting(ReportBindingModel model) { List totalList = new(); @@ -142,16 +151,17 @@ namespace BankBusinessLogic.BusinessLogics.Reports return totalList; } - public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum) - { + // Сохранение в файл-Excel для клиентов + public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum) + { byte[] excel = Array.Empty(); if (operationEnum == OfficeOperationEnum.Между_cчетами) - { + { _saveToExcel.CreateReport(new ExcelInfo { FileName = model.FileName, - Title = "Отчёт по переводам", + Title = "Отчёт по переводам", MoneyTransfer = GetMoneyTransfer(model) }, operationEnum); @@ -162,12 +172,12 @@ namespace BankBusinessLogic.BusinessLogics.Reports if (operationEnum == OfficeOperationEnum.Пополнение_карт) { - _saveToExcel.CreateReport(new ExcelInfo - { - FileName = model.FileName, - Title = "Отчёт по пополнениям (переводам из налички на карту)", - Crediting = GetExcelCrediting(model) - }, operationEnum); + _saveToExcel.CreateReport(new ExcelInfo + { + FileName = model.FileName, + Title = "Отчёт по пополнениям (переводам из налички на карту)", + Crediting = GetExcelCrediting(model) + }, operationEnum); excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по пополнениям.xlsx"); @@ -199,8 +209,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports }); } - public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum) - { + // Сохранение в файл-Word для клиентов + public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum) + { byte[] word = Array.Empty(); if (operationEnum == OfficeOperationEnum.Между_cчетами) @@ -256,11 +267,11 @@ namespace BankBusinessLogic.BusinessLogics.Reports }); } - //отчёт в формате PDF для клиента + // Сохранение в файл-Pdf для клиента public ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model) { - var listCreditings = GetCrediting(model); - var listDebitings = GetDebiting(model); + var listCreditings = GetCrediting(model); + var listDebitings = GetDebiting(model); _saveToPdf.CreateDoc(new PdfInfo { @@ -269,31 +280,31 @@ namespace BankBusinessLogic.BusinessLogics.Reports DateFrom = model.DateFrom!.Value, DateTo = model.DateTo!.Value, ReportCrediting = listCreditings, - ReportDebiting = listDebitings - }); + ReportDebiting = listDebitings + }); - byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_картам.pdf"); + byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_картам.pdf"); _mailKitWorker.SendMailAsync(new() - { - MailAddress = model.Email, - Subject = "Отчёт по картам", - Text = $"За период с {model.DateFrom} " + - $"по {model.DateTo}.", - File = pdf, - Role = model.Role, + { + MailAddress = model.Email, + Subject = "Отчёт по картам", + Text = $"За период с {model.DateFrom} " + + $"по {model.DateTo}.", + File = pdf, + Role = model.Role, TypeDoc = TypeDocEnum.PDF }); File.Delete("../BankRestAPI/Отчёт_по_картам.pdf"); - //возврат полученных списков для отображения на вебе + // Возврат полученных списков для отображения на вебе return new ReportClientViewModelForHTML - { - ReportCrediting = listCreditings, + { + ReportCrediting = listCreditings, - ReportDebiting = listDebitings - }; + ReportDebiting = listDebitings + }; } } } diff --git a/Bank/BankBusinessLogic/MailWorker/MailKitWorker.cs b/Bank/BankBusinessLogic/MailWorker/MailKitWorker.cs index 5f31083..5062f9e 100644 --- a/Bank/BankBusinessLogic/MailWorker/MailKitWorker.cs +++ b/Bank/BankBusinessLogic/MailWorker/MailKitWorker.cs @@ -16,7 +16,7 @@ using BankContracts.BindingModels.Messages; namespace BankBusinessLogic.MailWorker { - //класс, отвечающий за отправку письма + // Класс, отвечающий за отправку письма на почту public class MailKitWorker { private string _mailLogin = string.Empty; @@ -29,7 +29,8 @@ namespace BankBusinessLogic.MailWorker private readonly ILogger logger; - public MailKitWorker(ILogger logger) + // Конструктор + public MailKitWorker(ILogger logger) { this.logger = logger; } @@ -58,9 +59,9 @@ namespace BankBusinessLogic.MailWorker 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")); } diff --git a/Bank/BankClientApp/APIClient.cs b/Bank/BankClientApp/APIClient.cs index 2f2f138..a013251 100644 --- a/Bank/BankClientApp/APIClient.cs +++ b/Bank/BankClientApp/APIClient.cs @@ -25,7 +25,7 @@ namespace BankСlientApp ErrorMessage = error; } - //Get-запрос + // Get-запрос public static T? GetRequest(string requestUrl) { var response = _client.GetAsync(requestUrl); @@ -42,7 +42,7 @@ namespace BankСlientApp } } - //Post-запрос + // Post-запрос public static void PostRequest(string requestUrl, T model) { var json = JsonConvert.SerializeObject(model); @@ -58,7 +58,7 @@ namespace BankСlientApp } } - //Post-запрос для получения данных + // Post-запрос для получения данных public static T? PostRequestReport(string requestUrl, U model) { var json = JsonConvert.SerializeObject(model); diff --git a/Bank/BankClientApp/Views/Home/CardsList.cshtml b/Bank/BankClientApp/Views/Home/CardsList.cshtml index 419f857..4c7da2a 100644 --- a/Bank/BankClientApp/Views/Home/CardsList.cshtml +++ b/Bank/BankClientApp/Views/Home/CardsList.cshtml @@ -8,7 +8,7 @@ }
-

Карты

+

Банковские карты

diff --git a/Bank/BankClientApp/Views/Home/CreateCard.cshtml b/Bank/BankClientApp/Views/Home/CreateCard.cshtml index 10c8758..6e9ac46 100644 --- a/Bank/BankClientApp/Views/Home/CreateCard.cshtml +++ b/Bank/BankClientApp/Views/Home/CreateCard.cshtml @@ -2,8 +2,8 @@ ViewData["Title"] = "Создание карты"; } -
-

Создание карты

+
+

Создание банковской карты

@@ -30,7 +30,7 @@
-
+
diff --git a/Bank/BankDataModels/Models/Cashier/IAccountModel.cs b/Bank/BankDataModels/Models/Cashier/IAccountModel.cs index 8c5bb23..f21029a 100644 --- a/Bank/BankDataModels/Models/Cashier/IAccountModel.cs +++ b/Bank/BankDataModels/Models/Cashier/IAccountModel.cs @@ -7,9 +7,10 @@ using System.Threading.Tasks; namespace BankDataModels.Models.Cashier { - //банковский счёт + // Интерфейс, отвечающий за банковский cчёт public interface IAccountModel : IId { + // Номер счёта string AccountNumber { get; } int CashierId { get; } @@ -18,8 +19,10 @@ namespace BankDataModels.Models.Cashier string PasswordAccount { get; } + // Сумма на счёте double Balance { get; } + // Дата открытия DateTime DateOpen { get; } } } diff --git a/Bank/BankDataModels/Models/Cashier/ICashWithdrawalModel.cs b/Bank/BankDataModels/Models/Cashier/ICashWithdrawalModel.cs index 690829d..ae6530c 100644 --- a/Bank/BankDataModels/Models/Cashier/ICashWithdrawalModel.cs +++ b/Bank/BankDataModels/Models/Cashier/ICashWithdrawalModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace BankDataModels.Models.Cashier { - //выдача наличных + // Интерфейс, отвечающий за выдачу наличных public interface ICashWithdrawalModel : IId { int DebitingId { get; } @@ -15,8 +15,10 @@ namespace BankDataModels.Models.Cashier int CashierId { get; } + // Сумма наличисления наличных int Sum { get; } + // Дата выдачи наличных DateTime DateOperation { get; } } } diff --git a/Bank/BankDataModels/Models/Cashier/ICashierModel.cs b/Bank/BankDataModels/Models/Cashier/ICashierModel.cs index debf650..4455715 100644 --- a/Bank/BankDataModels/Models/Cashier/ICashierModel.cs +++ b/Bank/BankDataModels/Models/Cashier/ICashierModel.cs @@ -6,19 +6,25 @@ using System.Threading.Tasks; namespace BankDataModels.Models.Cashier { - //клиент + // Интерфейс, отвечающий за кассира public interface ICashierModel : IId { + // Пароль от аккаунта кассира string Password { get; } + // Имя кассира string Name { get; } + // Фамилия кассира string Surname { get; } + // Отчество кассира string Patronymic { get; } + // Отчество кассира string Email { get; } + // Мобильный телефон кассира string Telephone { get; } } } diff --git a/Bank/BankDataModels/Models/Cashier/IMoneyTransferModel.cs b/Bank/BankDataModels/Models/Cashier/IMoneyTransferModel.cs index c5f4d4e..7906954 100644 --- a/Bank/BankDataModels/Models/Cashier/IMoneyTransferModel.cs +++ b/Bank/BankDataModels/Models/Cashier/IMoneyTransferModel.cs @@ -6,15 +6,17 @@ using System.Threading.Tasks; namespace BankDataModels.Models.Cashier { - //перевод денег + // Интерфейс, отвечающий за перевод денег public interface IMoneyTransferModel : IId { + // Сумма перевода int Sum { get; } int? AccountSenderId { get; } int AccountPayeeId { get; } + // Дата перевода DateTime DateOperation { get; } int? CreditingId { get; } diff --git a/Bank/BankDataModels/Models/Client/ICreditingModel.cs b/Bank/BankDataModels/Models/Client/ICreditingModel.cs index 5abfe1a..1ddb204 100644 --- a/Bank/BankDataModels/Models/Client/ICreditingModel.cs +++ b/Bank/BankDataModels/Models/Client/ICreditingModel.cs @@ -7,17 +7,21 @@ using System.Threading.Tasks; namespace BankDataModels.Models.Client { - //пополнение карты + // Интерфейс, отвечающий за пополнение карты public interface ICreditingModel : IId { int CardId { get; } + // Сумма на пополнение карты int Sum { get; } + // Дата открытия заявки на пополнение DateTime DateOpen { get; } - DateTime? DateClose { get; } + // Дата пополнения карты + DateTime? DateClose { get; } + // Статус заявки StatusEnum Status { get; } } } diff --git a/Bank/BankDataModels/Models/Client/IDebitingModel.cs b/Bank/BankDataModels/Models/Client/IDebitingModel.cs index 1010918..c93a1fb 100644 --- a/Bank/BankDataModels/Models/Client/IDebitingModel.cs +++ b/Bank/BankDataModels/Models/Client/IDebitingModel.cs @@ -7,17 +7,21 @@ using System.Threading.Tasks; namespace BankDataModels.Models.Client { - //снятие денег с карты + // Интерфейс, отвечающий за получение наличных по карте public interface IDebitingModel : IId { int CardId { get; } - int Sum { get; } + // Сумма снятия с карты + int Sum { get; } + // Дата открытия заявки DateTime DateOpen { get; } + // Дата снятия денег DateTime? DateClose { get; } + // Статус заявки StatusEnum Status { get; } } } diff --git a/Bank/BankDataModels/Models/Client/IСardModel.cs b/Bank/BankDataModels/Models/Client/IСardModel.cs index 977b36f..b40c2f8 100644 --- a/Bank/BankDataModels/Models/Client/IСardModel.cs +++ b/Bank/BankDataModels/Models/Client/IСardModel.cs @@ -6,17 +6,20 @@ using System.Threading.Tasks; namespace BankDataModels.Models.Client { - //банковская карта + // Интерфейс, отвечающий за банковскую карту public interface ICardModel : IId { int ClientID { get; } int AccountId { get; } - + + // Номер банковской карты string Number { get; } + // Код CVC string CVC { get; } + // Период пользования картой DateTime Period { get; } } } diff --git a/Bank/BankDataModels/Models/Client/IСlientModel.cs b/Bank/BankDataModels/Models/Client/IСlientModel.cs index e381a63..5ce9b94 100644 --- a/Bank/BankDataModels/Models/Client/IСlientModel.cs +++ b/Bank/BankDataModels/Models/Client/IСlientModel.cs @@ -6,19 +6,25 @@ using System.Threading.Tasks; namespace BankDataModels.Models.Client { - //клиент + // Интерфейс, отвечающий за клиента public interface IClientModel : IId { + // Пароль от аккаунта клиента string Password { get; } + // Имя клиента string Name { get; } + // Фамилия клиента string Surname { get; } + // Отчество клиента string Patronymic { get; } + // Электронная почта клиента string Email { get; } + // Мобильный телефон клиента string Telephone { get; } } } diff --git a/Bank/BankDataModels/Models/IMessageInfoModel.cs b/Bank/BankDataModels/Models/IMessageInfoModel.cs index 5abdba1..0be5055 100644 --- a/Bank/BankDataModels/Models/IMessageInfoModel.cs +++ b/Bank/BankDataModels/Models/IMessageInfoModel.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; namespace BankDataModels.Models { + // Интерфейс, отвечающий за сообщения (на почту) public interface IMessageInfoModel : IId { string MessageId { get; }