From 9dc05cc8bc7f83270ea12820858f42bdc0d94f4b Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Fri, 1 Mar 2024 16:07:11 +0330 Subject: [PATCH] add order deliver at --- NetinaShop.Api/Controller/OrderController.cs | 12 + NetinaShop.Api/Dockerfile | 6 + NetinaShop.Api/NetinaShop.Api.csproj | 1 + NetinaShop.Api/Program.cs | 6 + NetinaShop.Api/Views/Invoices/Invoice.cshtml | 5 + NetinaShop.Api/wwwroot/fonts/Shabnam-Bold.ttf | Bin 0 -> 58836 bytes NetinaShop.Api/wwwroot/fonts/Shabnam.ttf | Bin 0 -> 58020 bytes .../GetOrderInvoiceCommandHandler.cs | 128 ++ NetinaShop.Core/NetinaShop.Core.csproj | 4 + .../CommandQueries/Commands/OrderCommands.cs | 1 + NetinaShop.Domain/Dtos/LargDtos/OrderLDto.cs | 2 +- NetinaShop.Domain/Mappers/OrderMapper.g.cs | 30 +- NetinaShop.Domain/MapsterRegister.cs | 14 + .../Handlers/Orders/GetOrdersQueryHandler.cs | 3 +- ...29174513_EditOrderAddDeliverAt.Designer.cs | 1755 +++++++++++++++++ .../20240229174513_EditOrderAddDeliverAt.cs | 32 + .../ApplicationContextModelSnapshot.cs | 3 + .../Program.cs | 218 +- 18 files changed, 2106 insertions(+), 114 deletions(-) create mode 100644 NetinaShop.Api/Views/Invoices/Invoice.cshtml create mode 100644 NetinaShop.Api/wwwroot/fonts/Shabnam-Bold.ttf create mode 100644 NetinaShop.Api/wwwroot/fonts/Shabnam.ttf create mode 100644 NetinaShop.Core/EntityServices/OrderHandlers/GetOrderInvoiceCommandHandler.cs create mode 100644 NetinaShop.Repository/Migrations/20240229174513_EditOrderAddDeliverAt.Designer.cs create mode 100644 NetinaShop.Repository/Migrations/20240229174513_EditOrderAddDeliverAt.cs diff --git a/NetinaShop.Api/Controller/OrderController.cs b/NetinaShop.Api/Controller/OrderController.cs index 6d5bb97..d5514d8 100644 --- a/NetinaShop.Api/Controller/OrderController.cs +++ b/NetinaShop.Api/Controller/OrderController.cs @@ -24,6 +24,9 @@ public class OrderController : ICarterModule group.MapDelete("{id}", DeleteAsync) .WithDisplayName("DeleteOneOrder") .HasApiVersion(1.0); + group.MapGet("{id}/invoice", GetOrderInvoiceAsync) + .WithDisplayName("GetOrderInvoice") + .HasApiVersion(1.0); } @@ -39,6 +42,15 @@ public class OrderController : ICarterModule return TypedResults.Ok(order); } + public async Task DeleteAsync(IMediator mediator, Guid id, CancellationToken cancellationToken = default) => TypedResults.Ok(await mediator.Send(new DeleteOrderCommand(id), cancellationToken)); + + private async Task GetOrderInvoiceAsync([FromRoute] Guid id, [FromServices] IMediator mediator, CancellationToken cancellationToken) + { + var file = await mediator.Send(new GetOrderInvoiceCommand(id), cancellationToken); + string fileName = $"Invoice_{id}.pdf"; + return TypedResults.File(file, "application/pdf", fileName); + } + } diff --git a/NetinaShop.Api/Dockerfile b/NetinaShop.Api/Dockerfile index 599a2c4..4528235 100644 --- a/NetinaShop.Api/Dockerfile +++ b/NetinaShop.Api/Dockerfile @@ -2,6 +2,7 @@ FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base USER app + WORKDIR /app EXPOSE 8080 @@ -19,6 +20,11 @@ ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./NetinaShop.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false FROM base AS final + + +RUN apt-get update +RUN apt-get install-y libgdiplus + WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "NetinaShop.Api.dll"] \ No newline at end of file diff --git a/NetinaShop.Api/NetinaShop.Api.csproj b/NetinaShop.Api/NetinaShop.Api.csproj index b45486a..3fdee50 100644 --- a/NetinaShop.Api/NetinaShop.Api.csproj +++ b/NetinaShop.Api/NetinaShop.Api.csproj @@ -134,6 +134,7 @@ + diff --git a/NetinaShop.Api/Program.cs b/NetinaShop.Api/Program.cs index 4add805..eb0128a 100644 --- a/NetinaShop.Api/Program.cs +++ b/NetinaShop.Api/Program.cs @@ -1,4 +1,8 @@ +using Autofac.Core; +using DinkToPdf.Contracts; +using DinkToPdf; using NetinaShop.Repository.Behaviors; +using QuestPDF.Infrastructure; var builder = WebApplication.CreateBuilder(args); builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); @@ -40,6 +44,8 @@ builder.Services.AddCustomIdentity(); builder.Services.AddCustomDbContext(configuration); builder.Services.AddMarten(configuration,builder.Environment); builder.Services.AddCarter(); +builder.Services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools())); +QuestPDF.Settings.License = LicenseType.Community; builder.Host.ConfigureContainer(builder => diff --git a/NetinaShop.Api/Views/Invoices/Invoice.cshtml b/NetinaShop.Api/Views/Invoices/Invoice.cshtml new file mode 100644 index 0000000..e1dd794 --- /dev/null +++ b/NetinaShop.Api/Views/Invoices/Invoice.cshtml @@ -0,0 +1,5 @@ +@* + For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 +*@ +@{ +} diff --git a/NetinaShop.Api/wwwroot/fonts/Shabnam-Bold.ttf b/NetinaShop.Api/wwwroot/fonts/Shabnam-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dbae5634f7b806efa8309c80dab77cf82ba9902a GIT binary patch literal 58836 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 literal 0 HcmV?d00001 diff --git a/NetinaShop.Api/wwwroot/fonts/Shabnam.ttf b/NetinaShop.Api/wwwroot/fonts/Shabnam.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7861e3fd524c719076ca25fb77d09bcc4be224bd GIT binary patch literal 58020 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 literal 0 HcmV?d00001 diff --git a/NetinaShop.Core/EntityServices/OrderHandlers/GetOrderInvoiceCommandHandler.cs b/NetinaShop.Core/EntityServices/OrderHandlers/GetOrderInvoiceCommandHandler.cs new file mode 100644 index 0000000..cec54e5 --- /dev/null +++ b/NetinaShop.Core/EntityServices/OrderHandlers/GetOrderInvoiceCommandHandler.cs @@ -0,0 +1,128 @@ +using DinkToPdf; +using DinkToPdf.Contracts; +using QuestPDF.Fluent; +using QuestPDF.Helpers; +using QuestPDF.Infrastructure; +using Unit = QuestPDF.Infrastructure.Unit; + +namespace NetinaShop.Core.EntityServices.OrderHandlers; + +public class GetOrderInvoiceCommandHandler : IRequestHandler +{ + private readonly IRepositoryWrapper _repositoryWrapper; + private readonly IMediator _mediator; + private readonly IConverter _converter; + + public GetOrderInvoiceCommandHandler(IRepositoryWrapper repositoryWrapper,IMediator mediator,IConverter converter) + { + _repositoryWrapper = repositoryWrapper; + _mediator = mediator; + _converter = converter; + } + public async Task Handle(GetOrderInvoiceCommand request, CancellationToken cancellationToken) + { + var orderLDto = await _mediator.Send(new GetOrderLDtoQuery(request.OrderId), cancellationToken); + + //var textStyleWithFallback = TextStyle + // .Default + // .FontSize(18) + // .Fallback(y => y + // .FontFamily(Fonts.Arial) + // .SemiBold() + // .Underline(false) + // .BackgroundColor(Colors.Red.Lighten4)); + + //var pdf = Document.Create(container => + //{ + // container.Page(page => + // { + // page.Size(PageSizes.A4); + // page.Margin(2,Unit.Centimetre); + // page.PageColor(Colors.White); + // page.DefaultTextStyle(x=>x.FontSize(14)); + + // page.Header() + // .Text(text => + // { + // text.DefaultTextStyle(textStyleWithFallback); + + // text.Line("This is normal text."); + // text.EmptyLine(); + + // text.Line("Following line should use font fallback:"); + // text.Line("中文文本"); + // text.EmptyLine(); + + // text.Line("The following line contains a mix of known and unknown characters."); + // text.Line("Mixed line: This 中文 is 文文 a mixed 本 本 line 本 中文文本!"); + // text.EmptyLine(); + + // text.Span("Emojis work out of the box because of font fallback: 😊😅🥳👍❤😍👌"); + // }); + + // page.Content() + // .ContentFromRightToLeft() + // .Column(x => + // { + // x.Spacing(20); + // x.Item().Text("فاکتور فروش "); + // }); + // }); + //}).GeneratePdf(); + + var sb = new StringBuilder(); + sb.Append(@" + + + + +

فاکتور فروش

+ + + + + + + "); + foreach (var emp in orderLDto.OrderProducts) + { + sb.AppendFormat(@" + + + + + ", emp.ProductName, emp.Count, emp.ProductFee, emp.ProductCost); + } + sb.Append(@" +
NameLastNameAgeGender
{0}{1}{2}{3}
+ + "); + + var globalSettings = new GlobalSettings + { + ColorMode = ColorMode.Color, + Orientation = Orientation.Portrait, + PaperSize = PaperKind.A4, + Margins = new MarginSettings { Top = 10 }, + DocumentTitle = "PDF Report", + Out = @"D:\PDFCreator\Employee_Report.pdf" + }; + var objectSettings = new ObjectSettings + { + PagesCount = true, + HtmlContent = sb.ToString(), + WebSettings = { DefaultEncoding = "utf-8", UserStyleSheet = Path.Combine(Directory.GetCurrentDirectory(), "assets", "styles.css") }, + HeaderSettings = { FontName = "Arial", FontSize = 9, Right = "Page [page] of [toPage]", Line = true }, + FooterSettings = { FontName = "Arial", FontSize = 9, Line = true, Center = "Report Footer" } + }; + var pdf = new HtmlToPdfDocument() + { + GlobalSettings = globalSettings, + Objects = { objectSettings } + }; + var file = _converter.Convert(pdf); + + + return file; + } +} \ No newline at end of file diff --git a/NetinaShop.Core/NetinaShop.Core.csproj b/NetinaShop.Core/NetinaShop.Core.csproj index 028f512..2e7cbc1 100644 --- a/NetinaShop.Core/NetinaShop.Core.csproj +++ b/NetinaShop.Core/NetinaShop.Core.csproj @@ -11,9 +11,13 @@ + + + + diff --git a/NetinaShop.Domain/CommandQueries/Commands/OrderCommands.cs b/NetinaShop.Domain/CommandQueries/Commands/OrderCommands.cs index 5a4718b..836568a 100644 --- a/NetinaShop.Domain/CommandQueries/Commands/OrderCommands.cs +++ b/NetinaShop.Domain/CommandQueries/Commands/OrderCommands.cs @@ -5,4 +5,5 @@ public sealed record CreateBaseOrderCommand(Guid UserId) : IRequest; public sealed record CalculateOrderCommand(Guid OrderId , bool NamoosiCalculate = false) : IRequest; public sealed record ConfirmOrderStepCommand(Guid OrderId , OrderStatus NextOrderStatus) : IRequest; +public sealed record GetOrderInvoiceCommand(Guid OrderId) : IRequest; public sealed record DeleteOrderCommand(Guid OrderId) : IRequest; \ No newline at end of file diff --git a/NetinaShop.Domain/Dtos/LargDtos/OrderLDto.cs b/NetinaShop.Domain/Dtos/LargDtos/OrderLDto.cs index 461ef24..fcd4adf 100644 --- a/NetinaShop.Domain/Dtos/LargDtos/OrderLDto.cs +++ b/NetinaShop.Domain/Dtos/LargDtos/OrderLDto.cs @@ -27,6 +27,6 @@ public class OrderLDto : BaseDto public List Payments { get; set; } = new(); - public OrderDeliverySDto? OrderDelivery { get; internal set; } + public OrderDeliverySDto OrderDelivery { get; set; } = new(); } diff --git a/NetinaShop.Domain/Mappers/OrderMapper.g.cs b/NetinaShop.Domain/Mappers/OrderMapper.g.cs index 6920deb..ffebf5b 100644 --- a/NetinaShop.Domain/Mappers/OrderMapper.g.cs +++ b/NetinaShop.Domain/Mappers/OrderMapper.g.cs @@ -189,7 +189,15 @@ namespace NetinaShop.Domain.Mappers Payments = funcMain10(p21.Payments), OrderDelivery = p21.OrderDelivery == null ? null : new OrderDeliverySDto() { - Address = p21.OrderDelivery.Address == null ? null : p21.OrderDelivery.Address.ToString(), + Province = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.Province : string.Empty, + City = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.City : string.Empty, + Plaque = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.Plaque : string.Empty, + LocationLat = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.LocationLat : 0f, + LocationLong = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.LocationLong : 0f, + Address = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.Address : string.Empty, + PostalCode = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.PostalCode : string.Empty, + ReceiverPhoneNumber = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.ReceiverPhoneNumber : string.Empty, + ReceiverFullName = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.ReceiverFullName : string.Empty, ShippingMethod = p21.OrderDelivery.Shipping != null ? p21.OrderDelivery.Shipping.Name : string.Empty, DeliveryCost = p21.OrderDelivery.DeliveryCost, AddressId = p21.OrderDelivery.AddressId, @@ -291,7 +299,15 @@ namespace NetinaShop.Domain.Mappers }).ToList(), OrderDelivery = p32.OrderDelivery == null ? null : new OrderDeliverySDto() { - Address = p32.OrderDelivery.Address == null ? null : p32.OrderDelivery.Address.ToString(), + Province = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.Province : string.Empty, + City = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.City : string.Empty, + Plaque = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.Plaque : string.Empty, + LocationLat = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.LocationLat : 0f, + LocationLong = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.LocationLong : 0f, + Address = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.Address : string.Empty, + PostalCode = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.PostalCode : string.Empty, + ReceiverPhoneNumber = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.ReceiverPhoneNumber : string.Empty, + ReceiverFullName = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.ReceiverFullName : string.Empty, ShippingMethod = p32.OrderDelivery.Shipping != null ? p32.OrderDelivery.Shipping.Name : string.Empty, DeliveryCost = p32.OrderDelivery.DeliveryCost, AddressId = p32.OrderDelivery.AddressId, @@ -801,7 +817,15 @@ namespace NetinaShop.Domain.Mappers } OrderDeliverySDto result = p31 ?? new OrderDeliverySDto(); - result.Address = p30.Address == null ? null : p30.Address.ToString(); + result.Province = p30.Address != null ? p30.Address.Province : string.Empty; + result.City = p30.Address != null ? p30.Address.City : string.Empty; + result.Plaque = p30.Address != null ? p30.Address.Plaque : string.Empty; + result.LocationLat = p30.Address != null ? p30.Address.LocationLat : 0f; + result.LocationLong = p30.Address != null ? p30.Address.LocationLong : 0f; + result.Address = p30.Address != null ? p30.Address.Address : string.Empty; + result.PostalCode = p30.Address != null ? p30.Address.PostalCode : string.Empty; + result.ReceiverPhoneNumber = p30.Address != null ? p30.Address.ReceiverPhoneNumber : string.Empty; + result.ReceiverFullName = p30.Address != null ? p30.Address.ReceiverFullName : string.Empty; result.ShippingMethod = p30.Shipping != null ? p30.Shipping.Name : string.Empty; result.DeliveryCost = p30.DeliveryCost; result.AddressId = p30.AddressId; diff --git a/NetinaShop.Domain/MapsterRegister.cs b/NetinaShop.Domain/MapsterRegister.cs index eb3eda4..6305892 100644 --- a/NetinaShop.Domain/MapsterRegister.cs +++ b/NetinaShop.Domain/MapsterRegister.cs @@ -51,6 +51,20 @@ public class MapsterRegister : IRegister .IgnoreNullValues(false) .TwoWays(); + config.NewConfig() + .Map("Province", o => o.Address != null ? o.Address.Province : string.Empty) + .Map("City", o => o.Address != null ? o.Address.City : string.Empty) + .Map("Plaque", o => o.Address != null ? o.Address.Plaque : string.Empty) + .Map("LocationLat", o => o.Address != null ? o.Address.LocationLat : 0) + .Map("LocationLong", o => o.Address != null ? o.Address.LocationLong : 0) + .Map("PostalCode", o => o.Address != null ? o.Address.PostalCode : string.Empty) + .Map("ReceiverPhoneNumber", o => o.Address != null ? o.Address.ReceiverPhoneNumber : string.Empty) + .Map("ReceiverFullName", o => o.Address != null ? o.Address.ReceiverFullName : string.Empty) + .Map("Address", o => o.Address != null ? o.Address.Address : string.Empty) + .Map("ShippingMethod", o => o.Shipping != null ? o.Shipping.Name : string.Empty) + .IgnoreNullValues(false) + .TwoWays(); + config.NewConfig() .Map("UserFullName", o => o.User != null ? o.User.FirstName + " " + o.User.LastName : string.Empty) .Map("UserPhoneNumber", o => o.User != null ? o.User.PhoneNumber : string.Empty) diff --git a/NetinaShop.Repository/Handlers/Orders/GetOrdersQueryHandler.cs b/NetinaShop.Repository/Handlers/Orders/GetOrdersQueryHandler.cs index 7dc4405..79ba509 100644 --- a/NetinaShop.Repository/Handlers/Orders/GetOrdersQueryHandler.cs +++ b/NetinaShop.Repository/Handlers/Orders/GetOrdersQueryHandler.cs @@ -16,8 +16,7 @@ public class GetOrdersQueryHandler : IRequestHandler orders = _repositoryWrapper .SetRepository() - .TableNoTracking - .Where(o=>o.OrderStatus != OrderStatus.OrderBag); + .TableNoTracking; if (request.DateFilter != null) { diff --git a/NetinaShop.Repository/Migrations/20240229174513_EditOrderAddDeliverAt.Designer.cs b/NetinaShop.Repository/Migrations/20240229174513_EditOrderAddDeliverAt.Designer.cs new file mode 100644 index 0000000..cd9ccd7 --- /dev/null +++ b/NetinaShop.Repository/Migrations/20240229174513_EditOrderAddDeliverAt.Designer.cs @@ -0,0 +1,1755 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using NetinaShop.Repository.Models; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace NetinaShop.Repository.Migrations +{ + [DbContext(typeof(ApplicationContext))] + [Migration("20240229174513_EditOrderAddDeliverAt")] + partial class EditOrderAddDeliverAt + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("public") + .HasAnnotation("ProductVersion", "8.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("RoleClaims", "public"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Claims", "public"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("Logins", "public"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("UserRoles", "public"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("Tokens", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Accounting.Payment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Amount") + .HasColumnType("double precision"); + + b.Property("Authority") + .IsRequired() + .HasColumnType("text"); + + b.Property("CardPan") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("FactorNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("OrderId") + .HasColumnType("uuid"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TransactionCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("OrderId"); + + b.HasIndex("UserId"); + + b.ToTable("Payments", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Blogs.Blog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CategoryId") + .HasColumnType("uuid"); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("IsSuggested") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("ReadingTime") + .HasColumnType("integer"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("Summery") + .IsRequired() + .HasColumnType("text"); + + b.Property("Tags") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.ToTable("Blogs", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Blogs.BlogCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("BlogCategories", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Brands.Brand", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("EnglishName") + .IsRequired() + .HasColumnType("text"); + + b.Property("HasSpecialPage") + .HasColumnType("boolean"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("PageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("PersianName") + .IsRequired() + .HasColumnType("text"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Brands", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Discounts.Discount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AmountType") + .HasColumnType("integer"); + + b.Property("Code") + .IsRequired() + .HasColumnType("text"); + + b.Property("CorporateUserId") + .HasColumnType("uuid"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("DiscountAmount") + .HasColumnType("bigint"); + + b.Property("DiscountPercent") + .HasColumnType("integer"); + + b.Property("Discriminator") + .IsRequired() + .HasMaxLength(21) + .HasColumnType("character varying(21)"); + + b.Property("ExpireDate") + .HasColumnType("timestamp without time zone"); + + b.Property("HasCode") + .HasColumnType("boolean"); + + b.Property("HasPriceCeiling") + .HasColumnType("boolean"); + + b.Property("HasPriceFloor") + .HasColumnType("boolean"); + + b.Property("Immortal") + .HasColumnType("boolean"); + + b.Property("IsForInvitation") + .HasColumnType("boolean"); + + b.Property("IsForSaleCooperation") + .HasColumnType("boolean"); + + b.Property("IsInfinity") + .HasColumnType("boolean"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("IsSpecialOffer") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("PriceCeiling") + .HasColumnType("bigint"); + + b.Property("PriceFloor") + .HasColumnType("bigint"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("StartDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("UseCount") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("CorporateUserId"); + + b.ToTable("Discounts", "public"); + + b.HasDiscriminator("Discriminator").HasValue("Discount"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Orders.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("DeliveredAt") + .HasColumnType("timestamp without time zone"); + + b.Property("DeliveryPrice") + .HasColumnType("double precision"); + + b.Property("DiscountCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("DiscountCodePrice") + .HasColumnType("double precision"); + + b.Property("DiscountId") + .HasColumnType("uuid"); + + b.Property("DiscountPrice") + .HasColumnType("double precision"); + + b.Property("DoneAt") + .HasColumnType("timestamp without time zone"); + + b.Property("FactorCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsPayed") + .HasColumnType("boolean"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("OrderAt") + .HasColumnType("timestamp without time zone"); + + b.Property("OrderStatus") + .HasColumnType("integer"); + + b.Property("PackingPrice") + .HasColumnType("double precision"); + + b.Property("PayedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("PaymentMethod") + .HasColumnType("integer"); + + b.Property("PreparingMinute") + .HasColumnType("integer"); + + b.Property("ProductDiscountPrice") + .HasColumnType("double precision"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("ServicePrice") + .HasColumnType("double precision"); + + b.Property("TaxesPrice") + .HasColumnType("double precision"); + + b.Property("TotalPrice") + .HasColumnType("double precision"); + + b.Property("TotalProductsPrice") + .HasColumnType("double precision"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("DiscountId"); + + b.HasIndex("UserId"); + + b.ToTable("Orders", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Orders.OrderDelivery", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AddressId") + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("DeliveryCost") + .HasColumnType("double precision"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("OrderId") + .HasColumnType("uuid"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("ShippingId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("AddressId"); + + b.HasIndex("OrderId") + .IsUnique(); + + b.HasIndex("ShippingId"); + + b.ToTable("OrderDeliveries", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Orders.OrderProduct", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("HasDiscount") + .HasColumnType("boolean"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("OrderId") + .HasColumnType("uuid"); + + b.Property("OrderProductStatus") + .HasColumnType("integer"); + + b.Property("PackingCost") + .HasColumnType("double precision"); + + b.Property("PackingFee") + .HasColumnType("double precision"); + + b.Property("ProductCategoryId") + .HasColumnType("uuid"); + + b.Property("ProductCost") + .HasColumnType("double precision"); + + b.Property("ProductFee") + .HasColumnType("double precision"); + + b.Property("ProductFeeWithDiscount") + .HasColumnType("double precision"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("OrderId"); + + b.HasIndex("ProductId"); + + b.ToTable("OrderProducts", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.ProductCategories.ProductCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsMain") + .HasColumnType("boolean"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentId"); + + b.ToTable("ProductCategories", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Products.Product", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("BeDisplayed") + .HasColumnType("boolean"); + + b.Property("BrandId") + .HasColumnType("uuid"); + + b.Property("CategoryId") + .HasColumnType("uuid"); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("EnglishName") + .IsRequired() + .HasColumnType("text"); + + b.Property("ExpertCheck") + .IsRequired() + .HasColumnType("text"); + + b.Property("HasExpressDelivery") + .HasColumnType("boolean"); + + b.Property("IsEnable") + .HasColumnType("boolean"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("MaxOrderCount") + .HasColumnType("integer"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("PackingCost") + .HasColumnType("double precision"); + + b.Property("PersianName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Rate") + .HasColumnType("real"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("ReviewCount") + .HasColumnType("integer"); + + b.Property("Stock") + .HasColumnType("integer"); + + b.Property("Summery") + .IsRequired() + .HasColumnType("text"); + + b.Property("Tags") + .IsRequired() + .HasColumnType("text"); + + b.Property("Viewed") + .HasColumnType("integer"); + + b.Property("Warranty") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("BrandId"); + + b.HasIndex("CategoryId"); + + b.ToTable("Products", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Products.Review", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("IsBuyer") + .HasColumnType("boolean"); + + b.Property("IsConfirmed") + .HasColumnType("boolean"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.Property("Rate") + .HasColumnType("real"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProductId"); + + b.HasIndex("UserId"); + + b.ToTable("Reviews", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Products.Specification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("Detail") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsFeature") + .HasColumnType("boolean"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentId"); + + b.HasIndex("ProductId"); + + b.ToTable("Specifications", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.StorageFiles.StorageFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("Discriminator") + .IsRequired() + .HasMaxLength(34) + .HasColumnType("character varying(34)"); + + b.Property("FileLocation") + .IsRequired() + .HasColumnType("text"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("text"); + + b.Property("FileType") + .HasColumnType("integer"); + + b.Property("IsHeader") + .HasColumnType("boolean"); + + b.Property("IsPrimary") + .HasColumnType("boolean"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("StorageFiles", "public"); + + b.HasDiscriminator("Discriminator").HasValue("StorageFile"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Users.ApplicationRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("EnglishName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PersianName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Users.ApplicationUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp without time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("text"); + + b.Property("LatestVersionUsed") + .HasColumnType("double precision"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NationalId") + .IsRequired() + .HasColumnType("text"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("SignUpStatus") + .HasColumnType("integer"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("Users", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Users.NewsletterMember", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("NewsletterMembers", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Users.UserAddress", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Address") + .IsRequired() + .HasColumnType("text"); + + b.Property("BuildingUnit") + .IsRequired() + .HasColumnType("text"); + + b.Property("City") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("LocationLat") + .HasColumnType("real"); + + b.Property("LocationLong") + .HasColumnType("real"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("Plaque") + .IsRequired() + .HasColumnType("text"); + + b.Property("PostalCode") + .IsRequired() + .HasColumnType("text"); + + b.Property("Province") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReceiverFullName") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReceiverPhoneNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserAddresses", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Users.UserFavoriteProduct", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProductId"); + + b.HasIndex("UserId"); + + b.ToTable("UserFavoriteProducts", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Warehouses.Shipping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("CreatedBy") + .HasColumnType("text"); + + b.Property("DeliveryCost") + .HasColumnType("double precision"); + + b.Property("IsExpressShipping") + .HasColumnType("boolean"); + + b.Property("IsOriginalWarehouse") + .HasColumnType("boolean"); + + b.Property("IsRemoved") + .HasColumnType("boolean"); + + b.Property("IsShipBySeller") + .HasColumnType("boolean"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("ModifiedBy") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("RemovedAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RemovedBy") + .HasColumnType("text"); + + b.Property("WarehouseName") + .IsRequired() + .HasColumnType("text"); + + b.Property("WorkingDays") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Shippings", "public"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Discounts.CategoryDiscount", b => + { + b.HasBaseType("NetinaShop.Domain.Entities.Discounts.Discount"); + + b.Property("CategoryId") + .HasColumnType("uuid"); + + b.HasIndex("CategoryId"); + + b.HasDiscriminator().HasValue("CategoryDiscount"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Discounts.ProductDiscount", b => + { + b.HasBaseType("NetinaShop.Domain.Entities.Discounts.Discount"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.HasIndex("ProductId"); + + b.HasDiscriminator().HasValue("ProductDiscount"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Blogs.BlogStorageFile", b => + { + b.HasBaseType("NetinaShop.Domain.Entities.StorageFiles.StorageFile"); + + b.Property("BlogId") + .HasColumnType("uuid"); + + b.HasIndex("BlogId"); + + b.HasDiscriminator().HasValue("BlogStorageFile"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Brands.BrandStorageFile", b => + { + b.HasBaseType("NetinaShop.Domain.Entities.StorageFiles.StorageFile"); + + b.Property("BrandId") + .HasColumnType("uuid"); + + b.HasIndex("BrandId"); + + b.HasDiscriminator().HasValue("BrandStorageFile"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.ProductCategories.ProductCategoryStorageFile", b => + { + b.HasBaseType("NetinaShop.Domain.Entities.StorageFiles.StorageFile"); + + b.Property("CategoryId") + .HasColumnType("uuid"); + + b.HasIndex("CategoryId"); + + b.HasDiscriminator().HasValue("ProductCategoryStorageFile"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Products.ProductStorageFile", b => + { + b.HasBaseType("NetinaShop.Domain.Entities.StorageFiles.StorageFile"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.HasIndex("ProductId"); + + b.HasDiscriminator().HasValue("ProductStorageFile"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Accounting.Payment", b => + { + b.HasOne("NetinaShop.Domain.Entities.Orders.Order", "Order") + .WithMany("Payments") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Order"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Blogs.Blog", b => + { + b.HasOne("NetinaShop.Domain.Entities.Blogs.BlogCategory", "Category") + .WithMany("Blogs") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Discounts.Discount", b => + { + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationUser", "CorporateUser") + .WithMany() + .HasForeignKey("CorporateUserId"); + + b.Navigation("CorporateUser"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Orders.Order", b => + { + b.HasOne("NetinaShop.Domain.Entities.Discounts.Discount", null) + .WithMany("Orders") + .HasForeignKey("DiscountId"); + + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Orders.OrderDelivery", b => + { + b.HasOne("NetinaShop.Domain.Entities.Users.UserAddress", "Address") + .WithMany() + .HasForeignKey("AddressId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("NetinaShop.Domain.Entities.Orders.Order", "Order") + .WithOne("OrderDelivery") + .HasForeignKey("NetinaShop.Domain.Entities.Orders.OrderDelivery", "OrderId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("NetinaShop.Domain.Entities.Warehouses.Shipping", "Shipping") + .WithMany() + .HasForeignKey("ShippingId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Address"); + + b.Navigation("Order"); + + b.Navigation("Shipping"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Orders.OrderProduct", b => + { + b.HasOne("NetinaShop.Domain.Entities.Orders.Order", "Order") + .WithMany("OrderProducts") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("NetinaShop.Domain.Entities.Products.Product", "Product") + .WithMany("OrderProducts") + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Order"); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.ProductCategories.ProductCategory", b => + { + b.HasOne("NetinaShop.Domain.Entities.ProductCategories.ProductCategory", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Products.Product", b => + { + b.HasOne("NetinaShop.Domain.Entities.Brands.Brand", "Brand") + .WithMany("Products") + .HasForeignKey("BrandId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("NetinaShop.Domain.Entities.ProductCategories.ProductCategory", "Category") + .WithMany("Products") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Brand"); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Products.Review", b => + { + b.HasOne("NetinaShop.Domain.Entities.Products.Product", "Product") + .WithMany("Reviews") + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Product"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Products.Specification", b => + { + b.HasOne("NetinaShop.Domain.Entities.Products.Specification", "Parent") + .WithMany("Children") + .HasForeignKey("ParentId"); + + b.HasOne("NetinaShop.Domain.Entities.Products.Product", "Product") + .WithMany("Specifications") + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Parent"); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Users.UserAddress", b => + { + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationUser", "User") + .WithMany("Addresses") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Users.UserFavoriteProduct", b => + { + b.HasOne("NetinaShop.Domain.Entities.Products.Product", "Product") + .WithMany() + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("NetinaShop.Domain.Entities.Users.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Product"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Discounts.CategoryDiscount", b => + { + b.HasOne("NetinaShop.Domain.Entities.ProductCategories.ProductCategory", "Category") + .WithMany() + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Discounts.ProductDiscount", b => + { + b.HasOne("NetinaShop.Domain.Entities.Products.Product", "Product") + .WithMany() + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Blogs.BlogStorageFile", b => + { + b.HasOne("NetinaShop.Domain.Entities.Blogs.Blog", "Blog") + .WithMany("Files") + .HasForeignKey("BlogId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Blog"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Brands.BrandStorageFile", b => + { + b.HasOne("NetinaShop.Domain.Entities.Brands.Brand", "Brand") + .WithMany("Files") + .HasForeignKey("BrandId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Brand"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.ProductCategories.ProductCategoryStorageFile", b => + { + b.HasOne("NetinaShop.Domain.Entities.ProductCategories.ProductCategory", "Category") + .WithMany("Files") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Products.ProductStorageFile", b => + { + b.HasOne("NetinaShop.Domain.Entities.Products.Product", "Product") + .WithMany("Files") + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Blogs.Blog", b => + { + b.Navigation("Files"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Blogs.BlogCategory", b => + { + b.Navigation("Blogs"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Brands.Brand", b => + { + b.Navigation("Files"); + + b.Navigation("Products"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Discounts.Discount", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Orders.Order", b => + { + b.Navigation("OrderDelivery"); + + b.Navigation("OrderProducts"); + + b.Navigation("Payments"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.ProductCategories.ProductCategory", b => + { + b.Navigation("Files"); + + b.Navigation("Products"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Products.Product", b => + { + b.Navigation("Files"); + + b.Navigation("OrderProducts"); + + b.Navigation("Reviews"); + + b.Navigation("Specifications"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Products.Specification", b => + { + b.Navigation("Children"); + }); + + modelBuilder.Entity("NetinaShop.Domain.Entities.Users.ApplicationUser", b => + { + b.Navigation("Addresses"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/NetinaShop.Repository/Migrations/20240229174513_EditOrderAddDeliverAt.cs b/NetinaShop.Repository/Migrations/20240229174513_EditOrderAddDeliverAt.cs new file mode 100644 index 0000000..4627990 --- /dev/null +++ b/NetinaShop.Repository/Migrations/20240229174513_EditOrderAddDeliverAt.cs @@ -0,0 +1,32 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace NetinaShop.Repository.Migrations +{ + /// + public partial class EditOrderAddDeliverAt : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "DeliveredAt", + schema: "public", + table: "Orders", + type: "timestamp without time zone", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "DeliveredAt", + schema: "public", + table: "Orders"); + } + } +} diff --git a/NetinaShop.Repository/Migrations/ApplicationContextModelSnapshot.cs b/NetinaShop.Repository/Migrations/ApplicationContextModelSnapshot.cs index fcba2d8..2b5fbe7 100644 --- a/NetinaShop.Repository/Migrations/ApplicationContextModelSnapshot.cs +++ b/NetinaShop.Repository/Migrations/ApplicationContextModelSnapshot.cs @@ -463,6 +463,9 @@ namespace NetinaShop.Repository.Migrations b.Property("CreatedBy") .HasColumnType("text"); + b.Property("DeliveredAt") + .HasColumnType("timestamp without time zone"); + b.Property("DeliveryPrice") .HasColumnType("double precision"); diff --git a/Tools/NetinaShop.WordPressDBConverter/Program.cs b/Tools/NetinaShop.WordPressDBConverter/Program.cs index 4c88ba6..783caff 100644 --- a/Tools/NetinaShop.WordPressDBConverter/Program.cs +++ b/Tools/NetinaShop.WordPressDBConverter/Program.cs @@ -9,124 +9,126 @@ using Newtonsoft.Json; Console.ReadKey(); -try -{ - var termReader = new StreamReader("F:\\wp_terms.json"); - var termJson = termReader.ReadToEnd(); - Console.WriteLine("Terms File Read Success !"); - var terms = JsonConvert.DeserializeObject>(termJson); - if (terms == null) - throw new Exception("Terms is null"); - - var termTaxonomyReader = new StreamReader("F:\\wp_term_taxonomy.json"); - var termTaxonomyJson = termTaxonomyReader.ReadToEnd(); - Console.WriteLine("Term Taxonomy File Read Success !"); - var termTaxonomies = JsonConvert.DeserializeObject>(termTaxonomyJson); - if (termTaxonomies == null) - throw new Exception("Term Taxonomies is null"); - var termRelationshipsReader = new StreamReader("F:\\wp_term_relationships.json"); - var termRelationshipsJson = termRelationshipsReader.ReadToEnd(); - Console.WriteLine("Term Relationships File Read Success !"); - var termRelationships = JsonConvert.DeserializeObject>(termRelationshipsJson); - if (termRelationships == null) - throw new Exception("Term Relationships is null"); +//try +//{ +// var termReader = new StreamReader("F:\\wp_terms.json"); +// var termJson = termReader.ReadToEnd(); +// Console.WriteLine("Terms File Read Success !"); +// var terms = JsonConvert.DeserializeObject>(termJson); +// if (terms == null) +// throw new Exception("Terms is null"); - var postReader = new StreamReader("F:\\wp_posts.json"); - var json = postReader.ReadToEnd(); - Console.WriteLine("Post File Read Success !"); - var posts = JsonConvert.DeserializeObject>(json); - if (posts == null) - throw new Exception("Posts is null"); +// var termTaxonomyReader = new StreamReader("F:\\wp_term_taxonomy.json"); +// var termTaxonomyJson = termTaxonomyReader.ReadToEnd(); +// Console.WriteLine("Term Taxonomy File Read Success !"); +// var termTaxonomies = JsonConvert.DeserializeObject>(termTaxonomyJson); +// if (termTaxonomies == null) +// throw new Exception("Term Taxonomies is null"); - var metaReader = new StreamReader("F:\\wp_postmeta.json"); - var metaJson = metaReader.ReadToEnd(); - Console.WriteLine("Post Metas File Read Success !"); - var postMetas = JsonConvert.DeserializeObject>(metaJson); - if (postMetas == null) - throw new Exception("Post Metas is null"); +// var termRelationshipsReader = new StreamReader("F:\\wp_term_relationships.json"); +// var termRelationshipsJson = termRelationshipsReader.ReadToEnd(); +// Console.WriteLine("Term Relationships File Read Success !"); +// var termRelationships = JsonConvert.DeserializeObject>(termRelationshipsJson); +// if (termRelationships == null) +// throw new Exception("Term Relationships is null"); -//CREATE CATEGORY PART - List categories = new List(); - foreach (var taxonomy in termTaxonomies) - { - if (taxonomy.taxonomy == "product_cat") - { - var term = terms.FirstOrDefault(t => t.term_id == taxonomy.term_id); - if (term != null) - categories.Add(new SeedCategoryRequestDto - { BaseCategoryId = term.term_id.ToInt(), Description = taxonomy.description, Name = term.name }); - } - } +// var postReader = new StreamReader("F:\\wp_posts.json"); +// var json = postReader.ReadToEnd(); +// Console.WriteLine("Post File Read Success !"); +// var posts = JsonConvert.DeserializeObject>(json); +// if (posts == null) +// throw new Exception("Posts is null"); - var categoriesRest = await RestWrapper.Instance.SeedRestApi.SeedCategoriesAsync(categories,"kKAYskyG8xPxKnJrHkuYxub4Ao2bnz7AOmNtwDT0RaqzaG7ZvbvaP29tCrC8wJ823RczJFXOIQT2bDOec4F38A=="); - Console.WriteLine($"{categories.Count} ProductCategory Added Success !"); - //CREATE BRAND PART - List brands = new List(); - foreach (var taxonomy in termTaxonomies) - { - if (taxonomy.taxonomy == "pa_brand") - { - var term = terms.FirstOrDefault(t => t.term_id == taxonomy.term_id); - if (term != null) - brands.Add(new SeedBrandRequestDto{BaseBrandId = term.term_id.ToInt(),Description = taxonomy.description,Name = term.name}); - } - } - var brandsRest = await RestWrapper.Instance.SeedRestApi.SeedBrandsAsync(brands, "kKAYskyG8xPxKnJrHkuYxub4Ao2bnz7AOmNtwDT0RaqzaG7ZvbvaP29tCrC8wJ823RczJFXOIQT2bDOec4F38A=="); +// var metaReader = new StreamReader("F:\\wp_postmeta.json"); +// var metaJson = metaReader.ReadToEnd(); +// Console.WriteLine("Post Metas File Read Success !"); +// var postMetas = JsonConvert.DeserializeObject>(metaJson); +// if (postMetas == null) +// throw new Exception("Post Metas is null"); - Console.WriteLine($"{brands.Count} Brand Added Success !"); - //CREATE PRODUCT PART - List products = new List(); - foreach (var wordPressPostDto in posts.Where(p => p.post_type == "product")) - { - CreateProductCommand product; - Guid brandId = default; - Guid categoryId = default; - var postTermRelations = termRelationships.Where(p => p.object_id == wordPressPostDto.ID); - foreach (var postTermRelation in postTermRelations) - { - var taxanomy = termTaxonomies.FirstOrDefault(f => f.term_taxonomy_id == postTermRelation.term_taxonomy_id); - if (taxanomy != null) - { - if (taxanomy.taxonomy == "pa_brand") - brandId = brandsRest.FirstOrDefault(f => f.Key == taxanomy.term_id.ToInt()).Value; - if (taxanomy.taxonomy == "product_cat") - categoryId = categoriesRest.FirstOrDefault(c => c.Key == taxanomy.term_id.ToInt()).Value; - } - } +////CREATE CATEGORY PART +// List categories = new List(); +// foreach (var taxonomy in termTaxonomies) +// { +// if (taxonomy.taxonomy == "product_cat") +// { +// var term = terms.FirstOrDefault(t => t.term_id == taxonomy.term_id); +// if (term != null) +// categories.Add(new SeedCategoryRequestDto +// { BaseCategoryId = term.term_id.ToInt(), Description = taxonomy.description, Name = term.name }); +// } +// } - if (brandId == default) - brandId = brandsRest.FirstOrDefault(f => f.Key == 0).Value; - if (categoryId == default) - categoryId = categoriesRest.FirstOrDefault(c => c.Key == 0).Value; - var price = postMetas.FirstOrDefault(pm => pm.post_id == wordPressPostDto.ID && pm.meta_key == "_price"); - if (price != null && double.TryParse(price.meta_value, out double dPrice)) - product = new CreateProductCommand(wordPressPostDto.post_title, string.Empty, wordPressPostDto.post_content, - wordPressPostDto.post_excerpt, string.Empty, string.Empty, true, dPrice, 0,10, - false,10,false,brandId, categoryId, - new DiscountSDto(),new List(), new List()); - else - product = new CreateProductCommand(wordPressPostDto.post_title, string.Empty, wordPressPostDto.post_content, - wordPressPostDto.post_excerpt, string.Empty, string.Empty, true, 0, 0,10,false,10, - false,brandId,categoryId, - new DiscountSDto(),new List(), new List()); +// var categoriesRest = await RestWrapper.Instance.SeedRestApi.SeedCategoriesAsync(categories,"kKAYskyG8xPxKnJrHkuYxub4Ao2bnz7AOmNtwDT0RaqzaG7ZvbvaP29tCrC8wJ823RczJFXOIQT2bDOec4F38A=="); +// Console.WriteLine($"{categories.Count} ProductCategory Added Success !"); - products.Add(product); - } +// //CREATE BRAND PART +// List brands = new List(); +// foreach (var taxonomy in termTaxonomies) +// { +// if (taxonomy.taxonomy == "pa_brand") +// { +// var term = terms.FirstOrDefault(t => t.term_id == taxonomy.term_id); +// if (term != null) +// brands.Add(new SeedBrandRequestDto{BaseBrandId = term.term_id.ToInt(),Description = taxonomy.description,Name = term.name}); +// } +// } +// var brandsRest = await RestWrapper.Instance.SeedRestApi.SeedBrandsAsync(brands, "kKAYskyG8xPxKnJrHkuYxub4Ao2bnz7AOmNtwDT0RaqzaG7ZvbvaP29tCrC8wJ823RczJFXOIQT2bDOec4F38A=="); - for (int i = 0; i < products.Count / 50 ; i++) - { - await RestWrapper.Instance.SeedRestApi.SeedProductsAsync(products.Skip(i * 50).Take(50).ToList(), - "kKAYskyG8xPxKnJrHkuYxub4Ao2bnz7AOmNtwDT0RaqzaG7ZvbvaP29tCrC8wJ823RczJFXOIQT2bDOec4F38A=="); +// Console.WriteLine($"{brands.Count} Brand Added Success !"); +// //CREATE PRODUCT PART +// List products = new List(); +// foreach (var wordPressPostDto in posts.Where(p => p.post_type == "product")) +// { +// CreateProductCommand product; +// Guid brandId = default; +// Guid categoryId = default; +// var postTermRelations = termRelationships.Where(p => p.object_id == wordPressPostDto.ID); +// foreach (var postTermRelation in postTermRelations) +// { +// var taxanomy = termTaxonomies.FirstOrDefault(f => f.term_taxonomy_id == postTermRelation.term_taxonomy_id); +// if (taxanomy != null) +// { +// if (taxanomy.taxonomy == "pa_brand") +// brandId = brandsRest.FirstOrDefault(f => f.Key == taxanomy.term_id.ToInt()).Value; +// if (taxanomy.taxonomy == "product_cat") +// categoryId = categoriesRest.FirstOrDefault(c => c.Key == taxanomy.term_id.ToInt()).Value; +// } +// } - Console.WriteLine($"{i*50} / {products.Count} Product Added Success !"); - } -} -catch (Exception e) -{ - Console.WriteLine(e); - throw; -} \ No newline at end of file +// if (brandId == default) +// brandId = brandsRest.FirstOrDefault(f => f.Key == 0).Value; +// if (categoryId == default) +// categoryId = categoriesRest.FirstOrDefault(c => c.Key == 0).Value; +// var price = postMetas.FirstOrDefault(pm => pm.post_id == wordPressPostDto.ID && pm.meta_key == "_price"); +// if (price != null && double.TryParse(price.meta_value, out double dPrice)) +// product = new CreateProductCommand(wordPressPostDto.post_title, string.Empty, wordPressPostDto.post_content, +// wordPressPostDto.post_excerpt, string.Empty, string.Empty, true, dPrice, 0,10, +// false,10,false,brandId, categoryId, +// new DiscountSDto(),new List(), new List()); +// else +// product = new CreateProductCommand(wordPressPostDto.post_title, string.Empty, wordPressPostDto.post_content, +// wordPressPostDto.post_excerpt, string.Empty, string.Empty, true, 0, 0,10,false,10, +// false,brandId,categoryId, +// new DiscountSDto(),new List(), new List()); + +// products.Add(product); +// } + +// for (int i = 0; i < products.Count / 50 ; i++) +// { +// await RestWrapper.Instance.SeedRestApi.SeedProductsAsync(products.Skip(i * 50).Take(50).ToList(), +// "kKAYskyG8xPxKnJrHkuYxub4Ao2bnz7AOmNtwDT0RaqzaG7ZvbvaP29tCrC8wJ823RczJFXOIQT2bDOec4F38A=="); + +// Console.WriteLine($"{i*50} / {products.Count} Product Added Success !"); +// } +//} +//catch (Exception e) +//{ +// Console.WriteLine(e); +// throw; +//} \ No newline at end of file