diff --git a/CarCenter/CarCenterContracts/BindingModels/CarBindingModel.cs b/CarCenter/CarCenterContracts/BindingModels/CarBindingModel.cs index 384066e..5304b2a 100644 --- a/CarCenter/CarCenterContracts/BindingModels/CarBindingModel.cs +++ b/CarCenter/CarCenterContracts/BindingModels/CarBindingModel.cs @@ -11,6 +11,8 @@ namespace CarCenterContracts.BindingModels public class CarBindingModel : ICarModel { public int Id { get; set; } + public int StorekeeperId { get; set; } + public int OrderId { get; set; } public CarBrand CarBrand { get; set; } = CarBrand.Неизвестно; public string Model { get; set; } = string.Empty; public CarClass CarClass { get; set; } = CarClass.Неизвестно; diff --git a/CarCenter/CarCenterContracts/BindingModels/OrderBindingModel.cs b/CarCenter/CarCenterContracts/BindingModels/OrderBindingModel.cs index 8b2bc0b..5314f5b 100644 --- a/CarCenter/CarCenterContracts/BindingModels/OrderBindingModel.cs +++ b/CarCenter/CarCenterContracts/BindingModels/OrderBindingModel.cs @@ -11,6 +11,7 @@ namespace CarCenterContracts.BindingModels public class OrderBindingModel : IOrderModel { public int Id { get; set; } + public int WorkerId { get; set; } public PaymentType PaymentType { get; set; } = PaymentType.Неизвестно; public PaymentStatus PaymentStatus { get; set; } = PaymentStatus.Неизвестно; @@ -21,6 +22,6 @@ namespace CarCenterContracts.BindingModels public double Sum { get; set; } - + public Dictionary OrderPresales { get; set; } = new(); } } diff --git a/CarCenter/CarCenterContracts/BindingModels/PresaleBindingModel.cs b/CarCenter/CarCenterContracts/BindingModels/PresaleBindingModel.cs index 8797748..7a26689 100644 --- a/CarCenter/CarCenterContracts/BindingModels/PresaleBindingModel.cs +++ b/CarCenter/CarCenterContracts/BindingModels/PresaleBindingModel.cs @@ -18,6 +18,6 @@ namespace CarCenterContracts.BindingModels public DateTime DueTill { get; set; } public double Price { get; set; } - + public Dictionary PresaleBundlings { get; set; } = new(); } } diff --git a/CarCenter/CarCenterContracts/BindingModels/RequestBindingModel.cs b/CarCenter/CarCenterContracts/BindingModels/RequestBindingModel.cs index 489770e..692580b 100644 --- a/CarCenter/CarCenterContracts/BindingModels/RequestBindingModel.cs +++ b/CarCenter/CarCenterContracts/BindingModels/RequestBindingModel.cs @@ -11,6 +11,7 @@ namespace CarCenterContracts.BindingModels public class RequestBindingModel : IRequestModel { public int Id { get; set; } + public int PresaleId { get; set; } public string Description { get; set; } = string.Empty; public RequestTypes RequestType { get; set; } = RequestTypes.Неизвестно; diff --git a/CarCenter/CarCenterContracts/ViewModels/CarViewModel.cs b/CarCenter/CarCenterContracts/ViewModels/CarViewModel.cs index 429ace7..b407cf1 100644 --- a/CarCenter/CarCenterContracts/ViewModels/CarViewModel.cs +++ b/CarCenter/CarCenterContracts/ViewModels/CarViewModel.cs @@ -12,6 +12,15 @@ namespace CarCenterContracts.ViewModels public class CarViewModel : ICarModel { public int Id { get; set; } + public int? OrderId { get; set; } + [DisplayName("ФИО покупателя")] + public string BuyerFCS { get; set; } + public int? FeatureId { get; set; } + [DisplayName("Цена особенности")] + public double FeaturePrice { get; set; } + public int StorekeeperId { get; set; } + [DisplayName("Имя работника")] + public string StorekeeperName { get; set; } = string.Empty; [DisplayName("Марка")] public CarBrand CarBrand { get; set; } [DisplayName("Модель")] diff --git a/CarCenter/CarCenterContracts/ViewModels/OrderViewModel.cs b/CarCenter/CarCenterContracts/ViewModels/OrderViewModel.cs index 19ba223..b7e83e3 100644 --- a/CarCenter/CarCenterContracts/ViewModels/OrderViewModel.cs +++ b/CarCenter/CarCenterContracts/ViewModels/OrderViewModel.cs @@ -12,6 +12,9 @@ namespace CarCenterContracts.ViewModels public class OrderViewModel : IOrderModel { public int Id { get; set; } + public int WorkerId { get; set; } + [DisplayName("Имя работника")] + public string WorkerName { get; set; } = string.Empty; [DisplayName("Тип оплаты")] public PaymentType PaymentType { get; set; } = PaymentType.Неизвестно; [DisplayName("Статус оплаты")] @@ -22,5 +25,6 @@ namespace CarCenterContracts.ViewModels public DateTime PaymentDate { get; set; } [DisplayName("Сумма")] public double Sum { get; set; } + public Dictionary OrderPresales { get; set; } = new(); } } diff --git a/CarCenter/CarCenterContracts/ViewModels/PresaleViewModel.cs b/CarCenter/CarCenterContracts/ViewModels/PresaleViewModel.cs index e9c7c56..29843d0 100644 --- a/CarCenter/CarCenterContracts/ViewModels/PresaleViewModel.cs +++ b/CarCenter/CarCenterContracts/ViewModels/PresaleViewModel.cs @@ -20,5 +20,6 @@ namespace CarCenterContracts.ViewModels public DateTime DueTill { get; set; } [DisplayName("Цена")] public double Price { get; set; } + public Dictionary PresaleBundlings { get; set; } = new(); } } diff --git a/CarCenter/CarCenterContracts/ViewModels/RequestViewModel.cs b/CarCenter/CarCenterContracts/ViewModels/RequestViewModel.cs index ed27dbb..ec55682 100644 --- a/CarCenter/CarCenterContracts/ViewModels/RequestViewModel.cs +++ b/CarCenter/CarCenterContracts/ViewModels/RequestViewModel.cs @@ -12,7 +12,10 @@ namespace CarCenterContracts.ViewModels public class RequestViewModel : IRequestModel { public int Id { get; set; } - [DisplayName("Описание")] + public int PresaleId { get; set; } + [DisplayName("Описание работы")] + public string PresaleDescription { get; set; } = string.Empty; + [DisplayName("Описание пожелания")] public string Description { get; set; } = string.Empty; [DisplayName("Тип пожелания")] public RequestTypes RequestType { get; set; } = RequestTypes.Неизвестно; diff --git a/CarCenter/CarCenterDataModels/CarCenterDataModels.csproj b/CarCenter/CarCenterDataModels/CarCenterDataModels.csproj index 132c02c..85b0783 100644 --- a/CarCenter/CarCenterDataModels/CarCenterDataModels.csproj +++ b/CarCenter/CarCenterDataModels/CarCenterDataModels.csproj @@ -6,4 +6,11 @@ enable + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/CarCenter/CarCenterDataModels/Models/IOrderModel.cs b/CarCenter/CarCenterDataModels/Models/IOrderModel.cs index d759a28..cfcf4b6 100644 --- a/CarCenter/CarCenterDataModels/Models/IOrderModel.cs +++ b/CarCenter/CarCenterDataModels/Models/IOrderModel.cs @@ -19,5 +19,7 @@ namespace CarCenterDataModels.Models double Sum { get; } + Dictionary OrderPresales { get; } + } } diff --git a/CarCenter/CarCenterDataModels/Models/IPresaleModel.cs b/CarCenter/CarCenterDataModels/Models/IPresaleModel.cs index 49d8b3a..6d59bf9 100644 --- a/CarCenter/CarCenterDataModels/Models/IPresaleModel.cs +++ b/CarCenter/CarCenterDataModels/Models/IPresaleModel.cs @@ -17,5 +17,6 @@ namespace CarCenterDataModels.Models double Price { get; } + Dictionary PresaleBundlings { get; } } } diff --git a/CarCenter/CarCenterDatabaseImplement/CarCenterDatabase.cs b/CarCenter/CarCenterDatabaseImplement/CarCenterDatabase.cs index 040ca9d..a5ba287 100644 --- a/CarCenter/CarCenterDatabaseImplement/CarCenterDatabase.cs +++ b/CarCenter/CarCenterDatabaseImplement/CarCenterDatabase.cs @@ -1,4 +1,5 @@ -using Microsoft.EntityFrameworkCore; +using CarCenterDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; @@ -19,6 +20,16 @@ namespace CarCenterDatabaseImplement AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true); } - + public virtual DbSet Orders { set; get; } + public virtual DbSet Presales { set; get; } + public virtual DbSet OrderPresales { set; get; } + public virtual DbSet Workers { set; get; } + public virtual DbSet Storekeepers { set; get; } + public virtual DbSet Cars { set; get; } + public virtual DbSet Requests { set; get; } + public virtual DbSet Features { set; get; } + public virtual DbSet Bundlings { set; get; } + public virtual DbSet CarBundlings { set; get; } + public virtual DbSet PresaleBundlings { set; get; } } } diff --git a/CarCenter/CarCenterDatabaseImplement/CarCenterDatabaseImplement.csproj b/CarCenter/CarCenterDatabaseImplement/CarCenterDatabaseImplement.csproj index 16d1806..77878fd 100644 --- a/CarCenter/CarCenterDatabaseImplement/CarCenterDatabaseImplement.csproj +++ b/CarCenter/CarCenterDatabaseImplement/CarCenterDatabaseImplement.csproj @@ -6,11 +6,6 @@ enable - - - - - diff --git a/CarCenter/CarCenterDatabaseImplement/Implements/BundlingStorage.cs b/CarCenter/CarCenterDatabaseImplement/Implements/BundlingStorage.cs new file mode 100644 index 0000000..4dd628b --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Implements/BundlingStorage.cs @@ -0,0 +1,91 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using CarCenterDatabaseImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Implements +{ + public class BundlingStorage : IBundlingStorage + { + public List GetFullList() + { + using var context = new CarCenterDatabase(); + return context.Bundlings + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(BundlingSearchModel model) + { + using var context = new CarCenterDatabase(); + if (model.Id.HasValue) + { + return context.Bundlings + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + public BundlingViewModel? GetElement(BundlingSearchModel model) + { + using var context = new CarCenterDatabase(); + if (!model.Id.HasValue) + { + return null; + } + return context.Bundlings + .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) + ?.GetViewModel; + } + public BundlingViewModel? Insert(BundlingBindingModel model) + { + using var context = new CarCenterDatabase(); + var newBundling = Bundling.Create(model); + if (newBundling == null) + { + return null; + } + context.Bundlings.Add(newBundling); + context.SaveChanges(); + return context.Bundlings + .FirstOrDefault(x => x.Id == newBundling.Id) + ?.GetViewModel; + } + public BundlingViewModel? Update(BundlingBindingModel model) + { + using var context = new CarCenterDatabase(); + var order = context.Bundlings.FirstOrDefault(x => x.Id == model.Id); + if (order == null) + { + return null; + } + order.Update(model); + context.SaveChanges(); + return context.Bundlings + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + } + public BundlingViewModel? Delete(BundlingBindingModel model) + { + using var context = new CarCenterDatabase(); + var element = context.Bundlings + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + var deletedElement = context.Bundlings + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + context.Bundlings.Remove(element); + context.SaveChanges(); + return deletedElement; + } + return null; + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Implements/CarStorage.cs b/CarCenter/CarCenterDatabaseImplement/Implements/CarStorage.cs new file mode 100644 index 0000000..906e52b --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Implements/CarStorage.cs @@ -0,0 +1,122 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using CarCenterDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Implements +{ + public class CarStorage : ICarStorage + { + public List GetFullList() + { + using var context = new CarCenterDatabase(); + return context.Cars + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .Include(x => x.Feature) + .Include(x => x.Order) + .Include(x => x.Storekeeper) + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(CarSearchModel model) + { + using var context = new CarCenterDatabase(); + if (model.Id.HasValue) + { + return context.Cars + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .Include(x => x.Feature) + .Include(x => x.Order) + .Include(x => x.Storekeeper) + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + public CarViewModel? GetElement(CarSearchModel model) + { + using var context = new CarCenterDatabase(); + if (!model.Id.HasValue) + { + return null; + } + return context.Cars + .Include(x => x.Bundlings) // здесь эксперименты)) + .ThenInclude(x => x.Bundling) + .Include(x => x.Feature) + .Include(x => x.Order) + .Include(x => x.Storekeeper) + .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) + ?.GetViewModel; + } + public CarViewModel? Insert(CarBindingModel model) + { + using var context = new CarCenterDatabase(); + var newCar = Car.Create(context, model); + if (newCar == null) + { + return null; + } + context.Cars.Add(newCar); + context.SaveChanges(); + return context.Cars + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .Include(x => x.Feature) + .Include(x => x.Order) + .Include(x => x.Storekeeper) + .FirstOrDefault(x => x.Id == newCar.Id) + ?.GetViewModel; + } + public CarViewModel? Update(CarBindingModel model) + { + using var context = new CarCenterDatabase(); + var car = context.Cars.FirstOrDefault(x => x.Id == model.Id); + if (car == null) + { + return null; + } + car.Update(model); + context.SaveChanges(); + return context.Cars + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .Include(x => x.Feature) + .Include(x => x.Order) + .Include(x => x.Storekeeper) + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + } + public CarViewModel? Delete(CarBindingModel model) + { + using var context = new CarCenterDatabase(); + var element = context.Cars + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + var deletedElement = context.Cars + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .Include(x => x.Feature) + .Include(x => x.Order) + .Include(x => x.Storekeeper) + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + context.Cars.Remove(element); + context.SaveChanges(); + return deletedElement; + } + return null; + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Implements/FeatureStorage.cs b/CarCenter/CarCenterDatabaseImplement/Implements/FeatureStorage.cs new file mode 100644 index 0000000..01b24b0 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Implements/FeatureStorage.cs @@ -0,0 +1,92 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using CarCenterDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Implements +{ + public class FeatureStorage : IFeatureStorage + { + public List GetFullList() + { + using var context = new CarCenterDatabase(); + return context.Features + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(FeatureSearchModel model) + { + using var context = new CarCenterDatabase(); + if (model.Id.HasValue) + { + return context.Features + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + public FeatureViewModel? GetElement(FeatureSearchModel model) + { + using var context = new CarCenterDatabase(); + if (!model.Id.HasValue) + { + return null; + } + return context.Features + .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) + ?.GetViewModel; + } + public FeatureViewModel? Insert(FeatureBindingModel model) + { + using var context = new CarCenterDatabase(); + var newFeature = Feature.Create(model); + if (newFeature == null) + { + return null; + } + context.Features.Add(newFeature); + context.SaveChanges(); + return context.Features + .FirstOrDefault(x => x.Id == newFeature.Id) + ?.GetViewModel; + } + public FeatureViewModel? Update(FeatureBindingModel model) + { + using var context = new CarCenterDatabase(); + var order = context.Features.FirstOrDefault(x => x.Id == model.Id); + if (order == null) + { + return null; + } + order.Update(model); + context.SaveChanges(); + return context.Features + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + } + public FeatureViewModel? Delete(FeatureBindingModel model) + { + using var context = new CarCenterDatabase(); + var element = context.Features + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + var deletedElement = context.Features + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + context.Features.Remove(element); + context.SaveChanges(); + return deletedElement; + } + return null; + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Implements/OrderStorage.cs b/CarCenter/CarCenterDatabaseImplement/Implements/OrderStorage.cs new file mode 100644 index 0000000..4ac9c04 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Implements/OrderStorage.cs @@ -0,0 +1,115 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using CarCenterDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Implements +{ + public class OrderStorage : IOrderStorage + { + public OrderViewModel? Delete(OrderBindingModel model) + { + using var context = new CarCenterDatabase(); + var element = context.Orders + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + var deletedElement = context.Orders + .Include(x => x.Worker) + .Include(x => x.Presales) + .ThenInclude(x => x.Presale) + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + context.Orders.Remove(element); + context.SaveChanges(); + return deletedElement; + } + return null; + } + + public OrderViewModel? GetElement(OrderSearchModel model) + { + using var context = new CarCenterDatabase(); + if (!model.Id.HasValue) + { + return null; + } + return context.Orders + .Include(x => x.Worker) //рубрика ЭЭЭЭЭЭЭЭЭКсперименты + .Include(x => x.Presales) + .ThenInclude(x => x.Presale) + .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) + ?.GetViewModel; + } + + public List GetFilteredList(OrderSearchModel model) + { + using var context = new CarCenterDatabase(); + if (model.Id.HasValue) + { + return context.Orders + .Include(x => x.Worker) + .Include(x => x.Presales) + .ThenInclude(x => x.Presale) + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + + public List GetFullList() + { + using var context = new CarCenterDatabase(); + return context.Orders + .Include(x => x.Worker) + .Include(x => x.Presales) + .ThenInclude(x => x.Presale) + .Select(x => x.GetViewModel) + .ToList(); + } + + public OrderViewModel? Insert(OrderBindingModel model) + { + using var context = new CarCenterDatabase(); + var newOrder = Order.Create(context,model); + if (newOrder == null) + { + return null; + } + context.Orders.Add(newOrder); + context.SaveChanges(); + return context.Orders + .Include(x => x.Worker) + .Include(x => x.Presales) + .ThenInclude(x => x.Presale) + .FirstOrDefault(x => x.Id == newOrder.Id) + ?.GetViewModel; + } + + public OrderViewModel? Update(OrderBindingModel model) + { + using var context = new CarCenterDatabase(); + 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.Worker) + .Include(x => x.Presales) + .ThenInclude(x => x.Presale) + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Implements/PresaleStorage.cs b/CarCenter/CarCenterDatabaseImplement/Implements/PresaleStorage.cs new file mode 100644 index 0000000..eb7abe1 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Implements/PresaleStorage.cs @@ -0,0 +1,109 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using CarCenterDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Implements +{ + public class PresaleStorage : IPresaleStorage + { + public PresaleViewModel? Delete(PresaleBindingModel model) + { + using var context = new CarCenterDatabase(); + var element = context.Presales + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + var deletedElement = context.Presales + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + context.Presales.Remove(element); + context.SaveChanges(); + return deletedElement; + } + return null; + } + + public PresaleViewModel? GetElement(PresaleSearchModel model) + { + using var context = new CarCenterDatabase(); + if (!model.Id.HasValue) + { + return null; + } + return context.Presales + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) + ?.GetViewModel; + } + + public List GetFilteredList(PresaleSearchModel model) + { + using var context = new CarCenterDatabase(); + if (model.Id.HasValue) + { + return context.Presales + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + + public List GetFullList() + { + using var context = new CarCenterDatabase(); + return context.Presales + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .Select(x => x.GetViewModel) + .ToList(); + } + + public PresaleViewModel? Insert(PresaleBindingModel model) + { + using var context = new CarCenterDatabase(); + var newPresale = Presale.Create(context, model); + if (newPresale == null) + { + return null; + } + context.Presales.Add(newPresale); + context.SaveChanges(); + return context.Presales + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .FirstOrDefault(x => x.Id == newPresale.Id) + ?.GetViewModel; + } + + public PresaleViewModel? Update(PresaleBindingModel model) + { + using var context = new CarCenterDatabase(); + var order = context.Presales.FirstOrDefault(x => x.Id == model.Id); + if (order == null) + { + return null; + } + order.Update(model); + context.SaveChanges(); + return context.Presales + .Include(x => x.Bundlings) + .ThenInclude(x => x.Bundling) + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Implements/RequestStorage.cs b/CarCenter/CarCenterDatabaseImplement/Implements/RequestStorage.cs new file mode 100644 index 0000000..153bdb5 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Implements/RequestStorage.cs @@ -0,0 +1,103 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using CarCenterDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Implements +{ + public class RequestStorage : IRequestStorage + { + public RequestViewModel? Delete(RequestBindingModel model) + { + using var context = new CarCenterDatabase(); + var element = context.Requests + .FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + var deletedElement = context.Requests + .Include(x => x.Presale) + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + context.Requests.Remove(element); + context.SaveChanges(); + return deletedElement; + } + return null; + } + + public RequestViewModel? GetElement(RequestSearchModel model) + { + using var context = new CarCenterDatabase(); + if (!model.Id.HasValue) + { + return null; + } + return context.Requests + .Include(x => x.Presale) + .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) + ?.GetViewModel; + } + + public List GetFilteredList(RequestSearchModel model) + { + using var context = new CarCenterDatabase(); + if (model.Id.HasValue) + { + return context.Requests + .Include(x => x.Presale) + .Where(x => x.Id == model.Id) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + + public List GetFullList() + { + using var context = new CarCenterDatabase(); + return context.Requests + .Include(x => x.Presale) + .Select(x => x.GetViewModel) + .ToList(); + } + + public RequestViewModel? Insert(RequestBindingModel model) + { + using var context = new CarCenterDatabase(); + var newRequest = Request.Create(model); + if (newRequest == null) + { + return null; + } + context.Requests.Add(newRequest); + context.SaveChanges(); + return context.Requests + .Include(x => x.Presale) + .FirstOrDefault(x => x.Id == newRequest.Id) + ?.GetViewModel; + } + + public RequestViewModel? Update(RequestBindingModel model) + { + using var context = new CarCenterDatabase(); + var order = context.Requests.FirstOrDefault(x => x.Id == model.Id); + if (order == null) + { + return null; + } + order.Update(model); + context.SaveChanges(); + return context.Requests + .Include(x => x.Presale) + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Implements/StorekeeperStorage.cs b/CarCenter/CarCenterDatabaseImplement/Implements/StorekeeperStorage.cs new file mode 100644 index 0000000..829a214 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Implements/StorekeeperStorage.cs @@ -0,0 +1,99 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using CarCenterDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Implements +{ + public class StorekeeperStorage : IStorekeeperStorage + { + public List GetFullList() + { + using var context = new CarCenterDatabase(); + + return context.Storekeepers + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(StorekeeperSearchModel model) + { + if (model == null) + { + return new(); + } + + if (model.Id.HasValue) + { + var res = GetElement(model); + + return res != null ? new() { res } : new(); + } + return new(); + } + + public StorekeeperViewModel? GetElement(StorekeeperSearchModel model) + { + using var context = new CarCenterDatabase(); + + if (model.Id.HasValue) + return context.Storekeepers + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + return null; + } + + + public StorekeeperViewModel? Delete(StorekeeperBindingModel model) + { + using var context = new CarCenterDatabase(); + + var res = context.Storekeepers + .FirstOrDefault(x => x.Id == model.Id); + + if (res != null) + { + context.Storekeepers.Remove(res); + context.SaveChanges(); + } + + return res?.GetViewModel; + } + + public StorekeeperViewModel? Insert(StorekeeperBindingModel model) + { + using var context = new CarCenterDatabase(); + + var res = Storekeeper.Create(model); + + if (res != null) + { + context.Storekeepers.Add(res); + context.SaveChanges(); + } + + return res?.GetViewModel; + } + + public StorekeeperViewModel? Update(StorekeeperBindingModel model) + { + using var context = new CarCenterDatabase(); + + var res = context.Storekeepers.FirstOrDefault(x => x.Id == model.Id); + + if (res != null) + { + res.Update(model); + context.SaveChanges(); + } + + return res?.GetViewModel; + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Implements/WorkerStorage.cs b/CarCenter/CarCenterDatabaseImplement/Implements/WorkerStorage.cs new file mode 100644 index 0000000..047618b --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Implements/WorkerStorage.cs @@ -0,0 +1,99 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.SearchModels; +using CarCenterContracts.StoragesContracts; +using CarCenterContracts.ViewModels; +using CarCenterDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Implements +{ + public class WorkerStorage : IWorkerStorage + { + public List GetFullList() + { + using var context = new CarCenterDatabase(); + + return context.Workers + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(WorkerSearchModel model) + { + if (model == null) + { + return new(); + } + + if (model.Id.HasValue) + { + var res = GetElement(model); + + return res != null ? new() { res } : new(); + } + return new(); + } + + public WorkerViewModel? GetElement(WorkerSearchModel model) + { + using var context = new CarCenterDatabase(); + + if (model.Id.HasValue) + return context.Workers + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + return null; + } + + + public WorkerViewModel? Delete(WorkerBindingModel model) + { + using var context = new CarCenterDatabase(); + + var res = context.Workers + .FirstOrDefault(x => x.Id == model.Id); + + if (res != null) + { + context.Workers.Remove(res); + context.SaveChanges(); + } + + return res?.GetViewModel; + } + + public WorkerViewModel? Insert(WorkerBindingModel model) + { + using var context = new CarCenterDatabase(); + + var res = Worker.Create(model); + + if (res != null) + { + context.Workers.Add(res); + context.SaveChanges(); + } + + return res?.GetViewModel; + } + + public WorkerViewModel? Update(WorkerBindingModel model) + { + using var context = new CarCenterDatabase(); + + var res = context.Workers.FirstOrDefault(x => x.Id == model.Id); + + if (res != null) + { + res.Update(model); + context.SaveChanges(); + } + + return res?.GetViewModel; + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Migrations/20240428140324_InitialCreate.Designer.cs b/CarCenter/CarCenterDatabaseImplement/Migrations/20240428140324_InitialCreate.Designer.cs new file mode 100644 index 0000000..31c6b46 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Migrations/20240428140324_InitialCreate.Designer.cs @@ -0,0 +1,501 @@ +// +using System; +using CarCenterDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CarCenterDatabaseImplement.Migrations +{ + [DbContext(typeof(CarCenterDatabase))] + [Migration("20240428140324_InitialCreate")] + partial class InitialCreate + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.29") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Bundling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EquipmentPackage") + .HasColumnType("integer"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("TirePackage") + .HasColumnType("integer"); + + b.Property("ToolKit") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Bundlings"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Car", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CarBrand") + .HasColumnType("integer"); + + b.Property("CarClass") + .HasColumnType("integer"); + + b.Property("FeatureID") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("Model") + .IsRequired() + .HasColumnType("text"); + + b.Property("OrderId") + .HasColumnType("integer"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("StorekeeperId") + .HasColumnType("integer"); + + b.Property("VINnumber") + .HasColumnType("bigint"); + + b.Property("Year") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.HasIndex("OrderId"); + + b.HasIndex("StorekeeperId"); + + b.ToTable("Cars"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.CarBundling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BundlingId") + .HasColumnType("integer"); + + b.Property("CarId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("BundlingId"); + + b.HasIndex("CarId"); + + b.ToTable("CarBundlings"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CabinColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("DriveType") + .HasColumnType("integer"); + + b.Property("HelpDevice") + .HasColumnType("integer"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Features"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BuyerFCS") + .IsRequired() + .HasColumnType("text"); + + b.Property("PaymentDate") + .HasColumnType("timestamp without time zone"); + + b.Property("PaymentStatus") + .HasColumnType("integer"); + + b.Property("PaymentType") + .HasColumnType("integer"); + + b.Property("Sum") + .HasColumnType("double precision"); + + b.Property("WorkerId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("WorkerId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.OrderPresale", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("OrderId") + .HasColumnType("integer"); + + b.Property("PresaleId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("OrderId"); + + b.HasIndex("PresaleId"); + + b.ToTable("OrderPresales"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Presale", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("DueTill") + .HasColumnType("timestamp without time zone"); + + b.Property("PresaleStatus") + .HasColumnType("integer"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Presales"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.PresaleBundling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BundlingId") + .HasColumnType("integer"); + + b.Property("PresaleId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("BundlingId"); + + b.HasIndex("PresaleId"); + + b.ToTable("PresaleBundlings"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Request", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("PresaleId") + .HasColumnType("integer"); + + b.Property("RequestType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PresaleId"); + + b.ToTable("Requests"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Storekeeper", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Patronymic") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("bigint"); + + b.Property("Surname") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Storekeepers"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Worker", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Patronymic") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("bigint"); + + b.Property("Surname") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Workers"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Car", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Feature", "Feature") + .WithMany("Cars") + .HasForeignKey("FeatureId"); + + b.HasOne("CarCenterDatabaseImplement.Models.Order", "Order") + .WithMany("Cars") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CarCenterDatabaseImplement.Models.Storekeeper", "Storekeeper") + .WithMany("Cars") + .HasForeignKey("StorekeeperId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + + b.Navigation("Order"); + + b.Navigation("Storekeeper"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.CarBundling", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Bundling", "Bundling") + .WithMany("CarBundling") + .HasForeignKey("BundlingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CarCenterDatabaseImplement.Models.Car", "Car") + .WithMany("Bundlings") + .HasForeignKey("CarId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bundling"); + + b.Navigation("Car"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Order", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Worker", "Worker") + .WithMany("Orders") + .HasForeignKey("WorkerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Worker"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.OrderPresale", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Order", "Order") + .WithMany("Presales") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CarCenterDatabaseImplement.Models.Presale", "Presale") + .WithMany("OrderPresales") + .HasForeignKey("PresaleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Order"); + + b.Navigation("Presale"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.PresaleBundling", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Bundling", "Bundling") + .WithMany("PresaleBundling") + .HasForeignKey("BundlingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CarCenterDatabaseImplement.Models.Presale", "Presale") + .WithMany("Bundlings") + .HasForeignKey("PresaleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bundling"); + + b.Navigation("Presale"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Request", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Presale", "Presale") + .WithMany("Requests") + .HasForeignKey("PresaleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Presale"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Bundling", b => + { + b.Navigation("CarBundling"); + + b.Navigation("PresaleBundling"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Car", b => + { + b.Navigation("Bundlings"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Feature", b => + { + b.Navigation("Cars"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Order", b => + { + b.Navigation("Cars"); + + b.Navigation("Presales"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Presale", b => + { + b.Navigation("Bundlings"); + + b.Navigation("OrderPresales"); + + b.Navigation("Requests"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Storekeeper", b => + { + b.Navigation("Cars"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Worker", b => + { + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Migrations/20240428140324_InitialCreate.cs b/CarCenter/CarCenterDatabaseImplement/Migrations/20240428140324_InitialCreate.cs new file mode 100644 index 0000000..00e7294 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Migrations/20240428140324_InitialCreate.cs @@ -0,0 +1,351 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CarCenterDatabaseImplement.Migrations +{ + public partial class InitialCreate : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Bundlings", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + EquipmentPackage = table.Column(type: "integer", nullable: false), + TirePackage = table.Column(type: "integer", nullable: false), + ToolKit = table.Column(type: "integer", nullable: false), + Price = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Bundlings", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Features", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + HelpDevice = table.Column(type: "integer", nullable: false), + CabinColor = table.Column(type: "text", nullable: false), + DriveType = table.Column(type: "integer", nullable: false), + Price = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Features", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Presales", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + PresaleStatus = table.Column(type: "integer", nullable: false), + Description = table.Column(type: "text", nullable: false), + DueTill = table.Column(type: "timestamp without time zone", nullable: false), + Price = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Presales", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Storekeepers", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + Surname = table.Column(type: "text", nullable: false), + Patronymic = table.Column(type: "text", nullable: true), + Password = table.Column(type: "text", nullable: false), + Email = table.Column(type: "text", nullable: false), + PhoneNumber = table.Column(type: "bigint", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Storekeepers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Workers", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + Surname = table.Column(type: "text", nullable: false), + Patronymic = table.Column(type: "text", nullable: true), + Password = table.Column(type: "text", nullable: false), + Email = table.Column(type: "text", nullable: false), + PhoneNumber = table.Column(type: "bigint", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Workers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "PresaleBundlings", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + PresaleId = table.Column(type: "integer", nullable: false), + BundlingId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_PresaleBundlings", x => x.Id); + table.ForeignKey( + name: "FK_PresaleBundlings_Bundlings_BundlingId", + column: x => x.BundlingId, + principalTable: "Bundlings", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PresaleBundlings_Presales_PresaleId", + column: x => x.PresaleId, + principalTable: "Presales", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Requests", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + PresaleId = table.Column(type: "integer", nullable: false), + Description = table.Column(type: "text", nullable: false), + RequestType = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Requests", x => x.Id); + table.ForeignKey( + name: "FK_Requests_Presales_PresaleId", + column: x => x.PresaleId, + principalTable: "Presales", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Orders", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + WorkerId = table.Column(type: "integer", nullable: false), + PaymentType = table.Column(type: "integer", nullable: false), + PaymentStatus = table.Column(type: "integer", nullable: false), + BuyerFCS = table.Column(type: "text", nullable: false), + PaymentDate = table.Column(type: "timestamp without time zone", nullable: false), + Sum = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Orders", x => x.Id); + table.ForeignKey( + name: "FK_Orders_Workers_WorkerId", + column: x => x.WorkerId, + principalTable: "Workers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Cars", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + StorekeeperId = table.Column(type: "integer", nullable: false), + OrderId = table.Column(type: "integer", nullable: false), + FeatureId = table.Column(type: "integer", nullable: true), + CarBrand = table.Column(type: "integer", nullable: false), + Model = table.Column(type: "text", nullable: false), + CarClass = table.Column(type: "integer", nullable: false), + Year = table.Column(type: "integer", nullable: false), + Price = table.Column(type: "double precision", nullable: false), + VINnumber = table.Column(type: "bigint", nullable: false), + FeatureID = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Cars", x => x.Id); + table.ForeignKey( + name: "FK_Cars_Features_FeatureId", + column: x => x.FeatureId, + principalTable: "Features", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_Cars_Orders_OrderId", + column: x => x.OrderId, + principalTable: "Orders", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Cars_Storekeepers_StorekeeperId", + column: x => x.StorekeeperId, + principalTable: "Storekeepers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "OrderPresales", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + OrderId = table.Column(type: "integer", nullable: false), + PresaleId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_OrderPresales", x => x.Id); + table.ForeignKey( + name: "FK_OrderPresales_Orders_OrderId", + column: x => x.OrderId, + principalTable: "Orders", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_OrderPresales_Presales_PresaleId", + column: x => x.PresaleId, + principalTable: "Presales", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "CarBundlings", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + CarId = table.Column(type: "integer", nullable: false), + BundlingId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CarBundlings", x => x.Id); + table.ForeignKey( + name: "FK_CarBundlings_Bundlings_BundlingId", + column: x => x.BundlingId, + principalTable: "Bundlings", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CarBundlings_Cars_CarId", + column: x => x.CarId, + principalTable: "Cars", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_CarBundlings_BundlingId", + table: "CarBundlings", + column: "BundlingId"); + + migrationBuilder.CreateIndex( + name: "IX_CarBundlings_CarId", + table: "CarBundlings", + column: "CarId"); + + migrationBuilder.CreateIndex( + name: "IX_Cars_FeatureId", + table: "Cars", + column: "FeatureId"); + + migrationBuilder.CreateIndex( + name: "IX_Cars_OrderId", + table: "Cars", + column: "OrderId"); + + migrationBuilder.CreateIndex( + name: "IX_Cars_StorekeeperId", + table: "Cars", + column: "StorekeeperId"); + + migrationBuilder.CreateIndex( + name: "IX_OrderPresales_OrderId", + table: "OrderPresales", + column: "OrderId"); + + migrationBuilder.CreateIndex( + name: "IX_OrderPresales_PresaleId", + table: "OrderPresales", + column: "PresaleId"); + + migrationBuilder.CreateIndex( + name: "IX_Orders_WorkerId", + table: "Orders", + column: "WorkerId"); + + migrationBuilder.CreateIndex( + name: "IX_PresaleBundlings_BundlingId", + table: "PresaleBundlings", + column: "BundlingId"); + + migrationBuilder.CreateIndex( + name: "IX_PresaleBundlings_PresaleId", + table: "PresaleBundlings", + column: "PresaleId"); + + migrationBuilder.CreateIndex( + name: "IX_Requests_PresaleId", + table: "Requests", + column: "PresaleId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CarBundlings"); + + migrationBuilder.DropTable( + name: "OrderPresales"); + + migrationBuilder.DropTable( + name: "PresaleBundlings"); + + migrationBuilder.DropTable( + name: "Requests"); + + migrationBuilder.DropTable( + name: "Cars"); + + migrationBuilder.DropTable( + name: "Bundlings"); + + migrationBuilder.DropTable( + name: "Presales"); + + migrationBuilder.DropTable( + name: "Features"); + + migrationBuilder.DropTable( + name: "Orders"); + + migrationBuilder.DropTable( + name: "Storekeepers"); + + migrationBuilder.DropTable( + name: "Workers"); + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Migrations/CarCenterDatabaseModelSnapshot.cs b/CarCenter/CarCenterDatabaseImplement/Migrations/CarCenterDatabaseModelSnapshot.cs new file mode 100644 index 0000000..ec96439 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Migrations/CarCenterDatabaseModelSnapshot.cs @@ -0,0 +1,499 @@ +// +using System; +using CarCenterDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CarCenterDatabaseImplement.Migrations +{ + [DbContext(typeof(CarCenterDatabase))] + partial class CarCenterDatabaseModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.29") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Bundling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EquipmentPackage") + .HasColumnType("integer"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("TirePackage") + .HasColumnType("integer"); + + b.Property("ToolKit") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Bundlings"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Car", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CarBrand") + .HasColumnType("integer"); + + b.Property("CarClass") + .HasColumnType("integer"); + + b.Property("FeatureID") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("Model") + .IsRequired() + .HasColumnType("text"); + + b.Property("OrderId") + .HasColumnType("integer"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("StorekeeperId") + .HasColumnType("integer"); + + b.Property("VINnumber") + .HasColumnType("bigint"); + + b.Property("Year") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.HasIndex("OrderId"); + + b.HasIndex("StorekeeperId"); + + b.ToTable("Cars"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.CarBundling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BundlingId") + .HasColumnType("integer"); + + b.Property("CarId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("BundlingId"); + + b.HasIndex("CarId"); + + b.ToTable("CarBundlings"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CabinColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("DriveType") + .HasColumnType("integer"); + + b.Property("HelpDevice") + .HasColumnType("integer"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Features"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BuyerFCS") + .IsRequired() + .HasColumnType("text"); + + b.Property("PaymentDate") + .HasColumnType("timestamp without time zone"); + + b.Property("PaymentStatus") + .HasColumnType("integer"); + + b.Property("PaymentType") + .HasColumnType("integer"); + + b.Property("Sum") + .HasColumnType("double precision"); + + b.Property("WorkerId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("WorkerId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.OrderPresale", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("OrderId") + .HasColumnType("integer"); + + b.Property("PresaleId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("OrderId"); + + b.HasIndex("PresaleId"); + + b.ToTable("OrderPresales"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Presale", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("DueTill") + .HasColumnType("timestamp without time zone"); + + b.Property("PresaleStatus") + .HasColumnType("integer"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Presales"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.PresaleBundling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BundlingId") + .HasColumnType("integer"); + + b.Property("PresaleId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("BundlingId"); + + b.HasIndex("PresaleId"); + + b.ToTable("PresaleBundlings"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Request", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("PresaleId") + .HasColumnType("integer"); + + b.Property("RequestType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PresaleId"); + + b.ToTable("Requests"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Storekeeper", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Patronymic") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("bigint"); + + b.Property("Surname") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Storekeepers"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Worker", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Patronymic") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("bigint"); + + b.Property("Surname") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Workers"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Car", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Feature", "Feature") + .WithMany("Cars") + .HasForeignKey("FeatureId"); + + b.HasOne("CarCenterDatabaseImplement.Models.Order", "Order") + .WithMany("Cars") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CarCenterDatabaseImplement.Models.Storekeeper", "Storekeeper") + .WithMany("Cars") + .HasForeignKey("StorekeeperId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + + b.Navigation("Order"); + + b.Navigation("Storekeeper"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.CarBundling", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Bundling", "Bundling") + .WithMany("CarBundling") + .HasForeignKey("BundlingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CarCenterDatabaseImplement.Models.Car", "Car") + .WithMany("Bundlings") + .HasForeignKey("CarId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bundling"); + + b.Navigation("Car"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Order", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Worker", "Worker") + .WithMany("Orders") + .HasForeignKey("WorkerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Worker"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.OrderPresale", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Order", "Order") + .WithMany("Presales") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CarCenterDatabaseImplement.Models.Presale", "Presale") + .WithMany("OrderPresales") + .HasForeignKey("PresaleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Order"); + + b.Navigation("Presale"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.PresaleBundling", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Bundling", "Bundling") + .WithMany("PresaleBundling") + .HasForeignKey("BundlingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CarCenterDatabaseImplement.Models.Presale", "Presale") + .WithMany("Bundlings") + .HasForeignKey("PresaleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bundling"); + + b.Navigation("Presale"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Request", b => + { + b.HasOne("CarCenterDatabaseImplement.Models.Presale", "Presale") + .WithMany("Requests") + .HasForeignKey("PresaleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Presale"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Bundling", b => + { + b.Navigation("CarBundling"); + + b.Navigation("PresaleBundling"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Car", b => + { + b.Navigation("Bundlings"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Feature", b => + { + b.Navigation("Cars"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Order", b => + { + b.Navigation("Cars"); + + b.Navigation("Presales"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Presale", b => + { + b.Navigation("Bundlings"); + + b.Navigation("OrderPresales"); + + b.Navigation("Requests"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Storekeeper", b => + { + b.Navigation("Cars"); + }); + + modelBuilder.Entity("CarCenterDatabaseImplement.Models.Worker", b => + { + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/Bundling.cs b/CarCenter/CarCenterDatabaseImplement/Models/Bundling.cs new file mode 100644 index 0000000..a44931e --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/Bundling.cs @@ -0,0 +1,77 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.ViewModels; +using CarCenterDataModels.Enums; +using CarCenterDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Models +{ + public class Bundling : IBundlingModel + { + public int Id { get; private set; } + [Required] + public EquipmentPackage EquipmentPackage { get; set; } = EquipmentPackage.Неизвестно; + [Required] + public TirePackage TirePackage { get; set; } = TirePackage.Неизвестно; + [Required] + public ToolKit ToolKit { get; set; } = ToolKit.Неизвестно; + [Required] + public double Price { get; set; } + [ForeignKey("BundlingId")] + public virtual List CarBundling { get; set; } = new(); + [ForeignKey("BundlingId")] + public virtual List PresaleBundling { get; set; } = new(); + public static Bundling? Create(BundlingBindingModel model) + { + if (model == null) + { + return null; + } + return new Bundling() + { + Id = model.Id, + EquipmentPackage = model.EquipmentPackage, + TirePackage = model.TirePackage, + ToolKit = model.ToolKit, + Price = model.Price, + }; + } + public static Bundling Create(BundlingViewModel model) + { + return new Bundling + { + Id = model.Id, + EquipmentPackage = model.EquipmentPackage, + TirePackage = model.TirePackage, + ToolKit = model.ToolKit, + Price = model.Price, + }; + } + public void Update(BundlingBindingModel model) + { + if (model == null) + { + return; + } + EquipmentPackage = model.EquipmentPackage; + TirePackage = model.TirePackage; + ToolKit = model.ToolKit; + Price = model.Price; + } + public BundlingViewModel GetViewModel => new() + { + Id = Id, + EquipmentPackage = EquipmentPackage, + TirePackage = TirePackage, + ToolKit = ToolKit, + Price = Price, + }; + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/Car.cs b/CarCenter/CarCenterDatabaseImplement/Models/Car.cs new file mode 100644 index 0000000..4714c0c --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/Car.cs @@ -0,0 +1,132 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.ViewModels; +using CarCenterDataModels.Enums; +using CarCenterDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Models +{ + public class Car : ICarModel + { + public int Id { get; private set; } + public int StorekeeperId { get; set; } + public int OrderId { get; set; } + public int? FeatureId { get; set; } + [Required] + public CarBrand CarBrand { get; set; } = CarBrand.Неизвестно; + [Required] + public string Model { get; set; } = string.Empty; + [Required] + public CarClass CarClass { get; set; } = CarClass.Неизвестно; + [Required] + public int Year { get; set; } + [Required] + public double Price { get; set; } + [Required] + public long VINnumber { get; set; } + [Required] + public int FeatureID { get; set; } + public virtual Storekeeper Storekeeper { get; set; } + public virtual Feature Feature { get; set; } + public virtual Order Order { get; set; } + + private Dictionary? _carBundlings = null; + [ForeignKey("CarId")] + public virtual List Bundlings { get; set; } = new(); + [NotMapped] + public Dictionary CarBundlings + { + get + { + if (_carBundlings == null) + { + _carBundlings = Bundlings.ToDictionary(recPc => recPc.BundlingId, recPc => recPc.Bundling as IBundlingModel); + } + return _carBundlings; + } + } + public static Car? Create(CarCenterDatabase context, CarBindingModel model) + { + if (model == null) + { + return null; + } + return new Car() + { + Id = model.Id, + StorekeeperId = model.StorekeeperId, + FeatureId = model.FeatureID, + OrderId = model.OrderId, + CarBrand = model.CarBrand, + Model = model.Model, + CarClass = model.CarClass, + Year = model.Year, + Price = model.Price, + VINnumber = model.VINnumber, + FeatureID = model.FeatureID, + Bundlings = model.CarBundlings.Select(x => new CarBundling + { + Bundling = context.Bundlings.First(y => y.Id == x.Key) + }).ToList() + }; + } + + public void UpdateBundlings(CarCenterDatabase context, CarBindingModel model) + { + var car = context.Cars.First(x => x.Id == Id); + foreach (var pc in model.CarBundlings) + { + context.CarBundlings.Add(new CarBundling + { + Car = car, + Bundling = context.Bundlings.First(x => x.Id == pc.Key), + }); + context.SaveChanges(); + } + _carBundlings = null; + } + + public void Update(CarBindingModel model) + { + if (model == null) + { + return; + } + StorekeeperId = model.StorekeeperId; + FeatureId = model.FeatureID; + OrderId = model.OrderId; + CarBrand = model.CarBrand; + Model = model.Model; + CarClass = model.CarClass; + Year = model.Year; + Price = model.Price; + VINnumber = model.VINnumber; + FeatureID = model.FeatureID; + } + public CarViewModel GetViewModel => new() + { + Id = Id, + StorekeeperId = StorekeeperId, + StorekeeperName = Storekeeper?.Name ?? string.Empty, + FeatureId = FeatureId, + FeaturePrice = Feature?.Price ?? 0, + OrderId = OrderId, + BuyerFCS = Order?.BuyerFCS ?? string.Empty, + CarBrand = CarBrand, + Model = Model, + CarClass = CarClass, + Year = Year, + Price = Price, + VINnumber = VINnumber, + FeatureID = FeatureID, + CarBundlings = CarBundlings, + }; + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/CarBundling.cs b/CarCenter/CarCenterDatabaseImplement/Models/CarBundling.cs new file mode 100644 index 0000000..c0b8ea7 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/CarBundling.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Models +{ + public class CarBundling + { + public int Id { get; set; } + [Required] + public int CarId { get; set; } + [Required] + public int BundlingId { get; set; } + [Required] + public virtual Car Car { get; set; } = new(); + public virtual Bundling Bundling { get; set; } = new(); + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/Feature.cs b/CarCenter/CarCenterDatabaseImplement/Models/Feature.cs new file mode 100644 index 0000000..2643656 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/Feature.cs @@ -0,0 +1,76 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.ViewModels; +using CarCenterDataModels.Enums; +using CarCenterDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Models +{ + public class Feature : IFeatureModel + { + public int Id { get; private set; } + [Required] + public HelpDevices HelpDevice { get; set; } = HelpDevices.Неизвестно; + [Required] + public string CabinColor { get; set; } = string.Empty; + [Required] + public DriveTypes DriveType { get; set; } = DriveTypes.Неизвестно; + [Required] + public double Price { get; set; } + [ForeignKey("FeatureId")] + public virtual List Cars { get; set; } = new(); + + public static Feature? Create(FeatureBindingModel model) + { + if (model == null) + { + return null; + } + return new Feature() + { + Id = model.Id, + HelpDevice = model.HelpDevice, + CabinColor = model.CabinColor, + DriveType = model.DriveType, + Price = model.Price, + }; + } + public static Feature Create(FeatureViewModel model) + { + return new Feature + { + Id = model.Id, + HelpDevice = model.HelpDevice, + CabinColor = model.CabinColor, + DriveType = model.DriveType, + Price = model.Price, + }; + } + public void Update(FeatureBindingModel model) + { + if (model == null) + { + return; + } + HelpDevice = model.HelpDevice; + CabinColor = model.CabinColor; + DriveType = model.DriveType; + Price = model.Price; + } + public FeatureViewModel GetViewModel => new() + { + Id = Id, + HelpDevice = HelpDevice, + CabinColor = CabinColor, + DriveType = DriveType, + Price = Price, + }; + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/Order.cs b/CarCenter/CarCenterDatabaseImplement/Models/Order.cs new file mode 100644 index 0000000..8e2b781 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/Order.cs @@ -0,0 +1,106 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.ViewModels; +using CarCenterDataModels.Enums; +using CarCenterDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Models +{ + public class Order : IOrderModel + { + public int Id { get; set; } + public int WorkerId { get; set; } + [Required] + public PaymentType PaymentType { get; set; } = PaymentType.Неизвестно; + [Required] + public PaymentStatus PaymentStatus { get; set; } = PaymentStatus.Неизвестно; + [Required] + public string BuyerFCS { get; set; } = string.Empty; + public DateTime PaymentDate { get; set; } + [Required] + public double Sum { get; set; } + public virtual Worker Worker { get; set; } + [ForeignKey("OrderId")] + public virtual List Cars { get; set; } = new(); + private Dictionary? _orderPresales = null; + [ForeignKey("OrderId")] + public virtual List Presales { get; set; } = new(); + [NotMapped] + public Dictionary OrderPresales + { + get + { + if(_orderPresales == null) + { + _orderPresales = Presales.ToDictionary(recPc => recPc.PresaleId, recPc => recPc.Presale as IPresaleModel); + } + return _orderPresales; + } + } + public static Order? Create(CarCenterDatabase context, OrderBindingModel model) + { + if (model == null) + { + return null; + } + return new Order() + { + Id = model.Id, + WorkerId = model.WorkerId, + PaymentType = model.PaymentType, + PaymentStatus = model.PaymentStatus, + BuyerFCS = model.BuyerFCS, + PaymentDate = model.PaymentDate, + Sum = model.Sum, + Presales = model.OrderPresales.Select(x => new OrderPresale + { + Presale = context.Presales.First(y => y.Id == x.Key) + }).ToList() + }; + } + + public void Update(OrderBindingModel? model) + { + if (model == null) + { + return; + } + WorkerId = model.WorkerId; + PaymentDate = model.PaymentDate; + PaymentType = model.PaymentType; + Sum = model.Sum; + } + public void UpdatePresales(CarCenterDatabase context, OrderBindingModel model) + { + var order = context.Orders.First(x => x.Id == Id); + foreach (var pc in model.OrderPresales) + { + context.OrderPresales.Add(new OrderPresale + { + Order = order, + Presale = context.Presales.First(x => x.Id == pc.Key), + }); + context.SaveChanges(); + } + _orderPresales = null; + } + public OrderViewModel GetViewModel => new() + { + Id = Id, + WorkerId = WorkerId, + WorkerName = Worker?.Name ?? string.Empty, + PaymentType = PaymentType, + PaymentStatus = PaymentStatus, + BuyerFCS = BuyerFCS, + PaymentDate = PaymentDate, + Sum = Sum, + OrderPresales = OrderPresales + }; + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/OrderPresale.cs b/CarCenter/CarCenterDatabaseImplement/Models/OrderPresale.cs new file mode 100644 index 0000000..d8300b4 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/OrderPresale.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Models +{ + public class OrderPresale + { + public int Id { get; set; } + [Required] + public int OrderId { get; set; } + [Required] + public int PresaleId { get; set; } + [Required] + public virtual Order Order { get; set; } = new(); + public virtual Presale Presale { get; set; } = new(); + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/Presale.cs b/CarCenter/CarCenterDatabaseImplement/Models/Presale.cs new file mode 100644 index 0000000..7f663e2 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/Presale.cs @@ -0,0 +1,102 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.ViewModels; +using CarCenterDataModels.Enums; +using CarCenterDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Models +{ + public class Presale : IPresaleModel + { + public int Id { get; set; } + [Required] + public PresaleStatus PresaleStatus { get; set; } = PresaleStatus.Неизвестно; + [Required] + public string Description { get; set; } = string.Empty; + [Required] + public DateTime DueTill { get; set; } + [Required] + public double Price { get; set; } + [ForeignKey("PresaleId")] + public virtual List Requests { get; set; } = new(); + [ForeignKey("PresaleId")] + public virtual List OrderPresales { get; set; } = new(); + + private Dictionary? _presaleBundlings = null; + [ForeignKey("PresaleId")] + public virtual List Bundlings { get; set; } = new(); + public Dictionary PresaleBundlings + { + get + { + if (_presaleBundlings == null) + { + _presaleBundlings = Bundlings.ToDictionary(recPc => recPc.BundlingId, recPc => recPc.Bundling as IBundlingModel); + } + return _presaleBundlings; + } + } + public static Presale? Create(CarCenterDatabase context, PresaleBindingModel model) + { + if (model == null) + { + return null; + } + return new Presale() + { + Id = model.Id, + PresaleStatus = model.PresaleStatus, + Description = model.Description, + Price = model.Price, + DueTill = model.DueTill, + Bundlings = model.PresaleBundlings.Select(x => new PresaleBundling + { + Bundling = context.Bundlings.First(y => y.Id == x.Key) + }).ToList() + }; + } + + public void UpdateBundlings(CarCenterDatabase context, PresaleBindingModel model) + { + var presale = context.Presales.First(x => x.Id == Id); + foreach (var pc in model.PresaleBundlings) + { + context.PresaleBundlings.Add(new PresaleBundling + { + Presale = presale, + Bundling = context.Bundlings.First(x => x.Id == pc.Key), + }); + context.SaveChanges(); + } + _presaleBundlings = null; + } + + public void Update(PresaleBindingModel? model) + { + if (model == null) + { + return; + } + Description = model.Description; + Price = model.Price; + DueTill = model.DueTill; + PresaleStatus = model.PresaleStatus; + } + + public PresaleViewModel GetViewModel => new() + { + Id = Id, + PresaleStatus = PresaleStatus, + Description = Description, + DueTill = DueTill, + Price = Price, + PresaleBundlings = PresaleBundlings, + }; + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/PresaleBundling.cs b/CarCenter/CarCenterDatabaseImplement/Models/PresaleBundling.cs new file mode 100644 index 0000000..1c05446 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/PresaleBundling.cs @@ -0,0 +1,22 @@ +using CarCenterContracts.SearchModels; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Models +{ + public class PresaleBundling + { + public int Id { get; set; } + [Required] + public int PresaleId { get; set; } + [Required] + public int BundlingId { get; set; } + [Required] + public virtual Presale Presale { get; set; } = new(); + public virtual Bundling Bundling { get; set; } = new(); + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/Request.cs b/CarCenter/CarCenterDatabaseImplement/Models/Request.cs new file mode 100644 index 0000000..4e4f921 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/Request.cs @@ -0,0 +1,59 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.ViewModels; +using CarCenterDataModels.Enums; +using CarCenterDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Models +{ + public class Request : IRequestModel + { + public int Id { get; set; } + public int PresaleId { get; set; } + [Required] + public string Description { get; set; } = string.Empty; + [Required] + public RequestTypes RequestType { get; set; } = RequestTypes.Неизвестно; + public virtual Presale Presale { get; set; } + + public static Request? Create(RequestBindingModel? model) + { + if (model == null) + { + return null; + } + return new Request() + { + Id = model.Id, + PresaleId = model.PresaleId, + Description = model.Description, + RequestType = model.RequestType, + }; + } + + public void Update(RequestBindingModel? model) + { + if (model == null) + { + return; + } + Description = model.Description; + RequestType = model.RequestType; + PresaleId = model.PresaleId; + } + + public RequestViewModel GetViewModel => new() + { + Id = Id, + Description = Description, + RequestType = RequestType, + PresaleId = PresaleId, + PresaleDescription = Presale?.Description ?? string.Empty, + }; + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/Storekeeper.cs b/CarCenter/CarCenterDatabaseImplement/Models/Storekeeper.cs new file mode 100644 index 0000000..7b516c7 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/Storekeeper.cs @@ -0,0 +1,71 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.ViewModels; +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 CarCenterDataModels.Models; + +namespace CarCenterDatabaseImplement.Models +{ + public class Storekeeper : IStorekeeperModel + { + public int Id { get; set; } + [Required] + public string Name { get; set; } = string.Empty; + [Required] + public string Surname { get; set; } = string.Empty; + public string? Patronymic { get; set; } + [Required] + public string Password { get; set; } = string.Empty; + [Required] + public string Email { get; set; } = string.Empty; + [Required] + public long PhoneNumber { get; set; } + [ForeignKey("StorekeeperId")] + public virtual List Cars { get; set; } = new(); + + public static Storekeeper? Create(StorekeeperBindingModel? model) + { + if (model == null) + { + return null; + } + return new Storekeeper() + { + Id = model.Id, + Name = model.Name, + Surname = model.Surname, + Patronymic = model.Patronymic, + Password = model.Password, + Email = model.Email, + PhoneNumber = model.PhoneNumber, + }; + } + + public void Update(StorekeeperBindingModel? model) + { + if (model == null) + { + return; + } + Password = model.Password; + Email = model.Email; + PhoneNumber = model.PhoneNumber; + } + + public StorekeeperViewModel GetViewModel => new() + { + Id = Id, + Name = Name, + Surname = Surname, + Patronymic = Patronymic, + Password = Password, + Email = Email, + PhoneNumber = PhoneNumber, + }; + } +} diff --git a/CarCenter/CarCenterDatabaseImplement/Models/Worker.cs b/CarCenter/CarCenterDatabaseImplement/Models/Worker.cs new file mode 100644 index 0000000..32a9145 --- /dev/null +++ b/CarCenter/CarCenterDatabaseImplement/Models/Worker.cs @@ -0,0 +1,72 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.ViewModels; +using CarCenterDataModels.Enums; +using CarCenterDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CarCenterDatabaseImplement.Models +{ + public class Worker : IWorkerModel + { + public int Id { get; set; } + [Required] + public string Name { get; set; } = string.Empty; + [Required] + public string Surname { get; set; } = string.Empty; + public string? Patronymic { get; set; } + [Required] + public string Password { get; set; } = string.Empty; + [Required] + public string Email { get; set; } = string.Empty; + [Required] + public long PhoneNumber { get; set; } + [ForeignKey("WorkerId")] + public virtual List Orders { get; set; } = new(); + + public static Worker? Create(WorkerBindingModel? model) + { + if (model == null) + { + return null; + } + return new Worker() + { + Id = model.Id, + Name = model.Name, + Surname = model.Surname, + Patronymic = model.Patronymic, + Password = model.Password, + Email = model.Email, + PhoneNumber = model.PhoneNumber, + }; + } + + public void Update(WorkerBindingModel? model) + { + if (model == null) + { + return; + } + Password = model.Password; + Email = model.Email; + PhoneNumber = model.PhoneNumber; + } + + public WorkerViewModel GetViewModel => new() + { + Id = Id, + Name = Name, + Surname = Surname, + Patronymic = Patronymic, + Password = Password, + Email = Email, + PhoneNumber = PhoneNumber, + }; + } +}