Подправил 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>
<PackageReference Include="DocumentFormat.OpenXml" Version="2.19.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="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
</ItemGroup>

View File

@ -6,9 +6,15 @@ 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
{
private readonly ILogger _logger;
@ -17,6 +23,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
private readonly ICashWithdrawalLogic _cashWithdrawalLogic;
private readonly IMoneyTransferLogic _moneyTransferLogic;
// Конструктор
public AccountLogic(ILogger<AccountLogic> 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<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);
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);
@ -144,7 +156,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
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 })
}).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()
@ -173,7 +185,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return result;
}
//проверка входного аргумента для методов Insert, Update и Delete
// Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(AccountBindingModel model, bool withParams = true)
{
if (model == null)
@ -181,41 +193,42 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
throw new ArgumentNullException(nameof(model));
}
//так как при удалении передаём как параметр false
// Так как при удалении передаём как параметр false
if (!withParams)
{
return;
}
//проверка на наличие номера счёта
// Проверка на наличие номера счёта
if (string.IsNullOrEmpty(model.AccountNumber))
{
throw new ArgumentNullException("Отсутствие номера у счёта", nameof(model.AccountNumber));
}
//проверка на наличие id владельца
// Проверка на наличие 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) {
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("Счёт с таким номером уже существует");

View File

@ -7,9 +7,15 @@ 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
{
private readonly ILogger _logger;
@ -18,6 +24,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
private readonly IDebitingStorage _debitingStorage;
// Конструктор
public CashWithdrawalLogic(ILogger<CashWithdrawalLogic> 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<CashWithdrawalViewModel>? 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));

View File

@ -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
{
private readonly ILogger _logger;
private readonly ICashierStorage _cashierStorage;
// Конструктор
public CashierLogic(ILogger<CashierLogic> logger, ICashierStorage cashierStorage)
{
_logger = logger;
_cashierStorage = cashierStorage;
}
// Вывод конкретного клиента
public CashierViewModel? ReadElement(CashierSearchModel model)
{
if (model == null)
@ -43,12 +52,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return element;
}
// Вывод отфильтрованного списка
public List<CashierViewModel>? ReadList(CashierSearchModel? model)
{
_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("Аккаунт с таким логином уже есть");

View File

@ -7,9 +7,15 @@ 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
{
private readonly ILogger _logger;
@ -18,6 +24,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
public readonly ICreditingStorage _creditingStorage;
// Конструктор
public MoneyTransferLogic(ILogger<MoneyTransferLogic> 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<MoneyTransferViewModel>? 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));

View File

@ -8,37 +8,110 @@ 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 CardLogic(ILogger<CardLogic> logger, ICardStorage cardStorage, IAccountLogic accountLogic,
IDebitingLogic debitingLogic, ICreditingLogic creditingLogic) {
IDebitingLogic debitingLogic, ICreditingLogic creditingLogic)
{
_logger = logger;
_cardStorage = cardStorage;
_accountLogic = accountLogic;
_debitingLogic = debitingLogic;
_creditingLogic = creditingLogic;
}
// Вывод конкретной банковской карты
public CardViewModel? ReadElement(CardSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. CardNumber:{Number}.Id:{ Id}", model.Number, model.Id);
var element = _cardStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element;
}
// Вывод всего списка банковских карт
public List<CardViewModel>? ReadList(CardSearchModel? model)
{
_logger.LogInformation("ReadList. CardId:{Id}", model?.Id);
// list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _cardStorage.GetFullList() : _cardStorage.GetFilteredList(model);
if (list == null)
{
_logger.LogWarning("ReadList return null list");
return null;
}
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list;
}
// Создание банковской карты
public bool Create(CardBindingModel model)
{
CheckModel(model);
if (_cardStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
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)
{
CheckModel(model, false);
@ -51,55 +124,16 @@ namespace BankBusinessLogic.BusinessLogics.Client
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()
{
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));
.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,
@ -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));
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;
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});
result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum });
}
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("Карта с таким ноиером уже есть");
@ -155,6 +210,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
ClientId = model.ClientID
});
// Проверка привязан ли счёт к данному клиенту
if (accountElement != null && accountElement.ClientId != model.ClientID)
{
throw new InvalidOperationException("Это не счёт данного клиента");

View File

@ -4,123 +4,186 @@ 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 ClientLogic(ILogger<ClientLogic> logger, IClientStorage clientStorage) {
// Конструктор
public ClientLogic(ILogger<ClientLogic> logger, IClientStorage clientStorage)
{
_logger = logger;
_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)
{
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;
}
// Вывод отфильтрованного списка
public List<ClientViewModel>? 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));
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("Клиент с такой почтой уже есть");

View File

@ -5,21 +5,73 @@ 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
{
private readonly ILogger _logger;
private readonly ICreditingStorage _creditingStorage;
private readonly ICardStorage _cardStorage;
// Конструктор
public CreditingLogic(ILogger<CreditingLogic> logger, ICreditingStorage creditingStorage, ICardStorage cardStorage) {
_logger = logger;
_creditingStorage = creditingStorage;
_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)
{
CheckModel(model);
@ -43,73 +95,57 @@ namespace BankBusinessLogic.BusinessLogics.Client
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)
{
CheckModel(model);
if (_creditingStorage.Update(model) == null)
{
_logger.LogWarning("Update 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;
}
// Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(CreditingBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
// Так как при удалении передаём как параметр false
if (!withParams)
{
return;
}
// Проверка на корректность суммы пополнения
if (model.Sum <= 0)
{
throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum));
}
// Проверка на корректную дату операции
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;
}
}

View File

@ -5,9 +5,15 @@ 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
{
private readonly ILogger _logger;
@ -16,12 +22,56 @@ namespace BankBusinessLogic.BusinessLogics.Client
private readonly ICardStorage _cardStorage;
// Конструктор
public DebitingLogic(ILogger<DebitingLogic> logger, IDebitingStorage debitingStorage, ICardStorage cardStorage) {
_logger = logger;
_debitingStorage = debitingStorage;
_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)
{
CheckModel(model);
@ -44,48 +94,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
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)
{
CheckModel(model);
@ -100,20 +109,43 @@ namespace BankBusinessLogic.BusinessLogics.Client
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)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
// Так как при удалении передаём как параметр false
if (!withParams)
{
return;
}
// Проверка на корректность снятия суммы
if (model.Sum <= 0)
{
throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum));
}
// Проверка на корректную дату операции
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;

View File

@ -14,13 +14,15 @@ using BankDataModels.Enums;
namespace BankBusinessLogic.BusinessLogics.Reports
{
// Реализация бизнес-логики отчётов по кассиру
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;
@ -28,7 +30,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
private readonly MailKitWorker _mailKitWorker;
//инициализируем поля класса через контейнер
// Конструктор (Инициализируем поля класса через контейнер)
public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage,
IClientStorage clientStorage, AbstractSaveToExcel saveToExcel,
AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
@ -47,10 +49,10 @@ namespace BankBusinessLogic.BusinessLogics.Reports
_mailKitWorker = mailKitWorker;
}
//формирование списка переводов между счетами за период
// Формирование списка переводов между счетами за период
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
{
OperationId = x.Id,
@ -62,7 +64,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
.ToList();
}
//формирование списка выдаци наличных со счёта за период
// Формирование списка выдачи наличных со счёта за период
public List<ReportCashierViewModel>? 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<DebitingViewModel>? GetDebitings(ReportBindingModel model)
{
List<int> 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<DebitingViewModel> totalList = new();
foreach(var index in CardIdList)
foreach (var index in CardIdList)
{
var result = _debitingStorage.GetFilteredList(new DebitingSearchModel
{
@ -107,7 +109,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
return totalList;
}
//формирование полного имени клиента для отчёта
// Формирование полного имени клиента для отчёта
public string GetFullName(ReportBindingModel model)
{
var client = _clientStorage.GetElement(new ClientSearchModel
@ -118,7 +120,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
return client.Surname + " " + client.Name + " " + client.Patronymic;
}
//Сохранение мороженных в файл-Word
// Сохранение банковских счетов в файл-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);
@ -205,7 +207,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
TypeDoc = TypeDocEnum.PDF
});
//возврат полученных списков для отображения на вебе
// Возврат полученных списков для отображения на вебе
return new ReportCashierViewModelForHTML
{
ReportCashWithdrawal = listCashWithdrawals,

View File

@ -12,16 +12,23 @@ 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 ICardStorage _cardStorage;
private readonly IClientStorage _clientStorage;
private readonly ICreditingStorage _creditingStorage;
private readonly IDebitingStorage _debitingStorage;
private readonly ICardStorage _cardStorage;
private readonly IMoneyTransferStorage _moneyTransferStorage;
private readonly IClientStorage _clientStorage;
private readonly AbstractSaveToExcel _saveToExcel;
private readonly AbstractSaveToWord _saveToWord;
@ -47,6 +54,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
_mailKitWorker = mailKitWorker;
}
// Информация о пополнениях для отчёта
public List<ReportClientViewModel>? GetCrediting(ReportBindingModel model)
{
return _creditingStorage.GetFilteredList(new CreditingSearchModel
@ -62,6 +70,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
}).ToList();
}
// Информация о снятиях для отчёта
public List<ReportClientViewModel>? GetDebiting(ReportBindingModel model)
{
return _debitingStorage.GetFilteredList(new DebitingSearchModel
@ -77,15 +86,15 @@ namespace BankBusinessLogic.BusinessLogics.Reports
}).ToList();
}
//для excel отчёта по переводам между счетов
// Для Excel отчёта по переводам между счетов
public List<MoneyTransferViewModel>? GetMoneyTransfer(ReportBindingModel model)
{
//список счетов по выбранным картам
// Список счетов по выбранным картам
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();
@ -106,7 +115,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
return totalList;
}
//для excel отчёта по пополнениям карты
// Для Excel отчёта по пополнениям карты
public List<CreditingViewModel> GetExcelCrediting(ReportBindingModel model)
{
List<CreditingViewModel> totalList = new();
@ -124,7 +133,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
return totalList;
}
//для excel отчёта по снятиям с карты
// Для Excel отчёта по снятиям с карты
public List<DebitingViewModel> GetExcelDebiting(ReportBindingModel model)
{
List<DebitingViewModel> totalList = new();
@ -142,6 +151,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
return totalList;
}
// Сохранение в файл-Excel для клиентов
public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
{
byte[] excel = Array.Empty<byte>();
@ -199,6 +209,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
});
}
// Сохранение в файл-Word для клиентов
public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
{
byte[] word = Array.Empty<byte>();
@ -256,7 +267,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
});
}
//отчёт в формате PDF для клиента
// Сохранение в файл-Pdf для клиента
public ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model)
{
var listCreditings = GetCrediting(model);
@ -287,7 +298,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
File.Delete("../BankRestAPI/Отчёт_поартам.pdf");
//возврат полученных списков для отображения на вебе
// Возврат полученных списков для отображения на вебе
return new ReportClientViewModelForHTML
{
ReportCrediting = listCreditings,

View File

@ -16,7 +16,7 @@ using BankContracts.BindingModels.Messages;
namespace BankBusinessLogic.MailWorker
{
//класс, отвечающий за отправку письма
// Класс, отвечающий за отправку письма на почту
public class MailKitWorker
{
private string _mailLogin = string.Empty;
@ -29,6 +29,7 @@ namespace BankBusinessLogic.MailWorker
private readonly ILogger logger;
// Конструктор
public MailKitWorker(ILogger<MailKitWorker> 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"));
}

View File

@ -25,7 +25,7 @@ namespace BankСlientApp
ErrorMessage = error;
}
//Get-запрос
// Get-запрос
public static T? GetRequest<T>(string requestUrl)
{
var response = _client.GetAsync(requestUrl);
@ -42,7 +42,7 @@ namespace BankСlientApp
}
}
//Post-запрос
// Post-запрос
public static void PostRequest<T>(string requestUrl, T 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)
{
var json = JsonConvert.SerializeObject(model);

View File

@ -8,7 +8,7 @@
}
<div class="text-center">
<h1 class="display-4">Карты</h1>
<h1 class="display-4">Банковские карты</h1>
</div>
<div class="text-center">

View File

@ -2,8 +2,8 @@
ViewData["Title"] = "Создание карты";
}
<div class="text-center">
<h2 class="display-4">Создание карты</h2>
<div class="text-center mb-2">
<h2 class="display-4">Создание банковской карты</h2>
</div>
<form method="post">
<div class="row mb-2">
@ -30,7 +30,7 @@
<input type="date" class="form-control" name="period" id="period" required />
</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" />
</div>
</form>

View File

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

View File

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

View File

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

View File

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

View File

@ -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; }
// Статус заявки
StatusEnum Status { get; }
}
}

View File

@ -7,17 +7,21 @@ using System.Threading.Tasks;
namespace BankDataModels.Models.Client
{
//снятие денег с карты
// Интерфейс, отвечающий за получение наличных по карте
public interface IDebitingModel : IId
{
int CardId { get; }
// Сумма снятия с карты
int Sum { get; }
// Дата открытия заявки
DateTime DateOpen { get; }
// Дата снятия денег
DateTime? DateClose { get; }
// Статус заявки
StatusEnum Status { get; }
}
}

View File

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

View File

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

View File

@ -6,6 +6,7 @@ using System.Threading.Tasks;
namespace BankDataModels.Models
{
// Интерфейс, отвечающий за сообщения (на почту)
public interface IMessageInfoModel : IId
{
string MessageId { get; }