diff --git a/Bank/Bank.sln b/Bank/Bank.sln index fffc74a..9fa4c9b 100644 --- a/Bank/Bank.sln +++ b/Bank/Bank.sln @@ -5,7 +5,9 @@ VisualStudioVersion = 17.9.34723.18 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BankDataModels", "BankDataModels\BankDataModels.csproj", "{B74F0734-6D5B-41D5-AF9B-23CF7535C52F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BankContracts", "BankContracts\BankContracts.csproj", "{59CDEA88-47C6-434D-84C6-40390E267858}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BankContracts", "BankContracts\BankContracts.csproj", "{59CDEA88-47C6-434D-84C6-40390E267858}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BankDatabaseImplement", "BankDatabaseImplement\BankDatabaseImplement.csproj", "{E038E32E-3601-4A3C-BB3D-301F9AE9B8E7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,6 +23,10 @@ Global {59CDEA88-47C6-434D-84C6-40390E267858}.Debug|Any CPU.Build.0 = Debug|Any CPU {59CDEA88-47C6-434D-84C6-40390E267858}.Release|Any CPU.ActiveCfg = Release|Any CPU {59CDEA88-47C6-434D-84C6-40390E267858}.Release|Any CPU.Build.0 = Release|Any CPU + {E038E32E-3601-4A3C-BB3D-301F9AE9B8E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E038E32E-3601-4A3C-BB3D-301F9AE9B8E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E038E32E-3601-4A3C-BB3D-301F9AE9B8E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E038E32E-3601-4A3C-BB3D-301F9AE9B8E7}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Bank/BankContracts/BindingModels/RequestBindingModel.cs b/Bank/BankContracts/BindingModels/RequestBindingModel.cs index c923f68..654fba9 100644 --- a/Bank/BankContracts/BindingModels/RequestBindingModel.cs +++ b/Bank/BankContracts/BindingModels/RequestBindingModel.cs @@ -13,5 +13,6 @@ namespace BankContracts.BindingModels public int Sum { get; set; } public DateTime RequestTime { get; set; } public RequestStatus Status { get; set; } + public Dictionary CardRequests { get; set; } = new(); } } diff --git a/Bank/BankContracts/SearchModels/CardSearchModel.cs b/Bank/BankContracts/SearchModels/CardSearchModel.cs index e154736..bc04b3e 100644 --- a/Bank/BankContracts/SearchModels/CardSearchModel.cs +++ b/Bank/BankContracts/SearchModels/CardSearchModel.cs @@ -11,5 +11,7 @@ namespace BankContracts.SearchModels public int? Id { get; set; } public string? Number { get; set; } public int? ClientId { get; set; } + public DateOnly? ReleaseDate { get; set; } + public DateOnly? ExpirationDate { get; set; } } } diff --git a/Bank/BankContracts/SearchModels/OperationSearchModel.cs b/Bank/BankContracts/SearchModels/OperationSearchModel.cs index f532a3d..2ba7ad9 100644 --- a/Bank/BankContracts/SearchModels/OperationSearchModel.cs +++ b/Bank/BankContracts/SearchModels/OperationSearchModel.cs @@ -10,6 +10,7 @@ namespace BankContracts.SearchModels { public int? Id { get; set; } public DateTime? OperationTime { get; set; } + public int? SenderCardId { get; set; } public int? RecipientCardId { get; set; } } } diff --git a/Bank/BankContracts/SearchModels/RequestSearchModel.cs b/Bank/BankContracts/SearchModels/RequestSearchModel.cs index 7812db3..de95ed5 100644 --- a/Bank/BankContracts/SearchModels/RequestSearchModel.cs +++ b/Bank/BankContracts/SearchModels/RequestSearchModel.cs @@ -12,5 +12,6 @@ namespace BankContracts.SearchModels public int? Id { get; set; } public DateTime? RequestTime { get; set; } public string? CardNumber { get; set; } + public RequestStatus? Status { get; set; } } } diff --git a/Bank/BankContracts/ViewModels/CardViewModel.cs b/Bank/BankContracts/ViewModels/CardViewModel.cs index 41e77a3..784712b 100644 --- a/Bank/BankContracts/ViewModels/CardViewModel.cs +++ b/Bank/BankContracts/ViewModels/CardViewModel.cs @@ -25,7 +25,7 @@ namespace BankContracts.ViewModels [DisplayName("Держатель карты")] public string ClientName { get; set; } = string.Empty; public int? AccountId { get; set; } - [DisplayName("")] + [DisplayName("Номер счета")] public string AccountNumber { get; set; } = string.Empty; } } diff --git a/Bank/BankContracts/ViewModels/ManagerViewModel.cs b/Bank/BankContracts/ViewModels/ManagerViewModel.cs index 0e93c59..f267f2c 100644 --- a/Bank/BankContracts/ViewModels/ManagerViewModel.cs +++ b/Bank/BankContracts/ViewModels/ManagerViewModel.cs @@ -16,7 +16,7 @@ namespace BankContracts.ViewModels [DisplayName("Email")] public string Email { get; set; } = string.Empty; - + [DisplayName("Пароль")] public string Password { get; set; } = string.Empty; } } diff --git a/Bank/BankContracts/ViewModels/OperationViewModel.cs b/Bank/BankContracts/ViewModels/OperationViewModel.cs index b979b39..0658d95 100644 --- a/Bank/BankContracts/ViewModels/OperationViewModel.cs +++ b/Bank/BankContracts/ViewModels/OperationViewModel.cs @@ -10,6 +10,7 @@ namespace BankContracts.ViewModels { public class OperationViewModel : IOperationModel { + [DisplayName("Номер")] public int Id { get; set; } [DisplayName("Сумма пополнения")] public int Sum { get; set; } diff --git a/Bank/BankContracts/ViewModels/RequestViewModel.cs b/Bank/BankContracts/ViewModels/RequestViewModel.cs index 22a022f..b871f43 100644 --- a/Bank/BankContracts/ViewModels/RequestViewModel.cs +++ b/Bank/BankContracts/ViewModels/RequestViewModel.cs @@ -10,6 +10,7 @@ namespace BankContracts.ViewModels { public class RequestViewModel : IRequestModel { + [DisplayName("Номер")] public int Id { get; set; } [DisplayName("Сумма заявки")] public int Sum { get; set; } @@ -17,5 +18,7 @@ namespace BankContracts.ViewModels public DateTime RequestTime { get; set; } [DisplayName("Статус заявки")] public RequestStatus Status { get; set; } + public Dictionary CardRequests { get; set; } = new(); + } } diff --git a/Bank/BankDataModels/Models/IRequestModel.cs b/Bank/BankDataModels/Models/IRequestModel.cs index 6f3043e..e4dd12b 100644 --- a/Bank/BankDataModels/Models/IRequestModel.cs +++ b/Bank/BankDataModels/Models/IRequestModel.cs @@ -11,5 +11,7 @@ namespace BankDataModels.Models int Sum { get; set; } DateTime RequestTime { get; set; } RequestStatus Status { get; set; } - } + Dictionary CardRequests { get; } + + } } diff --git a/Bank/BankDatabaseImplement/BankDatabase.cs b/Bank/BankDatabaseImplement/BankDatabase.cs new file mode 100644 index 0000000..bee8ae3 --- /dev/null +++ b/Bank/BankDatabaseImplement/BankDatabase.cs @@ -0,0 +1,24 @@ +using BankDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; + +namespace BankDatabaseImplement +{ + public class BankDatabase : DbContext + { + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + if (optionsBuilder.IsConfigured == false) + { + optionsBuilder.UseSqlServer(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=BankDatabase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True" + ); + } + base.OnConfiguring(optionsBuilder); + } + + public virtual DbSet Clients { get; set; } + public virtual DbSet Cards { get; set; } + public virtual DbSet Operations { get; set; } + public virtual DbSet Requests { get; set; } + public virtual DbSet CardRequests { get; set; } + } +} \ No newline at end of file diff --git a/Bank/BankDatabaseImplement/BankDatabaseImplement.csproj b/Bank/BankDatabaseImplement/BankDatabaseImplement.csproj new file mode 100644 index 0000000..ca2d4cb --- /dev/null +++ b/Bank/BankDatabaseImplement/BankDatabaseImplement.csproj @@ -0,0 +1,26 @@ + + + + net6.0 + enable + enable + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + diff --git a/Bank/BankDatabaseImplement/Models/Card.cs b/Bank/BankDatabaseImplement/Models/Card.cs new file mode 100644 index 0000000..05bba95 --- /dev/null +++ b/Bank/BankDatabaseImplement/Models/Card.cs @@ -0,0 +1,78 @@ +using BankContracts.BindingModels; +using BankContracts.ViewModels; +using BankDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankDatabaseImplement.Models +{ + public class Card : ICardModel + { + public int Id { get; set; } + [Required] + public string Number { get; set; } = string.Empty; + [Required] + public string Cvv { get; set; } = string.Empty; + [Required] + public string Pin { get; set; } = string.Empty; + [Required] + public DateOnly ReleaseDate { get; set; } + [Required] + public DateOnly ExpirationDate { get; set; } + [Required] + public int ClientId { get; set; } + [Required] + public int? AccountId { get; set; } = null; + [ForeignKey("CardId")] + public virtual List CardRequests { get; set; } = new(); + [ForeignKey("SenderCardId")] + public virtual List SenderOperations { get; set; } = new(); + [ForeignKey("RecipientCardId")] + public virtual List RecipientOperations { get; set; } = new(); + + public static Card? Create(CardBindingModel model) + { + if (model == null) return null; + return new Card + { + Id = model.Id, + Number = model.Number, + Cvv = model.Cvv, + Pin = model.Pin, + ReleaseDate = model.ReleaseDate, + ExpirationDate = model.ExpirationDate, + ClientId = model.ClientId, + AccountId = model.AccountId, + }; + } + + public void Update(CardBindingModel model) + { + if (model == null) return; + Number = model.Number; + Cvv = model.Cvv; + Pin = model.Pin; + ReleaseDate = model.ReleaseDate; + ExpirationDate = model.ExpirationDate; + ClientId = model.ClientId; + AccountId = model.AccountId; + } + + public CardViewModel GetViewModel => new() + { + Id = Id, + Number = Number, + Cvv = Cvv, + Pin = Pin, + ReleaseDate = ReleaseDate, + ExpirationDate = ExpirationDate, + ClientId = ClientId, + AccountId = AccountId, + }; + } +} diff --git a/Bank/BankDatabaseImplement/Models/CardRequest.cs b/Bank/BankDatabaseImplement/Models/CardRequest.cs new file mode 100644 index 0000000..119bb1b --- /dev/null +++ b/Bank/BankDatabaseImplement/Models/CardRequest.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankDatabaseImplement.Models +{ + public class CardRequest + { + public int Id { get; set; } + [Required] + public int CardId { get; set; } + [Required] + public int RequestId { get; set; } + public virtual Card Card { get; set; } = new(); + public virtual Request Request { get; set; } = new(); + } +} diff --git a/Bank/BankDatabaseImplement/Models/Client.cs b/Bank/BankDatabaseImplement/Models/Client.cs new file mode 100644 index 0000000..21121ef --- /dev/null +++ b/Bank/BankDatabaseImplement/Models/Client.cs @@ -0,0 +1,63 @@ +using BankContracts.BindingModels; +using BankContracts.ViewModels; +using BankDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankDatabaseImplement.Models +{ + public class Client : IClientModel + { + public int Id { get; set; } + [Required] + public string Fio { get; set; } = string.Empty; + [Required] + public string Email { get; set; } = string.Empty; + [Required] + public string Password { get; set; } = string.Empty; + [ForeignKey("ClientId")] + public virtual List Cards { get; set; } = new(); + + public static Client? Create(ClientBindingModel model) + { + if (model == null) + return null; + return new Client + { + Id = model.Id, + Fio = model.Fio, + Email = model.Email, + Password = model.Password, + }; + } + public static Client Create(ClientViewModel model) + { + return new Client() + { + Id = model.Id, + Fio = model.Fio, + Email = model.Email, + Password = model.Password, + }; + } + public void Update(ClientBindingModel model) + { + if (model == null) return; + Fio = model.Fio; + Email = model.Email; + Password = model.Password; + } + public ClientViewModel GetViewModel => new() + { + Id = Id, + Fio = Fio, + Email = Email, + Password = Password, + }; + } +} diff --git a/Bank/BankDatabaseImplement/Models/Operation.cs b/Bank/BankDatabaseImplement/Models/Operation.cs new file mode 100644 index 0000000..3e5e2d4 --- /dev/null +++ b/Bank/BankDatabaseImplement/Models/Operation.cs @@ -0,0 +1,57 @@ +using Azure; +using BankContracts.BindingModels; +using BankContracts.ViewModels; +using BankDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankDatabaseImplement.Models +{ + public class Operation : IOperationModel + { + public int Id { get; set; } + [Required] + public int Sum { get; set; } + [Required] + public DateTime OperationTime { get; set; } + [Required] + public int? SenderCardId { get; set; } = null; + [Required] + public int RecipientCardId { get; set; } + + public static Operation? Create(OperationBindingModel model) + { + if (model == null) return null; + return new Operation + { + Id = model.Id, + Sum = model.Sum, + OperationTime = model.OperationTime, + SenderCardId = model.SenderCardId, + RecipientCardId = model.RecipientCardId, + }; + } + + public void Update(OperationBindingModel model) + { + if (model == null) return; + Sum = model.Sum; + OperationTime = model.OperationTime; + SenderCardId = model.SenderCardId; + RecipientCardId = model.RecipientCardId; + } + + public OperationViewModel GetViewModel => new() + { + Id = Id, + Sum = Sum, + OperationTime = OperationTime, + SenderCardId = SenderCardId, + RecipientCardId = RecipientCardId, + }; + } +} diff --git a/Bank/BankDatabaseImplement/Models/Request.cs b/Bank/BankDatabaseImplement/Models/Request.cs new file mode 100644 index 0000000..1064682 --- /dev/null +++ b/Bank/BankDatabaseImplement/Models/Request.cs @@ -0,0 +1,90 @@ +using BankContracts.BindingModels; +using BankDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankDatabaseImplement.Models +{ + public class Request : IRequestModel + { + public int Id { get; set; } + [Required] + public int Sum { get; set; } + [Required] + public DateTime RequestTime { get; set; } + [Required] + public RequestStatus Status { get; set; } + [ForeignKey("RequestId")] + public virtual List Cards { get; set; } = new(); + private Dictionary? _cardRequests { get; set; } = null; + [NotMapped] + public Dictionary CardRequests + { + get + { + if (_cardRequests == null) + { + _cardRequests = Cards.ToDictionary(recPC => recPC.CardId, recPC => recPC.Card as ICardModel); + } + return _cardRequests; + } + } + + public static Request Create(BankDatabase context, RequestBindingModel model) + { + return new Request + { + Id = model.Id, + Sum = model.Sum, + RequestTime = model.RequestTime, + Status = model.Status, + Cards = model.CardRequests.Select(x => new CardRequest + { + Card = context.Cards.First(y => y.Id == x.Key) + }).ToList() + }; + } + + public void Update(RequestBindingModel model) + { + Sum = model.Sum; + RequestTime = model.RequestTime; + Status = model.Status; + } + + public RequestBindingModel GetViewModel => new() + { + Id = Id, + Sum = Sum, + RequestTime = RequestTime, + Status = Status, + CardRequests = CardRequests + }; + + public void UpdateCards(BankDatabase context, RequestBindingModel model) + { + var CardRequests = context.CardRequests.Where(rec => rec.RequestId == model.Id).ToList(); + if (CardRequests != null && CardRequests.Count > 0) + { // удалили те, которых нет в модели + context.CardRequests.RemoveRange(CardRequests.Where(rec => !model.CardRequests.ContainsKey(rec.CardId))); + context.SaveChanges(); + } + var Request = context.Requests.First(x => x.Id == Id); + foreach (var request in model.CardRequests) + { + context.CardRequests.Add(new CardRequest + { + Request = Request, + Card = context.Cards.First(x => x.Id == request.Key), + }); + context.SaveChanges(); + } + _cardRequests = null; + } + } +} \ No newline at end of file diff --git a/ERD/Bank.vpp b/ERD/Bank.vpp index 63ba53c..f1c5409 100644 Binary files a/ERD/Bank.vpp and b/ERD/Bank.vpp differ diff --git a/ERD/Bank.vpp.bak_010d b/ERD/Bank.vpp.bak_010d new file mode 100644 index 0000000..66a6b60 Binary files /dev/null and b/ERD/Bank.vpp.bak_010d differ diff --git a/ERD/Bank_english.vpp b/ERD/Bank_english.vpp index 664cabe..91e298a 100644 Binary files a/ERD/Bank_english.vpp and b/ERD/Bank_english.vpp differ diff --git a/ERD/Bank_english.vpp.bak_006d b/ERD/Bank_english.vpp.bak_006d new file mode 100644 index 0000000..9f67b09 Binary files /dev/null and b/ERD/Bank_english.vpp.bak_006d differ