diff --git a/Bank/BankDatabaseImplement/Implements/WithdrawalStorage.cs b/Bank/BankDatabaseImplement/Implements/WithdrawalStorage.cs index 575684d..a39ac0e 100644 --- a/Bank/BankDatabaseImplement/Implements/WithdrawalStorage.cs +++ b/Bank/BankDatabaseImplement/Implements/WithdrawalStorage.cs @@ -3,6 +3,7 @@ using BankContracts.SearchModels; using BankContracts.StoragesContracts; using BankContracts.ViewModels; using BankDatabaseImplement.Models; +using BankDataModels.Models; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; @@ -57,14 +58,61 @@ namespace BankDatabaseImplement.Implements public WithdrawalViewModel? Insert(WithdrawalBindingModel model) { using var context = new BankDatabase(); - var newWithdrawal = Withdrawal.Create(context, model); - if (newWithdrawal == null) + using var transaction = context.Database.BeginTransaction(); + Withdrawal? newWithdrawal; + try { - return null; + newWithdrawal = Withdrawal.Create(context, model); + if (newWithdrawal == null) + throw new InvalidOperationException("Error during creating new withdrawal"); + context.Withdrawals.Add(newWithdrawal); } - context.Withdrawals.Add(newWithdrawal); + catch + { + transaction.Rollback(); + throw; + } context.SaveChanges(); - return newWithdrawal.GetViewModel; + transaction.Commit(); + return newWithdrawal.GetViewModel; + } + + private void MakeWithdrawal(BankDatabase context, WithdrawalBindingModel model) + { + if (model == null) + throw new ArgumentNullException(nameof(model)); + int count = model.Sum; + if (count == 0) + return; + var dictionary = model.WithdrawalAccounts; + var keys = dictionary.Keys; + foreach (int key in keys) + { + (IAccountModel, int) value = new(); + bool result = dictionary.TryGetValue(key, out value); + if (!result) + throw new InvalidOperationException("Value was not got"); + Account account = context.Accounts.FirstOrDefault(x => x.Id == key) ?? + throw new InvalidOperationException("Needed account was not found"); + int dif = count; + if (account.Money < dif) + dif = account.Money; + value.Item2 = dif; + dictionary[key] = value; + count -= dif; + account.Update(new AccountBindingModel + { + Id = account.Id, + Number = account.Number, + ReleaseDate = account.ReleaseDate, + ManagerId = account.ManagerId, + Money = account.Money - dif, + }); + if (count == 0) + break; + } + if (count > 0) + throw new InvalidOperationException("The accounts did not have enough money"); } public WithdrawalViewModel? Update(WithdrawalBindingModel model) diff --git a/Bank/BankManagersClientApp/Controllers/HomeController.cs b/Bank/BankManagersClientApp/Controllers/HomeController.cs index 46a5af9..d02bd69 100644 --- a/Bank/BankManagersClientApp/Controllers/HomeController.cs +++ b/Bank/BankManagersClientApp/Controllers/HomeController.cs @@ -226,8 +226,9 @@ namespace BankManagersClientApp.Controllers { return Redirect("~/Home/Enter"); } - ViewBag.Accounts = APIClient.GetRequest>($"api/account/getaccountlist?managerid={APIClient.Client.Id}"); - return View(); + ViewBag.SenderAccounts = APIClient.GetRequest>($"api/account/getaccountlist?managerid={APIClient.Client.Id}"); + ViewBag.RecipientAccounts = APIClient.GetRequest>("api/account/getaccountlist"); + return View(); } [HttpPost] @@ -256,8 +257,9 @@ namespace BankManagersClientApp.Controllers return Redirect("~/Home/Enter"); } ViewBag.Transfers = APIClient.GetRequest>($"api/transfer/gettransferlist?managerid={APIClient.Client.Id}"); - ViewBag.Accounts = APIClient.GetRequest>($"api/account/getaccountlist?managerid={APIClient.Client.Id}"); - return View(); + ViewBag.SenderAccounts = APIClient.GetRequest>($"api/account/getaccountlist?managerid={APIClient.Client.Id}"); + ViewBag.RecipientAccounts = APIClient.GetRequest>("api/account/getaccountlist"); + return View(); } [HttpPost] diff --git a/Bank/BankManagersClientApp/Views/Home/TransferCreate.cshtml b/Bank/BankManagersClientApp/Views/Home/TransferCreate.cshtml index bc40837..fe43531 100644 --- a/Bank/BankManagersClientApp/Views/Home/TransferCreate.cshtml +++ b/Bank/BankManagersClientApp/Views/Home/TransferCreate.cshtml @@ -15,14 +15,14 @@
Номер счета отправителя:
+ asp-items="@(new SelectList(@ViewBag.SenderAccounts, "Id", "Number"))">
Номер счета получателя:
+ asp-items="@(new SelectList(@ViewBag.RecipientAccounts, "Id", "Number"))">
diff --git a/Bank/BankManagersClientApp/Views/Home/TransferUpdate.cshtml b/Bank/BankManagersClientApp/Views/Home/TransferUpdate.cshtml index da60061..d821e64 100644 --- a/Bank/BankManagersClientApp/Views/Home/TransferUpdate.cshtml +++ b/Bank/BankManagersClientApp/Views/Home/TransferUpdate.cshtml @@ -25,13 +25,13 @@
Отправитель:
- +
Получатель:
- +
diff --git a/Bank/BankRestApi/Controllers/AccountController.cs b/Bank/BankRestApi/Controllers/AccountController.cs index a5f8afc..f31362f 100644 --- a/Bank/BankRestApi/Controllers/AccountController.cs +++ b/Bank/BankRestApi/Controllers/AccountController.cs @@ -21,7 +21,7 @@ namespace BankRestApi.Controllers } [HttpGet] - public List? GetAccountList(int managerId) + public List? GetAccountList(int? managerId) { try {