Подправил 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

@ -1,22 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" /> <PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" />
<PackageReference Include="MailKit" Version="4.5.0" /> <PackageReference Include="MailKit" Version="4.5.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.18">
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" /> <PrivateAssets>all</PrivateAssets>
</ItemGroup> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\BankContracts\BankContracts.csproj" /> <ProjectReference Include="..\BankContracts\BankContracts.csproj" />
<ProjectReference Include="..\BankDatabaseImplement\BankDatabaseImplement.csproj" /> <ProjectReference Include="..\BankDatabaseImplement\BankDatabaseImplement.csproj" />
<ProjectReference Include="..\BankDataModels\BankDataModels.csproj" /> <ProjectReference Include="..\BankDataModels\BankDataModels.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -6,10 +6,16 @@ using BankContracts.ViewModels.Cashier.Diagram;
using BankContracts.ViewModels.Cashier.ViewModels; using BankContracts.ViewModels.Cashier.ViewModels;
using BankDataModels.Enums; using BankDataModels.Enums;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankBusinessLogic.BusinessLogics.Cashier namespace BankBusinessLogic.BusinessLogics.Cashier
{ {
public class AccountLogic : IAccountLogic // Класс, реализующий бизнес-логику для счетов
public class AccountLogic : IAccountLogic
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
@ -17,6 +23,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
private readonly ICashWithdrawalLogic _cashWithdrawalLogic; private readonly ICashWithdrawalLogic _cashWithdrawalLogic;
private readonly IMoneyTransferLogic _moneyTransferLogic; private readonly IMoneyTransferLogic _moneyTransferLogic;
// Конструктор
public AccountLogic(ILogger<AccountLogic> logger, IAccountStorage accountStorage, public AccountLogic(ILogger<AccountLogic> logger, IAccountStorage accountStorage,
ICashWithdrawalLogic cashWithdrawalLogic, IMoneyTransferLogic moneyTransferLogic) ICashWithdrawalLogic cashWithdrawalLogic, IMoneyTransferLogic moneyTransferLogic)
{ {
@ -26,6 +33,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
_moneyTransferLogic = moneyTransferLogic; _moneyTransferLogic = moneyTransferLogic;
} }
// Вывод конкретного счёта
public AccountViewModel? ReadElement(AccountSearchModel model) public AccountViewModel? ReadElement(AccountSearchModel model)
{ {
if (model == null) if (model == null)
@ -49,11 +57,12 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return element; return element;
} }
// Вывод всего списка счетов
public List<AccountViewModel>? ReadList(AccountSearchModel? model) public List<AccountViewModel>? ReadList(AccountSearchModel? model)
{ {
//_logger.LogInformation("ReadList. AccountNumber:{AccountNumber}. Id:{Id}", model.AccountNumber, model?.Id); _logger.LogInformation("ReadList. AccountNumber:{AccountNumber}. Id:{Id}", model.AccountNumber, model?.Id);
//list хранит весь список в случае, если model пришло со значением null на вход метода // list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _accountStorage.GetFullList() : _accountStorage.GetFilteredList(model); var list = model == null ? _accountStorage.GetFullList() : _accountStorage.GetFilteredList(model);
if (list == null) if (list == null)
@ -67,10 +76,10 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return list; return list;
} }
//метод, отвечающий за изменение баланса счёта // Метод, отвечающий за изменение баланса на банковском счёте
public bool ChangeBalance(AccountSearchModel? model, int sum) public bool ChangeBalance(AccountSearchModel? model, int sum)
{ {
//ищем счёт // Ищем счёт
var account = ReadElement(model); var account = ReadElement(model);
if (account == null) if (account == null)
@ -78,13 +87,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
throw new ArgumentNullException("Счёт не найден", nameof(account)); throw new ArgumentNullException("Счёт не найден", nameof(account));
} }
//проверяем возможность операции снятия (sum может быть отрицательной) // Проверяем возможность операции снятия (sum может быть отрицательной)
if (sum + account.Balance < 0) if (sum + account.Balance < 0)
{ {
return false; return false;
} }
//обновляем балланс счёта // Обновляем балланс счёта
_accountStorage.Update(new AccountBindingModel _accountStorage.Update(new AccountBindingModel
{ {
Id = account.Id, Id = account.Id,
@ -94,6 +103,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Создание счёта
public bool Create(AccountBindingModel model) public bool Create(AccountBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -108,6 +118,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Обновление счёта
public bool Update(AccountBindingModel model) public bool Update(AccountBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -122,6 +133,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Удаление счёта
public bool Delete(AccountBindingModel model) public bool Delete(AccountBindingModel model)
{ {
CheckModel(model, false); CheckModel(model, false);
@ -138,84 +150,85 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
public List<CashierDiagramElementsViewModel> GetMonthInfo(int AccountId) public List<CashierDiagramElementsViewModel> GetMonthInfo(int AccountId)
{ {
Dictionary<(int, int), int> cashWithdrawals = _cashWithdrawalLogic.ReadList(new CashWithdrawalSearchModel() Dictionary<(int, int), int> cashWithdrawals = _cashWithdrawalLogic.ReadList(new CashWithdrawalSearchModel()
{ {
AccountId = AccountId, AccountId = AccountId,
}).Where(x => x.DebitingStatus == StatusEnum.Закрыта ).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year }) }).Where(x => x.DebitingStatus == StatusEnum.Закрыта).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum)); .Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
Dictionary<(int, int), int> moneyTransfers = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel() Dictionary<(int, int), int> moneyTransfers = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
{ {
AccountPayeeId = AccountId, AccountPayeeId = AccountId,
}).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year }) }).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum)); .Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
Dictionary<(int, int), int> moneyTransfersDebiting = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel() Dictionary<(int, int), int> moneyTransfersDebiting = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
{ {
AccountSenderId = AccountId, AccountSenderId = AccountId,
}).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year }) }).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum)); .Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
List<CashierDiagramElementsViewModel> result = new(); List<CashierDiagramElementsViewModel> result = new();
int sum = 0; int sum = 0;
foreach (var key in cashWithdrawals.Keys.Union(moneyTransfers.Keys).Union(moneyTransfers.Keys).OrderBy(x => x.Item1 * 12 + x.Item2)) foreach (var key in cashWithdrawals.Keys.Union(moneyTransfers.Keys).Union(moneyTransfers.Keys).OrderBy(x => x.Item1 * 12 + x.Item2))
{ {
if (cashWithdrawals.ContainsKey(key)) sum += cashWithdrawals.GetValueOrDefault(key); if (cashWithdrawals.ContainsKey(key)) sum += cashWithdrawals.GetValueOrDefault(key);
if (moneyTransfers.ContainsKey(key)) sum += moneyTransfers.GetValueOrDefault(key); if (moneyTransfers.ContainsKey(key)) sum += moneyTransfers.GetValueOrDefault(key);
if (moneyTransfers.ContainsKey(key)) sum -= moneyTransfersDebiting.GetValueOrDefault(key); if (moneyTransfers.ContainsKey(key)) sum -= moneyTransfersDebiting.GetValueOrDefault(key);
result.Add(new CashierDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum }); result.Add(new CashierDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum });
} }
return result; return result;
} }
//проверка входного аргумента для методов Insert, Update и Delete // Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(AccountBindingModel model, bool withParams = true) private void CheckModel(AccountBindingModel model, bool withParams = true)
{ {
if (model == null) if (model == null)
{ {
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
//так как при удалении передаём как параметр false // Так как при удалении передаём как параметр false
if (!withParams) if (!withParams)
{ {
return; return;
} }
//проверка на наличие номера счёта // Проверка на наличие номера счёта
if (string.IsNullOrEmpty(model.AccountNumber)) if (string.IsNullOrEmpty(model.AccountNumber))
{ {
throw new ArgumentNullException("Отсутствие номера у счёта", nameof(model.AccountNumber)); throw new ArgumentNullException("Отсутствие номера у счёта", nameof(model.AccountNumber));
} }
//проверка на наличие id владельца // Проверка на наличие id владельца
if (model.CashierId < 0) if (model.CashierId < 0)
{ {
throw new ArgumentNullException("Некорректный Id владельца счёта", nameof(model.CashierId)); throw new ArgumentNullException("Некорректный Id владельца счёта", nameof(model.CashierId));
} }
//проверка на наличие id кассира, создавшего счёт // Проверка на наличие id кассира, создавшего счёт
if (model.CashierId < 0) if (model.CashierId < 0)
{ {
throw new ArgumentNullException("Некорректный Id кассира, открывшего счёт", nameof(model.CashierId)); throw new ArgumentNullException("Некорректный Id кассира, открывшего счёт", nameof(model.CashierId));
} }
//проверка на наличие пароля счёта // Проверка на наличие пароля счёта
if (string.IsNullOrEmpty(model.PasswordAccount) ) if (string.IsNullOrEmpty(model.PasswordAccount))
{ {
throw new ArgumentNullException("Некорректный пароль счёта", nameof(model.PasswordAccount)); throw new ArgumentNullException("Некорректный пароль счёта", nameof(model.PasswordAccount));
} }
if (model.Balance < 0) { if (model.Balance < 0)
throw new ArgumentNullException("Изначальный баланс аккаунта не может быть < 0", nameof(model.Balance)); {
} throw new ArgumentNullException("Изначальный баланс аккаунта не может быть < 0", nameof(model.Balance));
}
//проверка на корректную дату открытия счёта // Проверка на корректную дату открытия счёта
if (model.DateOpen > DateTime.Now) if (model.DateOpen > DateTime.Now)
{ {
throw new ArgumentNullException("Дата открытия счёта не может быть ранее текущей", nameof(model.DateOpen)); throw new ArgumentNullException("Дата открытия счёта не может быть ранее текущей", nameof(model.DateOpen));
@ -225,13 +238,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
"CashierId:{CashierId}. DateOpen:{DateOpen}. Id:{Id}", "CashierId:{CashierId}. DateOpen:{DateOpen}. Id:{Id}",
model.AccountNumber, model.PasswordAccount, model.ClientId, model.CashierId, model.DateOpen, model.Id); model.AccountNumber, model.PasswordAccount, model.ClientId, model.CashierId, model.DateOpen, model.Id);
//для проверка на наличие такого же счёта // Для проверка на наличие такого же счёта
var element = _accountStorage.GetElement(new AccountSearchModel var element = _accountStorage.GetElement(new AccountSearchModel
{ {
AccountNumber = model.AccountNumber, AccountNumber = model.AccountNumber,
}); });
//если элемент найден и его Id не совпадает с Id переданного объекта // Если элемент найден и его Id не совпадает с Id переданного объекта
if (element != null && element.Id != model.Id) if (element != null && element.Id != model.Id)
{ {
throw new InvalidOperationException("Счёт с таким номером уже существует"); throw new InvalidOperationException("Счёт с таким номером уже существует");

View File

@ -7,10 +7,16 @@ using BankContracts.StoragesContracts.Client;
using BankContracts.ViewModels.Cashier.ViewModels; using BankContracts.ViewModels.Cashier.ViewModels;
using BankDataModels.Enums; using BankDataModels.Enums;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankBusinessLogic.BusinessLogics.Cashier namespace BankBusinessLogic.BusinessLogics.Cashier
{ {
public class CashWithdrawalLogic : ICashWithdrawalLogic // Класс, реализующий бизнес-логику для снятия наличных
public class CashWithdrawalLogic : ICashWithdrawalLogic
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
@ -18,6 +24,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
private readonly IDebitingStorage _debitingStorage; private readonly IDebitingStorage _debitingStorage;
// Конструктор
public CashWithdrawalLogic(ILogger<CashWithdrawalLogic> logger, ICashWithdrawalStorage cashWithdrawalStorage, public CashWithdrawalLogic(ILogger<CashWithdrawalLogic> logger, ICashWithdrawalStorage cashWithdrawalStorage,
IDebitingStorage debitingStorage) IDebitingStorage debitingStorage)
{ {
@ -26,6 +33,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
_debitingStorage = debitingStorage; _debitingStorage = debitingStorage;
} }
// Вывод конкретной операции
public CashWithdrawalViewModel? ReadElement(CashWithdrawalSearchModel model) public CashWithdrawalViewModel? ReadElement(CashWithdrawalSearchModel model)
{ {
if (model == null) if (model == null)
@ -50,12 +58,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return element; return element;
} }
// Вывод всего списка операций
public List<CashWithdrawalViewModel>? ReadList(CashWithdrawalSearchModel? model) public List<CashWithdrawalViewModel>? ReadList(CashWithdrawalSearchModel? model)
{ {
_logger.LogInformation("ReadElement. AccountId:{AccountId}. Sum:{Sum}. DateOperation:{DateOperation}. Id:{Id}", _logger.LogInformation("ReadElement. AccountId:{AccountId}. Sum:{Sum}. DateOperation:{DateOperation}. Id:{Id}",
model?.AccountId, model?.Sum, model?.DateTo, model?.Id); model?.AccountId, model?.Sum, model?.DateTo, model?.Id);
//list хранит весь список в случае, если model пришло со значением null на вход метода // list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _cashWithdrawalStorage.GetFullList() : _cashWithdrawalStorage.GetFilteredList(model); var list = model == null ? _cashWithdrawalStorage.GetFullList() : _cashWithdrawalStorage.GetFilteredList(model);
if (list == null) if (list == null)
@ -69,6 +78,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return list; return list;
} }
// Создание операции
public bool Create(CashWithdrawalBindingModel model, bool flag) public bool Create(CashWithdrawalBindingModel model, bool flag)
{ {
CheckModel(model); CheckModel(model);
@ -102,6 +112,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Обновление операции
public bool Update(CashWithdrawalBindingModel model) public bool Update(CashWithdrawalBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -116,6 +127,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Удаление операции
public bool Delete(CashWithdrawalBindingModel model) public bool Delete(CashWithdrawalBindingModel model)
{ {
CheckModel(model, false); CheckModel(model, false);
@ -132,7 +144,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
//проверка входного аргумента для методов Insert, Update и Delete // Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(CashWithdrawalBindingModel model, bool withParams = true) private void CheckModel(CashWithdrawalBindingModel model, bool withParams = true)
{ {
if (model == null) if (model == null)
@ -140,25 +152,25 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
//так как при удалении передаём как параметр false // Так как при удалении передаём как параметр false
if (!withParams) if (!withParams)
{ {
return; return;
} }
//проверка на корректность Id счёта // Проверка на корректность Id счёта
if (model.AccountId < 0) if (model.AccountId < 0)
{ {
throw new ArgumentNullException("Некорректный Id счёта", nameof(model.AccountId)); throw new ArgumentNullException("Некорректный Id счёта", nameof(model.AccountId));
} }
//проверка на корректность снимаемой суммы // Проверка на корректность снимаемой суммы
if (model.Sum <= 0) if (model.Sum <= 0)
{ {
throw new ArgumentNullException("Снимаемая сумма не может раняться нулю или быть меньше его", nameof(model.Sum)); throw new ArgumentNullException("Снимаемая сумма не может раняться нулю или быть меньше его", nameof(model.Sum));
} }
//проверка на корректную дату операции // Проверка на корректную дату операции
if (model.DateOperation > DateTime.Now) if (model.DateOperation > DateTime.Now)
{ {
throw new ArgumentNullException("Дата операции не может быть позднее текущей", nameof(model.DateOperation)); throw new ArgumentNullException("Дата операции не может быть позднее текущей", nameof(model.DateOperation));

View File

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

View File

@ -7,10 +7,16 @@ using BankContracts.StoragesContracts.Client;
using BankContracts.ViewModels.Cashier.ViewModels; using BankContracts.ViewModels.Cashier.ViewModels;
using BankDataModels.Enums; using BankDataModels.Enums;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankBusinessLogic.BusinessLogics.Cashier namespace BankBusinessLogic.BusinessLogics.Cashier
{ {
public class MoneyTransferLogic : IMoneyTransferLogic // Класс, реализующий бизнес-логику для перевода наличных
public class MoneyTransferLogic : IMoneyTransferLogic
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
@ -18,6 +24,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
public readonly ICreditingStorage _creditingStorage; public readonly ICreditingStorage _creditingStorage;
// Конструктор
public MoneyTransferLogic(ILogger<MoneyTransferLogic> logger, IMoneyTransferStorage moneyTransferStorage, ICreditingStorage creditingStorage) public MoneyTransferLogic(ILogger<MoneyTransferLogic> logger, IMoneyTransferStorage moneyTransferStorage, ICreditingStorage creditingStorage)
{ {
_logger = logger; _logger = logger;
@ -25,6 +32,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
_creditingStorage = creditingStorage; _creditingStorage = creditingStorage;
} }
// Вывод конкретной операции
public MoneyTransferViewModel? ReadElement(MoneyTransferSearchModel model) public MoneyTransferViewModel? ReadElement(MoneyTransferSearchModel model)
{ {
if (model == null) if (model == null)
@ -49,12 +57,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return element; return element;
} }
// Вывод всего списка операций на перевод наличных
public List<MoneyTransferViewModel>? ReadList(MoneyTransferSearchModel? model) public List<MoneyTransferViewModel>? ReadList(MoneyTransferSearchModel? model)
{ {
_logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}", _logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}",
model?.AccountSenderId, model?.AccountPayeeId, model?.Sum, model?.Id); model?.AccountSenderId, model?.AccountPayeeId, model?.Sum, model?.Id);
//list хранит весь список в случае, если model пришло со значением null на вход метода // list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _moneyTransferStorage.GetFullList() : _moneyTransferStorage.GetFilteredList(model); var list = model == null ? _moneyTransferStorage.GetFullList() : _moneyTransferStorage.GetFilteredList(model);
if (list == null) if (list == null)
@ -68,6 +77,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return list; return list;
} }
// Создание операции на перевод
public bool Create(MoneyTransferBindingModel model) public bool Create(MoneyTransferBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -79,7 +89,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return false; return false;
} }
//проверка на то, что это зачисление на карту, а не перевод между счетами // Проверка на то, что это зачисление на карту, а не перевод между счетами
if (model.CreditingId.HasValue) if (model.CreditingId.HasValue)
{ {
_creditingStorage.Update(new CreditingBindingModel _creditingStorage.Update(new CreditingBindingModel
@ -94,6 +104,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Обновление операции на перевод
public bool Update(MoneyTransferBindingModel model) public bool Update(MoneyTransferBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -108,6 +119,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
// Удаление операции на перевод
public bool Delete(MoneyTransferBindingModel model) public bool Delete(MoneyTransferBindingModel model)
{ {
CheckModel(model, false); CheckModel(model, false);
@ -124,7 +136,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
return true; return true;
} }
//проверка входного аргумента для методов Insert, Update и Delete // Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(MoneyTransferBindingModel model, bool withParams = true) private void CheckModel(MoneyTransferBindingModel model, bool withParams = true)
{ {
if (model == null) if (model == null)
@ -132,31 +144,31 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
//так как при удалении передаём как параметр false // Так как при удалении передаём как параметр false
if (!withParams) if (!withParams)
{ {
return; return;
} }
//проверка корректности Id счёта отправителя // Проверка корректности Id счёта отправителя
if (model.AccountSenderId < 0) if (model.AccountSenderId < 0)
{ {
throw new ArgumentNullException("Отсутствие Id у счёта отправителя", nameof(model.AccountSenderId)); throw new ArgumentNullException("Отсутствие Id у счёта отправителя", nameof(model.AccountSenderId));
} }
//проверка корректности Id счёта получателя // Проверка корректности Id счёта получателя
if (model.AccountPayeeId < 0) if (model.AccountPayeeId < 0)
{ {
throw new ArgumentNullException("Отсутствие Id у счёта получателя", nameof(model.AccountPayeeId)); throw new ArgumentNullException("Отсутствие Id у счёта получателя", nameof(model.AccountPayeeId));
} }
//проверка на корректную сумму перевода // Проверка на корректную сумму перевода
if (model.Sum <= 0) if (model.Sum <= 0)
{ {
throw new ArgumentNullException("Сумма перевода не может раняться нулю или быть меньше его", nameof(model.Sum)); throw new ArgumentNullException("Сумма перевода не может раняться нулю или быть меньше его", nameof(model.Sum));
} }
//проверка на корректную дату открытия счёта // Проверка на корректную дату открытия счёта
if (model.DateOperation > DateTime.Now) if (model.DateOperation > DateTime.Now)
{ {
throw new ArgumentNullException("Дата операции не может быть ранее текущей", nameof(model.DateOperation)); throw new ArgumentNullException("Дата операции не может быть ранее текущей", nameof(model.DateOperation));

View File

@ -8,160 +8,216 @@ using BankContracts.BindingModels.Client;
using BankContracts.SearchModels.Client; using BankContracts.SearchModels.Client;
using BankContracts.ViewModels.Client.ViewModels; using BankContracts.ViewModels.Client.ViewModels;
using BankContracts.SearchModels.Cashier; using BankContracts.SearchModels.Cashier;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankBusinessLogic.BusinessLogics.Client namespace BankBusinessLogic.BusinessLogics.Client
{ {
public class CardLogic : ICardLogic // Класс, реализующий бизнес-логику для банковских карт
{ public class CardLogic : ICardLogic
private readonly ILogger _logger; {
private readonly ICardStorage _cardStorage; private readonly ILogger _logger;
private readonly IAccountLogic _accountLogic;
private readonly IDebitingLogic _debitingLogic;
private readonly ICreditingLogic _creditingLogic;
public CardLogic(ILogger<CardLogic> logger, ICardStorage cardStorage, IAccountLogic accountLogic, private readonly ICardStorage _cardStorage;
IDebitingLogic debitingLogic, ICreditingLogic creditingLogic) {
_logger = logger;
_cardStorage = cardStorage;
_accountLogic = accountLogic;
_debitingLogic = debitingLogic;
_creditingLogic = creditingLogic;
}
private readonly IAccountLogic _accountLogic;
private readonly IDebitingLogic _debitingLogic;
private readonly ICreditingLogic _creditingLogic;
// Конструктор
public CardLogic(ILogger<CardLogic> logger, ICardStorage cardStorage, IAccountLogic accountLogic,
IDebitingLogic debitingLogic, ICreditingLogic creditingLogic)
{
_logger = logger;
_cardStorage = cardStorage;
_accountLogic = accountLogic;
_debitingLogic = debitingLogic;
_creditingLogic = creditingLogic;
}
// Вывод конкретной банковской карты
public CardViewModel? ReadElement(CardSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. CardNumber:{Number}.Id:{ Id}", model.Number, model.Id);
var element = _cardStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element;
}
// Вывод всего списка банковских карт
public List<CardViewModel>? ReadList(CardSearchModel? model)
{
_logger.LogInformation("ReadList. CardId:{Id}", model?.Id);
// list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _cardStorage.GetFullList() : _cardStorage.GetFilteredList(model);
if (list == null)
{
_logger.LogWarning("ReadList return null list");
return null;
}
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list;
}
// Создание банковской карты
public bool Create(CardBindingModel model) public bool Create(CardBindingModel model)
{ {
CheckModel(model); CheckModel(model);
if (_cardStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
public bool Delete(CardBindingModel model) if (_cardStorage.Insert(model) == null)
{ {
CheckModel(model, false); _logger.LogWarning("Insert operation failed");
_logger.LogInformation("Delete. Id:{Id}", model.Id); return false;
if (_cardStorage.Delete(model) == null) }
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
public CardViewModel? ReadElement(CardSearchModel model) return true;
{ }
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. CardNumber:{Number}.Id:{ Id}", model.Number, model.Id);
var element = _cardStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element;
}
public List<CardViewModel>? ReadList(CardSearchModel? model) // Обновление банковской карты
{ public bool Update(CardBindingModel model)
_logger.LogInformation("ReadList. CardId:{Id}", model?.Id); {
var list = model == null ? _cardStorage.GetFullList() : _cardStorage.GetFilteredList(model); CheckModel(model);
if (list == null)
{
_logger.LogWarning("ReadList return null list");
return null;
}
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list;
}
public bool Update(CardBindingModel model) if (_cardStorage.Update(model) == null)
{ {
CheckModel(model); _logger.LogWarning("Update operation failed");
if (_cardStorage.Update(model) == null) return false;
{ }
_logger.LogWarning("Update operation failed");
return false;
}
return true;
}
public List<ClientDiagramElementsViewModel> GetMonthInfo(int CardId) { return true;
}
Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel() // Удаление банковской карты
{ public bool Delete(CardBindingModel model)
CardId = CardId, {
Status = StatusEnum.Закрыта CheckModel(model, false);
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year }) _logger.LogInformation("Delete. Id:{Id}", model.Id);
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum()}).ToDictionary(x => (x.Month, x.Year), x => (x.Sum)); if (_cardStorage.Delete(model) == null)
Dictionary<(int?, int?), int> creditings = _creditingLogic.ReadList(new CreditingSearchModel() {
{ _logger.LogWarning("Delete operation failed");
CardId = CardId, return false;
Status = StatusEnum.Закрыта }
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year }) return true;
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum)); }
List<ClientDiagramElementsViewModel> result = new(); // Бизнес-логика для диаграмм, для получения информации по месяцам
foreach (var key in debitings.Keys.Union(creditings.Keys).OrderBy(x => x.Item1 * 12 + x.Item2)) { public List<ClientDiagramElementsViewModel> GetMonthInfo(int CardId)
int sum = 0; {
if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key); Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel()
if (creditings.ContainsKey(key)) sum += creditings.GetValueOrDefault(key); {
result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum}); CardId = CardId,
} Status = StatusEnum.Закрыта
return result; }).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
} .Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
private void CheckModel(CardBindingModel model, bool withParams = true) Dictionary<(int?, int?), int> creditings = _creditingLogic.ReadList(new CreditingSearchModel()
{ {
if (model == null) CardId = CardId,
{ Status = StatusEnum.Закрыта
throw new ArgumentNullException(nameof(model)); }).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
} .Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
if (!withParams)
{
return;
}
if (string.IsNullOrEmpty(model.Number) || model.Number.Length != 16)
{
throw new ArgumentNullException("Неправильный номер карты", nameof(model.Number));
}
if (string.IsNullOrEmpty(model.CVC) || model.CVC.Length != 3)
{
throw new ArgumentNullException("Неправильный СVC карты", nameof(model.CVC));
}
if (model.Period < DateTime.Now)
{
throw new ArgumentNullException("Нет периода действия", nameof(model.Period));
}
var cardElement = _cardStorage.GetElement(new CardSearchModel
{
Number = model.Number,
});
if (cardElement != null && cardElement.Id != model.Id) List<ClientDiagramElementsViewModel> result = new();
{
throw new InvalidOperationException("Карта с таким ноиером уже есть");
}
var accountElement = _accountLogic.ReadElement(new AccountSearchModel foreach (var key in debitings.Keys.Union(creditings.Keys).OrderBy(x => x.Item1 * 12 + x.Item2))
{ {
Id = model.AccountId, int sum = 0;
ClientId = model.ClientID if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key);
}); if (creditings.ContainsKey(key)) sum += creditings.GetValueOrDefault(key);
result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum });
}
if (accountElement != null && accountElement.ClientId != model.ClientID) return result;
{ }
// Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(CardBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
// Так как при удалении передаём как параметр false
if (!withParams)
{
return;
}
// Проверка на наличие номера у банковской карты
if (string.IsNullOrEmpty(model.Number) || model.Number.Length != 16)
{
throw new ArgumentNullException("Неправильный номер карты", nameof(model.Number));
}
// Проверка на наличие CVC кода у банковской карты
if (string.IsNullOrEmpty(model.CVC) || model.CVC.Length != 3)
{
throw new ArgumentNullException("Неправильный СVC карты", nameof(model.CVC));
}
// Проверка на конкретный период действия карты
if (model.Period < DateTime.Now)
{
throw new ArgumentNullException("Нет периода действия", nameof(model.Period));
}
// Проверка на наличие id клиента, получившего карту (лишним не будет)
if (model.ClientID < 0)
{
throw new ArgumentNullException("Некорректный Id клиента, открывшего счёт", nameof(model.ClientID));
}
// Для проверка на наличие такой же банковской карты
var cardElement = _cardStorage.GetElement(new CardSearchModel
{
Number = model.Number,
});
// Если элемент найден и его Id не совпадает с Id переданного объекта
if (cardElement != null && cardElement.Id != model.Id)
{
throw new InvalidOperationException("Карта с таким ноиером уже есть");
}
var accountElement = _accountLogic.ReadElement(new AccountSearchModel
{
Id = model.AccountId,
ClientId = model.ClientID
});
// Проверка привязан ли счёт к данному клиенту
if (accountElement != null && accountElement.ClientId != model.ClientID)
{
throw new InvalidOperationException("Это не счёт данного клиента"); throw new InvalidOperationException("Это не счёт данного клиента");
} }
_logger.LogInformation("Card. Number:{Number}.CVC:{CVC}.ClientId:{ClientID}.Patronymic:{Period}.Id:{Id}", _logger.LogInformation("Card. Number:{Number}.CVC:{CVC}.ClientId:{ClientID}.Patronymic:{Period}.Id:{Id}",
model.Number, model.CVC, model.Period.ToString(), model.ClientID, model.Id); model.Number, model.CVC, model.Period.ToString(), model.ClientID, model.Id);
} }
} }
} }

View File

@ -4,127 +4,190 @@ using BankContracts.SearchModels.Client;
using BankContracts.StoragesContracts.Client; using BankContracts.StoragesContracts.Client;
using BankContracts.ViewModels.Client.ViewModels; using BankContracts.ViewModels.Client.ViewModels;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System.Text.RegularExpressions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankBusinessLogic.BusinessLogics.Client namespace BankBusinessLogic.BusinessLogics.Client
{ {
public class ClientLogic : IClientLogic // Класс, реализующий бизнес-логику для клиентов
{ public class ClientLogic : IClientLogic
private readonly ILogger _logger; {
private readonly IClientStorage _clientStorage; private readonly ILogger _logger;
public ClientLogic(ILogger<ClientLogic> logger, IClientStorage clientStorage) { private readonly IClientStorage _clientStorage;
_logger = logger;
_clientStorage = clientStorage;
}
public bool Create(ClientBindingModel model) // Конструктор
{ public ClientLogic(ILogger<ClientLogic> logger, IClientStorage clientStorage)
CheckModel(model); {
if (_clientStorage.Insert(model) == null) _logger = logger;
{ _clientStorage = clientStorage;
_logger.LogWarning("Insert operation failed"); }
return false;
}
return true;
}
public bool Delete(ClientBindingModel model) // Вывод конкретного клиента
{ public ClientViewModel? ReadElement(ClientSearchModel model)
CheckModel(model, false); {
_logger.LogInformation("Delete. Id:{Id}", model.Id); if (model == null)
if (_clientStorage.Delete(model) == null) {
{ throw new ArgumentNullException(nameof(model));
_logger.LogWarning("Delete operation failed"); }
return false;
}
return true;
}
public ClientViewModel? ReadElement(ClientSearchModel model) _logger.LogInformation("ReadElement. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Id:{ Id}", model.Name, model.Surname, model.Patronymic, model.Id);
{
if (model == null)
{
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) var element = _clientStorage.GetElement(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;
}
public bool Update(ClientBindingModel model) if (element == null)
{ {
CheckModel(model); _logger.LogWarning("ReadElement element not found");
if (_clientStorage.Update(model) == null) return null;
{ }
_logger.LogWarning("Update operation failed");
return false;
}
return true;
}
private void CheckModel(ClientBindingModel model, bool withParams = true) _logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
{
if (model == null) return element;
{ }
throw new ArgumentNullException(nameof(model));
} // Вывод отфильтрованного списка
if (!withParams) public List<ClientViewModel>? ReadList(ClientSearchModel? model)
{ {
return; _logger.LogInformation("ReadList. ClientId:{Id}", model?.Id);
}
if (string.IsNullOrEmpty(model.Name)) // list хранит весь список в случае, если model пришло со значением null на вход метода
{ var list = model == null ? _clientStorage.GetFullList() : _clientStorage.GetFilteredList(model);
throw new ArgumentNullException("Нет имени пользователя", nameof(model.Name));
} if (list == null)
if (string.IsNullOrEmpty(model.Surname)) {
{ _logger.LogWarning("ReadList return null list");
throw new ArgumentNullException("Нет фамилии пользователя", nameof(model.Surname)); return null;
} }
if (string.IsNullOrEmpty(model.Patronymic))
{ _logger.LogInformation("ReadList. Count:{Count}", list.Count);
throw new ArgumentNullException("Нет отчества пользователя", nameof(model.Patronymic));
} return list;
if (string.IsNullOrEmpty(model.Email)) }
{
throw new ArgumentNullException("Нет почты пользователя", nameof(model.Email)); // Создание клиента
} public bool Create(ClientBindingModel model)
if (string.IsNullOrEmpty(model.Password)) {
{ CheckModel(model);
throw new ArgumentNullException("Нет пароля пользователя", nameof(model.Password));
} if (_clientStorage.Insert(model) == null)
if (string.IsNullOrEmpty(model.Telephone)) {
{ _logger.LogWarning("Insert operation failed");
throw new ArgumentNullException("Нет телефона пользователя", nameof(model.Telephone)); return false;
} }
_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); return true;
var element = _clientStorage.GetElement(new ClientSearchModel }
{
Email = model.Email, // Обновление клиента
}); public bool Update(ClientBindingModel model)
if (element != null && element.Id != model.Id) {
{ CheckModel(model);
throw new InvalidOperationException("Клиент с такой почтой уже есть");
} 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("Клиент с такой почтой уже есть");
}
}
}
} }

View File

@ -5,112 +5,148 @@ using BankContracts.StoragesContracts.Client;
using BankContracts.BindingModels.Client; using BankContracts.BindingModels.Client;
using BankContracts.ViewModels.Client.ViewModels; using BankContracts.ViewModels.Client.ViewModels;
using BankContracts.SearchModels.Client; using BankContracts.SearchModels.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankBusinessLogic.BusinessLogics.Client namespace BankBusinessLogic.BusinessLogics.Client
{ {
public class CreditingLogic : ICreditingLogic // Класс, реализующий бизнес-логику для пополнения карты
public class CreditingLogic : ICreditingLogic
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly ICreditingStorage _creditingStorage; private readonly ICreditingStorage _creditingStorage;
private readonly ICardStorage _cardStorage; private readonly ICardStorage _cardStorage;
public CreditingLogic(ILogger<CreditingLogic> logger, ICreditingStorage creditingStorage, ICardStorage cardStorage) { // Конструктор
public CreditingLogic(ILogger<CreditingLogic> logger, ICreditingStorage creditingStorage, ICardStorage cardStorage) {
_logger = logger; _logger = logger;
_creditingStorage = creditingStorage; _creditingStorage = creditingStorage;
_cardStorage = cardStorage; _cardStorage = cardStorage;
} }
public bool Create(CreditingBindingModel model) // Вывод конкретной операции на пополнение
{ public CreditingViewModel? ReadElement(CreditingSearchModel model)
CheckModel(model);
if (!CheckCardPeriod(model))
{
model.Status = StatusEnum.Карта_просрочена;
}
else
{
model.Status = StatusEnum.Открыта;
}
if (_creditingStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
public bool Delete(CreditingBindingModel model)
{
CheckModel(model, false);
_logger.LogInformation("Delete. Id:{Id}", model.Id);
if (_creditingStorage.Delete(model) == null)
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
public CreditingViewModel? ReadElement(CreditingSearchModel model)
{ {
if (model == null) if (model == null)
{ {
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
_logger.LogInformation("ReadElement. CreditingId:{ Id }", model.Id); _logger.LogInformation("ReadElement. CreditingId:{ Id }", model.Id);
var element = _creditingStorage.GetElement(model); var element = _creditingStorage.GetElement(model);
if (element == null) if (element == null)
{ {
_logger.LogWarning("ReadElement element not found"); _logger.LogWarning("ReadElement element not found");
return null; return null;
} }
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id); _logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element; return element;
} }
public List<CreditingViewModel>? ReadList(CreditingSearchModel? model) // Вывод всего списка операций на пополнение
public List<CreditingViewModel>? ReadList(CreditingSearchModel? model)
{ {
_logger.LogInformation("ReadList. CreditingId:{Id}", model?.Id); _logger.LogInformation("ReadList. CreditingId:{Id}", model?.Id);
var list = model == null ? _creditingStorage.GetFullList() : _creditingStorage.GetFilteredList(model);
// list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _creditingStorage.GetFullList() : _creditingStorage.GetFilteredList(model);
if (list == null) if (list == null)
{ {
_logger.LogWarning("ReadList return null list"); _logger.LogWarning("ReadList return null list");
return null; return null;
} }
_logger.LogInformation("ReadList. Count:{Count}", list.Count); _logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list; return list;
} }
public bool Update(CreditingBindingModel model) // Создание операции на пополнение
public bool Create(CreditingBindingModel model)
{
CheckModel(model);
if (!CheckCardPeriod(model))
{
model.Status = StatusEnum.Карта_просрочена;
}
else
{
model.Status = StatusEnum.Открыта;
}
if (_creditingStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
// Обновление операции на пополнение
public bool Update(CreditingBindingModel model)
{ {
CheckModel(model); CheckModel(model);
if (_creditingStorage.Update(model) == null) if (_creditingStorage.Update(model) == null)
{ {
_logger.LogWarning("Update operation failed"); _logger.LogWarning("Update operation failed");
return false; return false;
} }
return true; return true;
} }
private void CheckModel(CreditingBindingModel model, bool withParams = true) // Удаление операции на пополнение
public bool Delete(CreditingBindingModel model)
{
CheckModel(model, false);
_logger.LogInformation("Delete. Id:{Id}", model.Id);
if (_creditingStorage.Delete(model) == null)
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
// Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(CreditingBindingModel model, bool withParams = true)
{ {
if (model == null) if (model == null)
{ {
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
if (!withParams)
// Так как при удалении передаём как параметр false
if (!withParams)
{ {
return; return;
} }
if (model.Sum <= 0)
// Проверка на корректность суммы пополнения
if (model.Sum <= 0)
{ {
throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum)); throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum));
} }
if (model.DateOpen > DateTime.Now)
// Проверка на корректную дату операции
if (model.DateOpen > DateTime.Now)
{ {
throw new ArgumentNullException("Дата не может быть меньше текущего времени", nameof(model.DateOpen)); throw new ArgumentNullException("Дата не может быть меньше текущего времени", nameof(model.DateOpen));
} }
@ -119,7 +155,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
model.Sum, model.CardId, model.DateOpen.ToString(), model.Id); model.Sum, model.CardId, model.DateOpen.ToString(), model.Id);
} }
//проверка карты на просроченность // Проверка карты на просроченность
bool CheckCardPeriod(CreditingBindingModel model) bool CheckCardPeriod(CreditingBindingModel model)
{ {
var card = _cardStorage.GetElement(new CardSearchModel var card = _cardStorage.GetElement(new CardSearchModel
@ -127,13 +163,12 @@ namespace BankBusinessLogic.BusinessLogics.Client
Id = model.CardId Id = model.CardId
}); });
//если карта просрочена // Если карта просрочена
if (card.Period < DateTime.Now) if (card.Period < DateTime.Now)
{ {
return false; return false;
} }
return true; return true;
} }
} }

View File

@ -5,10 +5,16 @@ using BankContracts.StoragesContracts.Client;
using BankContracts.BindingModels.Client; using BankContracts.BindingModels.Client;
using BankContracts.SearchModels.Client; using BankContracts.SearchModels.Client;
using BankContracts.ViewModels.Client.ViewModels; using BankContracts.ViewModels.Client.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankBusinessLogic.BusinessLogics.Client namespace BankBusinessLogic.BusinessLogics.Client
{ {
public class DebitingLogic : IDebitingLogic // Класс, реализующий бизнес-логику для снятия наличных с карты
public class DebitingLogic : IDebitingLogic
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
@ -16,77 +22,80 @@ namespace BankBusinessLogic.BusinessLogics.Client
private readonly ICardStorage _cardStorage; private readonly ICardStorage _cardStorage;
// Конструктор
public DebitingLogic(ILogger<DebitingLogic> logger, IDebitingStorage debitingStorage, ICardStorage cardStorage) { public DebitingLogic(ILogger<DebitingLogic> logger, IDebitingStorage debitingStorage, ICardStorage cardStorage) {
_logger = logger; _logger = logger;
_debitingStorage = debitingStorage; _debitingStorage = debitingStorage;
_cardStorage = cardStorage; _cardStorage = cardStorage;
} }
public bool Create(DebitingBindingModel model) // Вывод конкретной операции на снятие наличных
{ public DebitingViewModel? ReadElement(DebitingSearchModel model)
CheckModel(model);
if (!CheckCardPeriod(model))
{
model.Status = StatusEnum.Карта_просрочена;
}
else
{
model.Status = StatusEnum.Открыта;
}
if (_debitingStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
public bool Delete(DebitingBindingModel model)
{
CheckModel(model, false);
_logger.LogInformation("Delete. Id:{Id}", model.Id);
if (_debitingStorage.Delete(model) == null)
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
public DebitingViewModel? ReadElement(DebitingSearchModel model)
{ {
if (model == null) if (model == null)
{ {
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
_logger.LogInformation("ReadElement. DebitingId:{ Id }", model.Id); _logger.LogInformation("ReadElement. DebitingId:{ Id }", model.Id);
var element = _debitingStorage.GetElement(model); var element = _debitingStorage.GetElement(model);
if (element == null) if (element == null)
{ {
_logger.LogWarning("ReadElement element not found"); _logger.LogWarning("ReadElement element not found");
return null; return null;
} }
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id); _logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element; return element;
} }
public List<DebitingViewModel>? ReadList(DebitingSearchModel? model) // Вывод всего списка операций на снятие наличных
public List<DebitingViewModel>? ReadList(DebitingSearchModel? model)
{ {
_logger.LogInformation("ReadList. DebitingId:{Id}", model?.Id); _logger.LogInformation("ReadList. DebitingId:{Id}", model?.Id);
var list = model == null ? _debitingStorage.GetFullList() : _debitingStorage.GetFilteredList(model);
// list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _debitingStorage.GetFullList() : _debitingStorage.GetFilteredList(model);
if (list == null) if (list == null)
{ {
_logger.LogWarning("ReadList return null list"); _logger.LogWarning("ReadList return null list");
return null; return null;
} }
_logger.LogInformation("ReadList. Count:{Count}", list.Count); _logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list; return list;
} }
public bool Update(DebitingBindingModel model) // Создание операции на снятие наличных
public bool Create(DebitingBindingModel model)
{
CheckModel(model);
if (!CheckCardPeriod(model))
{
model.Status = StatusEnum.Карта_просрочена;
}
else
{
model.Status = StatusEnum.Открыта;
}
if (_debitingStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
// Обновление операции на снятие наличных
public bool Update(DebitingBindingModel model)
{ {
CheckModel(model); CheckModel(model);
@ -100,21 +109,44 @@ namespace BankBusinessLogic.BusinessLogics.Client
return true; return true;
} }
private void CheckModel(DebitingBindingModel model, bool withParams = true) // Удаление операции на снятие наличных
public bool Delete(DebitingBindingModel model)
{
CheckModel(model, false);
_logger.LogInformation("Delete. Id:{Id}", model.Id);
if (_debitingStorage.Delete(model) == null)
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
// Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(DebitingBindingModel model, bool withParams = true)
{ {
if (model == null) if (model == null)
{ {
throw new ArgumentNullException(nameof(model)); throw new ArgumentNullException(nameof(model));
} }
if (!withParams)
// Так как при удалении передаём как параметр false
if (!withParams)
{ {
return; return;
} }
if (model.Sum <= 0)
// Проверка на корректность снятия суммы
if (model.Sum <= 0)
{ {
throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum)); throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum));
} }
if (model.DateClose < model.DateOpen)
// Проверка на корректную дату операции
if (model.DateClose < model.DateOpen)
{ {
throw new ArgumentNullException("Дата закрытия не может быть меньше даты открытия", nameof(model.DateClose)); throw new ArgumentNullException("Дата закрытия не может быть меньше даты открытия", nameof(model.DateClose));
} }
@ -123,7 +155,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
model.Sum, model.CardId, model.DateOpen.ToString(), model.DateClose.ToString(), model.Id); model.Sum, model.CardId, model.DateOpen.ToString(), model.DateClose.ToString(), model.Id);
} }
//проверка карты на просроченность // Проверка карты на просроченность
bool CheckCardPeriod(DebitingBindingModel model) bool CheckCardPeriod(DebitingBindingModel model)
{ {
var card = _cardStorage.GetElement(new CardSearchModel var card = _cardStorage.GetElement(new CardSearchModel
@ -131,7 +163,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
Id = model.CardId Id = model.CardId
}); });
//если карта просрочена // Если карта просрочена
if (card.Period < DateTime.Now) if (card.Period < DateTime.Now)
{ {
return false; return false;

View File

@ -14,22 +14,24 @@ using BankDataModels.Enums;
namespace BankBusinessLogic.BusinessLogics.Reports namespace BankBusinessLogic.BusinessLogics.Reports
{ {
public class ReportCashierLogic : IReportCashierLogic // Реализация бизнес-логики отчётов по кассиру
public class ReportCashierLogic : IReportCashierLogic
{ {
private readonly ICardStorage _cardStorage;
private readonly IClientStorage _clientStorage;
private readonly IMoneyTransferStorage _moneyTransferStorage; private readonly IMoneyTransferStorage _moneyTransferStorage;
private readonly ICashWithdrawalStorage _cashWithdrawalStorage; private readonly ICashWithdrawalStorage _cashWithdrawalStorage;
private readonly IClientStorage _clientStorage;
private readonly IDebitingStorage _debitingStorage; private readonly IDebitingStorage _debitingStorage;
private readonly ICardStorage _cardStorage;
private readonly AbstractSaveToExcel _saveToExcel; private readonly AbstractSaveToExcel _saveToExcel;
private readonly AbstractSaveToWord _saveToWord; private readonly AbstractSaveToWord _saveToWord;
private readonly AbstractSaveToPdf _saveToPdf; private readonly AbstractSaveToPdf _saveToPdf;
private readonly MailKitWorker _mailKitWorker; private readonly MailKitWorker _mailKitWorker;
//инициализируем поля класса через контейнер // Конструктор (Инициализируем поля класса через контейнер)
public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage, public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage,
IClientStorage clientStorage, AbstractSaveToExcel saveToExcel, IClientStorage clientStorage, AbstractSaveToExcel saveToExcel,
AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
IDebitingStorage debitingStorage, ICardStorage cardStorage, MailKitWorker mailKitWorker) IDebitingStorage debitingStorage, ICardStorage cardStorage, MailKitWorker mailKitWorker)
@ -47,10 +49,10 @@ namespace BankBusinessLogic.BusinessLogics.Reports
_mailKitWorker = mailKitWorker; _mailKitWorker = mailKitWorker;
} }
//формирование списка переводов между счетами за период // Формирование списка переводов между счетами за период
public List<ReportCashierViewModel>? GetMoneyTransfers(ReportBindingModel model) public List<ReportCashierViewModel>? GetMoneyTransfers(ReportBindingModel model)
{ {
return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo}) return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
.Select(x => new ReportCashierViewModel .Select(x => new ReportCashierViewModel
{ {
OperationId = x.Id, OperationId = x.Id,
@ -62,7 +64,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
.ToList(); .ToList();
} }
//формирование списка выдаци наличных со счёта за период // Формирование списка выдачи наличных со счёта за период
public List<ReportCashierViewModel>? GetCashWithrawals(ReportBindingModel model) public List<ReportCashierViewModel>? GetCashWithrawals(ReportBindingModel model)
{ {
return _cashWithdrawalStorage.GetFilteredList(new CashWithdrawalSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo }) return _cashWithdrawalStorage.GetFilteredList(new CashWithdrawalSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
@ -77,7 +79,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
.ToList(); .ToList();
} }
//формирование списка выдаци наличных со счёта за период // Формирование списка выдачи наличных со счёта за период
public List<DebitingViewModel>? GetDebitings(ReportBindingModel model) public List<DebitingViewModel>? GetDebitings(ReportBindingModel model)
{ {
List<int> CardIdList = new(); List<int> CardIdList = new();
@ -87,14 +89,14 @@ namespace BankBusinessLogic.BusinessLogics.Reports
AccountId = model.AccountId AccountId = model.AccountId
}); });
foreach(var index in list) foreach (var index in list)
{ {
CardIdList.Add(index.Id); CardIdList.Add(index.Id);
} }
List<DebitingViewModel> totalList = new(); List<DebitingViewModel> totalList = new();
foreach(var index in CardIdList) foreach (var index in CardIdList)
{ {
var result = _debitingStorage.GetFilteredList(new DebitingSearchModel var result = _debitingStorage.GetFilteredList(new DebitingSearchModel
{ {
@ -107,7 +109,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
return totalList; return totalList;
} }
//формирование полного имени клиента для отчёта // Формирование полного имени клиента для отчёта
public string GetFullName(ReportBindingModel model) public string GetFullName(ReportBindingModel model)
{ {
var client = _clientStorage.GetElement(new ClientSearchModel var client = _clientStorage.GetElement(new ClientSearchModel
@ -118,8 +120,8 @@ namespace BankBusinessLogic.BusinessLogics.Reports
return client.Surname + " " + client.Name + " " + client.Patronymic; return client.Surname + " " + client.Name + " " + client.Patronymic;
} }
//Сохранение мороженных в файл-Word // Сохранение банковских счетов в файл-Word
public void SaveAccountsToWordFile(ReportBindingModel model) public void SaveAccountsToWordFile(ReportBindingModel model)
{ {
_saveToWord.CreateDoc(new WordInfo _saveToWord.CreateDoc(new WordInfo
{ {
@ -130,9 +132,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports
Debiting = GetDebitings(model) Debiting = GetDebitings(model)
}, OfficeOperationEnum.Дляассира); }, OfficeOperationEnum.Дляассира);
byte[] word = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по зявкам на снятие.docx"); byte[] word = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по заявкам на снятие.docx");
File.Delete("../BankRestAPI/Отчёт по зявкам на снятие.docx"); File.Delete("../BankRestAPI/Отчёт по заявкам на снятие.docx");
_mailKitWorker.SendMailAsync(new() _mailKitWorker.SendMailAsync(new()
{ {
@ -145,7 +147,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
}); });
} }
//Сохранение заготовок с указаеним изделий в файл-Excel // Сохранение банковских счетов с указаением операций по ним в файл-Excel
public void SaveAccountsToExcelFile(ReportBindingModel model) public void SaveAccountsToExcelFile(ReportBindingModel model)
{ {
_saveToExcel.CreateReport(new ExcelInfo _saveToExcel.CreateReport(new ExcelInfo
@ -157,9 +159,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports
Debiting = GetDebitings(model) Debiting = GetDebitings(model)
}, OfficeOperationEnum.Дляассира); }, OfficeOperationEnum.Дляассира);
byte[] excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по зявкам на снятие.xlsx"); byte[] excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по заявкам на снятие.xlsx");
File.Delete("../BankRestAPI/Отчёт по зявкам на снятие.xlsx"); File.Delete("../BankRestAPI/Отчёт по заявкам на снятие.xlsx");
_mailKitWorker.SendMailAsync(new() _mailKitWorker.SendMailAsync(new()
{ {
@ -172,7 +174,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
}); });
} }
//Сохранение заказов в файл-Pdf // Сохранение Банковских счетов с переводами по ним в файл-Pdf
public ReportCashierViewModelForHTML SaveAccountsToPdfFile(ReportBindingModel model) public ReportCashierViewModelForHTML SaveAccountsToPdfFile(ReportBindingModel model)
{ {
var listMoneyTransfers = GetMoneyTransfers(model); var listMoneyTransfers = GetMoneyTransfers(model);
@ -190,23 +192,23 @@ namespace BankBusinessLogic.BusinessLogics.Reports
ReportCashWithdrawal = listCashWithdrawals ReportCashWithdrawal = listCashWithdrawals
}); });
byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_счетам.pdf"); byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_счетам.pdf");
File.Delete("../BankRestAPI/Отчёт_по_счетам.pdf"); File.Delete("../BankRestAPI/Отчёт_по_счетам.pdf");
_mailKitWorker.SendMailAsync(new() _mailKitWorker.SendMailAsync(new()
{ {
MailAddress = model.Email, MailAddress = model.Email,
Subject = "Отчёт по счетам", Subject = "Отчёт по счетам",
Text = $"За период с {model.DateFrom} " + Text = $"За период с {model.DateFrom} " +
$"по {model.DateTo}.", $"по {model.DateTo}.",
File = pdf, File = pdf,
Role = model.Role, Role = model.Role,
TypeDoc = TypeDocEnum.PDF TypeDoc = TypeDocEnum.PDF
}); });
//возврат полученных списков для отображения на вебе // Возврат полученных списков для отображения на вебе
return new ReportCashierViewModelForHTML return new ReportCashierViewModelForHTML
{ {
ReportCashWithdrawal = listCashWithdrawals, ReportCashWithdrawal = listCashWithdrawals,

View File

@ -12,103 +12,112 @@ using BankContracts.ViewModels.Cashier.ViewModels;
using BankContracts.SearchModels.Cashier; using BankContracts.SearchModels.Cashier;
using BankContracts.ViewModels.Client.ViewModels; using BankContracts.ViewModels.Client.ViewModels;
using BankContracts.ViewModels.Reports; using BankContracts.ViewModels.Reports;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankBusinessLogic.BusinessLogics.Reports namespace BankBusinessLogic.BusinessLogics.Reports
{ {
public class ReportClientLogic : IReportClientLogic // Реализация бизнес-логики отчётов по клиенту
{ public class ReportClientLogic : IReportClientLogic
private readonly ICreditingStorage _creditingStorage; {
private readonly IDebitingStorage _debitingStorage; private readonly ICardStorage _cardStorage;
private readonly ICardStorage _cardStorage; private readonly IClientStorage _clientStorage;
private readonly IMoneyTransferStorage _moneyTransferStorage;
private readonly IClientStorage _clientStorage;
private readonly AbstractSaveToExcel _saveToExcel; private readonly ICreditingStorage _creditingStorage;
private readonly AbstractSaveToWord _saveToWord; private readonly IDebitingStorage _debitingStorage;
private readonly AbstractSaveToPdf _saveToPdf; private readonly IMoneyTransferStorage _moneyTransferStorage;
private readonly MailKitWorker _mailKitWorker; private readonly AbstractSaveToExcel _saveToExcel;
private readonly AbstractSaveToWord _saveToWord;
private readonly AbstractSaveToPdf _saveToPdf;
public ReportClientLogic(ICreditingStorage creditingStorage, IDebitingStorage debitingStorage, private readonly MailKitWorker _mailKitWorker;
AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
ICardStorage cardStorage, IMoneyTransferStorage moneyTransferStorage,
MailKitWorker mailKitWorker, IClientStorage clientStorage)
{
_creditingStorage = creditingStorage;
_debitingStorage = debitingStorage;
_cardStorage = cardStorage;
_moneyTransferStorage = moneyTransferStorage;
_clientStorage = clientStorage;
_saveToExcel = saveToExcel; public ReportClientLogic(ICreditingStorage creditingStorage, IDebitingStorage debitingStorage,
_saveToWord = saveToWord; AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
_saveToPdf = saveToPdf; ICardStorage cardStorage, IMoneyTransferStorage moneyTransferStorage,
MailKitWorker mailKitWorker, IClientStorage clientStorage)
{
_creditingStorage = creditingStorage;
_debitingStorage = debitingStorage;
_cardStorage = cardStorage;
_moneyTransferStorage = moneyTransferStorage;
_clientStorage = clientStorage;
_saveToExcel = saveToExcel;
_saveToWord = saveToWord;
_saveToPdf = saveToPdf;
_mailKitWorker = mailKitWorker; _mailKitWorker = mailKitWorker;
} }
public List<ReportClientViewModel>? GetCrediting(ReportBindingModel model) // Информация о пополнениях для отчёта
{ public List<ReportClientViewModel>? GetCrediting(ReportBindingModel model)
return _creditingStorage.GetFilteredList(new CreditingSearchModel {
{ return _creditingStorage.GetFilteredList(new CreditingSearchModel
DateFrom = model.DateFrom, {
DateTo = model.DateTo, DateFrom = model.DateFrom,
}).Select(x => new ReportClientViewModel DateTo = model.DateTo,
{ }).Select(x => new ReportClientViewModel
OperationId = x.Id, {
OperationId = x.Id,
CardNumber = x.CardNumber, CardNumber = x.CardNumber,
SumOperation = x.Sum, SumOperation = x.Sum,
DateComplite = x.DateOpen DateComplite = x.DateOpen
}).ToList(); }).ToList();
} }
public List<ReportClientViewModel>? GetDebiting(ReportBindingModel model) // Информация о снятиях для отчёта
{ public List<ReportClientViewModel>? GetDebiting(ReportBindingModel model)
return _debitingStorage.GetFilteredList(new DebitingSearchModel {
{ return _debitingStorage.GetFilteredList(new DebitingSearchModel
DateTo = model.DateFrom, {
DateFrom = model.DateTo, DateTo = model.DateFrom,
}).Select(x => new ReportClientViewModel DateFrom = model.DateTo,
{ }).Select(x => new ReportClientViewModel
OperationId = x.Id, {
CardNumber = x.CardNumber, OperationId = x.Id,
SumOperation = x.Sum, CardNumber = x.CardNumber,
DateComplite = x.DateClose SumOperation = x.Sum,
}).ToList(); DateComplite = x.DateClose
} }).ToList();
}
//для excel отчёта по переводам между счетов // Для Excel отчёта по переводам между счетов
public List<MoneyTransferViewModel>? GetMoneyTransfer(ReportBindingModel model) public List<MoneyTransferViewModel>? GetMoneyTransfer(ReportBindingModel model)
{ {
//список счетов по выбранным картам // Список счетов по выбранным картам
List<int> accountId = new(); List<int> accountId = new();
foreach(var index in model.CardList) foreach (var index in model.CardList)
{ {
accountId.Add(_cardStorage.GetElement(new CardSearchModel { Id = index}).AccountId); accountId.Add(_cardStorage.GetElement(new CardSearchModel { Id = index }).AccountId);
} }
var list = accountId.ToHashSet().ToList(); var list = accountId.ToHashSet().ToList();
List<MoneyTransferViewModel> totalList = new(); List<MoneyTransferViewModel> totalList = new();
foreach (var index in list) foreach (var index in list)
{ {
var result = _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel var result = _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel
{ {
AccountSenderId = index, AccountSenderId = index,
AccountPayeeId = index AccountPayeeId = index
}).OrderBy(x => x.AccountSenderId).ToList(); }).OrderBy(x => x.AccountSenderId).ToList();
totalList.AddRange(result); totalList.AddRange(result);
} }
return totalList; return totalList;
} }
//для excel отчёта по пополнениям карты // Для Excel отчёта по пополнениям карты
public List<CreditingViewModel> GetExcelCrediting(ReportBindingModel model) public List<CreditingViewModel> GetExcelCrediting(ReportBindingModel model)
{ {
List<CreditingViewModel> totalList = new(); List<CreditingViewModel> totalList = new();
foreach (var index in model.CardList) foreach (var index in model.CardList)
@ -124,7 +133,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
return totalList; return totalList;
} }
//для excel отчёта по снятиям с карты // Для Excel отчёта по снятиям с карты
public List<DebitingViewModel> GetExcelDebiting(ReportBindingModel model) public List<DebitingViewModel> GetExcelDebiting(ReportBindingModel model)
{ {
List<DebitingViewModel> totalList = new(); List<DebitingViewModel> totalList = new();
@ -142,16 +151,17 @@ namespace BankBusinessLogic.BusinessLogics.Reports
return totalList; return totalList;
} }
public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum) // Сохранение в файл-Excel для клиентов
{ public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
{
byte[] excel = Array.Empty<byte>(); byte[] excel = Array.Empty<byte>();
if (operationEnum == OfficeOperationEnum.Между_cчетами) if (operationEnum == OfficeOperationEnum.Между_cчетами)
{ {
_saveToExcel.CreateReport(new ExcelInfo _saveToExcel.CreateReport(new ExcelInfo
{ {
FileName = model.FileName, FileName = model.FileName,
Title = "Отчёт по переводам", Title = "Отчёт по переводам",
MoneyTransfer = GetMoneyTransfer(model) MoneyTransfer = GetMoneyTransfer(model)
}, operationEnum); }, operationEnum);
@ -162,12 +172,12 @@ namespace BankBusinessLogic.BusinessLogics.Reports
if (operationEnum == OfficeOperationEnum.Пополнениеарт) if (operationEnum == OfficeOperationEnum.Пополнениеарт)
{ {
_saveToExcel.CreateReport(new ExcelInfo _saveToExcel.CreateReport(new ExcelInfo
{ {
FileName = model.FileName, FileName = model.FileName,
Title = "Отчёт по пополнениям (переводам из налички на карту)", Title = "Отчёт по пополнениям (переводам из налички на карту)",
Crediting = GetExcelCrediting(model) Crediting = GetExcelCrediting(model)
}, operationEnum); }, operationEnum);
excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по пополнениям.xlsx"); excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по пополнениям.xlsx");
@ -199,8 +209,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports
}); });
} }
public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum) // Сохранение в файл-Word для клиентов
{ public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
{
byte[] word = Array.Empty<byte>(); byte[] word = Array.Empty<byte>();
if (operationEnum == OfficeOperationEnum.Между_cчетами) if (operationEnum == OfficeOperationEnum.Между_cчетами)
@ -256,11 +267,11 @@ namespace BankBusinessLogic.BusinessLogics.Reports
}); });
} }
//отчёт в формате PDF для клиента // Сохранение в файл-Pdf для клиента
public ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model) public ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model)
{ {
var listCreditings = GetCrediting(model); var listCreditings = GetCrediting(model);
var listDebitings = GetDebiting(model); var listDebitings = GetDebiting(model);
_saveToPdf.CreateDoc(new PdfInfo _saveToPdf.CreateDoc(new PdfInfo
{ {
@ -269,31 +280,31 @@ namespace BankBusinessLogic.BusinessLogics.Reports
DateFrom = model.DateFrom!.Value, DateFrom = model.DateFrom!.Value,
DateTo = model.DateTo!.Value, DateTo = model.DateTo!.Value,
ReportCrediting = listCreditings, ReportCrediting = listCreditings,
ReportDebiting = listDebitings ReportDebiting = listDebitings
}); });
byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_поартам.pdf"); byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_поартам.pdf");
_mailKitWorker.SendMailAsync(new() _mailKitWorker.SendMailAsync(new()
{ {
MailAddress = model.Email, MailAddress = model.Email,
Subject = "Отчёт по картам", Subject = "Отчёт по картам",
Text = $"За период с {model.DateFrom} " + Text = $"За период с {model.DateFrom} " +
$"по {model.DateTo}.", $"по {model.DateTo}.",
File = pdf, File = pdf,
Role = model.Role, Role = model.Role,
TypeDoc = TypeDocEnum.PDF TypeDoc = TypeDocEnum.PDF
}); });
File.Delete("../BankRestAPI/Отчёт_поартам.pdf"); File.Delete("../BankRestAPI/Отчёт_поартам.pdf");
//возврат полученных списков для отображения на вебе // Возврат полученных списков для отображения на вебе
return new ReportClientViewModelForHTML return new ReportClientViewModelForHTML
{ {
ReportCrediting = listCreditings, ReportCrediting = listCreditings,
ReportDebiting = listDebitings ReportDebiting = listDebitings
}; };
} }
} }
} }

View File

@ -16,7 +16,7 @@ using BankContracts.BindingModels.Messages;
namespace BankBusinessLogic.MailWorker namespace BankBusinessLogic.MailWorker
{ {
//класс, отвечающий за отправку письма // Класс, отвечающий за отправку письма на почту
public class MailKitWorker public class MailKitWorker
{ {
private string _mailLogin = string.Empty; private string _mailLogin = string.Empty;
@ -29,7 +29,8 @@ namespace BankBusinessLogic.MailWorker
private readonly ILogger logger; private readonly ILogger logger;
public MailKitWorker(ILogger<MailKitWorker> logger) // Конструктор
public MailKitWorker(ILogger<MailKitWorker> logger)
{ {
this.logger = logger; this.logger = logger;
} }
@ -58,9 +59,9 @@ namespace BankBusinessLogic.MailWorker
MemoryStream ms = new(info.File); MemoryStream ms = new(info.File);
if(info.Role == MailsEnum.Клиент) if (info.Role == MailsEnum.Клиент)
{ {
if(info.TypeDoc == TypeDocEnum.PDF) if (info.TypeDoc == TypeDocEnum.PDF)
{ {
objMailMessage.Attachments.Add(new Attachment(ms, "Отчёт_для_клиента.pdf", "application/pdf")); objMailMessage.Attachments.Add(new Attachment(ms, "Отчёт_для_клиента.pdf", "application/pdf"));
} }

View File

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

View File

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

View File

@ -2,8 +2,8 @@
ViewData["Title"] = "Создание карты"; ViewData["Title"] = "Создание карты";
} }
<div class="text-center"> <div class="text-center mb-2">
<h2 class="display-4">Создание карты</h2> <h2 class="display-4">Создание банковской карты</h2>
</div> </div>
<form method="post"> <form method="post">
<div class="row mb-2"> <div class="row mb-2">
@ -30,7 +30,7 @@
<input type="date" class="form-control" name="period" id="period" required /> <input type="date" class="form-control" name="period" id="period" required />
</div> </div>
</div> </div>
<div class="row mb-2"> <div class="row mb-2 mt-2">
<input type="submit" value="Создание" style="width: 100%" class="btn btn-warning" /> <input type="submit" value="Создание" style="width: 100%" class="btn btn-warning" />
</div> </div>
</form> </form>

View File

@ -7,9 +7,10 @@ using System.Threading.Tasks;
namespace BankDataModels.Models.Cashier namespace BankDataModels.Models.Cashier
{ {
//банковский счёт // Интерфейс, отвечающий за банковский cчёт
public interface IAccountModel : IId public interface IAccountModel : IId
{ {
// Номер счёта
string AccountNumber { get; } string AccountNumber { get; }
int CashierId { get; } int CashierId { get; }
@ -18,8 +19,10 @@ namespace BankDataModels.Models.Cashier
string PasswordAccount { get; } string PasswordAccount { get; }
// Сумма на счёте
double Balance { get; } double Balance { get; }
// Дата открытия
DateTime DateOpen { get; } DateTime DateOpen { get; }
} }
} }

View File

@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace BankDataModels.Models.Cashier namespace BankDataModels.Models.Cashier
{ {
//выдача наличных // Интерфейс, отвечающий за выдачу наличных
public interface ICashWithdrawalModel : IId public interface ICashWithdrawalModel : IId
{ {
int DebitingId { get; } int DebitingId { get; }
@ -15,8 +15,10 @@ namespace BankDataModels.Models.Cashier
int CashierId { get; } int CashierId { get; }
// Сумма наличисления наличных
int Sum { get; } int Sum { get; }
// Дата выдачи наличных
DateTime DateOperation { get; } DateTime DateOperation { get; }
} }
} }

View File

@ -6,19 +6,25 @@ using System.Threading.Tasks;
namespace BankDataModels.Models.Cashier namespace BankDataModels.Models.Cashier
{ {
//клиент // Интерфейс, отвечающий за кассира
public interface ICashierModel : IId public interface ICashierModel : IId
{ {
// Пароль от аккаунта кассира
string Password { get; } string Password { get; }
// Имя кассира
string Name { get; } string Name { get; }
// Фамилия кассира
string Surname { get; } string Surname { get; }
// Отчество кассира
string Patronymic { get; } string Patronymic { get; }
// Отчество кассира
string Email { get; } string Email { get; }
// Мобильный телефон кассира
string Telephone { get; } string Telephone { get; }
} }
} }

View File

@ -6,15 +6,17 @@ using System.Threading.Tasks;
namespace BankDataModels.Models.Cashier namespace BankDataModels.Models.Cashier
{ {
//перевод денег // Интерфейс, отвечающий за перевод денег
public interface IMoneyTransferModel : IId public interface IMoneyTransferModel : IId
{ {
// Сумма перевода
int Sum { get; } int Sum { get; }
int? AccountSenderId { get; } int? AccountSenderId { get; }
int AccountPayeeId { get; } int AccountPayeeId { get; }
// Дата перевода
DateTime DateOperation { get; } DateTime DateOperation { get; }
int? CreditingId { get; } int? CreditingId { get; }

View File

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

View File

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

View File

@ -6,17 +6,20 @@ using System.Threading.Tasks;
namespace BankDataModels.Models.Client namespace BankDataModels.Models.Client
{ {
//банковская карта // Интерфейс, отвечающий за банковскую карту
public interface ICardModel : IId public interface ICardModel : IId
{ {
int ClientID { get; } int ClientID { get; }
int AccountId { get; } int AccountId { get; }
// Номер банковской карты
string Number { get; } string Number { get; }
// Код CVC
string CVC { get; } string CVC { get; }
// Период пользования картой
DateTime Period { get; } DateTime Period { get; }
} }
} }

View File

@ -6,19 +6,25 @@ using System.Threading.Tasks;
namespace BankDataModels.Models.Client namespace BankDataModels.Models.Client
{ {
//клиент // Интерфейс, отвечающий за клиента
public interface IClientModel : IId public interface IClientModel : IId
{ {
// Пароль от аккаунта клиента
string Password { get; } string Password { get; }
// Имя клиента
string Name { get; } string Name { get; }
// Фамилия клиента
string Surname { get; } string Surname { get; }
// Отчество клиента
string Patronymic { get; } string Patronymic { get; }
// Электронная почта клиента
string Email { get; } string Email { get; }
// Мобильный телефон клиента
string Telephone { get; } string Telephone { get; }
} }
} }

View File

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