diff --git a/AutoWorkshopDatabaseImplement/Implements/ShopStorage.cs b/AutoWorkshopDatabaseImplement/Implements/ShopStorage.cs index 41443c0..2685c94 100644 --- a/AutoWorkshopDatabaseImplement/Implements/ShopStorage.cs +++ b/AutoWorkshopDatabaseImplement/Implements/ShopStorage.cs @@ -106,60 +106,7 @@ namespace AutoWorkshopDatabaseImplement.Implements Context.SaveChanges(); return Shop.GetViewModel; - } - - public bool RestockingShops(SupplyBindingModel Model) - { - using var Context = new AutoWorkshopDatabase(); - var Transaction = Context.Database.BeginTransaction(); - - var Shops = Context.Shops - .Include(x => x.Repairs) - .ThenInclude(x => x.Repair) - .ToList() - .Where(x => x.RepairsMaxCount > x.ShopRepairs - .Select(x => x.Value.Item2).Sum()) - .ToList(); - - try - { - foreach (Shop Shop in Shops) - { - int Difference = Shop.RepairsMaxCount - Shop.ShopRepairs.Select(x => x.Value.Item2).Sum(); - int Refill = Math.Min(Difference, Model.Count); - - Model.Count -= Refill; - - if (Shop.ShopRepairs.ContainsKey(Model.RepairId)) - { - var DatePair = Shop.ShopRepairs[Model.RepairId]; - DatePair.Item2 += Refill; - Shop.ShopRepairs[Model.RepairId] = DatePair; - } - else - { - var Repair = Context.Repairs.First(x => x.Id == Model.RepairId); - Shop.ShopRepairs.Add(Model.RepairId, (Repair, Refill)); - } - - Shop.RepairsDictionatyUpdate(Context); - - if (Model.Count == 0) - { - Transaction.Commit(); - return true; - } - } - - Transaction.Rollback(); - return false; - } - catch - { - Transaction.Rollback(); - throw; - } - } + } public bool Sell(SupplySearchModel Model) { @@ -168,7 +115,7 @@ namespace AutoWorkshopDatabaseImplement.Implements try { - var Shops = Context.Shops + var ShopsWithDesiredRepair = Context.Shops .Include(x => x.Repairs) .ThenInclude(x => x.Repair) .ToList() @@ -176,28 +123,29 @@ namespace AutoWorkshopDatabaseImplement.Implements .OrderByDescending(x => x.ShopRepairs[Model.RepairId.Value].Item2) .ToList(); - foreach (var Shop in Shops) + foreach (var Shop in ShopsWithDesiredRepair) { - int Residue = Model.Count.Value - Shop.ShopRepairs[Model.RepairId.Value].Item2; + int Slack = Model.Count.Value - Shop.ShopRepairs[Model.RepairId.Value].Item2; - if (Residue > 0) + if (Slack > 0) { - Shop.ShopRepairs.Remove(Model.RepairId.Value); + Shop.ShopRepairs.Remove(Model.RepairId.Value); Shop.RepairsDictionatyUpdate(Context); Context.SaveChanges(); - Model.Count = Residue; + Model.Count = Slack; } else { - if (Residue == 0) + if (Slack == 0) + { Shop.ShopRepairs.Remove(Model.RepairId.Value); - + } else { - var DataPair = Shop.ShopRepairs[Model.RepairId.Value]; - DataPair.Item2 = -Residue; - Shop.ShopRepairs[Model.RepairId.Value] = DataPair; + var RepairAndCount = Shop.ShopRepairs[Model.RepairId.Value]; + RepairAndCount.Item2 = -Slack; + Shop.ShopRepairs[Model.RepairId.Value] = RepairAndCount; } Shop.RepairsDictionatyUpdate(Context); @@ -216,5 +164,58 @@ namespace AutoWorkshopDatabaseImplement.Implements throw; } } - } + + public bool RestockingShops(SupplyBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + var Transaction = Context.Database.BeginTransaction(); + + var Shops = Context.Shops + .Include(x => x.Repairs) + .ThenInclude(x => x.Repair) + .ToList() + .Where(x => x.RepairsMaxCount > x.ShopRepairs + .Select(x => x.Value.Item2).Sum()) + .ToList(); + + try + { + foreach (Shop Shop in Shops) + { + int FreeSpaceNum = Shop.RepairsMaxCount - Shop.ShopRepairs.Select(x => x.Value.Item2).Sum(); + + int Refill = Math.Min(FreeSpaceNum, Model.Count); + Model.Count -= Refill; + + if (Shop.ShopRepairs.ContainsKey(Model.RepairId)) + { + var RepairAndCount = Shop.ShopRepairs[Model.RepairId]; + RepairAndCount.Item2 += Refill; + Shop.ShopRepairs[Model.RepairId] = RepairAndCount; + } + else + { + var Repair = Context.Repairs.First(x => x.Id == Model.RepairId); + Shop.ShopRepairs.Add(Model.RepairId, (Repair, Refill)); + } + + Shop.RepairsDictionatyUpdate(Context); + + if (Model.Count == 0) + { + Transaction.Commit(); + return true; + } + } + + Transaction.Rollback(); + return false; + } + catch + { + Transaction.Rollback(); + throw; + } + } + } } diff --git a/AutoWorkshopDatabaseImplement/Migrations/20240402181656_InitialCreate.Designer.cs b/AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.Designer.cs similarity index 68% rename from AutoWorkshopDatabaseImplement/Migrations/20240402181656_InitialCreate.Designer.cs rename to AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.Designer.cs index 06a8333..dcb69a0 100644 --- a/AutoWorkshopDatabaseImplement/Migrations/20240402181656_InitialCreate.Designer.cs +++ b/AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.Designer.cs @@ -12,8 +12,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace AutoWorkshopDatabaseImplement.Migrations { [DbContext(typeof(AutoWorkshopDatabase))] - [Migration("20240402181656_InitialCreate")] - partial class InitialCreate + [Migration("20240417061857_Shops")] + partial class Shops { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -124,6 +124,59 @@ namespace AutoWorkshopDatabaseImplement.Migrations b.ToTable("RepairComponents"); }); + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasColumnType("text"); + + b.Property("OpeningDate") + .HasColumnType("timestamp without time zone"); + + b.Property("RepairsMaxCount") + .HasColumnType("integer"); + + b.Property("ShopName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Shops"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.ShopRepair", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("RepairId") + .HasColumnType("integer"); + + b.Property("ShopId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("RepairId"); + + b.HasIndex("ShopId"); + + b.ToTable("ShopRepairs"); + }); + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Order", b => { b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair") @@ -154,6 +207,25 @@ namespace AutoWorkshopDatabaseImplement.Migrations b.Navigation("Repair"); }); + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.ShopRepair", b => + { + b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair") + .WithMany() + .HasForeignKey("RepairId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AutoWorkshopDatabaseImplement.Models.Shop", "Shop") + .WithMany("Repairs") + .HasForeignKey("ShopId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Repair"); + + b.Navigation("Shop"); + }); + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Component", b => { b.Navigation("RepairComponents"); @@ -165,6 +237,11 @@ namespace AutoWorkshopDatabaseImplement.Migrations b.Navigation("Orders"); }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b => + { + b.Navigation("Repairs"); + }); #pragma warning restore 612, 618 } } diff --git a/AutoWorkshopDatabaseImplement/Migrations/20240402181656_InitialCreate.cs b/AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.cs similarity index 66% rename from AutoWorkshopDatabaseImplement/Migrations/20240402181656_InitialCreate.cs rename to AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.cs index dd113b0..a4f4cc6 100644 --- a/AutoWorkshopDatabaseImplement/Migrations/20240402181656_InitialCreate.cs +++ b/AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.cs @@ -7,7 +7,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace AutoWorkshopDatabaseImplement.Migrations { /// - public partial class InitialCreate : Migration + public partial class Shops : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -40,6 +40,22 @@ namespace AutoWorkshopDatabaseImplement.Migrations table.PrimaryKey("PK_Repairs", x => x.Id); }); + migrationBuilder.CreateTable( + name: "Shops", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ShopName = table.Column(type: "text", nullable: false), + Address = table.Column(type: "text", nullable: false), + OpeningDate = table.Column(type: "timestamp without time zone", nullable: false), + RepairsMaxCount = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Shops", x => x.Id); + }); + migrationBuilder.CreateTable( name: "Orders", columns: table => new @@ -91,6 +107,33 @@ namespace AutoWorkshopDatabaseImplement.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "ShopRepairs", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + RepairId = table.Column(type: "integer", nullable: false), + ShopId = table.Column(type: "integer", nullable: false), + Count = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ShopRepairs", x => x.Id); + table.ForeignKey( + name: "FK_ShopRepairs_Repairs_RepairId", + column: x => x.RepairId, + principalTable: "Repairs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ShopRepairs_Shops_ShopId", + column: x => x.ShopId, + principalTable: "Shops", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateIndex( name: "IX_Orders_RepairId", table: "Orders", @@ -105,6 +148,16 @@ namespace AutoWorkshopDatabaseImplement.Migrations name: "IX_RepairComponents_RepairId", table: "RepairComponents", column: "RepairId"); + + migrationBuilder.CreateIndex( + name: "IX_ShopRepairs_RepairId", + table: "ShopRepairs", + column: "RepairId"); + + migrationBuilder.CreateIndex( + name: "IX_ShopRepairs_ShopId", + table: "ShopRepairs", + column: "ShopId"); } /// @@ -116,11 +169,17 @@ namespace AutoWorkshopDatabaseImplement.Migrations migrationBuilder.DropTable( name: "RepairComponents"); + migrationBuilder.DropTable( + name: "ShopRepairs"); + migrationBuilder.DropTable( name: "Components"); migrationBuilder.DropTable( name: "Repairs"); + + migrationBuilder.DropTable( + name: "Shops"); } } } diff --git a/AutoWorkshopDatabaseImplement/Migrations/AutoWorkshopDatabaseModelSnapshot.cs b/AutoWorkshopDatabaseImplement/Migrations/AutoWorkshopDatabaseModelSnapshot.cs index 40a9aca..454b66c 100644 --- a/AutoWorkshopDatabaseImplement/Migrations/AutoWorkshopDatabaseModelSnapshot.cs +++ b/AutoWorkshopDatabaseImplement/Migrations/AutoWorkshopDatabaseModelSnapshot.cs @@ -121,6 +121,59 @@ namespace AutoWorkshopDatabaseImplement.Migrations b.ToTable("RepairComponents"); }); + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasColumnType("text"); + + b.Property("OpeningDate") + .HasColumnType("timestamp without time zone"); + + b.Property("RepairsMaxCount") + .HasColumnType("integer"); + + b.Property("ShopName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Shops"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.ShopRepair", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("RepairId") + .HasColumnType("integer"); + + b.Property("ShopId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("RepairId"); + + b.HasIndex("ShopId"); + + b.ToTable("ShopRepairs"); + }); + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Order", b => { b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair") @@ -151,6 +204,25 @@ namespace AutoWorkshopDatabaseImplement.Migrations b.Navigation("Repair"); }); + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.ShopRepair", b => + { + b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair") + .WithMany() + .HasForeignKey("RepairId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AutoWorkshopDatabaseImplement.Models.Shop", "Shop") + .WithMany("Repairs") + .HasForeignKey("ShopId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Repair"); + + b.Navigation("Shop"); + }); + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Component", b => { b.Navigation("RepairComponents"); @@ -162,6 +234,11 @@ namespace AutoWorkshopDatabaseImplement.Migrations b.Navigation("Orders"); }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b => + { + b.Navigation("Repairs"); + }); #pragma warning restore 612, 618 } } diff --git a/AutoWorkshopDatabaseImplement/Models/Shop.cs b/AutoWorkshopDatabaseImplement/Models/Shop.cs index 3ad4006..59aef6c 100644 --- a/AutoWorkshopDatabaseImplement/Models/Shop.cs +++ b/AutoWorkshopDatabaseImplement/Models/Shop.cs @@ -84,8 +84,10 @@ namespace AutoWorkshopDatabaseImplement.Models { Context.ShopRepairs.RemoveRange(ShopRepairs.Where(rec => !Model.ShopRepairs.ContainsKey(rec.RepairId))); Context.SaveChanges(); - - foreach (var RepairToUpdate in ShopRepairs) + + ShopRepairs = Context.ShopRepairs.Where(rec => rec.ShopId == Model.Id).ToList(); + + foreach (var RepairToUpdate in ShopRepairs) { RepairToUpdate.Count = Model.ShopRepairs[RepairToUpdate.RepairId].Item2; Model.ShopRepairs.Remove(RepairToUpdate.RepairId);