From 1d42d66ba86a0071e9aaf084aebccbb7b993cceb Mon Sep 17 00:00:00 2001 From: dyakonovr Date: Thu, 2 May 2024 22:55:41 +0400 Subject: [PATCH] All done --- .../SoftwareInstallation/FormShop.cs | 5 +- .../BusinessLogics/OrderLogic.cs | 5 +- .../Implements/OrderStorage.cs | 9 +- .../Implements/ShopStorage.cs | 178 +++++++++++++ .../20240429151038_AddShopModel.Designer.cs | 248 ++++++++++++++++++ .../Migrations/20240429151038_AddShopModel.cs | 78 ++++++ ...ftwareInstallationDatabaseModelSnapshot.cs | 77 ++++++ .../Models/Order.cs | 7 +- .../Models/Shop.cs | 110 ++++++++ .../Models/ShopPackage.cs | 27 ++ .../SoftwareInstallationDatabase.cs | 6 +- 11 files changed, 736 insertions(+), 14 deletions(-) create mode 100644 SoftwareInstallation/SoftwareInstallationDatabaseImplement/Implements/ShopStorage.cs create mode 100644 SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/20240429151038_AddShopModel.Designer.cs create mode 100644 SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/20240429151038_AddShopModel.cs create mode 100644 SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/Shop.cs create mode 100644 SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/ShopPackage.cs diff --git a/SoftwareInstallation/SoftwareInstallation/FormShop.cs b/SoftwareInstallation/SoftwareInstallation/FormShop.cs index 71b4502..c625bfc 100644 --- a/SoftwareInstallation/SoftwareInstallation/FormShop.cs +++ b/SoftwareInstallation/SoftwareInstallation/FormShop.cs @@ -57,8 +57,9 @@ namespace SoftwareInstallationView ShopName = nameTextBox.Text, ShopAddress = addressTextBox.Text, OpeningDate = openingDatePicker.Value.Date, - PackageMaxCount = (int)numericUpDown.Value - }; + PackageMaxCount = (int)numericUpDown.Value, + ShopPackages = _listStores + }; var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); if (!operationResult) { diff --git a/SoftwareInstallation/SoftwareInstallationBusinessLogic/BusinessLogics/OrderLogic.cs b/SoftwareInstallation/SoftwareInstallationBusinessLogic/BusinessLogics/OrderLogic.cs index 5cf085f..17ea9c9 100644 --- a/SoftwareInstallation/SoftwareInstallationBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/SoftwareInstallation/SoftwareInstallationBusinessLogic/BusinessLogics/OrderLogic.cs @@ -67,6 +67,7 @@ namespace SoftwareInstallationBusinessLogic.BusinessLogics model.Status = newStatus; if (model.Status == OrderStatus.Выдан) + { model.DateImplement = DateTime.Now; var package = _packageStorage.GetElement(new() { Id = viewModel.PackageId }); @@ -81,8 +82,8 @@ namespace SoftwareInstallationBusinessLogic.BusinessLogics throw new Exception($"AddPackage operation failed. Store is full."); } } - else - { + + else { model.DateImplement = viewModel.DateImplement; } diff --git a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Implements/OrderStorage.cs b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Implements/OrderStorage.cs index c9fe224..23671a7 100644 --- a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Implements/OrderStorage.cs +++ b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Implements/OrderStorage.cs @@ -40,7 +40,7 @@ namespace SoftwareInstallationDatabaseImplement.Implements using var context = new SoftwareInstallationDatabase(); - return context.Orders.FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; + return context.Orders.Include(x => x.Package).FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; } public List GetFilteredList(OrderSearchModel model) @@ -64,15 +64,14 @@ namespace SoftwareInstallationDatabaseImplement.Implements public OrderViewModel? Insert(OrderBindingModel model) { - var newOrder = Order.Create(model); + using var context = new SoftwareInstallationDatabase(); + var newOrder = Order.Create(context, model); if (newOrder == null) { return null; } - using var context = new SoftwareInstallationDatabase(); - context.Orders.Add(newOrder); context.SaveChanges(); @@ -83,7 +82,7 @@ namespace SoftwareInstallationDatabaseImplement.Implements { using var context = new SoftwareInstallationDatabase(); - var order = context.Orders.FirstOrDefault(x => x.Id == model.Id); + var order = context.Orders.Include(x => x.Package).FirstOrDefault(x => x.Id == model.Id); if (order == null) { diff --git a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Implements/ShopStorage.cs b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Implements/ShopStorage.cs new file mode 100644 index 0000000..1eb47fb --- /dev/null +++ b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Implements/ShopStorage.cs @@ -0,0 +1,178 @@ +using Microsoft.EntityFrameworkCore; +using SoftwareInstallationContracts.BindingModels; +using SoftwareInstallationContracts.SearchModels; +using SoftwareInstallationContracts.StoragesContracts; +using SoftwareInstallationContracts.ViewModels; +using SoftwareInstallationDatabaseImplement.Models; +using SoftwareInstallationDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SoftwareInstallationDatabaseImplement.Implements +{ + public class ShopStorage : IShopStorage + { + public ShopViewModel? Delete(ShopBindingModel model) + { + using var context = new SoftwareInstallationDatabase(); + + var element = context.Shops + .Include(x => x.Packages) + .FirstOrDefault(rec => rec.Id == model.Id); + + if (element != null) + { + context.Shops.Remove(element); + context.SaveChanges(); + + return element.GetViewModel; + } + + return null; + } + + public ShopViewModel? GetElement(ShopSearchModel model) + { + if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue) + { + return null; + } + + using var context = new SoftwareInstallationDatabase(); + + return context.Shops + .Include(x => x.Packages) + .ThenInclude(x => x.Package) + .FirstOrDefault(x => (!string.IsNullOrEmpty(model.ShopName) && x.ShopName == model.ShopName) || (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + + public List GetFilteredList(ShopSearchModel model) + { + if (string.IsNullOrEmpty(model.ShopName)) + { + return new(); + } + + using var context = new SoftwareInstallationDatabase(); + + return context.Shops + .Include(x => x.Packages) + .ThenInclude(x => x.Package) + .Where(x => x.ShopName.Contains(model.ShopName)) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFullList() + { + using var context = new SoftwareInstallationDatabase(); + return context.Shops + .Include(x => x.Packages) + .ThenInclude(x => x.Package) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + + public ShopViewModel? Insert(ShopBindingModel model) + { + using var context = new SoftwareInstallationDatabase(); + var newShop = Shop.Create(context, model); + if (newShop == null) + { + return null; + } + context.Shops.Add(newShop); + context.SaveChanges(); + return newShop.GetViewModel; + } + + public bool SellPackage(IPackageModel model, int quantity) + { + using var context = new SoftwareInstallationDatabase(); + + if (context.Shops + .Include(x => x.Packages) + .ThenInclude(x => x.Package) + .ToList() + .Where(x => x.ShopPackages.ContainsKey(model.Id)).Select(x => x.PackageMaxCount).Sum() < quantity) + { + return false; + } + + using var transaction = context.Database.BeginTransaction(); + try + { + foreach (var Shop in context.Shops + .Include(x => x.Packages) + .ThenInclude(x => x.Package) + .ToList() + .Where(x => x.ShopPackages.ContainsKey(model.Id))) + { + int countInCurrentShop = Shop.ShopPackages[model.Id].Item2; + if (countInCurrentShop <= quantity) + { + var elem = context.ShopPackages + .Where(x => x.PackageId == model.Id) + .FirstOrDefault(x => x.ShopId == Shop.Id); + context.ShopPackages.Remove(elem); + Shop.ShopPackages.Remove(model.Id); + quantity -= countInCurrentShop; + } + else + { + Shop.ShopPackages[model.Id] = (Shop.ShopPackages[model.Id].Item1, countInCurrentShop - quantity); + quantity = 0; + Shop.UpdatePackage(context, new() + { + Id = Shop.Id, + ShopPackages = Shop.ShopPackages, + }); + } + if (quantity == 0) + { + context.SaveChanges(); + transaction.Commit(); + return true; + } + } + transaction.Rollback(); + return false; + } + catch + { + transaction.Rollback(); + throw; + } + } + + public ShopViewModel? Update(ShopBindingModel model) + { + using var context = new SoftwareInstallationDatabase(); + using var transaction = context.Database.BeginTransaction(); + try + { + var Shop = context.Shops.FirstOrDefault(rec => rec.Id == model.Id); + if (Shop == null) + { + return null; + } + Shop.Update(model); + Shop.UpdatePackage(context, model); + context.SaveChanges(); + transaction.Commit(); + return Shop.GetViewModel; + } + catch + { + transaction.Rollback(); + throw; + } + } + } +} diff --git a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/20240429151038_AddShopModel.Designer.cs b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/20240429151038_AddShopModel.Designer.cs new file mode 100644 index 0000000..e1d8c56 --- /dev/null +++ b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/20240429151038_AddShopModel.Designer.cs @@ -0,0 +1,248 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SoftwareInstallationDatabaseImplement; + +#nullable disable + +namespace SoftwareInstallationDatabaseImplement.Migrations +{ + [DbContext(typeof(SoftwareInstallationDatabase))] + [Migration("20240429151038_AddShopModel")] + partial class AddShopModel + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Cost") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("PackageId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("PackageId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Package", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("PackageName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Packages"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.PackageComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("PackageId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("PackageId"); + + b.ToTable("PackageComponents"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Shop", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("OpeningDate") + .HasColumnType("datetime2"); + + b.Property("PackageMaxCount") + .HasColumnType("int"); + + b.Property("ShopAddress") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ShopName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Shops"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.ShopPackage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("PackageId") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PackageId"); + + b.HasIndex("ShopId"); + + b.ToTable("ShopPackages"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Order", b => + { + b.HasOne("SoftwareInstallationDatabaseImplement.Models.Package", "Package") + .WithMany("Orders") + .HasForeignKey("PackageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Package"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.PackageComponent", b => + { + b.HasOne("SoftwareInstallationDatabaseImplement.Models.Component", "Component") + .WithMany("PackageComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SoftwareInstallationDatabaseImplement.Models.Package", "Package") + .WithMany("Components") + .HasForeignKey("PackageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Package"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.ShopPackage", b => + { + b.HasOne("SoftwareInstallationDatabaseImplement.Models.Package", "Package") + .WithMany() + .HasForeignKey("PackageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SoftwareInstallationDatabaseImplement.Models.Shop", "Shop") + .WithMany("Packages") + .HasForeignKey("ShopId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Package"); + + b.Navigation("Shop"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Component", b => + { + b.Navigation("PackageComponents"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Package", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Shop", b => + { + b.Navigation("Packages"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/20240429151038_AddShopModel.cs b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/20240429151038_AddShopModel.cs new file mode 100644 index 0000000..fbbbed6 --- /dev/null +++ b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/20240429151038_AddShopModel.cs @@ -0,0 +1,78 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace SoftwareInstallationDatabaseImplement.Migrations +{ + /// + public partial class AddShopModel : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Shops", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + ShopName = table.Column(type: "nvarchar(max)", nullable: false), + ShopAddress = table.Column(type: "nvarchar(max)", nullable: false), + OpeningDate = table.Column(type: "datetime2", nullable: false), + PackageMaxCount = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Shops", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "ShopPackages", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + PackageId = table.Column(type: "int", nullable: false), + ShopId = table.Column(type: "int", nullable: false), + Count = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ShopPackages", x => x.Id); + table.ForeignKey( + name: "FK_ShopPackages_Packages_PackageId", + column: x => x.PackageId, + principalTable: "Packages", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ShopPackages_Shops_ShopId", + column: x => x.ShopId, + principalTable: "Shops", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_ShopPackages_PackageId", + table: "ShopPackages", + column: "PackageId"); + + migrationBuilder.CreateIndex( + name: "IX_ShopPackages_ShopId", + table: "ShopPackages", + column: "ShopId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ShopPackages"); + + migrationBuilder.DropTable( + name: "Shops"); + } + } +} diff --git a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/SoftwareInstallationDatabaseModelSnapshot.cs b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/SoftwareInstallationDatabaseModelSnapshot.cs index e076682..2b06282 100644 --- a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/SoftwareInstallationDatabaseModelSnapshot.cs +++ b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Migrations/SoftwareInstallationDatabaseModelSnapshot.cs @@ -121,6 +121,59 @@ namespace SoftwareInstallationDatabaseImplement.Migrations b.ToTable("PackageComponents"); }); + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Shop", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("OpeningDate") + .HasColumnType("datetime2"); + + b.Property("PackageMaxCount") + .HasColumnType("int"); + + b.Property("ShopAddress") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ShopName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Shops"); + }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.ShopPackage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("PackageId") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PackageId"); + + b.HasIndex("ShopId"); + + b.ToTable("ShopPackages"); + }); + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Order", b => { b.HasOne("SoftwareInstallationDatabaseImplement.Models.Package", "Package") @@ -151,6 +204,25 @@ namespace SoftwareInstallationDatabaseImplement.Migrations b.Navigation("Package"); }); + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.ShopPackage", b => + { + b.HasOne("SoftwareInstallationDatabaseImplement.Models.Package", "Package") + .WithMany() + .HasForeignKey("PackageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SoftwareInstallationDatabaseImplement.Models.Shop", "Shop") + .WithMany("Packages") + .HasForeignKey("ShopId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Package"); + + b.Navigation("Shop"); + }); + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Component", b => { b.Navigation("PackageComponents"); @@ -162,6 +234,11 @@ namespace SoftwareInstallationDatabaseImplement.Migrations b.Navigation("Orders"); }); + + modelBuilder.Entity("SoftwareInstallationDatabaseImplement.Models.Shop", b => + { + b.Navigation("Packages"); + }); #pragma warning restore 612, 618 } } diff --git a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/Order.cs b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/Order.cs index 0303f0d..f33aec7 100644 --- a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/Order.cs +++ b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/Order.cs @@ -33,7 +33,7 @@ namespace SoftwareInstallationDatabaseImplement.Models public virtual Package Package { get; set; } - public static Order? Create(OrderBindingModel? model) + public static Order? Create(SoftwareInstallationDatabase context, OrderBindingModel? model) { if (model == null) { @@ -48,8 +48,9 @@ namespace SoftwareInstallationDatabaseImplement.Models Sum = model.Sum, Status = model.Status, DateCreate = model.DateCreate, - DateImplement = model.DateImplement - }; + DateImplement = model.DateImplement, + Package = context.Packages.First(x => x.Id == model.PackageId) + }; } public void Update(OrderBindingModel model) diff --git a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/Shop.cs b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/Shop.cs new file mode 100644 index 0000000..8881058 --- /dev/null +++ b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/Shop.cs @@ -0,0 +1,110 @@ +using SoftwareInstallationDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SoftwareInstallationContracts.BindingModels; +using SoftwareInstallationContracts.ViewModels; + +namespace SoftwareInstallationDatabaseImplement.Models +{ + public class Shop : IShopModel + { + [Required] + public string ShopName { get; private set; } = string.Empty; + [Required] + public string ShopAddress { get; private set; } = string.Empty; + [Required] + public DateTime OpeningDate { get; private set; } + [Required] + public int PackageMaxCount { get; private set; } + + public int Id { get; private set; } + + + private Dictionary _ShopPackages = null; + [NotMapped] + public Dictionary ShopPackages + { + get + { + if (_ShopPackages == null) + { + _ShopPackages = Packages + .ToDictionary(recPC => recPC.PackageId, recPC => (recPC.Package as IPackageModel, recPC.Count)); + } + return _ShopPackages; + } + } + + [ForeignKey("ShopId")] + public virtual List Packages { get; set; } = new(); + + public static Shop Create(SoftwareInstallationDatabase context, ShopBindingModel model) + { + return new Shop() + { + Id = model.Id, + ShopName = model.ShopName, + ShopAddress = model.ShopAddress, + OpeningDate = model.OpeningDate, + PackageMaxCount = model.PackageMaxCount, + Packages = model.ShopPackages.Select(x => new ShopPackage + { + Package = context.Packages.First(y => y.Id == x.Key), + Count = x.Value.Item2 + }).ToList() + }; + } + + public void Update(ShopBindingModel model) + { + ShopName = model.ShopName; + ShopAddress = model.ShopAddress; + OpeningDate = model.OpeningDate; + PackageMaxCount = model.PackageMaxCount; + } + + public ShopViewModel GetViewModel => new() + { + Id = Id, + ShopName = ShopName, + ShopAddress = ShopAddress, + OpeningDate = OpeningDate, + PackageMaxCount = PackageMaxCount, + ShopPackages = ShopPackages + }; + + public void UpdatePackage(SoftwareInstallationDatabase context, ShopBindingModel model) + { + var ShopPackages = context.ShopPackages.Where(rec => rec.ShopId == model.Id).ToList(); + if (ShopPackages != null && ShopPackages.Count > 0) + { // удалили те, которых нет в модели + context.ShopPackages.RemoveRange(ShopPackages.Where(rec => !model.ShopPackages.ContainsKey(rec.PackageId))); + context.SaveChanges(); + // обновили количество у существующих записей + foreach (var updatePackage in ShopPackages) + { + updatePackage.Count = model.ShopPackages[updatePackage.PackageId].Item2; + model.ShopPackages.Remove(updatePackage.PackageId); + } + context.SaveChanges(); + } + var Shop = context.Shops.First(x => x.Id == Id); + foreach (var sp in model.ShopPackages) + { + context.ShopPackages.Add(new ShopPackage + { + Shop = Shop, + Package = context.Packages.First(x => x.Id == sp.Key), + Count = sp.Value.Item2 + }); + context.SaveChanges(); + } + _ShopPackages = null; + } + } +} diff --git a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/ShopPackage.cs b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/ShopPackage.cs new file mode 100644 index 0000000..b0e026f --- /dev/null +++ b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/Models/ShopPackage.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SoftwareInstallationDatabaseImplement.Models +{ + public class ShopPackage + { + public int Id { get; set; } + + [Required] + public int PackageId { get; set; } + + [Required] + public int ShopId { get; set; } + + [Required] + public int Count { get; set; } + + public virtual Shop Shop { get; set; } = new(); + + public virtual Package Package { get; set; } = new(); + } +} diff --git a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/SoftwareInstallationDatabase.cs b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/SoftwareInstallationDatabase.cs index a0e502b..022875f 100644 --- a/SoftwareInstallation/SoftwareInstallationDatabaseImplement/SoftwareInstallationDatabase.cs +++ b/SoftwareInstallation/SoftwareInstallationDatabaseImplement/SoftwareInstallationDatabase.cs @@ -15,7 +15,7 @@ namespace SoftwareInstallationDatabaseImplement { if (optionsBuilder.IsConfigured == false) { - optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-SPMUS7R;Initial Catalog=SoftwareInstallationDatabase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); + optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-SPMUS7R;Initial Catalog=SoftwareInstallationHardDatabase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); } base.OnConfiguring(optionsBuilder); } @@ -23,5 +23,7 @@ namespace SoftwareInstallationDatabaseImplement public virtual DbSet Packages { set; get; } public virtual DbSet PackageComponents { set; get; } public virtual DbSet Orders { set; get; } - } + public virtual DbSet Shops { set; get; } + public virtual DbSet ShopPackages { set; get; } + } }