diff --git a/AutoWorkshop.sln b/AutoWorkshop.sln index fb90b42..1f3bcf9 100644 --- a/AutoWorkshop.sln +++ b/AutoWorkshop.sln @@ -13,7 +13,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoWorkshopBusinessLogic", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoWorkshopListImplement", "AutoWorkshopImplement\AutoWorkshopListImplement.csproj", "{B564F5E8-2F14-4816-8481-1F9649F1F414}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoWorkshopFileImplement", "AutoWorkshopFileImplement\AutoWorkshopFileImplement.csproj", "{862B0F3D-1B88-45B8-9526-AD21A6D6FA81}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoWorkshopFileImplement", "AutoWorkshopFileImplement\AutoWorkshopFileImplement.csproj", "{862B0F3D-1B88-45B8-9526-AD21A6D6FA81}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoWorkshopDatabaseImplement", "AutoWorkshopDatabaseImplement\AutoWorkshopDatabaseImplement.csproj", "{751668F7-01A3-43F0-BDD8-ABB3A8F5A955}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -45,6 +47,10 @@ Global {862B0F3D-1B88-45B8-9526-AD21A6D6FA81}.Debug|Any CPU.Build.0 = Debug|Any CPU {862B0F3D-1B88-45B8-9526-AD21A6D6FA81}.Release|Any CPU.ActiveCfg = Release|Any CPU {862B0F3D-1B88-45B8-9526-AD21A6D6FA81}.Release|Any CPU.Build.0 = Release|Any CPU + {751668F7-01A3-43F0-BDD8-ABB3A8F5A955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {751668F7-01A3-43F0-BDD8-ABB3A8F5A955}.Debug|Any CPU.Build.0 = Debug|Any CPU + {751668F7-01A3-43F0-BDD8-ABB3A8F5A955}.Release|Any CPU.ActiveCfg = Release|Any CPU + {751668F7-01A3-43F0-BDD8-ABB3A8F5A955}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AutoWorkshopDatabaseImplement/AutoWorkshopDatabase.cs b/AutoWorkshopDatabaseImplement/AutoWorkshopDatabase.cs new file mode 100644 index 0000000..5088a41 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/AutoWorkshopDatabase.cs @@ -0,0 +1,33 @@ +using AutoWorkshopDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; + +namespace AutoWorkshopDatabaseImplement +{ + public class AutoWorkshopDatabase : DbContext + { + protected override void OnConfiguring(DbContextOptionsBuilder OptionsBuilder) + { + if (OptionsBuilder.IsConfigured == false) + { + OptionsBuilder.UseNpgsql(@"Host=localhost;Port=5000;Database=AutoWorkshop_Hard;Username=postgres;Password=admin"); + } + + base.OnConfiguring(OptionsBuilder); + + AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); + AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true); + } + + public virtual DbSet Components { set; get; } + + public virtual DbSet Repairs { set; get; } + + public virtual DbSet RepairComponents { set; get; } + + public virtual DbSet Orders { set; get; } + + public virtual DbSet Shops { get; set; } + + public virtual DbSet ShopRepairs { get; set; } + } +} diff --git a/AutoWorkshopDatabaseImplement/AutoWorkshopDatabaseImplement.csproj b/AutoWorkshopDatabaseImplement/AutoWorkshopDatabaseImplement.csproj new file mode 100644 index 0000000..18d1907 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/AutoWorkshopDatabaseImplement.csproj @@ -0,0 +1,24 @@ + + + + net6.0 + enable + enable + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + diff --git a/AutoWorkshopDatabaseImplement/Implements/ComponentStorage.cs b/AutoWorkshopDatabaseImplement/Implements/ComponentStorage.cs new file mode 100644 index 0000000..4bf7dec --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Implements/ComponentStorage.cs @@ -0,0 +1,82 @@ +using AutoWorkshopContracts.BindingModels; +using AutoWorkshopContracts.SearchModels; +using AutoWorkshopContracts.StoragesContracts; +using AutoWorkshopContracts.ViewModels; +using AutoWorkshopDatabaseImplement.Models; + +namespace AutoWorkshopDatabaseImplement.Implements +{ + public class ComponentStorage : IComponentStorage + { + public List GetFullList() + { + using var Context = new AutoWorkshopDatabase(); + return Context.Components.Select(x => x.GetViewModel).ToList(); + } + + public List GetFilteredList(ComponentSearchModel Model) + { + if (string.IsNullOrEmpty(Model.ComponentName)) + return new(); + + using var Context = new AutoWorkshopDatabase(); + return Context.Components + .Where(x => x.ComponentName.Contains(Model.ComponentName)) + .Select(x => x.GetViewModel) + .ToList(); + } + + public ComponentViewModel? GetElement(ComponentSearchModel Model) + { + if (string.IsNullOrEmpty(Model.ComponentName) && !Model.Id.HasValue) + return null; + + using var Context = new AutoWorkshopDatabase(); + return Context.Components + .FirstOrDefault(x => (!string.IsNullOrEmpty(Model.ComponentName) && x.ComponentName == Model.ComponentName) || + (Model.Id.HasValue && x.Id == Model.Id))?.GetViewModel; + } + + public ComponentViewModel? Insert(ComponentBindingModel Model) + { + var NewComponent = Component.Create(Model); + + if (NewComponent == null) + return null; + + using var Context = new AutoWorkshopDatabase(); + Context.Components.Add(NewComponent); + Context.SaveChanges(); + + return NewComponent.GetViewModel; + } + + public ComponentViewModel? Update(ComponentBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + + var Component = Context.Components.FirstOrDefault(x => x.Id == Model.Id); + + if (Component == null) + return null; + + Component.Update(Model); + Context.SaveChanges(); + + return Component.GetViewModel; + } + + public ComponentViewModel? Delete(ComponentBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + var Component = Context.Components.FirstOrDefault(rec => rec.Id == Model.Id); + + if (Component == null) + return null; + + Context.Components.Remove(Component); + Context.SaveChanges(); + return Component.GetViewModel; + } + } +} diff --git a/AutoWorkshopDatabaseImplement/Implements/OrderStorage.cs b/AutoWorkshopDatabaseImplement/Implements/OrderStorage.cs new file mode 100644 index 0000000..b42ccd7 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Implements/OrderStorage.cs @@ -0,0 +1,94 @@ +using AutoWorkshopContracts.BindingModels; +using AutoWorkshopContracts.SearchModels; +using AutoWorkshopContracts.StoragesContracts; +using AutoWorkshopContracts.ViewModels; +using AutoWorkshopDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; + +namespace AutoWorkshopDatabaseImplement.Implements +{ + public class OrderStorage : IOrderStorage + { + public List GetFullList() + { + using var Context = new AutoWorkshopDatabase(); + + return Context.Orders + .Include(x => x.Repair) + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFilteredList(OrderSearchModel Model) + { + if (!Model.Id.HasValue) + return new(); + + using var Context = new AutoWorkshopDatabase(); + + return Context.Orders + .Include(x => x.Repair) + .Where(x => x.Id == Model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + + public OrderViewModel? GetElement(OrderSearchModel Model) + { + if (!Model.Id.HasValue) + return null; + + using var Context = new AutoWorkshopDatabase(); + + return Context.Orders + .Include(x => x.Repair) + .FirstOrDefault(x => Model.Id.HasValue && x.Id == Model.Id)? + .GetViewModel; + } + + public OrderViewModel? Insert(OrderBindingModel Model) + { + if (Model == null) + return null; + + var NewOrder = Order.Create(Model); + if (NewOrder == null) + return null; + + using var Context = new AutoWorkshopDatabase(); + + Context.Orders.Add(NewOrder); + Context.SaveChanges(); + + return Context.Orders.Include(x => x.Repair).FirstOrDefault(x => x.Id == NewOrder.Id)?.GetViewModel; + } + + public OrderViewModel? Update(OrderBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + + var Order = Context.Orders.FirstOrDefault(x => x.Id == Model.Id); + if (Order == null) + return null; + + Order.Update(Model); + Context.SaveChanges(); + + return Context.Orders.Include(x => x.Repair).FirstOrDefault(x => x.Id == Model.Id)?.GetViewModel; + } + + public OrderViewModel? Delete(OrderBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + var Order = Context.Orders.FirstOrDefault(rec => rec.Id == Model.Id); + + if (Order == null) + return null; + + Context.Orders.Remove(Order); + Context.SaveChanges(); + + return Order.GetViewModel; + } + } +} diff --git a/AutoWorkshopDatabaseImplement/Implements/RepairStorage.cs b/AutoWorkshopDatabaseImplement/Implements/RepairStorage.cs new file mode 100644 index 0000000..41be0a8 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Implements/RepairStorage.cs @@ -0,0 +1,109 @@ +using AutoWorkshopContracts.BindingModels; +using AutoWorkshopContracts.SearchModels; +using AutoWorkshopContracts.StoragesContracts; +using AutoWorkshopContracts.ViewModels; +using AutoWorkshopDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; + +namespace AutoWorkshopDatabaseImplement.Implements +{ + public class RepairStorage : IRepairStorage + { + public List GetFullList() + { + using var Context = new AutoWorkshopDatabase(); + return Context.Repairs + .Include(x => x.Components) + .ThenInclude(x => x.Component) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFilteredList(RepairSearchModel Model) + { + if (string.IsNullOrEmpty(Model.RepairName)) + return new(); + + using var Context = new AutoWorkshopDatabase(); + + return Context.Repairs + .Include(x => x.Components) + .ThenInclude(x => x.Component) + .Where(x => x.RepairName.Contains(Model.RepairName)) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + + public RepairViewModel? GetElement(RepairSearchModel Model) + { + if (string.IsNullOrEmpty(Model.RepairName) && !Model.Id.HasValue) + return null; + + using var Context = new AutoWorkshopDatabase(); + + return Context.Repairs + .Include(x => x.Components) + .ThenInclude(x => x.Component) + .FirstOrDefault(x => (!string.IsNullOrEmpty(Model.RepairName) && x.RepairName == Model.RepairName) || + (Model.Id.HasValue && x.Id == Model.Id))? + .GetViewModel; + } + + public RepairViewModel? Insert(RepairBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + + var NewRepair = Repair.Create(Context, Model); + if (NewRepair == null) + return null; + + Context.Repairs.Add(NewRepair); + Context.SaveChanges(); + + return NewRepair.GetViewModel; + } + + public RepairViewModel? Update(RepairBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + + using var Transaction = Context.Database.BeginTransaction(); + try + { + var Repair = Context.Repairs.FirstOrDefault(rec => rec.Id == Model.Id); + + if (Repair == null) + return null; + + Repair.Update(Model); + Context.SaveChanges(); + Repair.UpdateComponents(Context, Model); + + Transaction.Commit(); + return Repair.GetViewModel; + } + catch + { + Transaction.Rollback(); + throw; + } + } + public RepairViewModel? Delete(RepairBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + + var Repair = Context.Repairs + .Include(x => x.Components) + .FirstOrDefault(rec => rec.Id == Model.Id); + + if (Repair == null) + return null; + + Context.Repairs.Remove(Repair); + Context.SaveChanges(); + return Repair.GetViewModel; + } + } +} diff --git a/AutoWorkshopDatabaseImplement/Implements/ShopStorage.cs b/AutoWorkshopDatabaseImplement/Implements/ShopStorage.cs new file mode 100644 index 0000000..2685c94 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Implements/ShopStorage.cs @@ -0,0 +1,221 @@ +using AutoWorkshopContracts.BindingModels; +using AutoWorkshopContracts.SearchModels; +using AutoWorkshopContracts.StoragesContracts; +using AutoWorkshopContracts.ViewModels; +using AutoWorkshopDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; + +namespace AutoWorkshopDatabaseImplement.Implements +{ + public class ShopStorage : IShopStorage + { + public List GetFullList() + { + using var Context = new AutoWorkshopDatabase(); + return Context.Shops + .Include(x => x.Repairs) + .ThenInclude(x => x.Repair) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFilteredList(ShopSearchModel Model) + { + if (string.IsNullOrEmpty(Model.ShopName)) + return new(); + + using var Context = new AutoWorkshopDatabase(); + + return Context.Shops + .Include(x => x.Repairs) + .ThenInclude(x => x.Repair) + .Where(x => x.ShopName.Contains(Model.ShopName)) + .ToList() + .Select(x => x.GetViewModel) + .ToList(); + } + + public ShopViewModel? GetElement(ShopSearchModel Model) + { + if (string.IsNullOrEmpty(Model.ShopName) && !Model.Id.HasValue) + return new(); + + using var Context = new AutoWorkshopDatabase(); + + return Context.Shops + .Include(x => x.Repairs) + .ThenInclude(x => x.Repair) + .FirstOrDefault(x => (!string.IsNullOrEmpty(Model.ShopName) && x.ShopName == Model.ShopName) || + (Model.Id.HasValue && x.Id == Model.Id))? + .GetViewModel; + } + + public ShopViewModel? Insert(ShopBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + + var NewShop = Shop.Create(Context, Model); + if (NewShop == null) + return null; + + Context.Shops.Add(NewShop); + Context.SaveChanges(); + + return NewShop.GetViewModel; + } + + public ShopViewModel? Update(ShopBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + + using var Transaction = Context.Database.BeginTransaction(); + try + { + var Shop = Context.Shops.FirstOrDefault(x => x.Id == Model.Id); + + if (Shop == null) + return null; + + Shop.Update(Model); + Context.SaveChanges(); + Shop.UpdateRepairs(Context, Model); + + Transaction.Commit(); + return Shop.GetViewModel; + } + catch + { + Transaction.Rollback(); + throw; + } + } + + public ShopViewModel? Delete(ShopBindingModel Model) + { + using var Context = new AutoWorkshopDatabase(); + + var Shop = Context.Shops + .Include(x => x.Repairs) + .FirstOrDefault(x => x.Id == Model.Id); + + if (Shop == null) + return null; + + Context.Shops.Remove(Shop); + Context.SaveChanges(); + + return Shop.GetViewModel; + } + + public bool Sell(SupplySearchModel Model) + { + using var Context = new AutoWorkshopDatabase(); + var Transaction = Context.Database.BeginTransaction(); + + try + { + var ShopsWithDesiredRepair = Context.Shops + .Include(x => x.Repairs) + .ThenInclude(x => x.Repair) + .ToList() + .Where(x => x.ShopRepairs.ContainsKey(Model.RepairId.Value)) + .OrderByDescending(x => x.ShopRepairs[Model.RepairId.Value].Item2) + .ToList(); + + foreach (var Shop in ShopsWithDesiredRepair) + { + int Slack = Model.Count.Value - Shop.ShopRepairs[Model.RepairId.Value].Item2; + + if (Slack > 0) + { + Shop.ShopRepairs.Remove(Model.RepairId.Value); + Shop.RepairsDictionatyUpdate(Context); + Context.SaveChanges(); + + Model.Count = Slack; + } + else + { + if (Slack == 0) + { + Shop.ShopRepairs.Remove(Model.RepairId.Value); + } + else + { + var RepairAndCount = Shop.ShopRepairs[Model.RepairId.Value]; + RepairAndCount.Item2 = -Slack; + Shop.ShopRepairs[Model.RepairId.Value] = RepairAndCount; + } + + Shop.RepairsDictionatyUpdate(Context); + Transaction.Commit(); + + return true; + } + } + + Transaction.Rollback(); + return false; + } + catch + { + Transaction.Rollback(); + 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/20240417061857_Shops.Designer.cs b/AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.Designer.cs new file mode 100644 index 0000000..dcb69a0 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.Designer.cs @@ -0,0 +1,248 @@ +// +using System; +using AutoWorkshopDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace AutoWorkshopDatabaseImplement.Migrations +{ + [DbContext(typeof(AutoWorkshopDatabase))] + [Migration("20240417061857_Shops")] + partial class Shops + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.17") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateCreate") + .HasColumnType("timestamp without time zone"); + + b.Property("DateImplement") + .HasColumnType("timestamp without time zone"); + + b.Property("RepairId") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Sum") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.HasIndex("RepairId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Repair", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("RepairName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Repairs"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.RepairComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("integer"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("RepairId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("RepairId"); + + 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") + .WithMany("Orders") + .HasForeignKey("RepairId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Repair"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.RepairComponent", b => + { + b.HasOne("AutoWorkshopDatabaseImplement.Models.Component", "Component") + .WithMany("RepairComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair") + .WithMany("Components") + .HasForeignKey("RepairId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + 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"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Repair", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b => + { + b.Navigation("Repairs"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.cs b/AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.cs new file mode 100644 index 0000000..a4f4cc6 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Migrations/20240417061857_Shops.cs @@ -0,0 +1,185 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace AutoWorkshopDatabaseImplement.Migrations +{ + /// + public partial class Shops : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Components", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ComponentName = table.Column(type: "text", nullable: false), + Cost = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Components", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Repairs", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + RepairName = table.Column(type: "text", nullable: false), + Price = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + 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 + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + RepairId = table.Column(type: "integer", nullable: false), + Count = table.Column(type: "integer", nullable: false), + Sum = table.Column(type: "double precision", nullable: false), + Status = table.Column(type: "integer", nullable: false), + DateCreate = table.Column(type: "timestamp without time zone", nullable: false), + DateImplement = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Orders", x => x.Id); + table.ForeignKey( + name: "FK_Orders_Repairs_RepairId", + column: x => x.RepairId, + principalTable: "Repairs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "RepairComponents", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + RepairId = table.Column(type: "integer", nullable: false), + ComponentId = table.Column(type: "integer", nullable: false), + Count = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_RepairComponents", x => x.Id); + table.ForeignKey( + name: "FK_RepairComponents_Components_ComponentId", + column: x => x.ComponentId, + principalTable: "Components", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_RepairComponents_Repairs_RepairId", + column: x => x.RepairId, + principalTable: "Repairs", + principalColumn: "Id", + 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", + column: "RepairId"); + + migrationBuilder.CreateIndex( + name: "IX_RepairComponents_ComponentId", + table: "RepairComponents", + column: "ComponentId"); + + migrationBuilder.CreateIndex( + 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"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Orders"); + + 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/20240505173724_Fix Shop-Repair relationship.Designer.cs b/AutoWorkshopDatabaseImplement/Migrations/20240505173724_Fix Shop-Repair relationship.Designer.cs new file mode 100644 index 0000000..ac63286 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Migrations/20240505173724_Fix Shop-Repair relationship.Designer.cs @@ -0,0 +1,250 @@ +// +using System; +using AutoWorkshopDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace AutoWorkshopDatabaseImplement.Migrations +{ + [DbContext(typeof(AutoWorkshopDatabase))] + [Migration("20240505173724_Fix Shop-Repair relationship")] + partial class FixShopRepairrelationship + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.17") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateCreate") + .HasColumnType("timestamp without time zone"); + + b.Property("DateImplement") + .HasColumnType("timestamp without time zone"); + + b.Property("RepairId") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Sum") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.HasIndex("RepairId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Repair", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("RepairName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Repairs"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.RepairComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("integer"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("RepairId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("RepairId"); + + 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") + .WithMany("Orders") + .HasForeignKey("RepairId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Repair"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.RepairComponent", b => + { + b.HasOne("AutoWorkshopDatabaseImplement.Models.Component", "Component") + .WithMany("RepairComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair") + .WithMany("Components") + .HasForeignKey("RepairId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Repair"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.ShopRepair", b => + { + b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair") + .WithMany("Shops") + .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"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Repair", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + + b.Navigation("Shops"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b => + { + b.Navigation("Repairs"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AutoWorkshopDatabaseImplement/Migrations/20240505173724_Fix Shop-Repair relationship.cs b/AutoWorkshopDatabaseImplement/Migrations/20240505173724_Fix Shop-Repair relationship.cs new file mode 100644 index 0000000..1738a1e --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Migrations/20240505173724_Fix Shop-Repair relationship.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AutoWorkshopDatabaseImplement.Migrations +{ + /// + public partial class FixShopRepairrelationship : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/AutoWorkshopDatabaseImplement/Migrations/AutoWorkshopDatabaseModelSnapshot.cs b/AutoWorkshopDatabaseImplement/Migrations/AutoWorkshopDatabaseModelSnapshot.cs new file mode 100644 index 0000000..7dc1d54 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Migrations/AutoWorkshopDatabaseModelSnapshot.cs @@ -0,0 +1,247 @@ +// +using System; +using AutoWorkshopDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace AutoWorkshopDatabaseImplement.Migrations +{ + [DbContext(typeof(AutoWorkshopDatabase))] + partial class AutoWorkshopDatabaseModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.17") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateCreate") + .HasColumnType("timestamp without time zone"); + + b.Property("DateImplement") + .HasColumnType("timestamp without time zone"); + + b.Property("RepairId") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Sum") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.HasIndex("RepairId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Repair", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("RepairName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Repairs"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.RepairComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("integer"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("RepairId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("RepairId"); + + 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") + .WithMany("Orders") + .HasForeignKey("RepairId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Repair"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.RepairComponent", b => + { + b.HasOne("AutoWorkshopDatabaseImplement.Models.Component", "Component") + .WithMany("RepairComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair") + .WithMany("Components") + .HasForeignKey("RepairId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Repair"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.ShopRepair", b => + { + b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair") + .WithMany("Shops") + .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"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Repair", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + + b.Navigation("Shops"); + }); + + modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b => + { + b.Navigation("Repairs"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AutoWorkshopDatabaseImplement/Models/Component.cs b/AutoWorkshopDatabaseImplement/Models/Component.cs new file mode 100644 index 0000000..bc6ff06 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Models/Component.cs @@ -0,0 +1,61 @@ +using AutoWorkshopContracts.BindingModels; +using AutoWorkshopContracts.ViewModels; +using AutoWorkshopDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace AutoWorkshopDatabaseImplement.Models +{ + public class Component : IComponentModel + { + public int Id { get; private set; } + + [Required] + public string ComponentName { get; private set; } = string.Empty; + + [Required] + public double Cost { get; set; } + + [ForeignKey("ComponentId")] + public virtual List RepairComponents { get; set; } = new(); + + public static Component? Create(ComponentBindingModel Model) + { + if (Model == null) + return null; + + return new Component() + { + Id = Model.Id, + ComponentName = Model.ComponentName, + Cost = Model.Cost + }; + } + + public static Component Create(ComponentViewModel Model) + { + return new Component + { + Id = Model.Id, + ComponentName = Model.ComponentName, + Cost = Model.Cost + }; + } + + public void Update(ComponentBindingModel Model) + { + if (Model == null) + return; + + ComponentName = Model.ComponentName; + Cost = Model.Cost; + } + + public ComponentViewModel GetViewModel => new() + { + Id = Id, + ComponentName = ComponentName, + Cost = Cost + }; + } +} diff --git a/AutoWorkshopDatabaseImplement/Models/Order.cs b/AutoWorkshopDatabaseImplement/Models/Order.cs new file mode 100644 index 0000000..0a423f4 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Models/Order.cs @@ -0,0 +1,70 @@ +using AutoWorkshopContracts.BindingModels; +using AutoWorkshopContracts.ViewModels; +using AutoWorkshopDataModels.Enums; +using AutoWorkshopDataModels.Models; +using System.ComponentModel.DataAnnotations; + +namespace AutoWorkshopDatabaseImplement.Models +{ + public class Order : IOrderModel + { + public int Id { get; private set; } + + [Required] + public int RepairId { get; private set; } + + public virtual Repair Repair { get; set; } + + [Required] + public int Count { get; private set; } + + [Required] + public double Sum { get; private set; } + + [Required] + public OrderStatus Status { get; private set; } = OrderStatus.Undefined; + + [Required] + public DateTime DateCreate { get; private set; } = DateTime.Now; + + public DateTime? DateImplement { get; private set; } + + public static Order? Create(OrderBindingModel Model) + { + if (Model is null) + return null; + + return new Order() + { + Id = Model.Id, + RepairId = Model.RepairId, + Count = Model.Count, + Sum = Model.Sum, + Status = Model.Status, + DateCreate = Model.DateCreate, + DateImplement = Model.DateImplement, + }; + } + + public void Update(OrderBindingModel Model) + { + if (Model is null) + return; + + Status = Model.Status; + DateImplement = Model.DateImplement; + } + + public OrderViewModel GetViewModel => new() + { + Id = Id, + RepairId = RepairId, + RepairName = Repair.RepairName, + Count = Count, + Sum = Sum, + Status = Status, + DateCreate = DateCreate, + DateImplement = DateImplement, + }; + } +} diff --git a/AutoWorkshopDatabaseImplement/Models/Repair.cs b/AutoWorkshopDatabaseImplement/Models/Repair.cs new file mode 100644 index 0000000..b98ccb8 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Models/Repair.cs @@ -0,0 +1,109 @@ +using AutoWorkshopContracts.BindingModels; +using AutoWorkshopContracts.ViewModels; +using AutoWorkshopDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace AutoWorkshopDatabaseImplement.Models +{ + public class Repair : IRepairModel + { + public int Id { get; set; } + + [Required] + public string RepairName { get; set; } = string.Empty; + + [Required] + public double Price { get; set; } + + private Dictionary? _repairComponents = null; + + [NotMapped] + public Dictionary RepairComponents + { + get + { + if (_repairComponents == null) + { + _repairComponents = Components.ToDictionary(RepComp => RepComp.ComponentId, RepComp => + (RepComp.Component as IComponentModel, RepComp.Count)); + } + + return _repairComponents; + } + } + + [ForeignKey("RepairId")] + public virtual List Components { get; set; } = new(); + + [ForeignKey("RepairId")] + public virtual List Orders { get; set; } = new(); + + [ForeignKey("RepairId")] + public virtual List Shops { get; set; } = new(); + + public static Repair Create(AutoWorkshopDatabase Context, RepairBindingModel Model) + { + return new Repair() + { + Id = Model.Id, + RepairName = Model.RepairName, + Price = Model.Price, + Components = Model.RepairComponents.Select(x => new RepairComponent + { + Component = Context.Components.First(y => y.Id == x.Key), + Count = x.Value.Item2 + }).ToList() + }; + } + + public void Update(RepairBindingModel Model) + { + RepairName = Model.RepairName; + Price = Model.Price; + } + + public RepairViewModel GetViewModel => new() + { + Id = Id, + RepairName = RepairName, + Price = Price, + RepairComponents = RepairComponents + }; + + public void UpdateComponents(AutoWorkshopDatabase Context, RepairBindingModel Model) + { + var RepairComponents = Context.RepairComponents.Where(rec => rec.RepairId == Model.Id).ToList(); + + if (RepairComponents != null && RepairComponents.Count > 0) + { + Context.RepairComponents.RemoveRange(RepairComponents.Where(rec => !Model.RepairComponents.ContainsKey(rec.ComponentId))); + Context.SaveChanges(); + + foreach (var ComponentToUpdate in RepairComponents) + { + ComponentToUpdate.Count = Model.RepairComponents[ComponentToUpdate.ComponentId].Item2; + Model.RepairComponents.Remove(ComponentToUpdate.ComponentId); + } + + Context.SaveChanges(); + } + + var Repair = Context.Repairs.First(x => x.Id == Id); + + foreach (var RepairComponent in Model.RepairComponents) + { + Context.RepairComponents.Add(new RepairComponent + { + Repair = Repair, + Component = Context.Components.First(x => x.Id == RepairComponent.Key), + Count = RepairComponent.Value.Item2 + }); + + Context.SaveChanges(); + } + + _repairComponents = null; + } + } +} diff --git a/AutoWorkshopDatabaseImplement/Models/RepairComponent.cs b/AutoWorkshopDatabaseImplement/Models/RepairComponent.cs new file mode 100644 index 0000000..0dcfd38 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Models/RepairComponent.cs @@ -0,0 +1,22 @@ +using System.ComponentModel.DataAnnotations; + +namespace AutoWorkshopDatabaseImplement.Models +{ + public class RepairComponent + { + public int Id { get; set; } + + [Required] + public int RepairId { get; set; } + + [Required] + public int ComponentId { get; set; } + + [Required] + public int Count { get; set; } + + public virtual Component Component { get; set; } = new(); + + public virtual Repair Repair { get; set; } = new(); + } +} diff --git a/AutoWorkshopDatabaseImplement/Models/Shop.cs b/AutoWorkshopDatabaseImplement/Models/Shop.cs new file mode 100644 index 0000000..63f60b8 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Models/Shop.cs @@ -0,0 +1,131 @@ +using AutoWorkshopContracts.BindingModels; +using AutoWorkshopContracts.ViewModels; +using AutoWorkshopDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace AutoWorkshopDatabaseImplement.Models +{ + public class Shop : IShopModel + { + public int Id { get; set; } + + [Required] + public string ShopName { get; set; } = string.Empty; + + [Required] + public string Address { get; set; } = string.Empty; + + [Required] + public DateTime OpeningDate { get; set; } + + [Required] + public int RepairsMaxCount { get; set; } + + [ForeignKey("ShopId")] + public List Repairs { get; set; } = new(); + + private Dictionary? _shopRepairs = null; + + [NotMapped] + public Dictionary ShopRepairs + { + get + { + if (_shopRepairs == null) + { + if (_shopRepairs == null) + { + _shopRepairs = Repairs.ToDictionary(ShopRep => ShopRep.RepairId, ShopRep => (ShopRep.Repair as IRepairModel, ShopRep.Count)); + } + return _shopRepairs; + } + + return _shopRepairs; + } + } + + public static Shop Create(AutoWorkshopDatabase Context, ShopBindingModel Model) + { + return new Shop() + { + Id = Model.Id, + ShopName = Model.ShopName, + Address = Model.Address, + OpeningDate = Model.OpeningDate, + Repairs = Model.ShopRepairs.Select(x => new ShopRepair + { + Repair = Context.Repairs.First(y => y.Id == x.Key), + Count = x.Value.Item2 + }).ToList(), + RepairsMaxCount = Model.RepairsMaxCount + }; + } + + public void Update(ShopBindingModel Model) + { + ShopName = Model.ShopName; + Address = Model.Address; + OpeningDate = Model.OpeningDate; + RepairsMaxCount = Model.RepairsMaxCount; + } + + public ShopViewModel GetViewModel => new() + { + Id = Id, + ShopName = ShopName, + Address = Address, + OpeningDate = OpeningDate, + ShopRepairs = ShopRepairs, + RepairsMaxCount = RepairsMaxCount + }; + + public void UpdateRepairs(AutoWorkshopDatabase Context, ShopBindingModel Model) + { + var ShopRepairs = Context.ShopRepairs + .Where(rec => rec.ShopId == Model.Id) + .ToList(); + + if (ShopRepairs != null && ShopRepairs.Count > 0) + { + Context.ShopRepairs.RemoveRange(ShopRepairs.Where(rec => !Model.ShopRepairs.ContainsKey(rec.RepairId))); + Context.SaveChanges(); + + 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); + } + + Context.SaveChanges(); + } + + var Shop = Context.Shops.First(x => x.Id == Id); + + foreach (var ShopRepair in Model.ShopRepairs) + { + Context.ShopRepairs.Add(new ShopRepair + { + Shop = Shop, + Repair = Context.Repairs.First(x => x.Id == ShopRepair.Key), + Count = ShopRepair.Value.Item2 + }); + + Context.SaveChanges(); + } + + _shopRepairs = null; + } + + public void RepairsDictionatyUpdate(AutoWorkshopDatabase Context) + { + UpdateRepairs(Context, new ShopBindingModel + { + Id = Id, + ShopRepairs = ShopRepairs + }); + } + } +} diff --git a/AutoWorkshopDatabaseImplement/Models/ShopRepair.cs b/AutoWorkshopDatabaseImplement/Models/ShopRepair.cs new file mode 100644 index 0000000..2810e13 --- /dev/null +++ b/AutoWorkshopDatabaseImplement/Models/ShopRepair.cs @@ -0,0 +1,22 @@ +using System.ComponentModel.DataAnnotations; + +namespace AutoWorkshopDatabaseImplement.Models +{ + public class ShopRepair + { + public int Id { get; set; } + + [Required] + public int RepairId { get; set; } + + [Required] + public int ShopId { get; set; } + + [Required] + public int Count { get; set; } + + public virtual Shop Shop { get; set; } = new(); + + public virtual Repair Repair { get; set; } = new(); + } +} diff --git a/AutoWorkshopView/AutoWorkshopView.csproj b/AutoWorkshopView/AutoWorkshopView.csproj index be1364a..49bf415 100644 --- a/AutoWorkshopView/AutoWorkshopView.csproj +++ b/AutoWorkshopView/AutoWorkshopView.csproj @@ -10,8 +10,11 @@ - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/AutoWorkshopView/Program.cs b/AutoWorkshopView/Program.cs index d0f3589..ec849b3 100644 --- a/AutoWorkshopView/Program.cs +++ b/AutoWorkshopView/Program.cs @@ -2,7 +2,7 @@ using AutoWorkshopBusinessLogic.BusinessLogics; using AutoWorkshopContracts.BusinessLogicContracts; using AutoWorkshopContracts.BusinessLogicsContracts; using AutoWorkshopContracts.StoragesContracts; -using AutoWorkshopFileImplement.Implements; +using AutoWorkshopDatabaseImplement.Implements; using AutoWorkshopView.Forms; using AutoWorkshopView.Forms.Shop; using Microsoft.Extensions.DependencyInjection;