Подправил Html и комментики
This commit is contained in:
parent
0f70b85ca6
commit
2791d89c9d
@ -1,22 +1,26 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" />
|
||||
<PackageReference Include="MailKit" Version="4.5.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
|
||||
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" />
|
||||
<PackageReference Include="MailKit" Version="4.5.0" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.18">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
|
||||
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\BankContracts\BankContracts.csproj" />
|
||||
<ProjectReference Include="..\BankDatabaseImplement\BankDatabaseImplement.csproj" />
|
||||
<ProjectReference Include="..\BankDataModels\BankDataModels.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\BankContracts\BankContracts.csproj" />
|
||||
<ProjectReference Include="..\BankDatabaseImplement\BankDatabaseImplement.csproj" />
|
||||
<ProjectReference Include="..\BankDataModels\BankDataModels.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -6,10 +6,16 @@ using BankContracts.ViewModels.Cashier.Diagram;
|
||||
using BankContracts.ViewModels.Cashier.ViewModels;
|
||||
using BankDataModels.Enums;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
{
|
||||
public class AccountLogic : IAccountLogic
|
||||
// Класс, реализующий бизнес-логику для счетов
|
||||
public class AccountLogic : IAccountLogic
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
|
||||
@ -17,6 +23,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
private readonly ICashWithdrawalLogic _cashWithdrawalLogic;
|
||||
private readonly IMoneyTransferLogic _moneyTransferLogic;
|
||||
|
||||
// Конструктор
|
||||
public AccountLogic(ILogger<AccountLogic> logger, IAccountStorage accountStorage,
|
||||
ICashWithdrawalLogic cashWithdrawalLogic, IMoneyTransferLogic moneyTransferLogic)
|
||||
{
|
||||
@ -26,6 +33,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
_moneyTransferLogic = moneyTransferLogic;
|
||||
}
|
||||
|
||||
// Вывод конкретного счёта
|
||||
public AccountViewModel? ReadElement(AccountSearchModel model)
|
||||
{
|
||||
if (model == null)
|
||||
@ -49,11 +57,12 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return element;
|
||||
}
|
||||
|
||||
// Вывод всего списка счетов
|
||||
public List<AccountViewModel>? ReadList(AccountSearchModel? model)
|
||||
{
|
||||
//_logger.LogInformation("ReadList. AccountNumber:{AccountNumber}. Id:{Id}", model.AccountNumber, model?.Id);
|
||||
_logger.LogInformation("ReadList. AccountNumber:{AccountNumber}. Id:{Id}", model.AccountNumber, model?.Id);
|
||||
|
||||
//list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
var list = model == null ? _accountStorage.GetFullList() : _accountStorage.GetFilteredList(model);
|
||||
|
||||
if (list == null)
|
||||
@ -67,10 +76,10 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return list;
|
||||
}
|
||||
|
||||
//метод, отвечающий за изменение баланса счёта
|
||||
// Метод, отвечающий за изменение баланса на банковском счёте
|
||||
public bool ChangeBalance(AccountSearchModel? model, int sum)
|
||||
{
|
||||
//ищем счёт
|
||||
// Ищем счёт
|
||||
var account = ReadElement(model);
|
||||
|
||||
if (account == null)
|
||||
@ -78,13 +87,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
throw new ArgumentNullException("Счёт не найден", nameof(account));
|
||||
}
|
||||
|
||||
//проверяем возможность операции снятия (sum может быть отрицательной)
|
||||
// Проверяем возможность операции снятия (sum может быть отрицательной)
|
||||
if (sum + account.Balance < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//обновляем балланс счёта
|
||||
// Обновляем балланс счёта
|
||||
_accountStorage.Update(new AccountBindingModel
|
||||
{
|
||||
Id = account.Id,
|
||||
@ -94,6 +103,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
// Создание счёта
|
||||
public bool Create(AccountBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
@ -108,6 +118,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
// Обновление счёта
|
||||
public bool Update(AccountBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
@ -122,6 +133,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
// Удаление счёта
|
||||
public bool Delete(AccountBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
@ -138,84 +150,85 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<CashierDiagramElementsViewModel> GetMonthInfo(int AccountId)
|
||||
{
|
||||
public List<CashierDiagramElementsViewModel> GetMonthInfo(int AccountId)
|
||||
{
|
||||
|
||||
Dictionary<(int, int), int> cashWithdrawals = _cashWithdrawalLogic.ReadList(new CashWithdrawalSearchModel()
|
||||
{
|
||||
AccountId = AccountId,
|
||||
}).Where(x => x.DebitingStatus == StatusEnum.Закрыта ).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||
Dictionary<(int, int), int> cashWithdrawals = _cashWithdrawalLogic.ReadList(new CashWithdrawalSearchModel()
|
||||
{
|
||||
AccountId = AccountId,
|
||||
}).Where(x => x.DebitingStatus == StatusEnum.Закрыта).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||
|
||||
Dictionary<(int, int), int> moneyTransfers = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
|
||||
{
|
||||
AccountPayeeId = AccountId,
|
||||
}).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||
Dictionary<(int, int), int> moneyTransfers = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
|
||||
{
|
||||
AccountPayeeId = AccountId,
|
||||
}).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||
|
||||
Dictionary<(int, int), int> moneyTransfersDebiting = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
|
||||
{
|
||||
AccountSenderId = AccountId,
|
||||
}).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||
Dictionary<(int, int), int> moneyTransfersDebiting = _moneyTransferLogic.ReadList(new MoneyTransferSearchModel()
|
||||
{
|
||||
AccountSenderId = AccountId,
|
||||
}).GroupBy(x => new { x.DateOperation.Month, x.DateOperation.Year })
|
||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||
|
||||
List<CashierDiagramElementsViewModel> result = new();
|
||||
List<CashierDiagramElementsViewModel> result = new();
|
||||
|
||||
int sum = 0;
|
||||
|
||||
foreach (var key in cashWithdrawals.Keys.Union(moneyTransfers.Keys).Union(moneyTransfers.Keys).OrderBy(x => x.Item1 * 12 + x.Item2))
|
||||
{
|
||||
if (cashWithdrawals.ContainsKey(key)) sum += cashWithdrawals.GetValueOrDefault(key);
|
||||
if (moneyTransfers.ContainsKey(key)) sum += moneyTransfers.GetValueOrDefault(key);
|
||||
if (moneyTransfers.ContainsKey(key)) sum -= moneyTransfersDebiting.GetValueOrDefault(key);
|
||||
result.Add(new CashierDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum });
|
||||
}
|
||||
return result;
|
||||
}
|
||||
{
|
||||
if (cashWithdrawals.ContainsKey(key)) sum += cashWithdrawals.GetValueOrDefault(key);
|
||||
if (moneyTransfers.ContainsKey(key)) sum += moneyTransfers.GetValueOrDefault(key);
|
||||
if (moneyTransfers.ContainsKey(key)) sum -= moneyTransfersDebiting.GetValueOrDefault(key);
|
||||
result.Add(new CashierDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum });
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//проверка входного аргумента для методов Insert, Update и Delete
|
||||
private void CheckModel(AccountBindingModel model, bool withParams = true)
|
||||
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||
private void CheckModel(AccountBindingModel model, bool withParams = true)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
|
||||
//так как при удалении передаём как параметр false
|
||||
// Так как при удалении передаём как параметр false
|
||||
if (!withParams)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//проверка на наличие номера счёта
|
||||
// Проверка на наличие номера счёта
|
||||
if (string.IsNullOrEmpty(model.AccountNumber))
|
||||
{
|
||||
throw new ArgumentNullException("Отсутствие номера у счёта", nameof(model.AccountNumber));
|
||||
}
|
||||
|
||||
//проверка на наличие id владельца
|
||||
if (model.CashierId < 0)
|
||||
// Проверка на наличие id владельца
|
||||
if (model.CashierId < 0)
|
||||
{
|
||||
throw new ArgumentNullException("Некорректный Id владельца счёта", nameof(model.CashierId));
|
||||
}
|
||||
|
||||
//проверка на наличие id кассира, создавшего счёт
|
||||
// Проверка на наличие id кассира, создавшего счёт
|
||||
if (model.CashierId < 0)
|
||||
{
|
||||
throw new ArgumentNullException("Некорректный Id кассира, открывшего счёт", nameof(model.CashierId));
|
||||
}
|
||||
|
||||
//проверка на наличие пароля счёта
|
||||
if (string.IsNullOrEmpty(model.PasswordAccount) )
|
||||
// Проверка на наличие пароля счёта
|
||||
if (string.IsNullOrEmpty(model.PasswordAccount))
|
||||
{
|
||||
throw new ArgumentNullException("Некорректный пароль счёта", nameof(model.PasswordAccount));
|
||||
}
|
||||
|
||||
if (model.Balance < 0) {
|
||||
throw new ArgumentNullException("Изначальный баланс аккаунта не может быть < 0", nameof(model.Balance));
|
||||
}
|
||||
if (model.Balance < 0)
|
||||
{
|
||||
throw new ArgumentNullException("Изначальный баланс аккаунта не может быть < 0", nameof(model.Balance));
|
||||
}
|
||||
|
||||
//проверка на корректную дату открытия счёта
|
||||
// Проверка на корректную дату открытия счёта
|
||||
if (model.DateOpen > DateTime.Now)
|
||||
{
|
||||
throw new ArgumentNullException("Дата открытия счёта не может быть ранее текущей", nameof(model.DateOpen));
|
||||
@ -225,13 +238,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
"CashierId:{CashierId}. DateOpen:{DateOpen}. Id:{Id}",
|
||||
model.AccountNumber, model.PasswordAccount, model.ClientId, model.CashierId, model.DateOpen, model.Id);
|
||||
|
||||
//для проверка на наличие такого же счёта
|
||||
// Для проверка на наличие такого же счёта
|
||||
var element = _accountStorage.GetElement(new AccountSearchModel
|
||||
{
|
||||
AccountNumber = model.AccountNumber,
|
||||
});
|
||||
|
||||
//если элемент найден и его Id не совпадает с Id переданного объекта
|
||||
// Если элемент найден и его Id не совпадает с Id переданного объекта
|
||||
if (element != null && element.Id != model.Id)
|
||||
{
|
||||
throw new InvalidOperationException("Счёт с таким номером уже существует");
|
||||
|
@ -7,10 +7,16 @@ using BankContracts.StoragesContracts.Client;
|
||||
using BankContracts.ViewModels.Cashier.ViewModels;
|
||||
using BankDataModels.Enums;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
{
|
||||
public class CashWithdrawalLogic : ICashWithdrawalLogic
|
||||
// Класс, реализующий бизнес-логику для снятия наличных
|
||||
public class CashWithdrawalLogic : ICashWithdrawalLogic
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
|
||||
@ -18,6 +24,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
|
||||
private readonly IDebitingStorage _debitingStorage;
|
||||
|
||||
// Конструктор
|
||||
public CashWithdrawalLogic(ILogger<CashWithdrawalLogic> logger, ICashWithdrawalStorage cashWithdrawalStorage,
|
||||
IDebitingStorage debitingStorage)
|
||||
{
|
||||
@ -26,6 +33,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
_debitingStorage = debitingStorage;
|
||||
}
|
||||
|
||||
// Вывод конкретной операции
|
||||
public CashWithdrawalViewModel? ReadElement(CashWithdrawalSearchModel model)
|
||||
{
|
||||
if (model == null)
|
||||
@ -50,12 +58,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return element;
|
||||
}
|
||||
|
||||
// Вывод всего списка операций
|
||||
public List<CashWithdrawalViewModel>? ReadList(CashWithdrawalSearchModel? model)
|
||||
{
|
||||
_logger.LogInformation("ReadElement. AccountId:{AccountId}. Sum:{Sum}. DateOperation:{DateOperation}. Id:{Id}",
|
||||
model?.AccountId, model?.Sum, model?.DateTo, model?.Id);
|
||||
|
||||
//list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
var list = model == null ? _cashWithdrawalStorage.GetFullList() : _cashWithdrawalStorage.GetFilteredList(model);
|
||||
|
||||
if (list == null)
|
||||
@ -69,6 +78,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return list;
|
||||
}
|
||||
|
||||
// Создание операции
|
||||
public bool Create(CashWithdrawalBindingModel model, bool flag)
|
||||
{
|
||||
CheckModel(model);
|
||||
@ -102,6 +112,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
// Обновление операции
|
||||
public bool Update(CashWithdrawalBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
@ -116,6 +127,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
// Удаление операции
|
||||
public bool Delete(CashWithdrawalBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
@ -132,7 +144,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
//проверка входного аргумента для методов Insert, Update и Delete
|
||||
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||
private void CheckModel(CashWithdrawalBindingModel model, bool withParams = true)
|
||||
{
|
||||
if (model == null)
|
||||
@ -140,25 +152,25 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
|
||||
//так как при удалении передаём как параметр false
|
||||
// Так как при удалении передаём как параметр false
|
||||
if (!withParams)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//проверка на корректность Id счёта
|
||||
// Проверка на корректность Id счёта
|
||||
if (model.AccountId < 0)
|
||||
{
|
||||
throw new ArgumentNullException("Некорректный Id счёта", nameof(model.AccountId));
|
||||
}
|
||||
|
||||
//проверка на корректность снимаемой суммы
|
||||
// Проверка на корректность снимаемой суммы
|
||||
if (model.Sum <= 0)
|
||||
{
|
||||
throw new ArgumentNullException("Снимаемая сумма не может раняться нулю или быть меньше его", nameof(model.Sum));
|
||||
}
|
||||
|
||||
//проверка на корректную дату операции
|
||||
// Проверка на корректную дату операции
|
||||
if (model.DateOperation > DateTime.Now)
|
||||
{
|
||||
throw new ArgumentNullException("Дата операции не может быть позднее текущей", nameof(model.DateOperation));
|
||||
|
@ -4,21 +4,30 @@ using BankContracts.SearchModels.Cashier;
|
||||
using BankContracts.StoragesContracts.Cashier;
|
||||
using BankContracts.ViewModels.Cashier.ViewModels;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System.Text.RegularExpressions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
{
|
||||
public class CashierLogic : ICashierLogic
|
||||
// Класс, реализующий бизнес-логику для кассиров
|
||||
public class CashierLogic : ICashierLogic
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
|
||||
private readonly ICashierStorage _cashierStorage;
|
||||
|
||||
// Конструктор
|
||||
public CashierLogic(ILogger<CashierLogic> logger, ICashierStorage cashierStorage)
|
||||
{
|
||||
_logger = logger;
|
||||
_cashierStorage = cashierStorage;
|
||||
}
|
||||
|
||||
// Вывод конкретного клиента
|
||||
public CashierViewModel? ReadElement(CashierSearchModel model)
|
||||
{
|
||||
if (model == null)
|
||||
@ -43,12 +52,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return element;
|
||||
}
|
||||
|
||||
// Вывод отфильтрованного списка
|
||||
public List<CashierViewModel>? ReadList(CashierSearchModel? model)
|
||||
{
|
||||
_logger.LogInformation("ReadList. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. Id:{Id}",
|
||||
model.Name, model.Surname, model.Patronymic, model?.Id);
|
||||
|
||||
//list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
var list = model == null ? _cashierStorage.GetFullList() : _cashierStorage.GetFilteredList(model);
|
||||
|
||||
if (list == null)
|
||||
@ -62,6 +72,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return list;
|
||||
}
|
||||
|
||||
// Создание кассира
|
||||
public bool Create(CashierBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
@ -76,6 +87,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
// Обновление кассира
|
||||
public bool Update(CashierBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
@ -90,6 +102,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
// Удаление кассира
|
||||
public bool Delete(CashierBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
@ -106,7 +119,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
//проверка входного аргумента для методов Insert, Update и Delete
|
||||
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||
private void CheckModel(CashierBindingModel model, bool withParams = true)
|
||||
{
|
||||
if (model == null)
|
||||
@ -114,53 +127,70 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
|
||||
//так как при удалении передаём как параметр false
|
||||
// Так как при удалении передаём как параметр false
|
||||
if (!withParams)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//проверка на наличие имени
|
||||
// Проверка на наличие имени
|
||||
if (string.IsNullOrEmpty(model.Name))
|
||||
{
|
||||
throw new ArgumentNullException("Отсутствие имени в учётной записи", nameof(model.Name));
|
||||
}
|
||||
|
||||
//проверка на наличие фамилия
|
||||
// Проверка на наличие фамилия
|
||||
if (string.IsNullOrEmpty(model.Surname))
|
||||
{
|
||||
throw new ArgumentNullException("Отсутствие фамилии в учётной записи", nameof(model.Name));
|
||||
}
|
||||
|
||||
//проверка на наличие отчество
|
||||
// Проверка на наличие отчество
|
||||
if (string.IsNullOrEmpty(model.Patronymic))
|
||||
{
|
||||
throw new ArgumentNullException("Отсутствие отчества в учётной записи", nameof(model.Name));
|
||||
}
|
||||
|
||||
//проверка на наличие почты
|
||||
// Проверка на наличие почты
|
||||
if (string.IsNullOrEmpty(model.Email))
|
||||
{
|
||||
throw new ArgumentNullException("Отсутствие почты в учётной записи (логина)", nameof(model.Email));
|
||||
}
|
||||
|
||||
//проверка на наличие пароля
|
||||
// Проверка на наличие мобильного телефона
|
||||
if (string.IsNullOrEmpty(model.Telephone))
|
||||
{
|
||||
throw new ArgumentNullException("Нет моб.телефона пользователя", nameof(model.Telephone));
|
||||
}
|
||||
|
||||
// Проверка на наличие пароля
|
||||
if (string.IsNullOrEmpty(model.Password))
|
||||
{
|
||||
throw new ArgumentNullException("Отсутствие пароля в учётной записи", nameof(model.Password));
|
||||
}
|
||||
|
||||
if (!Regex.IsMatch(model.Email, @"^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$", RegexOptions.IgnoreCase))
|
||||
{
|
||||
throw new ArgumentException("Некорректная почта", nameof(model.Email));
|
||||
}
|
||||
|
||||
if (!Regex.IsMatch(model.Password, @"^((\w+\d+\W+)|(\w+\W+\d+)|(\d+\w+\W+)|(\d+\W+\w+)|(\W+\w+\d+)|(\W+\d+\w+))[\w\d\W]*$", RegexOptions.IgnoreCase)
|
||||
&& model.Password.Length < 10 && model.Password.Length > 50)
|
||||
{
|
||||
throw new ArgumentException("Необходимо придумать другой пароль", nameof(model.Password));
|
||||
}
|
||||
|
||||
_logger.LogInformation("Cashier. CashierName:{Name}. CashierSurname:{Surname}. CashierPatronymic:{Patronymic}. " +
|
||||
"Email:{Email}. Password:{Password}. Id:{Id}",
|
||||
model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Id);
|
||||
|
||||
//для проверка на наличие такого же аккаунта
|
||||
// Для проверки на наличие такого же аккаунта
|
||||
var element = _cashierStorage.GetElement(new CashierSearchModel
|
||||
{
|
||||
Email = model.Email,
|
||||
});
|
||||
|
||||
//если элемент найден и его Id не совпадает с Id переданного объекта
|
||||
// Если элемент найден и его Id не совпадает с Id переданного объекта
|
||||
if (element != null && element.Id != model.Id)
|
||||
{
|
||||
throw new InvalidOperationException("Аккаунт с таким логином уже есть");
|
||||
|
@ -7,10 +7,16 @@ using BankContracts.StoragesContracts.Client;
|
||||
using BankContracts.ViewModels.Cashier.ViewModels;
|
||||
using BankDataModels.Enums;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
{
|
||||
public class MoneyTransferLogic : IMoneyTransferLogic
|
||||
// Класс, реализующий бизнес-логику для перевода наличных
|
||||
public class MoneyTransferLogic : IMoneyTransferLogic
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
|
||||
@ -18,6 +24,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
|
||||
public readonly ICreditingStorage _creditingStorage;
|
||||
|
||||
// Конструктор
|
||||
public MoneyTransferLogic(ILogger<MoneyTransferLogic> logger, IMoneyTransferStorage moneyTransferStorage, ICreditingStorage creditingStorage)
|
||||
{
|
||||
_logger = logger;
|
||||
@ -25,6 +32,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
_creditingStorage = creditingStorage;
|
||||
}
|
||||
|
||||
// Вывод конкретной операции
|
||||
public MoneyTransferViewModel? ReadElement(MoneyTransferSearchModel model)
|
||||
{
|
||||
if (model == null)
|
||||
@ -49,12 +57,13 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return element;
|
||||
}
|
||||
|
||||
// Вывод всего списка операций на перевод наличных
|
||||
public List<MoneyTransferViewModel>? ReadList(MoneyTransferSearchModel? model)
|
||||
{
|
||||
_logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}",
|
||||
model?.AccountSenderId, model?.AccountPayeeId, model?.Sum, model?.Id);
|
||||
|
||||
//list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
var list = model == null ? _moneyTransferStorage.GetFullList() : _moneyTransferStorage.GetFilteredList(model);
|
||||
|
||||
if (list == null)
|
||||
@ -68,6 +77,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return list;
|
||||
}
|
||||
|
||||
// Создание операции на перевод
|
||||
public bool Create(MoneyTransferBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
@ -79,7 +89,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return false;
|
||||
}
|
||||
|
||||
//проверка на то, что это зачисление на карту, а не перевод между счетами
|
||||
// Проверка на то, что это зачисление на карту, а не перевод между счетами
|
||||
if (model.CreditingId.HasValue)
|
||||
{
|
||||
_creditingStorage.Update(new CreditingBindingModel
|
||||
@ -94,6 +104,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
// Обновление операции на перевод
|
||||
public bool Update(MoneyTransferBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
@ -108,6 +119,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
// Удаление операции на перевод
|
||||
public bool Delete(MoneyTransferBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
@ -124,7 +136,7 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
return true;
|
||||
}
|
||||
|
||||
//проверка входного аргумента для методов Insert, Update и Delete
|
||||
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||
private void CheckModel(MoneyTransferBindingModel model, bool withParams = true)
|
||||
{
|
||||
if (model == null)
|
||||
@ -132,31 +144,31 @@ namespace BankBusinessLogic.BusinessLogics.Cashier
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
|
||||
//так как при удалении передаём как параметр false
|
||||
// Так как при удалении передаём как параметр false
|
||||
if (!withParams)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//проверка корректности Id счёта отправителя
|
||||
// Проверка корректности Id счёта отправителя
|
||||
if (model.AccountSenderId < 0)
|
||||
{
|
||||
throw new ArgumentNullException("Отсутствие Id у счёта отправителя", nameof(model.AccountSenderId));
|
||||
}
|
||||
|
||||
//проверка корректности Id счёта получателя
|
||||
// Проверка корректности Id счёта получателя
|
||||
if (model.AccountPayeeId < 0)
|
||||
{
|
||||
throw new ArgumentNullException("Отсутствие Id у счёта получателя", nameof(model.AccountPayeeId));
|
||||
}
|
||||
|
||||
//проверка на корректную сумму перевода
|
||||
// Проверка на корректную сумму перевода
|
||||
if (model.Sum <= 0)
|
||||
{
|
||||
throw new ArgumentNullException("Сумма перевода не может раняться нулю или быть меньше его", nameof(model.Sum));
|
||||
}
|
||||
|
||||
//проверка на корректную дату открытия счёта
|
||||
// Проверка на корректную дату открытия счёта
|
||||
if (model.DateOperation > DateTime.Now)
|
||||
{
|
||||
throw new ArgumentNullException("Дата операции не может быть ранее текущей", nameof(model.DateOperation));
|
||||
|
@ -8,160 +8,216 @@ using BankContracts.BindingModels.Client;
|
||||
using BankContracts.SearchModels.Client;
|
||||
using BankContracts.ViewModels.Client.ViewModels;
|
||||
using BankContracts.SearchModels.Cashier;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BankBusinessLogic.BusinessLogics.Client
|
||||
{
|
||||
public class CardLogic : ICardLogic
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
private readonly ICardStorage _cardStorage;
|
||||
private readonly IAccountLogic _accountLogic;
|
||||
private readonly IDebitingLogic _debitingLogic;
|
||||
private readonly ICreditingLogic _creditingLogic;
|
||||
// Класс, реализующий бизнес-логику для банковских карт
|
||||
public class CardLogic : ICardLogic
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public CardLogic(ILogger<CardLogic> logger, ICardStorage cardStorage, IAccountLogic accountLogic,
|
||||
IDebitingLogic debitingLogic, ICreditingLogic creditingLogic) {
|
||||
_logger = logger;
|
||||
_cardStorage = cardStorage;
|
||||
_accountLogic = accountLogic;
|
||||
_debitingLogic = debitingLogic;
|
||||
_creditingLogic = creditingLogic;
|
||||
}
|
||||
private readonly ICardStorage _cardStorage;
|
||||
|
||||
private readonly IAccountLogic _accountLogic;
|
||||
|
||||
private readonly IDebitingLogic _debitingLogic;
|
||||
|
||||
private readonly ICreditingLogic _creditingLogic;
|
||||
|
||||
// Конструктор
|
||||
public CardLogic(ILogger<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)
|
||||
{
|
||||
CheckModel(model);
|
||||
if (_cardStorage.Insert(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Insert operation failed");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
{
|
||||
CheckModel(model);
|
||||
|
||||
public bool Delete(CardBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||
if (_cardStorage.Delete(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Delete operation failed");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (_cardStorage.Insert(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Insert operation failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
public CardViewModel? ReadElement(CardSearchModel model)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
_logger.LogInformation("ReadElement. CardNumber:{Number}.Id:{ Id}", model.Number, model.Id);
|
||||
var element = _cardStorage.GetElement(model);
|
||||
if (element == null)
|
||||
{
|
||||
_logger.LogWarning("ReadElement element not found");
|
||||
return null;
|
||||
}
|
||||
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
||||
return element;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<CardViewModel>? ReadList(CardSearchModel? model)
|
||||
{
|
||||
_logger.LogInformation("ReadList. CardId:{Id}", model?.Id);
|
||||
var list = model == null ? _cardStorage.GetFullList() : _cardStorage.GetFilteredList(model);
|
||||
if (list == null)
|
||||
{
|
||||
_logger.LogWarning("ReadList return null list");
|
||||
return null;
|
||||
}
|
||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
||||
return list;
|
||||
}
|
||||
// Обновление банковской карты
|
||||
public bool Update(CardBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
|
||||
public bool Update(CardBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
if (_cardStorage.Update(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Update operation failed");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (_cardStorage.Update(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Update operation failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
public List<ClientDiagramElementsViewModel> GetMonthInfo(int CardId) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel()
|
||||
{
|
||||
CardId = CardId,
|
||||
Status = StatusEnum.Закрыта
|
||||
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
|
||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum()}).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||
Dictionary<(int?, int?), int> creditings = _creditingLogic.ReadList(new CreditingSearchModel()
|
||||
{
|
||||
CardId = CardId,
|
||||
Status = StatusEnum.Закрыта
|
||||
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
|
||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||
// Удаление банковской карты
|
||||
public bool Delete(CardBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||
if (_cardStorage.Delete(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Delete operation failed");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
List<ClientDiagramElementsViewModel> result = new();
|
||||
foreach (var key in debitings.Keys.Union(creditings.Keys).OrderBy(x => x.Item1 * 12 + x.Item2)) {
|
||||
int sum = 0;
|
||||
if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key);
|
||||
if (creditings.ContainsKey(key)) sum += creditings.GetValueOrDefault(key);
|
||||
result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum});
|
||||
}
|
||||
return result;
|
||||
}
|
||||
// Бизнес-логика для диаграмм, для получения информации по месяцам
|
||||
public List<ClientDiagramElementsViewModel> GetMonthInfo(int CardId)
|
||||
{
|
||||
Dictionary<(int?, int?), int> debitings = _debitingLogic.ReadList(new DebitingSearchModel()
|
||||
{
|
||||
CardId = CardId,
|
||||
Status = StatusEnum.Закрыта
|
||||
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
|
||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||
|
||||
private void CheckModel(CardBindingModel model, bool withParams = true)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
if (!withParams)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (string.IsNullOrEmpty(model.Number) || model.Number.Length != 16)
|
||||
{
|
||||
throw new ArgumentNullException("Неправильный номер карты", nameof(model.Number));
|
||||
}
|
||||
if (string.IsNullOrEmpty(model.CVC) || model.CVC.Length != 3)
|
||||
{
|
||||
throw new ArgumentNullException("Неправильный СVC карты", nameof(model.CVC));
|
||||
}
|
||||
if (model.Period < DateTime.Now)
|
||||
{
|
||||
throw new ArgumentNullException("Нет периода действия", nameof(model.Period));
|
||||
}
|
||||
var cardElement = _cardStorage.GetElement(new CardSearchModel
|
||||
{
|
||||
Number = model.Number,
|
||||
});
|
||||
Dictionary<(int?, int?), int> creditings = _creditingLogic.ReadList(new CreditingSearchModel()
|
||||
{
|
||||
CardId = CardId,
|
||||
Status = StatusEnum.Закрыта
|
||||
}).GroupBy(x => new { x.DateClose?.Month, x.DateClose?.Year })
|
||||
.Select(x => new { x.Key.Month, x.Key.Year, Sum = x.Select(y => y.Sum).Sum() }).ToDictionary(x => (x.Month, x.Year), x => (x.Sum));
|
||||
|
||||
if (cardElement != null && cardElement.Id != model.Id)
|
||||
{
|
||||
throw new InvalidOperationException("Карта с таким ноиером уже есть");
|
||||
}
|
||||
List<ClientDiagramElementsViewModel> result = new();
|
||||
|
||||
var accountElement = _accountLogic.ReadElement(new AccountSearchModel
|
||||
{
|
||||
Id = model.AccountId,
|
||||
ClientId = model.ClientID
|
||||
});
|
||||
foreach (var key in debitings.Keys.Union(creditings.Keys).OrderBy(x => x.Item1 * 12 + x.Item2))
|
||||
{
|
||||
int sum = 0;
|
||||
if (debitings.ContainsKey(key)) sum -= debitings.GetValueOrDefault(key);
|
||||
if (creditings.ContainsKey(key)) sum += creditings.GetValueOrDefault(key);
|
||||
result.Add(new ClientDiagramElementsViewModel() { Name = Enum.GetName(typeof(Months), key.Item1) + " " + key.Item2.ToString(), Value = sum });
|
||||
}
|
||||
|
||||
if (accountElement != null && accountElement.ClientId != model.ClientID)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||
private void CheckModel(CardBindingModel model, bool withParams = true)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
|
||||
// Так как при удалении передаём как параметр false
|
||||
if (!withParams)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Проверка на наличие номера у банковской карты
|
||||
if (string.IsNullOrEmpty(model.Number) || model.Number.Length != 16)
|
||||
{
|
||||
throw new ArgumentNullException("Неправильный номер карты", nameof(model.Number));
|
||||
}
|
||||
|
||||
// Проверка на наличие CVC кода у банковской карты
|
||||
if (string.IsNullOrEmpty(model.CVC) || model.CVC.Length != 3)
|
||||
{
|
||||
throw new ArgumentNullException("Неправильный СVC карты", nameof(model.CVC));
|
||||
}
|
||||
|
||||
// Проверка на конкретный период действия карты
|
||||
if (model.Period < DateTime.Now)
|
||||
{
|
||||
throw new ArgumentNullException("Нет периода действия", nameof(model.Period));
|
||||
}
|
||||
|
||||
// Проверка на наличие id клиента, получившего карту (лишним не будет)
|
||||
if (model.ClientID < 0)
|
||||
{
|
||||
throw new ArgumentNullException("Некорректный Id клиента, открывшего счёт", nameof(model.ClientID));
|
||||
}
|
||||
|
||||
// Для проверка на наличие такой же банковской карты
|
||||
var cardElement = _cardStorage.GetElement(new CardSearchModel
|
||||
{
|
||||
Number = model.Number,
|
||||
});
|
||||
|
||||
// Если элемент найден и его Id не совпадает с Id переданного объекта
|
||||
if (cardElement != null && cardElement.Id != model.Id)
|
||||
{
|
||||
throw new InvalidOperationException("Карта с таким ноиером уже есть");
|
||||
}
|
||||
|
||||
var accountElement = _accountLogic.ReadElement(new AccountSearchModel
|
||||
{
|
||||
Id = model.AccountId,
|
||||
ClientId = model.ClientID
|
||||
});
|
||||
|
||||
// Проверка привязан ли счёт к данному клиенту
|
||||
if (accountElement != null && accountElement.ClientId != model.ClientID)
|
||||
{
|
||||
throw new InvalidOperationException("Это не счёт данного клиента");
|
||||
}
|
||||
|
||||
_logger.LogInformation("Card. Number:{Number}.CVC:{CVC}.ClientId:{ClientID}.Patronymic:{Period}.Id:{Id}",
|
||||
model.Number, model.CVC, model.Period.ToString(), model.ClientID, model.Id);
|
||||
}
|
||||
}
|
||||
_logger.LogInformation("Card. Number:{Number}.CVC:{CVC}.ClientId:{ClientID}.Patronymic:{Period}.Id:{Id}",
|
||||
model.Number, model.CVC, model.Period.ToString(), model.ClientID, model.Id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4,127 +4,190 @@ using BankContracts.SearchModels.Client;
|
||||
using BankContracts.StoragesContracts.Client;
|
||||
using BankContracts.ViewModels.Client.ViewModels;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System.Text.RegularExpressions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BankBusinessLogic.BusinessLogics.Client
|
||||
{
|
||||
public class ClientLogic : IClientLogic
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
private readonly IClientStorage _clientStorage;
|
||||
// Класс, реализующий бизнес-логику для клиентов
|
||||
public class ClientLogic : IClientLogic
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public ClientLogic(ILogger<ClientLogic> logger, IClientStorage clientStorage) {
|
||||
_logger = logger;
|
||||
_clientStorage = clientStorage;
|
||||
}
|
||||
private readonly IClientStorage _clientStorage;
|
||||
|
||||
public bool Create(ClientBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
if (_clientStorage.Insert(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Insert operation failed");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// Конструктор
|
||||
public ClientLogic(ILogger<ClientLogic> logger, IClientStorage clientStorage)
|
||||
{
|
||||
_logger = logger;
|
||||
_clientStorage = clientStorage;
|
||||
}
|
||||
|
||||
public bool Delete(ClientBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||
if (_clientStorage.Delete(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Delete operation failed");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// Вывод конкретного клиента
|
||||
public ClientViewModel? ReadElement(ClientSearchModel model)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
|
||||
public ClientViewModel? ReadElement(ClientSearchModel model)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
_logger.LogInformation("ReadElement. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Id:{ Id}", model.Name, model.Surname, model.Patronymic, model.Id);
|
||||
var element = _clientStorage.GetElement(model);
|
||||
if (element == null)
|
||||
{
|
||||
_logger.LogWarning("ReadElement element not found");
|
||||
return null;
|
||||
}
|
||||
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
||||
return element;
|
||||
}
|
||||
_logger.LogInformation("ReadElement. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Id:{ Id}", model.Name, model.Surname, model.Patronymic, model.Id);
|
||||
|
||||
public List<ClientViewModel>? ReadList(ClientSearchModel? model)
|
||||
{
|
||||
_logger.LogInformation("ReadList. ClientId:{Id}", model?.Id);
|
||||
var list = model == null ? _clientStorage.GetFullList() : _clientStorage.GetFilteredList(model);
|
||||
if (list == null)
|
||||
{
|
||||
_logger.LogWarning("ReadList return null list");
|
||||
return null;
|
||||
}
|
||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
||||
return list;
|
||||
}
|
||||
var element = _clientStorage.GetElement(model);
|
||||
|
||||
public bool Update(ClientBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
if (_clientStorage.Update(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Update operation failed");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (element == null)
|
||||
{
|
||||
_logger.LogWarning("ReadElement element not found");
|
||||
return null;
|
||||
}
|
||||
|
||||
private void CheckModel(ClientBindingModel model, bool withParams = true)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
if (!withParams)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (string.IsNullOrEmpty(model.Name))
|
||||
{
|
||||
throw new ArgumentNullException("Нет имени пользователя", nameof(model.Name));
|
||||
}
|
||||
if (string.IsNullOrEmpty(model.Surname))
|
||||
{
|
||||
throw new ArgumentNullException("Нет фамилии пользователя", nameof(model.Surname));
|
||||
}
|
||||
if (string.IsNullOrEmpty(model.Patronymic))
|
||||
{
|
||||
throw new ArgumentNullException("Нет отчества пользователя", nameof(model.Patronymic));
|
||||
}
|
||||
if (string.IsNullOrEmpty(model.Email))
|
||||
{
|
||||
throw new ArgumentNullException("Нет почты пользователя", nameof(model.Email));
|
||||
}
|
||||
if (string.IsNullOrEmpty(model.Password))
|
||||
{
|
||||
throw new ArgumentNullException("Нет пароля пользователя", nameof(model.Password));
|
||||
}
|
||||
if (string.IsNullOrEmpty(model.Telephone))
|
||||
{
|
||||
throw new ArgumentNullException("Нет телефона пользователя", nameof(model.Telephone));
|
||||
}
|
||||
_logger.LogInformation("Client. Name:{Name}.Surname:{Surname}.Patronymic:{Patronymic}.Email:{Email}.Password:{Password}.Telephone:{Telephone}.Id:{Id}",
|
||||
model.Name, model.Surname, model.Patronymic, model.Email, model.Password, model.Telephone, model.Id);
|
||||
var element = _clientStorage.GetElement(new ClientSearchModel
|
||||
{
|
||||
Email = model.Email,
|
||||
});
|
||||
if (element != null && element.Id != model.Id)
|
||||
{
|
||||
throw new InvalidOperationException("Клиент с такой почтой уже есть");
|
||||
}
|
||||
}
|
||||
}
|
||||
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
// Вывод отфильтрованного списка
|
||||
public List<ClientViewModel>? ReadList(ClientSearchModel? model)
|
||||
{
|
||||
_logger.LogInformation("ReadList. ClientId:{Id}", model?.Id);
|
||||
|
||||
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
var list = model == null ? _clientStorage.GetFullList() : _clientStorage.GetFilteredList(model);
|
||||
|
||||
if (list == null)
|
||||
{
|
||||
_logger.LogWarning("ReadList return null list");
|
||||
return null;
|
||||
}
|
||||
|
||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
// Создание клиента
|
||||
public bool Create(ClientBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
|
||||
if (_clientStorage.Insert(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Insert operation failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Обновление клиента
|
||||
public bool Update(ClientBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
|
||||
if (_clientStorage.Update(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Update operation failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Удаление клиента
|
||||
public bool Delete(ClientBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
|
||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||
|
||||
if (_clientStorage.Delete(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Delete operation failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||
private void CheckModel(ClientBindingModel model, bool withParams = true)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
|
||||
// При удалении параметру withParams передаём false
|
||||
if (!withParams)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Проверка на наличие имени клиента
|
||||
if (string.IsNullOrEmpty(model.Name))
|
||||
{
|
||||
throw new ArgumentNullException("Нет имени пользователя", nameof(model.Name));
|
||||
}
|
||||
|
||||
// Проверка на наличие фамилии клиента
|
||||
if (string.IsNullOrEmpty(model.Surname))
|
||||
{
|
||||
throw new ArgumentNullException("Нет фамилии пользователя", nameof(model.Surname));
|
||||
}
|
||||
|
||||
// Проверка на наличие отчества клиента
|
||||
if (string.IsNullOrEmpty(model.Patronymic))
|
||||
{
|
||||
throw new ArgumentNullException("Нет отчества пользователя", nameof(model.Patronymic));
|
||||
}
|
||||
|
||||
// Проверка на наличие электронной почты
|
||||
if (string.IsNullOrEmpty(model.Email))
|
||||
{
|
||||
throw new ArgumentNullException("Нет почты пользователя", nameof(model.Email));
|
||||
}
|
||||
|
||||
// Проверка на наличие пароля
|
||||
if (string.IsNullOrEmpty(model.Password))
|
||||
{
|
||||
throw new ArgumentNullException("Нет пароля пользователя", nameof(model.Password));
|
||||
}
|
||||
|
||||
// Проверка на наличие мобильного телефона
|
||||
if (string.IsNullOrEmpty(model.Telephone))
|
||||
{
|
||||
throw new ArgumentNullException("Нет моб.телефона пользователя", nameof(model.Telephone));
|
||||
}
|
||||
|
||||
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("Клиент с такой почтой уже есть");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,112 +5,148 @@ using BankContracts.StoragesContracts.Client;
|
||||
using BankContracts.BindingModels.Client;
|
||||
using BankContracts.ViewModels.Client.ViewModels;
|
||||
using BankContracts.SearchModels.Client;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BankBusinessLogic.BusinessLogics.Client
|
||||
{
|
||||
public class CreditingLogic : ICreditingLogic
|
||||
// Класс, реализующий бизнес-логику для пополнения карты
|
||||
public class CreditingLogic : ICreditingLogic
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
|
||||
private readonly ICreditingStorage _creditingStorage;
|
||||
|
||||
private readonly ICardStorage _cardStorage;
|
||||
|
||||
public CreditingLogic(ILogger<CreditingLogic> logger, ICreditingStorage creditingStorage, ICardStorage cardStorage) {
|
||||
// Конструктор
|
||||
public CreditingLogic(ILogger<CreditingLogic> logger, ICreditingStorage creditingStorage, ICardStorage cardStorage) {
|
||||
_logger = logger;
|
||||
_creditingStorage = creditingStorage;
|
||||
_cardStorage = cardStorage;
|
||||
}
|
||||
|
||||
public bool Create(CreditingBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
|
||||
if (!CheckCardPeriod(model))
|
||||
{
|
||||
model.Status = StatusEnum.Карта_просрочена;
|
||||
}
|
||||
else
|
||||
{
|
||||
model.Status = StatusEnum.Открыта;
|
||||
}
|
||||
|
||||
if (_creditingStorage.Insert(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Insert operation failed");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool Delete(CreditingBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||
if (_creditingStorage.Delete(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Delete operation failed");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public CreditingViewModel? ReadElement(CreditingSearchModel model)
|
||||
// Вывод конкретной операции на пополнение
|
||||
public CreditingViewModel? ReadElement(CreditingSearchModel model)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
|
||||
_logger.LogInformation("ReadElement. CreditingId:{ Id }", model.Id);
|
||||
|
||||
var element = _creditingStorage.GetElement(model);
|
||||
|
||||
if (element == null)
|
||||
{
|
||||
_logger.LogWarning("ReadElement element not found");
|
||||
return null;
|
||||
}
|
||||
|
||||
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
public List<CreditingViewModel>? ReadList(CreditingSearchModel? model)
|
||||
// Вывод всего списка операций на пополнение
|
||||
public List<CreditingViewModel>? ReadList(CreditingSearchModel? model)
|
||||
{
|
||||
_logger.LogInformation("ReadList. CreditingId:{Id}", model?.Id);
|
||||
var list = model == null ? _creditingStorage.GetFullList() : _creditingStorage.GetFilteredList(model);
|
||||
|
||||
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
var list = model == null ? _creditingStorage.GetFullList() : _creditingStorage.GetFilteredList(model);
|
||||
|
||||
if (list == null)
|
||||
{
|
||||
_logger.LogWarning("ReadList return null list");
|
||||
return null;
|
||||
}
|
||||
|
||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public bool Update(CreditingBindingModel model)
|
||||
// Создание операции на пополнение
|
||||
public bool Create(CreditingBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
|
||||
if (!CheckCardPeriod(model))
|
||||
{
|
||||
model.Status = StatusEnum.Карта_просрочена;
|
||||
}
|
||||
else
|
||||
{
|
||||
model.Status = StatusEnum.Открыта;
|
||||
}
|
||||
|
||||
if (_creditingStorage.Insert(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Insert operation failed");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Обновление операции на пополнение
|
||||
public bool Update(CreditingBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
|
||||
if (_creditingStorage.Update(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Update operation failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void CheckModel(CreditingBindingModel model, bool withParams = true)
|
||||
// Удаление операции на пополнение
|
||||
public bool Delete(CreditingBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
|
||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||
|
||||
if (_creditingStorage.Delete(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Delete operation failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||
private void CheckModel(CreditingBindingModel model, bool withParams = true)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
if (!withParams)
|
||||
|
||||
// Так как при удалении передаём как параметр false
|
||||
if (!withParams)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (model.Sum <= 0)
|
||||
|
||||
// Проверка на корректность суммы пополнения
|
||||
if (model.Sum <= 0)
|
||||
{
|
||||
throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum));
|
||||
}
|
||||
if (model.DateOpen > DateTime.Now)
|
||||
|
||||
// Проверка на корректную дату операции
|
||||
if (model.DateOpen > DateTime.Now)
|
||||
{
|
||||
throw new ArgumentNullException("Дата не может быть меньше текущего времени", nameof(model.DateOpen));
|
||||
}
|
||||
@ -119,7 +155,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
||||
model.Sum, model.CardId, model.DateOpen.ToString(), model.Id);
|
||||
}
|
||||
|
||||
//проверка карты на просроченность
|
||||
// Проверка карты на просроченность
|
||||
bool CheckCardPeriod(CreditingBindingModel model)
|
||||
{
|
||||
var card = _cardStorage.GetElement(new CardSearchModel
|
||||
@ -127,13 +163,12 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
||||
Id = model.CardId
|
||||
});
|
||||
|
||||
//если карта просрочена
|
||||
// Если карта просрочена
|
||||
if (card.Period < DateTime.Now)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -5,10 +5,16 @@ using BankContracts.StoragesContracts.Client;
|
||||
using BankContracts.BindingModels.Client;
|
||||
using BankContracts.SearchModels.Client;
|
||||
using BankContracts.ViewModels.Client.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BankBusinessLogic.BusinessLogics.Client
|
||||
{
|
||||
public class DebitingLogic : IDebitingLogic
|
||||
// Класс, реализующий бизнес-логику для снятия наличных с карты
|
||||
public class DebitingLogic : IDebitingLogic
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
|
||||
@ -16,77 +22,80 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
||||
|
||||
private readonly ICardStorage _cardStorage;
|
||||
|
||||
// Конструктор
|
||||
public DebitingLogic(ILogger<DebitingLogic> logger, IDebitingStorage debitingStorage, ICardStorage cardStorage) {
|
||||
_logger = logger;
|
||||
_debitingStorage = debitingStorage;
|
||||
_cardStorage = cardStorage;
|
||||
}
|
||||
|
||||
public bool Create(DebitingBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
|
||||
if (!CheckCardPeriod(model))
|
||||
{
|
||||
model.Status = StatusEnum.Карта_просрочена;
|
||||
}
|
||||
else
|
||||
{
|
||||
model.Status = StatusEnum.Открыта;
|
||||
}
|
||||
|
||||
if (_debitingStorage.Insert(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Insert operation failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool Delete(DebitingBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||
if (_debitingStorage.Delete(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Delete operation failed");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public DebitingViewModel? ReadElement(DebitingSearchModel model)
|
||||
// Вывод конкретной операции на снятие наличных
|
||||
public DebitingViewModel? ReadElement(DebitingSearchModel model)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
|
||||
_logger.LogInformation("ReadElement. DebitingId:{ Id }", model.Id);
|
||||
|
||||
var element = _debitingStorage.GetElement(model);
|
||||
|
||||
if (element == null)
|
||||
{
|
||||
_logger.LogWarning("ReadElement element not found");
|
||||
return null;
|
||||
}
|
||||
|
||||
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
public List<DebitingViewModel>? ReadList(DebitingSearchModel? model)
|
||||
// Вывод всего списка операций на снятие наличных
|
||||
public List<DebitingViewModel>? ReadList(DebitingSearchModel? model)
|
||||
{
|
||||
_logger.LogInformation("ReadList. DebitingId:{Id}", model?.Id);
|
||||
var list = model == null ? _debitingStorage.GetFullList() : _debitingStorage.GetFilteredList(model);
|
||||
|
||||
// list хранит весь список в случае, если model пришло со значением null на вход метода
|
||||
var list = model == null ? _debitingStorage.GetFullList() : _debitingStorage.GetFilteredList(model);
|
||||
|
||||
if (list == null)
|
||||
{
|
||||
_logger.LogWarning("ReadList return null list");
|
||||
return null;
|
||||
}
|
||||
|
||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public bool Update(DebitingBindingModel model)
|
||||
// Создание операции на снятие наличных
|
||||
public bool Create(DebitingBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
|
||||
if (!CheckCardPeriod(model))
|
||||
{
|
||||
model.Status = StatusEnum.Карта_просрочена;
|
||||
}
|
||||
else
|
||||
{
|
||||
model.Status = StatusEnum.Открыта;
|
||||
}
|
||||
|
||||
if (_debitingStorage.Insert(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Insert operation failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Обновление операции на снятие наличных
|
||||
public bool Update(DebitingBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
|
||||
@ -100,21 +109,44 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
||||
return true;
|
||||
}
|
||||
|
||||
private void CheckModel(DebitingBindingModel model, bool withParams = true)
|
||||
// Удаление операции на снятие наличных
|
||||
public bool Delete(DebitingBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
|
||||
_logger.LogInformation("Delete. Id:{Id}", model.Id);
|
||||
|
||||
if (_debitingStorage.Delete(model) == null)
|
||||
{
|
||||
_logger.LogWarning("Delete operation failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Проверка входного аргумента для методов Insert, Update и Delete
|
||||
private void CheckModel(DebitingBindingModel model, bool withParams = true)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
}
|
||||
if (!withParams)
|
||||
|
||||
// Так как при удалении передаём как параметр false
|
||||
if (!withParams)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (model.Sum <= 0)
|
||||
|
||||
// Проверка на корректность снятия суммы
|
||||
if (model.Sum <= 0)
|
||||
{
|
||||
throw new ArgumentNullException("Сумма операции должна быть больше 0", nameof(model.Sum));
|
||||
}
|
||||
if (model.DateClose < model.DateOpen)
|
||||
|
||||
// Проверка на корректную дату операции
|
||||
if (model.DateClose < model.DateOpen)
|
||||
{
|
||||
throw new ArgumentNullException("Дата закрытия не может быть меньше даты открытия", nameof(model.DateClose));
|
||||
}
|
||||
@ -123,7 +155,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
||||
model.Sum, model.CardId, model.DateOpen.ToString(), model.DateClose.ToString(), model.Id);
|
||||
}
|
||||
|
||||
//проверка карты на просроченность
|
||||
// Проверка карты на просроченность
|
||||
bool CheckCardPeriod(DebitingBindingModel model)
|
||||
{
|
||||
var card = _cardStorage.GetElement(new CardSearchModel
|
||||
@ -131,7 +163,7 @@ namespace BankBusinessLogic.BusinessLogics.Client
|
||||
Id = model.CardId
|
||||
});
|
||||
|
||||
//если карта просрочена
|
||||
// Если карта просрочена
|
||||
if (card.Period < DateTime.Now)
|
||||
{
|
||||
return false;
|
||||
|
@ -14,22 +14,24 @@ using BankDataModels.Enums;
|
||||
|
||||
namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
{
|
||||
public class ReportCashierLogic : IReportCashierLogic
|
||||
// Реализация бизнес-логики отчётов по кассиру
|
||||
public class ReportCashierLogic : IReportCashierLogic
|
||||
{
|
||||
private readonly ICardStorage _cardStorage;
|
||||
private readonly IClientStorage _clientStorage;
|
||||
|
||||
private readonly IMoneyTransferStorage _moneyTransferStorage;
|
||||
private readonly ICashWithdrawalStorage _cashWithdrawalStorage;
|
||||
private readonly IClientStorage _clientStorage;
|
||||
private readonly IDebitingStorage _debitingStorage;
|
||||
private readonly ICardStorage _cardStorage;
|
||||
|
||||
private readonly AbstractSaveToExcel _saveToExcel;
|
||||
private readonly AbstractSaveToWord _saveToWord;
|
||||
private readonly AbstractSaveToPdf _saveToPdf;
|
||||
|
||||
private readonly MailKitWorker _mailKitWorker;
|
||||
private readonly MailKitWorker _mailKitWorker;
|
||||
|
||||
//инициализируем поля класса через контейнер
|
||||
public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage,
|
||||
// Конструктор (Инициализируем поля класса через контейнер)
|
||||
public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage,
|
||||
IClientStorage clientStorage, AbstractSaveToExcel saveToExcel,
|
||||
AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
|
||||
IDebitingStorage debitingStorage, ICardStorage cardStorage, MailKitWorker mailKitWorker)
|
||||
@ -47,10 +49,10 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
_mailKitWorker = mailKitWorker;
|
||||
}
|
||||
|
||||
//формирование списка переводов между счетами за период
|
||||
// Формирование списка переводов между счетами за период
|
||||
public List<ReportCashierViewModel>? GetMoneyTransfers(ReportBindingModel model)
|
||||
{
|
||||
return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo})
|
||||
return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
|
||||
.Select(x => new ReportCashierViewModel
|
||||
{
|
||||
OperationId = x.Id,
|
||||
@ -62,7 +64,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
.ToList();
|
||||
}
|
||||
|
||||
//формирование списка выдаци наличных со счёта за период
|
||||
// Формирование списка выдачи наличных со счёта за период
|
||||
public List<ReportCashierViewModel>? GetCashWithrawals(ReportBindingModel model)
|
||||
{
|
||||
return _cashWithdrawalStorage.GetFilteredList(new CashWithdrawalSearchModel { ClientId = model.ClientId, DateFrom = model.DateFrom, DateTo = model.DateTo })
|
||||
@ -77,7 +79,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
.ToList();
|
||||
}
|
||||
|
||||
//формирование списка выдаци наличных со счёта за период
|
||||
// Формирование списка выдачи наличных со счёта за период
|
||||
public List<DebitingViewModel>? GetDebitings(ReportBindingModel model)
|
||||
{
|
||||
List<int> CardIdList = new();
|
||||
@ -87,14 +89,14 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
AccountId = model.AccountId
|
||||
});
|
||||
|
||||
foreach(var index in list)
|
||||
foreach (var index in list)
|
||||
{
|
||||
CardIdList.Add(index.Id);
|
||||
}
|
||||
|
||||
List<DebitingViewModel> totalList = new();
|
||||
|
||||
foreach(var index in CardIdList)
|
||||
foreach (var index in CardIdList)
|
||||
{
|
||||
var result = _debitingStorage.GetFilteredList(new DebitingSearchModel
|
||||
{
|
||||
@ -107,7 +109,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
return totalList;
|
||||
}
|
||||
|
||||
//формирование полного имени клиента для отчёта
|
||||
// Формирование полного имени клиента для отчёта
|
||||
public string GetFullName(ReportBindingModel model)
|
||||
{
|
||||
var client = _clientStorage.GetElement(new ClientSearchModel
|
||||
@ -118,8 +120,8 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
return client.Surname + " " + client.Name + " " + client.Patronymic;
|
||||
}
|
||||
|
||||
//Сохранение мороженных в файл-Word
|
||||
public void SaveAccountsToWordFile(ReportBindingModel model)
|
||||
// Сохранение банковских счетов в файл-Word
|
||||
public void SaveAccountsToWordFile(ReportBindingModel model)
|
||||
{
|
||||
_saveToWord.CreateDoc(new WordInfo
|
||||
{
|
||||
@ -130,9 +132,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
Debiting = GetDebitings(model)
|
||||
}, OfficeOperationEnum.Для_кассира);
|
||||
|
||||
byte[] word = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по зявкам на снятие.docx");
|
||||
byte[] word = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по заявкам на снятие.docx");
|
||||
|
||||
File.Delete("../BankRestAPI/Отчёт по зявкам на снятие.docx");
|
||||
File.Delete("../BankRestAPI/Отчёт по заявкам на снятие.docx");
|
||||
|
||||
_mailKitWorker.SendMailAsync(new()
|
||||
{
|
||||
@ -145,7 +147,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
});
|
||||
}
|
||||
|
||||
//Сохранение заготовок с указаеним изделий в файл-Excel
|
||||
// Сохранение банковских счетов с указаением операций по ним в файл-Excel
|
||||
public void SaveAccountsToExcelFile(ReportBindingModel model)
|
||||
{
|
||||
_saveToExcel.CreateReport(new ExcelInfo
|
||||
@ -157,9 +159,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
Debiting = GetDebitings(model)
|
||||
}, OfficeOperationEnum.Для_кассира);
|
||||
|
||||
byte[] excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по зявкам на снятие.xlsx");
|
||||
byte[] excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по заявкам на снятие.xlsx");
|
||||
|
||||
File.Delete("../BankRestAPI/Отчёт по зявкам на снятие.xlsx");
|
||||
File.Delete("../BankRestAPI/Отчёт по заявкам на снятие.xlsx");
|
||||
|
||||
_mailKitWorker.SendMailAsync(new()
|
||||
{
|
||||
@ -172,7 +174,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
});
|
||||
}
|
||||
|
||||
//Сохранение заказов в файл-Pdf
|
||||
// Сохранение Банковских счетов с переводами по ним в файл-Pdf
|
||||
public ReportCashierViewModelForHTML SaveAccountsToPdfFile(ReportBindingModel model)
|
||||
{
|
||||
var listMoneyTransfers = GetMoneyTransfers(model);
|
||||
@ -190,23 +192,23 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
ReportCashWithdrawal = listCashWithdrawals
|
||||
});
|
||||
|
||||
byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_счетам.pdf");
|
||||
byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_счетам.pdf");
|
||||
|
||||
File.Delete("../BankRestAPI/Отчёт_по_счетам.pdf");
|
||||
|
||||
_mailKitWorker.SendMailAsync(new()
|
||||
{
|
||||
MailAddress = model.Email,
|
||||
Subject = "Отчёт по счетам",
|
||||
Text = $"За период с {model.DateFrom} " +
|
||||
$"по {model.DateTo}.",
|
||||
File = pdf,
|
||||
Role = model.Role,
|
||||
{
|
||||
MailAddress = model.Email,
|
||||
Subject = "Отчёт по счетам",
|
||||
Text = $"За период с {model.DateFrom} " +
|
||||
$"по {model.DateTo}.",
|
||||
File = pdf,
|
||||
Role = model.Role,
|
||||
TypeDoc = TypeDocEnum.PDF
|
||||
});
|
||||
});
|
||||
|
||||
//возврат полученных списков для отображения на вебе
|
||||
return new ReportCashierViewModelForHTML
|
||||
// Возврат полученных списков для отображения на вебе
|
||||
return new ReportCashierViewModelForHTML
|
||||
{
|
||||
ReportCashWithdrawal = listCashWithdrawals,
|
||||
|
||||
|
@ -12,103 +12,112 @@ using BankContracts.ViewModels.Cashier.ViewModels;
|
||||
using BankContracts.SearchModels.Cashier;
|
||||
using BankContracts.ViewModels.Client.ViewModels;
|
||||
using BankContracts.ViewModels.Reports;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
{
|
||||
public class ReportClientLogic : IReportClientLogic
|
||||
{
|
||||
private readonly ICreditingStorage _creditingStorage;
|
||||
private readonly IDebitingStorage _debitingStorage;
|
||||
private readonly ICardStorage _cardStorage;
|
||||
private readonly IMoneyTransferStorage _moneyTransferStorage;
|
||||
private readonly IClientStorage _clientStorage;
|
||||
// Реализация бизнес-логики отчётов по клиенту
|
||||
public class ReportClientLogic : IReportClientLogic
|
||||
{
|
||||
private readonly ICardStorage _cardStorage;
|
||||
private readonly IClientStorage _clientStorage;
|
||||
|
||||
private readonly AbstractSaveToExcel _saveToExcel;
|
||||
private readonly AbstractSaveToWord _saveToWord;
|
||||
private readonly AbstractSaveToPdf _saveToPdf;
|
||||
private readonly ICreditingStorage _creditingStorage;
|
||||
private readonly IDebitingStorage _debitingStorage;
|
||||
private readonly IMoneyTransferStorage _moneyTransferStorage;
|
||||
|
||||
private readonly MailKitWorker _mailKitWorker;
|
||||
private readonly AbstractSaveToExcel _saveToExcel;
|
||||
private readonly AbstractSaveToWord _saveToWord;
|
||||
private readonly AbstractSaveToPdf _saveToPdf;
|
||||
|
||||
public ReportClientLogic(ICreditingStorage creditingStorage, IDebitingStorage debitingStorage,
|
||||
AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
|
||||
ICardStorage cardStorage, IMoneyTransferStorage moneyTransferStorage,
|
||||
MailKitWorker mailKitWorker, IClientStorage clientStorage)
|
||||
{
|
||||
_creditingStorage = creditingStorage;
|
||||
_debitingStorage = debitingStorage;
|
||||
_cardStorage = cardStorage;
|
||||
_moneyTransferStorage = moneyTransferStorage;
|
||||
_clientStorage = clientStorage;
|
||||
private readonly MailKitWorker _mailKitWorker;
|
||||
|
||||
_saveToExcel = saveToExcel;
|
||||
_saveToWord = saveToWord;
|
||||
_saveToPdf = saveToPdf;
|
||||
public ReportClientLogic(ICreditingStorage creditingStorage, IDebitingStorage debitingStorage,
|
||||
AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf,
|
||||
ICardStorage cardStorage, IMoneyTransferStorage moneyTransferStorage,
|
||||
MailKitWorker mailKitWorker, IClientStorage clientStorage)
|
||||
{
|
||||
_creditingStorage = creditingStorage;
|
||||
_debitingStorage = debitingStorage;
|
||||
_cardStorage = cardStorage;
|
||||
_moneyTransferStorage = moneyTransferStorage;
|
||||
_clientStorage = clientStorage;
|
||||
|
||||
_saveToExcel = saveToExcel;
|
||||
_saveToWord = saveToWord;
|
||||
_saveToPdf = saveToPdf;
|
||||
|
||||
_mailKitWorker = mailKitWorker;
|
||||
}
|
||||
}
|
||||
|
||||
public List<ReportClientViewModel>? GetCrediting(ReportBindingModel model)
|
||||
{
|
||||
return _creditingStorage.GetFilteredList(new CreditingSearchModel
|
||||
{
|
||||
DateFrom = model.DateFrom,
|
||||
DateTo = model.DateTo,
|
||||
}).Select(x => new ReportClientViewModel
|
||||
{
|
||||
OperationId = x.Id,
|
||||
// Информация о пополнениях для отчёта
|
||||
public List<ReportClientViewModel>? GetCrediting(ReportBindingModel model)
|
||||
{
|
||||
return _creditingStorage.GetFilteredList(new CreditingSearchModel
|
||||
{
|
||||
DateFrom = model.DateFrom,
|
||||
DateTo = model.DateTo,
|
||||
}).Select(x => new ReportClientViewModel
|
||||
{
|
||||
OperationId = x.Id,
|
||||
CardNumber = x.CardNumber,
|
||||
SumOperation = x.Sum,
|
||||
DateComplite = x.DateOpen
|
||||
}).ToList();
|
||||
}
|
||||
DateComplite = x.DateOpen
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
public List<ReportClientViewModel>? GetDebiting(ReportBindingModel model)
|
||||
{
|
||||
return _debitingStorage.GetFilteredList(new DebitingSearchModel
|
||||
{
|
||||
DateTo = model.DateFrom,
|
||||
DateFrom = model.DateTo,
|
||||
}).Select(x => new ReportClientViewModel
|
||||
{
|
||||
OperationId = x.Id,
|
||||
CardNumber = x.CardNumber,
|
||||
SumOperation = x.Sum,
|
||||
DateComplite = x.DateClose
|
||||
}).ToList();
|
||||
}
|
||||
// Информация о снятиях для отчёта
|
||||
public List<ReportClientViewModel>? GetDebiting(ReportBindingModel model)
|
||||
{
|
||||
return _debitingStorage.GetFilteredList(new DebitingSearchModel
|
||||
{
|
||||
DateTo = model.DateFrom,
|
||||
DateFrom = model.DateTo,
|
||||
}).Select(x => new ReportClientViewModel
|
||||
{
|
||||
OperationId = x.Id,
|
||||
CardNumber = x.CardNumber,
|
||||
SumOperation = x.Sum,
|
||||
DateComplite = x.DateClose
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
//для excel отчёта по переводам между счетов
|
||||
public List<MoneyTransferViewModel>? GetMoneyTransfer(ReportBindingModel model)
|
||||
{
|
||||
//список счетов по выбранным картам
|
||||
List<int> accountId = new();
|
||||
// Для Excel отчёта по переводам между счетов
|
||||
public List<MoneyTransferViewModel>? GetMoneyTransfer(ReportBindingModel model)
|
||||
{
|
||||
// Список счетов по выбранным картам
|
||||
List<int> accountId = new();
|
||||
|
||||
foreach(var index in model.CardList)
|
||||
{
|
||||
accountId.Add(_cardStorage.GetElement(new CardSearchModel { Id = index}).AccountId);
|
||||
}
|
||||
foreach (var index in model.CardList)
|
||||
{
|
||||
accountId.Add(_cardStorage.GetElement(new CardSearchModel { Id = index }).AccountId);
|
||||
}
|
||||
|
||||
var list = accountId.ToHashSet().ToList();
|
||||
var list = accountId.ToHashSet().ToList();
|
||||
|
||||
List<MoneyTransferViewModel> totalList = new();
|
||||
List<MoneyTransferViewModel> totalList = new();
|
||||
|
||||
foreach (var index in list)
|
||||
{
|
||||
foreach (var index in list)
|
||||
{
|
||||
var result = _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel
|
||||
{
|
||||
AccountSenderId = index,
|
||||
AccountPayeeId = index
|
||||
AccountPayeeId = index
|
||||
}).OrderBy(x => x.AccountSenderId).ToList();
|
||||
|
||||
totalList.AddRange(result);
|
||||
totalList.AddRange(result);
|
||||
}
|
||||
|
||||
return totalList;
|
||||
}
|
||||
return totalList;
|
||||
}
|
||||
|
||||
//для excel отчёта по пополнениям карты
|
||||
// Для Excel отчёта по пополнениям карты
|
||||
public List<CreditingViewModel> GetExcelCrediting(ReportBindingModel model)
|
||||
{
|
||||
{
|
||||
List<CreditingViewModel> totalList = new();
|
||||
|
||||
foreach (var index in model.CardList)
|
||||
@ -124,7 +133,7 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
return totalList;
|
||||
}
|
||||
|
||||
//для excel отчёта по снятиям с карты
|
||||
// Для Excel отчёта по снятиям с карты
|
||||
public List<DebitingViewModel> GetExcelDebiting(ReportBindingModel model)
|
||||
{
|
||||
List<DebitingViewModel> totalList = new();
|
||||
@ -142,16 +151,17 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
return totalList;
|
||||
}
|
||||
|
||||
public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
||||
{
|
||||
// Сохранение в файл-Excel для клиентов
|
||||
public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
||||
{
|
||||
byte[] excel = Array.Empty<byte>();
|
||||
|
||||
if (operationEnum == OfficeOperationEnum.Между_cчетами)
|
||||
{
|
||||
{
|
||||
_saveToExcel.CreateReport(new ExcelInfo
|
||||
{
|
||||
FileName = model.FileName,
|
||||
Title = "Отчёт по переводам",
|
||||
Title = "Отчёт по переводам",
|
||||
MoneyTransfer = GetMoneyTransfer(model)
|
||||
}, operationEnum);
|
||||
|
||||
@ -162,12 +172,12 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
|
||||
if (operationEnum == OfficeOperationEnum.Пополнение_карт)
|
||||
{
|
||||
_saveToExcel.CreateReport(new ExcelInfo
|
||||
{
|
||||
FileName = model.FileName,
|
||||
Title = "Отчёт по пополнениям (переводам из налички на карту)",
|
||||
Crediting = GetExcelCrediting(model)
|
||||
}, operationEnum);
|
||||
_saveToExcel.CreateReport(new ExcelInfo
|
||||
{
|
||||
FileName = model.FileName,
|
||||
Title = "Отчёт по пополнениям (переводам из налички на карту)",
|
||||
Crediting = GetExcelCrediting(model)
|
||||
}, operationEnum);
|
||||
|
||||
excel = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт по пополнениям.xlsx");
|
||||
|
||||
@ -199,8 +209,9 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
});
|
||||
}
|
||||
|
||||
public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
||||
{
|
||||
// Сохранение в файл-Word для клиентов
|
||||
public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum)
|
||||
{
|
||||
byte[] word = Array.Empty<byte>();
|
||||
|
||||
if (operationEnum == OfficeOperationEnum.Между_cчетами)
|
||||
@ -256,11 +267,11 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
});
|
||||
}
|
||||
|
||||
//отчёт в формате PDF для клиента
|
||||
// Сохранение в файл-Pdf для клиента
|
||||
public ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model)
|
||||
{
|
||||
var listCreditings = GetCrediting(model);
|
||||
var listDebitings = GetDebiting(model);
|
||||
var listCreditings = GetCrediting(model);
|
||||
var listDebitings = GetDebiting(model);
|
||||
|
||||
_saveToPdf.CreateDoc(new PdfInfo
|
||||
{
|
||||
@ -269,31 +280,31 @@ namespace BankBusinessLogic.BusinessLogics.Reports
|
||||
DateFrom = model.DateFrom!.Value,
|
||||
DateTo = model.DateTo!.Value,
|
||||
ReportCrediting = listCreditings,
|
||||
ReportDebiting = listDebitings
|
||||
});
|
||||
ReportDebiting = listDebitings
|
||||
});
|
||||
|
||||
byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_картам.pdf");
|
||||
byte[] pdf = System.IO.File.ReadAllBytes("../BankRestAPI/Отчёт_по_картам.pdf");
|
||||
|
||||
_mailKitWorker.SendMailAsync(new()
|
||||
{
|
||||
MailAddress = model.Email,
|
||||
Subject = "Отчёт по картам",
|
||||
Text = $"За период с {model.DateFrom} " +
|
||||
$"по {model.DateTo}.",
|
||||
File = pdf,
|
||||
Role = model.Role,
|
||||
{
|
||||
MailAddress = model.Email,
|
||||
Subject = "Отчёт по картам",
|
||||
Text = $"За период с {model.DateFrom} " +
|
||||
$"по {model.DateTo}.",
|
||||
File = pdf,
|
||||
Role = model.Role,
|
||||
TypeDoc = TypeDocEnum.PDF
|
||||
});
|
||||
|
||||
File.Delete("../BankRestAPI/Отчёт_по_картам.pdf");
|
||||
|
||||
//возврат полученных списков для отображения на вебе
|
||||
// Возврат полученных списков для отображения на вебе
|
||||
return new ReportClientViewModelForHTML
|
||||
{
|
||||
ReportCrediting = listCreditings,
|
||||
{
|
||||
ReportCrediting = listCreditings,
|
||||
|
||||
ReportDebiting = listDebitings
|
||||
};
|
||||
ReportDebiting = listDebitings
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ using BankContracts.BindingModels.Messages;
|
||||
|
||||
namespace BankBusinessLogic.MailWorker
|
||||
{
|
||||
//класс, отвечающий за отправку письма
|
||||
// Класс, отвечающий за отправку письма на почту
|
||||
public class MailKitWorker
|
||||
{
|
||||
private string _mailLogin = string.Empty;
|
||||
@ -29,7 +29,8 @@ namespace BankBusinessLogic.MailWorker
|
||||
|
||||
private readonly ILogger logger;
|
||||
|
||||
public MailKitWorker(ILogger<MailKitWorker> logger)
|
||||
// Конструктор
|
||||
public MailKitWorker(ILogger<MailKitWorker> logger)
|
||||
{
|
||||
this.logger = logger;
|
||||
}
|
||||
@ -58,9 +59,9 @@ namespace BankBusinessLogic.MailWorker
|
||||
|
||||
MemoryStream ms = new(info.File);
|
||||
|
||||
if(info.Role == MailsEnum.Клиент)
|
||||
if (info.Role == MailsEnum.Клиент)
|
||||
{
|
||||
if(info.TypeDoc == TypeDocEnum.PDF)
|
||||
if (info.TypeDoc == TypeDocEnum.PDF)
|
||||
{
|
||||
objMailMessage.Attachments.Add(new Attachment(ms, "Отчёт_для_клиента.pdf", "application/pdf"));
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ namespace BankСlientApp
|
||||
ErrorMessage = error;
|
||||
}
|
||||
|
||||
//Get-запрос
|
||||
// Get-запрос
|
||||
public static T? GetRequest<T>(string requestUrl)
|
||||
{
|
||||
var response = _client.GetAsync(requestUrl);
|
||||
@ -42,7 +42,7 @@ namespace BankСlientApp
|
||||
}
|
||||
}
|
||||
|
||||
//Post-запрос
|
||||
// Post-запрос
|
||||
public static void PostRequest<T>(string requestUrl, T model)
|
||||
{
|
||||
var json = JsonConvert.SerializeObject(model);
|
||||
@ -58,7 +58,7 @@ namespace BankСlientApp
|
||||
}
|
||||
}
|
||||
|
||||
//Post-запрос для получения данных
|
||||
// Post-запрос для получения данных
|
||||
public static T? PostRequestReport<T, U>(string requestUrl, U model)
|
||||
{
|
||||
var json = JsonConvert.SerializeObject(model);
|
||||
|
@ -8,7 +8,7 @@
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h1 class="display-4">Карты</h1>
|
||||
<h1 class="display-4">Банковские карты</h1>
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
|
@ -2,8 +2,8 @@
|
||||
ViewData["Title"] = "Создание карты";
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Создание карты</h2>
|
||||
<div class="text-center mb-2">
|
||||
<h2 class="display-4">Создание банковской карты</h2>
|
||||
</div>
|
||||
<form method="post">
|
||||
<div class="row mb-2">
|
||||
@ -30,7 +30,7 @@
|
||||
<input type="date" class="form-control" name="period" id="period" required />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="row mb-2 mt-2">
|
||||
<input type="submit" value="Создание" style="width: 100%" class="btn btn-warning" />
|
||||
</div>
|
||||
</form>
|
||||
|
@ -7,9 +7,10 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace BankDataModels.Models.Cashier
|
||||
{
|
||||
//банковский счёт
|
||||
// Интерфейс, отвечающий за банковский cчёт
|
||||
public interface IAccountModel : IId
|
||||
{
|
||||
// Номер счёта
|
||||
string AccountNumber { get; }
|
||||
|
||||
int CashierId { get; }
|
||||
@ -18,8 +19,10 @@ namespace BankDataModels.Models.Cashier
|
||||
|
||||
string PasswordAccount { get; }
|
||||
|
||||
// Сумма на счёте
|
||||
double Balance { get; }
|
||||
|
||||
// Дата открытия
|
||||
DateTime DateOpen { get; }
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace BankDataModels.Models.Cashier
|
||||
{
|
||||
//выдача наличных
|
||||
// Интерфейс, отвечающий за выдачу наличных
|
||||
public interface ICashWithdrawalModel : IId
|
||||
{
|
||||
int DebitingId { get; }
|
||||
@ -15,8 +15,10 @@ namespace BankDataModels.Models.Cashier
|
||||
|
||||
int CashierId { get; }
|
||||
|
||||
// Сумма наличисления наличных
|
||||
int Sum { get; }
|
||||
|
||||
// Дата выдачи наличных
|
||||
DateTime DateOperation { get; }
|
||||
}
|
||||
}
|
||||
|
@ -6,19 +6,25 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace BankDataModels.Models.Cashier
|
||||
{
|
||||
//клиент
|
||||
// Интерфейс, отвечающий за кассира
|
||||
public interface ICashierModel : IId
|
||||
{
|
||||
// Пароль от аккаунта кассира
|
||||
string Password { get; }
|
||||
|
||||
// Имя кассира
|
||||
string Name { get; }
|
||||
|
||||
// Фамилия кассира
|
||||
string Surname { get; }
|
||||
|
||||
// Отчество кассира
|
||||
string Patronymic { get; }
|
||||
|
||||
// Отчество кассира
|
||||
string Email { get; }
|
||||
|
||||
// Мобильный телефон кассира
|
||||
string Telephone { get; }
|
||||
}
|
||||
}
|
||||
|
@ -6,15 +6,17 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace BankDataModels.Models.Cashier
|
||||
{
|
||||
//перевод денег
|
||||
// Интерфейс, отвечающий за перевод денег
|
||||
public interface IMoneyTransferModel : IId
|
||||
{
|
||||
// Сумма перевода
|
||||
int Sum { get; }
|
||||
|
||||
int? AccountSenderId { get; }
|
||||
|
||||
int AccountPayeeId { get; }
|
||||
|
||||
// Дата перевода
|
||||
DateTime DateOperation { get; }
|
||||
|
||||
int? CreditingId { get; }
|
||||
|
@ -7,17 +7,21 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace BankDataModels.Models.Client
|
||||
{
|
||||
//пополнение карты
|
||||
// Интерфейс, отвечающий за пополнение карты
|
||||
public interface ICreditingModel : IId
|
||||
{
|
||||
int CardId { get; }
|
||||
|
||||
// Сумма на пополнение карты
|
||||
int Sum { get; }
|
||||
|
||||
// Дата открытия заявки на пополнение
|
||||
DateTime DateOpen { get; }
|
||||
|
||||
DateTime? DateClose { get; }
|
||||
// Дата пополнения карты
|
||||
DateTime? DateClose { get; }
|
||||
|
||||
// Статус заявки
|
||||
StatusEnum Status { get; }
|
||||
}
|
||||
}
|
||||
|
@ -7,17 +7,21 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace BankDataModels.Models.Client
|
||||
{
|
||||
//снятие денег с карты
|
||||
// Интерфейс, отвечающий за получение наличных по карте
|
||||
public interface IDebitingModel : IId
|
||||
{
|
||||
int CardId { get; }
|
||||
|
||||
int Sum { get; }
|
||||
// Сумма снятия с карты
|
||||
int Sum { get; }
|
||||
|
||||
// Дата открытия заявки
|
||||
DateTime DateOpen { get; }
|
||||
|
||||
// Дата снятия денег
|
||||
DateTime? DateClose { get; }
|
||||
|
||||
// Статус заявки
|
||||
StatusEnum Status { get; }
|
||||
}
|
||||
}
|
||||
|
@ -6,17 +6,20 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace BankDataModels.Models.Client
|
||||
{
|
||||
//банковская карта
|
||||
// Интерфейс, отвечающий за банковскую карту
|
||||
public interface ICardModel : IId
|
||||
{
|
||||
int ClientID { get; }
|
||||
|
||||
int AccountId { get; }
|
||||
|
||||
// Номер банковской карты
|
||||
string Number { get; }
|
||||
|
||||
// Код CVC
|
||||
string CVC { get; }
|
||||
|
||||
// Период пользования картой
|
||||
DateTime Period { get; }
|
||||
}
|
||||
}
|
||||
|
@ -6,19 +6,25 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace BankDataModels.Models.Client
|
||||
{
|
||||
//клиент
|
||||
// Интерфейс, отвечающий за клиента
|
||||
public interface IClientModel : IId
|
||||
{
|
||||
// Пароль от аккаунта клиента
|
||||
string Password { get; }
|
||||
|
||||
// Имя клиента
|
||||
string Name { get; }
|
||||
|
||||
// Фамилия клиента
|
||||
string Surname { get; }
|
||||
|
||||
// Отчество клиента
|
||||
string Patronymic { get; }
|
||||
|
||||
// Электронная почта клиента
|
||||
string Email { get; }
|
||||
|
||||
// Мобильный телефон клиента
|
||||
string Telephone { get; }
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace BankDataModels.Models
|
||||
{
|
||||
// Интерфейс, отвечающий за сообщения (на почту)
|
||||
public interface IMessageInfoModel : IId
|
||||
{
|
||||
string MessageId { get; }
|
||||
|
Loading…
Reference in New Issue
Block a user