From 492a96ecf1eaadeb071a562d598084a365de3705 Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:27:52 +0300 Subject: [PATCH 01/19] feat: Add price and section ID to configuration items and include product snapshot in line items --- .../Model/ConfigurationItem.cs | 10 + .../Model/LineItem.cs | 4 +- .../VirtoCommerce.OrdersModule.Core.csproj | 2 +- .../ConfigurationItemEntityConfiguration.cs | 15 + ...AddOrderConfigurationItemPrice.Designer.cs | 2255 +++++++++++++++++ ...09111643_AddOrderConfigurationItemPrice.cs | 78 + .../Migrations/OrderDbContextModelSnapshot.cs | 20 +- ...AddOrderConfigurationItemPrice.Designer.cs | 2202 ++++++++++++++++ ...09110924_AddOrderConfigurationItemPrice.cs | 71 + .../Migrations/OrderDbContextModelSnapshot.cs | 18 +- ...AddOrderConfigurationItemPrice.Designer.cs | 2203 ++++++++++++++++ ...09110744_AddOrderConfigurationItemPrice.cs | 71 + .../Migrations/OrderDbContextModelSnapshot.cs | 18 +- .../Model/ConfigurationItemEntity.cs | 24 + .../Model/LineItemEntity.cs | 6 + .../Repositories/OrderDbContext.cs | 3 +- .../Services/CustomerOrderBuilder.cs | 9 +- .../VirtoCommerce.OrdersModule.Data.csproj | 2 +- .../module.manifest | 4 +- 19 files changed, 7002 insertions(+), 13 deletions(-) create mode 100644 src/VirtoCommerce.OrdersModule.Data.MySql/ConfigurationItemEntityConfiguration.cs create mode 100644 src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/20251209111643_AddOrderConfigurationItemPrice.Designer.cs create mode 100644 src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/20251209111643_AddOrderConfigurationItemPrice.cs create mode 100644 src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/20251209110924_AddOrderConfigurationItemPrice.Designer.cs create mode 100644 src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/20251209110924_AddOrderConfigurationItemPrice.cs create mode 100644 src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/20251209110744_AddOrderConfigurationItemPrice.Designer.cs create mode 100644 src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/20251209110744_AddOrderConfigurationItemPrice.cs diff --git a/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs b/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs index b75927a53..62d3f900d 100644 --- a/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs +++ b/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs @@ -10,12 +10,20 @@ public class ConfigurationItem : AuditableEntity { public string ProductId { get; set; } + public string SectionId { get; set; } + public string Name { get; set; } public string Sku { get; set; } public int Quantity { get; set; } + public decimal Price { get; set; } + + public decimal SalePrice { get; set; } + + public virtual decimal ExtendedPrice => SalePrice * Quantity; + public string ImageUrl { get; set; } public string CatalogId { get; set; } @@ -26,6 +34,8 @@ public class ConfigurationItem : AuditableEntity public string CustomText { get; set; } + public string ProductSnapshot { get; set; } + public IList Files { get; set; } public object Clone() diff --git a/src/VirtoCommerce.OrdersModule.Core/Model/LineItem.cs b/src/VirtoCommerce.OrdersModule.Core/Model/LineItem.cs index 3c65c4b82..a8bd74f73 100644 --- a/src/VirtoCommerce.OrdersModule.Core/Model/LineItem.cs +++ b/src/VirtoCommerce.OrdersModule.Core/Model/LineItem.cs @@ -59,7 +59,7 @@ public class LineItem : AuditableEntity, IHasOuterId, IHasTaxDetalization, ISupp public decimal DiscountTotalWithTax { get; set; } - //Any extra Fee + //Any extra Fee public virtual decimal Fee { get; set; } public virtual decimal FeeWithTax { get; set; } @@ -109,6 +109,8 @@ public class LineItem : AuditableEntity, IHasOuterId, IHasTaxDetalization, ISupp public bool IsConfigured { get; set; } + public string ProductSnapshot { get; set; } + #region IHaveDimension Members public string WeightUnit { get; set; } diff --git a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj index 013762dd0..fd5f28f00 100644 --- a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj +++ b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Data.MySql/ConfigurationItemEntityConfiguration.cs b/src/VirtoCommerce.OrdersModule.Data.MySql/ConfigurationItemEntityConfiguration.cs new file mode 100644 index 000000000..ff088db57 --- /dev/null +++ b/src/VirtoCommerce.OrdersModule.Data.MySql/ConfigurationItemEntityConfiguration.cs @@ -0,0 +1,15 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using VirtoCommerce.OrdersModule.Data.Model; + +namespace VirtoCommerce.OrdersModule.Data.MySql +{ + public class ConfigurationItemEntityConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.Property(x => x.Price).HasColumnType("decimal").HasPrecision(18, 4); + builder.Property(x => x.SalePrice).HasColumnType("decimal").HasPrecision(18, 4); + } + } +} diff --git a/src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/20251209111643_AddOrderConfigurationItemPrice.Designer.cs b/src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/20251209111643_AddOrderConfigurationItemPrice.Designer.cs new file mode 100644 index 000000000..8de1476de --- /dev/null +++ b/src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/20251209111643_AddOrderConfigurationItemPrice.Designer.cs @@ -0,0 +1,2255 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using VirtoCommerce.OrdersModule.Data.Repositories; + +#nullable disable + +namespace VirtoCommerce.OrdersModule.Data.MySql.Migrations +{ + [DbContext(typeof(OrderDbContext))] + [Migration("20251209111643_AddOrderConfigurationItemPrice")] + partial class AddOrderConfigurationItemPrice + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.11") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.AddressEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("AddressType") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("City") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CountryCode") + .HasMaxLength(3) + .HasColumnType("varchar(3)"); + + b.Property("CountryName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CustomerOrderId") + .HasColumnType("varchar(128)"); + + b.Property("Description") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("FirstName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("LastName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Line1") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("Line2") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("MiddleName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Name") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("Organization") + .HasMaxLength(512) + .HasColumnType("varchar(512)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PaymentInId") + .HasColumnType("varchar(128)"); + + b.Property("Phone") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("PostalCode") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("RegionId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("RegionName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ShipmentId") + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderAddress", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Amount") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime(6)"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("CloseTransaction") + .HasColumnType("tinyint(1)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("varchar(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("varchar(128)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PaymentId") + .HasColumnType("varchar(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Sum") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TransactionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("VendorId") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("PaymentId"); + + b.HasIndex("TransactionId", "CustomerOrderId") + .IsUnique(); + + b.ToTable("OrderCapture", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CaptureId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("LineItemId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CaptureId"); + + b.HasIndex("LineItemId"); + + b.ToTable("OrderCaptureItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CatalogId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CategoryId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("CustomText") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ImageUrl") + .HasMaxLength(1028) + .HasColumnType("varchar(1028)"); + + b.Property("LineItemId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("Price") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("ProductId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ProductSnapshot") + .HasColumnType("longtext"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("SalePrice") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("SectionId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Sku") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("LineItemId"); + + b.ToTable("OrderConfigurationItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemFileEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ConfigurationItemId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ContentType") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("Size") + .HasColumnType("bigint"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(2083) + .HasColumnType("varchar(2083)"); + + b.HasKey("Id"); + + b.HasIndex("ConfigurationItemId"); + + b.ToTable("OrderConfigurationItemFile", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime(6)"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("ChannelId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("varchar(3)"); + + b.Property("CustomerId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CustomerName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("DiscountAmount") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("DiscountTotal") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("DiscountTotalWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("EmployeeId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("EmployeeName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Fee") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("FeeTotal") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("FeeTotalWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("FeeWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("HandlingTotal") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("HandlingTotalWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("IsAnonymous") + .HasColumnType("tinyint(1)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrototype") + .HasColumnType("tinyint(1)"); + + b.Property("LanguageCode") + .HasMaxLength(16) + .HasColumnType("varchar(16)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("OrganizationId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("OrganizationName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PaymentTotal") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("PaymentTotalWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("PurchaseOrderNumber") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp(6)"); + + b.Property("ShippingTotal") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("ShippingTotalWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("ShoppingCartId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("StoreId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("StoreName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("SubTotal") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("SubTotalWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("SubscriptionId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("SubscriptionNumber") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Sum") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("Total") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.HasKey("Id"); + + b.HasIndex("OuterId"); + + b.ToTable("CustomerOrder", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.DiscountEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CouponCode") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CouponInvalidDescription") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("varchar(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("varchar(128)"); + + b.Property("DiscountAmount") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("DiscountAmountWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("LineItemId") + .HasColumnType("varchar(128)"); + + b.Property("PaymentInId") + .HasColumnType("varchar(128)"); + + b.Property("PromotionDescription") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("PromotionId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("PromotionName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ShipmentId") + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderDiscount", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.FeeDetailEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Amount") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("Currency") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CustomerOrderId") + .HasColumnType("varchar(128)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeeId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("LineItemId") + .HasColumnType("varchar(128)"); + + b.Property("PaymentInId") + .HasColumnType("varchar(128)"); + + b.Property("ShipmentId") + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderFeeDetail", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime(6)"); + + b.Property("CatalogId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CategoryId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("varchar(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("varchar(128)"); + + b.Property("DiscountAmount") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("DiscountAmountWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("Fee") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("FeeWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("FulfillmentCenterId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("FulfillmentCenterName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("FulfillmentLocationCode") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Height") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("ImageUrl") + .HasMaxLength(1028) + .HasColumnType("varchar(1028)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsConfigured") + .HasColumnType("tinyint(1)"); + + b.Property("IsDiscountAmountRounded") + .HasColumnType("tinyint(1)"); + + b.Property("IsGift") + .HasColumnType("tinyint(1)"); + + b.Property("IsReccuring") + .HasColumnType("tinyint(1)"); + + b.Property("Length") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("MeasureUnit") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Price") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("PriceId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PriceWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("ProductId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ProductOuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ProductSnapshot") + .HasColumnType("longtext"); + + b.Property("ProductType") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("ShippingMethodCode") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Sku") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TaxType") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("VendorId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Weight") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("WeightUnit") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("Width") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.ToTable("OrderLineItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.OrderDynamicPropertyObjectValueEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("BooleanValue") + .HasColumnType("tinyint(1)"); + + b.Property("CaptureId") + .HasColumnType("varchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("CustomerOrderId") + .HasColumnType("varchar(128)"); + + b.Property("DateTimeValue") + .HasColumnType("datetime(6)"); + + b.Property("DecimalValue") + .HasColumnType("decimal(18,5)"); + + b.Property("DictionaryItemId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("IntegerValue") + .HasColumnType("int"); + + b.Property("LineItemId") + .HasColumnType("varchar(128)"); + + b.Property("Locale") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("LongTextValue") + .HasColumnType("longtext"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("ObjectId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ObjectType") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("PaymentInId") + .HasColumnType("varchar(128)"); + + b.Property("PropertyId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PropertyName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("RefundId") + .HasColumnType("varchar(128)"); + + b.Property("ShipmentId") + .HasColumnType("varchar(128)"); + + b.Property("ShortTextValue") + .HasMaxLength(512) + .HasColumnType("varchar(512)"); + + b.Property("ValueType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("CaptureId"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("RefundId"); + + b.HasIndex("ShipmentId"); + + b.HasIndex("ObjectType", "CustomerOrderId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_CustomerOrderId"); + + b.HasIndex("ObjectType", "LineItemId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_LineItemId"); + + b.HasIndex("ObjectType", "ObjectId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_ObjectId"); + + b.HasIndex("ObjectType", "PaymentInId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_PaymentInId"); + + b.HasIndex("ObjectType", "RefundId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_RefundId"); + + b.HasIndex("ObjectType", "ShipmentId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_ShipmentId"); + + b.ToTable("OrderDynamicPropertyObjectValue", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentGatewayTransactionEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Amount") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("Currency") + .HasMaxLength(3) + .HasColumnType("varchar(3)"); + + b.Property("GatewayIpAddress") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("IsProcessed") + .HasColumnType("tinyint(1)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Note") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("PaymentInId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("ProcessAttemptCount") + .HasColumnType("int"); + + b.Property("ProcessError") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("ProcessedDate") + .HasColumnType("datetime(6)"); + + b.Property("RequestData") + .HasColumnType("longtext"); + + b.Property("ResponseCode") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ResponseData") + .HasColumnType("longtext"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Type") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("PaymentInId"); + + b.ToTable("OrderPaymentGatewayTransaction", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("AuthorizedDate") + .HasColumnType("datetime(6)"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime(6)"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("CapturedDate") + .HasColumnType("datetime(6)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("varchar(3)"); + + b.Property("CustomerId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CustomerName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("CustomerOrderId") + .HasColumnType("varchar(128)"); + + b.Property("DiscountAmount") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("DiscountAmountWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("GatewayCode") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("IncomingDate") + .HasColumnType("datetime(6)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("OrganizationId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("OrganizationName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Price") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("PriceWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("Purpose") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("ShipmentId") + .HasColumnType("varchar(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Sum") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TaxType") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Total") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TotalWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("VendorId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("VoidedDate") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("OuterId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderPaymentIn", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Amount") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime(6)"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("varchar(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("varchar(128)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PaymentId") + .HasColumnType("varchar(128)"); + + b.Property("ReasonCode") + .HasColumnType("longtext"); + + b.Property("ReasonMessage") + .HasColumnType("longtext"); + + b.Property("RejectReasonMessage") + .HasColumnType("longtext"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Sum") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TransactionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("VendorId") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("PaymentId"); + + b.HasIndex("TransactionId", "CustomerOrderId") + .IsUnique(); + + b.ToTable("OrderRefund", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("LineItemId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("RefundId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("LineItemId"); + + b.HasIndex("RefundId"); + + b.ToTable("OrderRefundItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime(6)"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("varchar(3)"); + + b.Property("CustomerOrderId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("DeliveryDate") + .HasColumnType("datetime(6)"); + + b.Property("DiscountAmount") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("DiscountAmountWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("EmployeeId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("EmployeeName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Fee") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("FeeWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("FulfillmentCenterId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("FulfillmentCenterName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Height") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("Length") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("MeasureUnit") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("OrganizationId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("OrganizationName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PickupLocationId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Price") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("PriceWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("ShipmentMethodCode") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ShipmentMethodOption") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Sum") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TaxType") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Total") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TotalWithTax") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("TrackingNumber") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("TrackingUrl") + .HasColumnType("longtext"); + + b.Property("VendorId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("VolumetricWeight") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("Weight") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("WeightUnit") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("Width") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("OuterId"); + + b.ToTable("OrderShipment", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("BarCode") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("LineItemId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("ShipmentId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("ShipmentPackageId") + .HasColumnType("varchar(128)"); + + b.Property("Status") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("LineItemId"); + + b.HasIndex("ShipmentId"); + + b.HasIndex("ShipmentPackageId"); + + b.ToTable("OrderShipmentItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("BarCode") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("Height") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("Length") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("MeasureUnit") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("PackageType") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ShipmentId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("Weight") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("WeightUnit") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("Width") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.HasKey("Id"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderShipmentPackage", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.TaxDetailEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Amount") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("CustomerOrderId") + .HasColumnType("varchar(128)"); + + b.Property("LineItemId") + .HasColumnType("varchar(128)"); + + b.Property("Name") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("PaymentInId") + .HasColumnType("varchar(128)"); + + b.Property("Rate") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("ShipmentId") + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderTaxDetail", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.AddressEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Addresses") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("Addresses") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Addresses") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany() + .HasForeignKey("CustomerOrderId"); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "Payment") + .WithMany("Captures") + .HasForeignKey("PaymentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("Payment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", "Capture") + .WithMany("Items") + .HasForeignKey("CaptureId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("CaptureItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Capture"); + + b.Navigation("LineItem"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("ConfigurationItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.ClientCascade) + .IsRequired(); + + b.Navigation("LineItem"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemFileEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", "ConfigurationItem") + .WithMany("Files") + .HasForeignKey("ConfigurationItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ConfigurationItem"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.DiscountEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Discounts") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("Discounts") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("Discounts") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Discounts") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.FeeDetailEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("FeeDetails") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("FeeDetails") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("FeeDetails") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("FeeDetails") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Items") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.OrderDynamicPropertyObjectValueEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", "Capture") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("CaptureId"); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", "Refund") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("RefundId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("Capture"); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Refund"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentGatewayTransactionEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("Transactions") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PaymentIn"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("InPayments") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("InPayments") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("CustomerOrder"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany() + .HasForeignKey("CustomerOrderId"); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "Payment") + .WithMany("Refunds") + .HasForeignKey("PaymentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("Payment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("RefundItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", "Refund") + .WithMany("Items") + .HasForeignKey("RefundId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("LineItem"); + + b.Navigation("Refund"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Shipments") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CustomerOrder"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("ShipmentItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Items") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", "ShipmentPackage") + .WithMany("Items") + .HasForeignKey("ShipmentPackageId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("LineItem"); + + b.Navigation("Shipment"); + + b.Navigation("ShipmentPackage"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Packages") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.TaxDetailEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("TaxDetails") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("TaxDetails") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("TaxDetails") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("TaxDetails") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", b => + { + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("Items"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", b => + { + b.Navigation("Files"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", b => + { + b.Navigation("Addresses"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("InPayments"); + + b.Navigation("Items"); + + b.Navigation("Shipments"); + + b.Navigation("TaxDetails"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", b => + { + b.Navigation("CaptureItems"); + + b.Navigation("ConfigurationItems"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("RefundItems"); + + b.Navigation("ShipmentItems"); + + b.Navigation("TaxDetails"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", b => + { + b.Navigation("Addresses"); + + b.Navigation("Captures"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("Refunds"); + + b.Navigation("TaxDetails"); + + b.Navigation("Transactions"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", b => + { + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("Items"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", b => + { + b.Navigation("Addresses"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("InPayments"); + + b.Navigation("Items"); + + b.Navigation("Packages"); + + b.Navigation("TaxDetails"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", b => + { + b.Navigation("Items"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/20251209111643_AddOrderConfigurationItemPrice.cs b/src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/20251209111643_AddOrderConfigurationItemPrice.cs new file mode 100644 index 000000000..4fea2147c --- /dev/null +++ b/src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/20251209111643_AddOrderConfigurationItemPrice.cs @@ -0,0 +1,78 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace VirtoCommerce.OrdersModule.Data.MySql.Migrations +{ + /// + public partial class AddOrderConfigurationItemPrice : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ProductSnapshot", + table: "OrderLineItem", + type: "longtext", + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AddColumn( + name: "Price", + table: "OrderConfigurationItem", + type: "decimal(18,4)", + precision: 18, + scale: 4, + nullable: false, + defaultValue: 0m); + + migrationBuilder.AddColumn( + name: "SalePrice", + table: "OrderConfigurationItem", + type: "decimal(18,4)", + precision: 18, + scale: 4, + nullable: false, + defaultValue: 0m); + + migrationBuilder.AddColumn( + name: "SectionId", + table: "OrderConfigurationItem", + type: "varchar(128)", + maxLength: 128, + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AddColumn( + name: "ProductSnapshot", + table: "OrderConfigurationItem", + type: "longtext", + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ProductSnapshot", + table: "OrderLineItem"); + + migrationBuilder.DropColumn( + name: "Price", + table: "OrderConfigurationItem"); + + migrationBuilder.DropColumn( + name: "SalePrice", + table: "OrderConfigurationItem"); + + migrationBuilder.DropColumn( + name: "SectionId", + table: "OrderConfigurationItem"); + + migrationBuilder.DropColumn( + name: "ProductSnapshot", + table: "OrderConfigurationItem"); + } + } +} diff --git a/src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/OrderDbContextModelSnapshot.cs b/src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/OrderDbContextModelSnapshot.cs index fc33ff2e5..fbb0b67ea 100644 --- a/src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/OrderDbContextModelSnapshot.cs +++ b/src/VirtoCommerce.OrdersModule.Data.MySql/Migrations/OrderDbContextModelSnapshot.cs @@ -1,4 +1,4 @@ -// +// using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -316,13 +316,28 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(1024) .HasColumnType("varchar(1024)"); + b.Property("Price") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + b.Property("ProductId") .HasMaxLength(128) .HasColumnType("varchar(128)"); + b.Property("ProductSnapshot") + .HasColumnType("longtext"); + b.Property("Quantity") .HasColumnType("int"); + b.Property("SalePrice") + .HasPrecision(18, 4) + .HasColumnType("decimal"); + + b.Property("SectionId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + b.Property("Sku") .HasMaxLength(128) .HasColumnType("varchar(128)"); @@ -853,6 +868,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(128) .HasColumnType("varchar(128)"); + b.Property("ProductSnapshot") + .HasColumnType("longtext"); + b.Property("ProductType") .HasMaxLength(64) .HasColumnType("varchar(64)"); diff --git a/src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/20251209110924_AddOrderConfigurationItemPrice.Designer.cs b/src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/20251209110924_AddOrderConfigurationItemPrice.Designer.cs new file mode 100644 index 000000000..e6daa87ca --- /dev/null +++ b/src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/20251209110924_AddOrderConfigurationItemPrice.Designer.cs @@ -0,0 +1,2202 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using VirtoCommerce.OrdersModule.Data.Repositories; + +#nullable disable + +namespace VirtoCommerce.OrdersModule.Data.PostgreSql.Migrations +{ + [DbContext(typeof(OrderDbContext))] + [Migration("20251209110924_AddOrderConfigurationItemPrice")] + partial class AddOrderConfigurationItemPrice + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.11") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.AddressEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("AddressType") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("City") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CountryCode") + .HasMaxLength(3) + .HasColumnType("character varying(3)"); + + b.Property("CountryName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CustomerOrderId") + .HasColumnType("character varying(128)"); + + b.Property("Description") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("FirstName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("LastName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Line1") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("Line2") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("MiddleName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Name") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("Organization") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PaymentInId") + .HasColumnType("character varying(128)"); + + b.Property("Phone") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("PostalCode") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("RegionId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("RegionName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ShipmentId") + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderAddress", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Amount") + .HasColumnType("Money"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CancelledDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("CloseTransaction") + .HasColumnType("boolean"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("character varying(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("character varying(128)"); + + b.Property("IsApproved") + .HasColumnType("boolean"); + + b.Property("IsCancelled") + .HasColumnType("boolean"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PaymentId") + .HasColumnType("character varying(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Sum") + .HasColumnType("Money"); + + b.Property("TransactionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("VendorId") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("PaymentId"); + + b.HasIndex("TransactionId", "CustomerOrderId") + .IsUnique(); + + b.ToTable("OrderCapture", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CaptureId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("LineItemId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Quantity") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("CaptureId"); + + b.HasIndex("LineItemId"); + + b.ToTable("OrderCaptureItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CatalogId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CategoryId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CustomText") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ImageUrl") + .HasMaxLength(1028) + .HasColumnType("character varying(1028)"); + + b.Property("LineItemId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("Price") + .HasColumnType("Money"); + + b.Property("ProductId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProductSnapshot") + .HasColumnType("text"); + + b.Property("Quantity") + .HasColumnType("integer"); + + b.Property("SalePrice") + .HasColumnType("Money"); + + b.Property("SectionId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Sku") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasKey("Id"); + + b.HasIndex("LineItemId"); + + b.ToTable("OrderConfigurationItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemFileEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ConfigurationItemId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ContentType") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("Size") + .HasColumnType("bigint"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(2083) + .HasColumnType("character varying(2083)"); + + b.HasKey("Id"); + + b.HasIndex("ConfigurationItemId"); + + b.ToTable("OrderConfigurationItemFile", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CancelledDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("ChannelId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("character varying(3)"); + + b.Property("CustomerId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CustomerName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("DiscountAmount") + .HasColumnType("Money"); + + b.Property("DiscountTotal") + .HasColumnType("Money"); + + b.Property("DiscountTotalWithTax") + .HasColumnType("Money"); + + b.Property("EmployeeId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("EmployeeName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Fee") + .HasColumnType("Money"); + + b.Property("FeeTotal") + .HasColumnType("Money"); + + b.Property("FeeTotalWithTax") + .HasColumnType("Money"); + + b.Property("FeeWithTax") + .HasColumnType("Money"); + + b.Property("HandlingTotal") + .HasColumnType("Money"); + + b.Property("HandlingTotalWithTax") + .HasColumnType("Money"); + + b.Property("IsAnonymous") + .HasColumnType("boolean"); + + b.Property("IsApproved") + .HasColumnType("boolean"); + + b.Property("IsCancelled") + .HasColumnType("boolean"); + + b.Property("IsPrototype") + .HasColumnType("boolean"); + + b.Property("LanguageCode") + .HasMaxLength(16) + .HasColumnType("character varying(16)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("OrganizationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("OrganizationName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PaymentTotal") + .HasColumnType("Money"); + + b.Property("PaymentTotalWithTax") + .HasColumnType("Money"); + + b.Property("PurchaseOrderNumber") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("ShippingTotal") + .HasColumnType("Money"); + + b.Property("ShippingTotalWithTax") + .HasColumnType("Money"); + + b.Property("ShoppingCartId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("StoreId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("StoreName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("SubTotal") + .HasColumnType("Money"); + + b.Property("SubTotalWithTax") + .HasColumnType("Money"); + + b.Property("SubscriptionId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("SubscriptionNumber") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Sum") + .HasColumnType("Money"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasColumnType("Money"); + + b.Property("Total") + .HasColumnType("Money"); + + b.HasKey("Id"); + + b.HasIndex("OuterId"); + + b.ToTable("CustomerOrder", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.DiscountEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CouponCode") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CouponInvalidDescription") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("character varying(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("character varying(128)"); + + b.Property("DiscountAmount") + .HasColumnType("Money"); + + b.Property("DiscountAmountWithTax") + .HasColumnType("Money"); + + b.Property("LineItemId") + .HasColumnType("character varying(128)"); + + b.Property("PaymentInId") + .HasColumnType("character varying(128)"); + + b.Property("PromotionDescription") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("PromotionId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("PromotionName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ShipmentId") + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderDiscount", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.FeeDetailEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Amount") + .HasColumnType("Money"); + + b.Property("Currency") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CustomerOrderId") + .HasColumnType("character varying(128)"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("FeeId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("LineItemId") + .HasColumnType("character varying(128)"); + + b.Property("PaymentInId") + .HasColumnType("character varying(128)"); + + b.Property("ShipmentId") + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderFeeDetail", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CancelledDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CatalogId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CategoryId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("character varying(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("character varying(128)"); + + b.Property("DiscountAmount") + .HasColumnType("Money"); + + b.Property("DiscountAmountWithTax") + .HasColumnType("Money"); + + b.Property("Fee") + .HasColumnType("Money"); + + b.Property("FeeWithTax") + .HasColumnType("Money"); + + b.Property("FulfillmentCenterId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("FulfillmentCenterName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("FulfillmentLocationCode") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Height") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.Property("ImageUrl") + .HasMaxLength(1028) + .HasColumnType("character varying(1028)"); + + b.Property("IsCancelled") + .HasColumnType("boolean"); + + b.Property("IsConfigured") + .HasColumnType("boolean"); + + b.Property("IsDiscountAmountRounded") + .HasColumnType("boolean"); + + b.Property("IsGift") + .HasColumnType("boolean"); + + b.Property("IsReccuring") + .HasColumnType("boolean"); + + b.Property("Length") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.Property("MeasureUnit") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Price") + .HasColumnType("Money"); + + b.Property("PriceId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PriceWithTax") + .HasColumnType("Money"); + + b.Property("ProductId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProductOuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProductSnapshot") + .HasColumnType("text"); + + b.Property("ProductType") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Quantity") + .HasColumnType("integer"); + + b.Property("ShippingMethodCode") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Sku") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasColumnType("Money"); + + b.Property("TaxType") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("VendorId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Weight") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.Property("WeightUnit") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("Width") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.ToTable("OrderLineItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.OrderDynamicPropertyObjectValueEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("BooleanValue") + .HasColumnType("boolean"); + + b.Property("CaptureId") + .HasColumnType("character varying(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CustomerOrderId") + .HasColumnType("character varying(128)"); + + b.Property("DateTimeValue") + .HasColumnType("timestamp with time zone"); + + b.Property("DecimalValue") + .HasColumnType("decimal(18,5)"); + + b.Property("DictionaryItemId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IntegerValue") + .HasColumnType("integer"); + + b.Property("LineItemId") + .HasColumnType("character varying(128)"); + + b.Property("Locale") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("LongTextValue") + .HasColumnType("text"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ObjectId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ObjectType") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PaymentInId") + .HasColumnType("character varying(128)"); + + b.Property("PropertyId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PropertyName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("RefundId") + .HasColumnType("character varying(128)"); + + b.Property("ShipmentId") + .HasColumnType("character varying(128)"); + + b.Property("ShortTextValue") + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("ValueType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasKey("Id"); + + b.HasIndex("CaptureId"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("RefundId"); + + b.HasIndex("ShipmentId"); + + b.HasIndex("ObjectType", "CustomerOrderId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_CustomerOrderId"); + + b.HasIndex("ObjectType", "LineItemId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_LineItemId"); + + b.HasIndex("ObjectType", "ObjectId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_ObjectId"); + + b.HasIndex("ObjectType", "PaymentInId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_PaymentInId"); + + b.HasIndex("ObjectType", "RefundId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_RefundId"); + + b.HasIndex("ObjectType", "ShipmentId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_ShipmentId"); + + b.ToTable("OrderDynamicPropertyObjectValue", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentGatewayTransactionEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Amount") + .HasColumnType("Money"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Currency") + .HasMaxLength(3) + .HasColumnType("character varying(3)"); + + b.Property("GatewayIpAddress") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("IsProcessed") + .HasColumnType("boolean"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Note") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("PaymentInId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.Property("ProcessAttemptCount") + .HasColumnType("integer"); + + b.Property("ProcessError") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("ProcessedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RequestData") + .HasColumnType("text"); + + b.Property("ResponseCode") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ResponseData") + .HasColumnType("text"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Type") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasKey("Id"); + + b.HasIndex("PaymentInId"); + + b.ToTable("OrderPaymentGatewayTransaction", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("AuthorizedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CancelledDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("CapturedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("character varying(3)"); + + b.Property("CustomerId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CustomerName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CustomerOrderId") + .HasColumnType("character varying(128)"); + + b.Property("DiscountAmount") + .HasColumnType("Money"); + + b.Property("DiscountAmountWithTax") + .HasColumnType("Money"); + + b.Property("GatewayCode") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("IncomingDate") + .HasColumnType("timestamp with time zone"); + + b.Property("IsApproved") + .HasColumnType("boolean"); + + b.Property("IsCancelled") + .HasColumnType("boolean"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("OrganizationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("OrganizationName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Price") + .HasColumnType("Money"); + + b.Property("PriceWithTax") + .HasColumnType("Money"); + + b.Property("Purpose") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("ShipmentId") + .HasColumnType("character varying(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Sum") + .HasColumnType("Money"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasColumnType("Money"); + + b.Property("TaxType") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Total") + .HasColumnType("Money"); + + b.Property("TotalWithTax") + .HasColumnType("Money"); + + b.Property("VendorId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("VoidedDate") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("OuterId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderPaymentIn", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Amount") + .HasColumnType("Money"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CancelledDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("character varying(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("character varying(128)"); + + b.Property("IsApproved") + .HasColumnType("boolean"); + + b.Property("IsCancelled") + .HasColumnType("boolean"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PaymentId") + .HasColumnType("character varying(128)"); + + b.Property("ReasonCode") + .HasColumnType("text"); + + b.Property("ReasonMessage") + .HasColumnType("text"); + + b.Property("RejectReasonMessage") + .HasColumnType("text"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Sum") + .HasColumnType("Money"); + + b.Property("TransactionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("VendorId") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("PaymentId"); + + b.HasIndex("TransactionId", "CustomerOrderId") + .IsUnique(); + + b.ToTable("OrderRefund", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("LineItemId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Quantity") + .HasColumnType("integer"); + + b.Property("RefundId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("LineItemId"); + + b.HasIndex("RefundId"); + + b.ToTable("OrderRefundItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CancelledDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("character varying(3)"); + + b.Property("CustomerOrderId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.Property("DeliveryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("DiscountAmount") + .HasColumnType("Money"); + + b.Property("DiscountAmountWithTax") + .HasColumnType("Money"); + + b.Property("EmployeeId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("EmployeeName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Fee") + .HasColumnType("Money"); + + b.Property("FeeWithTax") + .HasColumnType("Money"); + + b.Property("FulfillmentCenterId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("FulfillmentCenterName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Height") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.Property("IsApproved") + .HasColumnType("boolean"); + + b.Property("IsCancelled") + .HasColumnType("boolean"); + + b.Property("Length") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.Property("MeasureUnit") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("OrganizationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("OrganizationName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PickupLocationId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Price") + .HasColumnType("Money"); + + b.Property("PriceWithTax") + .HasColumnType("Money"); + + b.Property("ShipmentMethodCode") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ShipmentMethodOption") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Sum") + .HasColumnType("Money"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasColumnType("Money"); + + b.Property("TaxType") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Total") + .HasColumnType("Money"); + + b.Property("TotalWithTax") + .HasColumnType("Money"); + + b.Property("TrackingNumber") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("TrackingUrl") + .HasColumnType("text"); + + b.Property("VendorId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("VolumetricWeight") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.Property("Weight") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.Property("WeightUnit") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("Width") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("OuterId"); + + b.ToTable("OrderShipment", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("BarCode") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("LineItemId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Quantity") + .HasColumnType("integer"); + + b.Property("ShipmentId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.Property("ShipmentPackageId") + .HasColumnType("character varying(128)"); + + b.Property("Status") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("LineItemId"); + + b.HasIndex("ShipmentId"); + + b.HasIndex("ShipmentPackageId"); + + b.ToTable("OrderShipmentItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("BarCode") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Height") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.Property("Length") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.Property("MeasureUnit") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("PackageType") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ShipmentId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.Property("Weight") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.Property("WeightUnit") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("Width") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)"); + + b.HasKey("Id"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderShipmentPackage", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.TaxDetailEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Amount") + .HasColumnType("Money"); + + b.Property("CustomerOrderId") + .HasColumnType("character varying(128)"); + + b.Property("LineItemId") + .HasColumnType("character varying(128)"); + + b.Property("Name") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("PaymentInId") + .HasColumnType("character varying(128)"); + + b.Property("Rate") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("ShipmentId") + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderTaxDetail", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.AddressEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Addresses") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("Addresses") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Addresses") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany() + .HasForeignKey("CustomerOrderId"); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "Payment") + .WithMany("Captures") + .HasForeignKey("PaymentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("Payment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", "Capture") + .WithMany("Items") + .HasForeignKey("CaptureId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("CaptureItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Capture"); + + b.Navigation("LineItem"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("ConfigurationItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.ClientCascade) + .IsRequired(); + + b.Navigation("LineItem"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemFileEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", "ConfigurationItem") + .WithMany("Files") + .HasForeignKey("ConfigurationItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ConfigurationItem"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.DiscountEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Discounts") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("Discounts") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("Discounts") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Discounts") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.FeeDetailEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("FeeDetails") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("FeeDetails") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("FeeDetails") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("FeeDetails") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Items") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.OrderDynamicPropertyObjectValueEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", "Capture") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("CaptureId"); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", "Refund") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("RefundId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("Capture"); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Refund"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentGatewayTransactionEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("Transactions") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PaymentIn"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("InPayments") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("InPayments") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("CustomerOrder"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany() + .HasForeignKey("CustomerOrderId"); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "Payment") + .WithMany("Refunds") + .HasForeignKey("PaymentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("Payment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("RefundItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", "Refund") + .WithMany("Items") + .HasForeignKey("RefundId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("LineItem"); + + b.Navigation("Refund"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Shipments") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CustomerOrder"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("ShipmentItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Items") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", "ShipmentPackage") + .WithMany("Items") + .HasForeignKey("ShipmentPackageId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("LineItem"); + + b.Navigation("Shipment"); + + b.Navigation("ShipmentPackage"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Packages") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.TaxDetailEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("TaxDetails") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("TaxDetails") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("TaxDetails") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("TaxDetails") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", b => + { + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("Items"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", b => + { + b.Navigation("Files"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", b => + { + b.Navigation("Addresses"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("InPayments"); + + b.Navigation("Items"); + + b.Navigation("Shipments"); + + b.Navigation("TaxDetails"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", b => + { + b.Navigation("CaptureItems"); + + b.Navigation("ConfigurationItems"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("RefundItems"); + + b.Navigation("ShipmentItems"); + + b.Navigation("TaxDetails"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", b => + { + b.Navigation("Addresses"); + + b.Navigation("Captures"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("Refunds"); + + b.Navigation("TaxDetails"); + + b.Navigation("Transactions"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", b => + { + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("Items"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", b => + { + b.Navigation("Addresses"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("InPayments"); + + b.Navigation("Items"); + + b.Navigation("Packages"); + + b.Navigation("TaxDetails"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", b => + { + b.Navigation("Items"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/20251209110924_AddOrderConfigurationItemPrice.cs b/src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/20251209110924_AddOrderConfigurationItemPrice.cs new file mode 100644 index 000000000..a85b207ef --- /dev/null +++ b/src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/20251209110924_AddOrderConfigurationItemPrice.cs @@ -0,0 +1,71 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace VirtoCommerce.OrdersModule.Data.PostgreSql.Migrations +{ + /// + public partial class AddOrderConfigurationItemPrice : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ProductSnapshot", + table: "OrderLineItem", + type: "text", + nullable: true); + + migrationBuilder.AddColumn( + name: "Price", + table: "OrderConfigurationItem", + type: "Money", + nullable: false, + defaultValue: 0m); + + migrationBuilder.AddColumn( + name: "SalePrice", + table: "OrderConfigurationItem", + type: "Money", + nullable: false, + defaultValue: 0m); + + migrationBuilder.AddColumn( + name: "SectionId", + table: "OrderConfigurationItem", + type: "character varying(128)", + maxLength: 128, + nullable: true); + + migrationBuilder.AddColumn( + name: "ProductSnapshot", + table: "OrderConfigurationItem", + type: "text", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ProductSnapshot", + table: "OrderLineItem"); + + migrationBuilder.DropColumn( + name: "Price", + table: "OrderConfigurationItem"); + + migrationBuilder.DropColumn( + name: "SalePrice", + table: "OrderConfigurationItem"); + + migrationBuilder.DropColumn( + name: "SectionId", + table: "OrderConfigurationItem"); + + migrationBuilder.DropColumn( + name: "ProductSnapshot", + table: "OrderConfigurationItem"); + } + } +} diff --git a/src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/OrderDbContextModelSnapshot.cs b/src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/OrderDbContextModelSnapshot.cs index e524c2785..55ca6c4c6 100644 --- a/src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/OrderDbContextModelSnapshot.cs +++ b/src/VirtoCommerce.OrdersModule.Data.PostgreSql/Migrations/OrderDbContextModelSnapshot.cs @@ -1,4 +1,4 @@ -// +// using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -314,13 +314,26 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(1024) .HasColumnType("character varying(1024)"); + b.Property("Price") + .HasColumnType("Money"); + b.Property("ProductId") .HasMaxLength(128) .HasColumnType("character varying(128)"); + b.Property("ProductSnapshot") + .HasColumnType("text"); + b.Property("Quantity") .HasColumnType("integer"); + b.Property("SalePrice") + .HasColumnType("Money"); + + b.Property("SectionId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + b.Property("Sku") .HasMaxLength(128) .HasColumnType("character varying(128)"); @@ -825,6 +838,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(128) .HasColumnType("character varying(128)"); + b.Property("ProductSnapshot") + .HasColumnType("text"); + b.Property("ProductType") .HasMaxLength(64) .HasColumnType("character varying(64)"); diff --git a/src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/20251209110744_AddOrderConfigurationItemPrice.Designer.cs b/src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/20251209110744_AddOrderConfigurationItemPrice.Designer.cs new file mode 100644 index 000000000..24e75f229 --- /dev/null +++ b/src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/20251209110744_AddOrderConfigurationItemPrice.Designer.cs @@ -0,0 +1,2203 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using VirtoCommerce.OrdersModule.Data.Repositories; + +#nullable disable + +namespace VirtoCommerce.OrdersModule.Data.SqlServer.Migrations +{ + [DbContext(typeof(OrderDbContext))] + [Migration("20251209110744_AddOrderConfigurationItemPrice")] + partial class AddOrderConfigurationItemPrice + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.11") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.AddressEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("AddressType") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("City") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CountryCode") + .HasMaxLength(3) + .HasColumnType("nvarchar(3)"); + + b.Property("CountryName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CustomerOrderId") + .HasColumnType("nvarchar(128)"); + + b.Property("Description") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("FirstName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Line1") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("Line2") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("MiddleName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("Organization") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PaymentInId") + .HasColumnType("nvarchar(128)"); + + b.Property("Phone") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("PostalCode") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("RegionId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("RegionName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ShipmentId") + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderAddress", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Amount") + .HasColumnType("Money"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime2"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("CloseTransaction") + .HasColumnType("bit"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("nvarchar(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("nvarchar(128)"); + + b.Property("IsApproved") + .HasColumnType("bit"); + + b.Property("IsCancelled") + .HasColumnType("bit"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PaymentId") + .HasColumnType("nvarchar(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Sum") + .HasColumnType("Money"); + + b.Property("TransactionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("VendorId") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("PaymentId"); + + b.HasIndex("TransactionId", "CustomerOrderId") + .IsUnique() + .HasFilter("[CustomerOrderId] IS NOT NULL"); + + b.ToTable("OrderCapture", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CaptureId") + .IsRequired() + .HasColumnType("nvarchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("LineItemId") + .IsRequired() + .HasColumnType("nvarchar(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CaptureId"); + + b.HasIndex("LineItemId"); + + b.ToTable("OrderCaptureItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CatalogId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CategoryId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("CustomText") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ImageUrl") + .HasMaxLength(1028) + .HasColumnType("nvarchar(1028)"); + + b.Property("LineItemId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("Price") + .HasColumnType("Money"); + + b.Property("ProductId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProductSnapshot") + .HasColumnType("nvarchar(max)"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("SalePrice") + .HasColumnType("Money"); + + b.Property("SectionId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Sku") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("LineItemId"); + + b.ToTable("OrderConfigurationItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemFileEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ConfigurationItemId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ContentType") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("Size") + .HasColumnType("bigint"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(2083) + .HasColumnType("nvarchar(2083)"); + + b.HasKey("Id"); + + b.HasIndex("ConfigurationItemId"); + + b.ToTable("OrderConfigurationItemFile", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime2"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("ChannelId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("nvarchar(3)"); + + b.Property("CustomerId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CustomerName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("DiscountAmount") + .HasColumnType("Money"); + + b.Property("DiscountTotal") + .HasColumnType("Money"); + + b.Property("DiscountTotalWithTax") + .HasColumnType("Money"); + + b.Property("EmployeeId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EmployeeName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Fee") + .HasColumnType("Money"); + + b.Property("FeeTotal") + .HasColumnType("Money"); + + b.Property("FeeTotalWithTax") + .HasColumnType("Money"); + + b.Property("FeeWithTax") + .HasColumnType("Money"); + + b.Property("HandlingTotal") + .HasColumnType("Money"); + + b.Property("HandlingTotalWithTax") + .HasColumnType("Money"); + + b.Property("IsAnonymous") + .HasColumnType("bit"); + + b.Property("IsApproved") + .HasColumnType("bit"); + + b.Property("IsCancelled") + .HasColumnType("bit"); + + b.Property("IsPrototype") + .HasColumnType("bit"); + + b.Property("LanguageCode") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("OrganizationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("OrganizationName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PaymentTotal") + .HasColumnType("Money"); + + b.Property("PaymentTotalWithTax") + .HasColumnType("Money"); + + b.Property("PurchaseOrderNumber") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("ShippingTotal") + .HasColumnType("Money"); + + b.Property("ShippingTotalWithTax") + .HasColumnType("Money"); + + b.Property("ShoppingCartId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("StoreId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("StoreName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("SubTotal") + .HasColumnType("Money"); + + b.Property("SubTotalWithTax") + .HasColumnType("Money"); + + b.Property("SubscriptionId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("SubscriptionNumber") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Sum") + .HasColumnType("Money"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasColumnType("Money"); + + b.Property("Total") + .HasColumnType("Money"); + + b.HasKey("Id"); + + b.HasIndex("OuterId"); + + b.ToTable("CustomerOrder", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.DiscountEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CouponCode") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CouponInvalidDescription") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("nvarchar(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("nvarchar(128)"); + + b.Property("DiscountAmount") + .HasColumnType("Money"); + + b.Property("DiscountAmountWithTax") + .HasColumnType("Money"); + + b.Property("LineItemId") + .HasColumnType("nvarchar(128)"); + + b.Property("PaymentInId") + .HasColumnType("nvarchar(128)"); + + b.Property("PromotionDescription") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("PromotionId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("PromotionName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ShipmentId") + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderDiscount", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.FeeDetailEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Amount") + .HasColumnType("Money"); + + b.Property("Currency") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CustomerOrderId") + .HasColumnType("nvarchar(128)"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("FeeId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LineItemId") + .HasColumnType("nvarchar(128)"); + + b.Property("PaymentInId") + .HasColumnType("nvarchar(128)"); + + b.Property("ShipmentId") + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderFeeDetail", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime2"); + + b.Property("CatalogId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CategoryId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("nvarchar(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("nvarchar(128)"); + + b.Property("DiscountAmount") + .HasColumnType("Money"); + + b.Property("DiscountAmountWithTax") + .HasColumnType("Money"); + + b.Property("Fee") + .HasColumnType("Money"); + + b.Property("FeeWithTax") + .HasColumnType("Money"); + + b.Property("FulfillmentCenterId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("FulfillmentCenterName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("FulfillmentLocationCode") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Height") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("ImageUrl") + .HasMaxLength(1028) + .HasColumnType("nvarchar(1028)"); + + b.Property("IsCancelled") + .HasColumnType("bit"); + + b.Property("IsConfigured") + .HasColumnType("bit"); + + b.Property("IsDiscountAmountRounded") + .HasColumnType("bit"); + + b.Property("IsGift") + .HasColumnType("bit"); + + b.Property("IsReccuring") + .HasColumnType("bit"); + + b.Property("Length") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("MeasureUnit") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Price") + .HasColumnType("Money"); + + b.Property("PriceId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PriceWithTax") + .HasColumnType("Money"); + + b.Property("ProductId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProductOuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProductSnapshot") + .HasColumnType("nvarchar(max)"); + + b.Property("ProductType") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("ShippingMethodCode") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Sku") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasColumnType("Money"); + + b.Property("TaxType") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("VendorId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Weight") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("WeightUnit") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("Width") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.ToTable("OrderLineItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.OrderDynamicPropertyObjectValueEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("BooleanValue") + .HasColumnType("bit"); + + b.Property("CaptureId") + .HasColumnType("nvarchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("CustomerOrderId") + .HasColumnType("nvarchar(128)"); + + b.Property("DateTimeValue") + .HasColumnType("datetime2"); + + b.Property("DecimalValue") + .HasColumnType("decimal(18,5)"); + + b.Property("DictionaryItemId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IntegerValue") + .HasColumnType("int"); + + b.Property("LineItemId") + .HasColumnType("nvarchar(128)"); + + b.Property("Locale") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("LongTextValue") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("ObjectId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ObjectType") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PaymentInId") + .HasColumnType("nvarchar(128)"); + + b.Property("PropertyId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PropertyName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("RefundId") + .HasColumnType("nvarchar(128)"); + + b.Property("ShipmentId") + .HasColumnType("nvarchar(128)"); + + b.Property("ShortTextValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ValueType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("CaptureId"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("RefundId"); + + b.HasIndex("ShipmentId"); + + b.HasIndex("ObjectType", "CustomerOrderId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_CustomerOrderId"); + + b.HasIndex("ObjectType", "LineItemId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_LineItemId"); + + b.HasIndex("ObjectType", "ObjectId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_ObjectId"); + + b.HasIndex("ObjectType", "PaymentInId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_PaymentInId"); + + b.HasIndex("ObjectType", "RefundId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_RefundId"); + + b.HasIndex("ObjectType", "ShipmentId") + .HasDatabaseName("IX_OrderDynamicProperty_ObjectType_ShipmentId"); + + b.ToTable("OrderDynamicPropertyObjectValue", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentGatewayTransactionEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Amount") + .HasColumnType("Money"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("Currency") + .HasMaxLength(3) + .HasColumnType("nvarchar(3)"); + + b.Property("GatewayIpAddress") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsProcessed") + .HasColumnType("bit"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("Note") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("PaymentInId") + .IsRequired() + .HasColumnType("nvarchar(128)"); + + b.Property("ProcessAttemptCount") + .HasColumnType("int"); + + b.Property("ProcessError") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("ProcessedDate") + .HasColumnType("datetime2"); + + b.Property("RequestData") + .HasColumnType("nvarchar(max)"); + + b.Property("ResponseCode") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ResponseData") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Type") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("PaymentInId"); + + b.ToTable("OrderPaymentGatewayTransaction", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("AuthorizedDate") + .HasColumnType("datetime2"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime2"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("CapturedDate") + .HasColumnType("datetime2"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("nvarchar(3)"); + + b.Property("CustomerId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CustomerName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("CustomerOrderId") + .HasColumnType("nvarchar(128)"); + + b.Property("DiscountAmount") + .HasColumnType("Money"); + + b.Property("DiscountAmountWithTax") + .HasColumnType("Money"); + + b.Property("GatewayCode") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IncomingDate") + .HasColumnType("datetime2"); + + b.Property("IsApproved") + .HasColumnType("bit"); + + b.Property("IsCancelled") + .HasColumnType("bit"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("OrganizationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("OrganizationName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Price") + .HasColumnType("Money"); + + b.Property("PriceWithTax") + .HasColumnType("Money"); + + b.Property("Purpose") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("ShipmentId") + .HasColumnType("nvarchar(128)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Sum") + .HasColumnType("Money"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasColumnType("Money"); + + b.Property("TaxType") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Total") + .HasColumnType("Money"); + + b.Property("TotalWithTax") + .HasColumnType("Money"); + + b.Property("VendorId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("VoidedDate") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("OuterId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderPaymentIn", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Amount") + .HasColumnType("Money"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime2"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("nvarchar(3)"); + + b.Property("CustomerOrderId") + .HasColumnType("nvarchar(128)"); + + b.Property("IsApproved") + .HasColumnType("bit"); + + b.Property("IsCancelled") + .HasColumnType("bit"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PaymentId") + .HasColumnType("nvarchar(128)"); + + b.Property("ReasonCode") + .HasColumnType("nvarchar(max)"); + + b.Property("ReasonMessage") + .HasColumnType("nvarchar(max)"); + + b.Property("RejectReasonMessage") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Sum") + .HasColumnType("Money"); + + b.Property("TransactionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("VendorId") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("PaymentId"); + + b.HasIndex("TransactionId", "CustomerOrderId") + .IsUnique() + .HasFilter("[CustomerOrderId] IS NOT NULL"); + + b.ToTable("OrderRefund", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("LineItemId") + .IsRequired() + .HasColumnType("nvarchar(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("RefundId") + .IsRequired() + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("LineItemId"); + + b.HasIndex("RefundId"); + + b.ToTable("OrderRefundItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CancelReason") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CancelledDate") + .HasColumnType("datetime2"); + + b.Property("CancelledState") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("Comment") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("Currency") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("nvarchar(3)"); + + b.Property("CustomerOrderId") + .IsRequired() + .HasColumnType("nvarchar(128)"); + + b.Property("DeliveryDate") + .HasColumnType("datetime2"); + + b.Property("DiscountAmount") + .HasColumnType("Money"); + + b.Property("DiscountAmountWithTax") + .HasColumnType("Money"); + + b.Property("EmployeeId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EmployeeName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Fee") + .HasColumnType("Money"); + + b.Property("FeeWithTax") + .HasColumnType("Money"); + + b.Property("FulfillmentCenterId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("FulfillmentCenterName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Height") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("IsApproved") + .HasColumnType("bit"); + + b.Property("IsCancelled") + .HasColumnType("bit"); + + b.Property("Length") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("MeasureUnit") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("Number") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("OrganizationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("OrganizationName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentOperationId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PickupLocationId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Price") + .HasColumnType("Money"); + + b.Property("PriceWithTax") + .HasColumnType("Money"); + + b.Property("ShipmentMethodCode") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ShipmentMethodOption") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Status") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Sum") + .HasColumnType("Money"); + + b.Property("TaxPercentRate") + .HasColumnType("decimal(18,4)"); + + b.Property("TaxTotal") + .HasColumnType("Money"); + + b.Property("TaxType") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Total") + .HasColumnType("Money"); + + b.Property("TotalWithTax") + .HasColumnType("Money"); + + b.Property("TrackingNumber") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TrackingUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("VendorId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("VolumetricWeight") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("Weight") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("WeightUnit") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("Width") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("OuterId"); + + b.ToTable("OrderShipment", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentItemEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("BarCode") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("LineItemId") + .IsRequired() + .HasColumnType("nvarchar(128)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("ShipmentId") + .IsRequired() + .HasColumnType("nvarchar(128)"); + + b.Property("ShipmentPackageId") + .HasColumnType("nvarchar(128)"); + + b.Property("Status") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("LineItemId"); + + b.HasIndex("ShipmentId"); + + b.HasIndex("ShipmentPackageId"); + + b.ToTable("OrderShipmentItem", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("BarCode") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("Height") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("Length") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("MeasureUnit") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime2"); + + b.Property("PackageType") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ShipmentId") + .IsRequired() + .HasColumnType("nvarchar(128)"); + + b.Property("Weight") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.Property("WeightUnit") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("Width") + .HasPrecision(18, 4) + .HasColumnType("decimal(18,4)"); + + b.HasKey("Id"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderShipmentPackage", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.TaxDetailEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Amount") + .HasColumnType("Money"); + + b.Property("CustomerOrderId") + .HasColumnType("nvarchar(128)"); + + b.Property("LineItemId") + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("PaymentInId") + .HasColumnType("nvarchar(128)"); + + b.Property("Rate") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("ShipmentId") + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("CustomerOrderId"); + + b.HasIndex("LineItemId"); + + b.HasIndex("PaymentInId"); + + b.HasIndex("ShipmentId"); + + b.ToTable("OrderTaxDetail", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.AddressEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Addresses") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("Addresses") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Addresses") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany() + .HasForeignKey("CustomerOrderId"); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "Payment") + .WithMany("Captures") + .HasForeignKey("PaymentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("Payment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", "Capture") + .WithMany("Items") + .HasForeignKey("CaptureId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("CaptureItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Capture"); + + b.Navigation("LineItem"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("ConfigurationItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.ClientCascade) + .IsRequired(); + + b.Navigation("LineItem"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemFileEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", "ConfigurationItem") + .WithMany("Files") + .HasForeignKey("ConfigurationItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ConfigurationItem"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.DiscountEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Discounts") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("Discounts") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("Discounts") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Discounts") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.FeeDetailEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("FeeDetails") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("FeeDetails") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("FeeDetails") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("FeeDetails") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Items") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.OrderDynamicPropertyObjectValueEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", "Capture") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("CaptureId"); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", "Refund") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("RefundId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("DynamicPropertyObjectValues") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("Capture"); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Refund"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentGatewayTransactionEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("Transactions") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PaymentIn"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("InPayments") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("InPayments") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("CustomerOrder"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany() + .HasForeignKey("CustomerOrderId"); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "Payment") + .WithMany("Refunds") + .HasForeignKey("PaymentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("Payment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("RefundItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", "Refund") + .WithMany("Items") + .HasForeignKey("RefundId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("LineItem"); + + b.Navigation("Refund"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("Shipments") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CustomerOrder"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentItemEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("ShipmentItems") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Items") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", "ShipmentPackage") + .WithMany("Items") + .HasForeignKey("ShipmentPackageId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("LineItem"); + + b.Navigation("Shipment"); + + b.Navigation("ShipmentPackage"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("Packages") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.TaxDetailEntity", b => + { + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", "CustomerOrder") + .WithMany("TaxDetails") + .HasForeignKey("CustomerOrderId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", "LineItem") + .WithMany("TaxDetails") + .HasForeignKey("LineItemId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", "PaymentIn") + .WithMany("TaxDetails") + .HasForeignKey("PaymentInId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", "Shipment") + .WithMany("TaxDetails") + .HasForeignKey("ShipmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("CustomerOrder"); + + b.Navigation("LineItem"); + + b.Navigation("PaymentIn"); + + b.Navigation("Shipment"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CaptureEntity", b => + { + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("Items"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ConfigurationItemEntity", b => + { + b.Navigation("Files"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.CustomerOrderEntity", b => + { + b.Navigation("Addresses"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("InPayments"); + + b.Navigation("Items"); + + b.Navigation("Shipments"); + + b.Navigation("TaxDetails"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.LineItemEntity", b => + { + b.Navigation("CaptureItems"); + + b.Navigation("ConfigurationItems"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("RefundItems"); + + b.Navigation("ShipmentItems"); + + b.Navigation("TaxDetails"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.PaymentInEntity", b => + { + b.Navigation("Addresses"); + + b.Navigation("Captures"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("Refunds"); + + b.Navigation("TaxDetails"); + + b.Navigation("Transactions"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.RefundEntity", b => + { + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("Items"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentEntity", b => + { + b.Navigation("Addresses"); + + b.Navigation("Discounts"); + + b.Navigation("DynamicPropertyObjectValues"); + + b.Navigation("FeeDetails"); + + b.Navigation("InPayments"); + + b.Navigation("Items"); + + b.Navigation("Packages"); + + b.Navigation("TaxDetails"); + }); + + modelBuilder.Entity("VirtoCommerce.OrdersModule.Data.Model.ShipmentPackageEntity", b => + { + b.Navigation("Items"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/20251209110744_AddOrderConfigurationItemPrice.cs b/src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/20251209110744_AddOrderConfigurationItemPrice.cs new file mode 100644 index 000000000..fa19490c0 --- /dev/null +++ b/src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/20251209110744_AddOrderConfigurationItemPrice.cs @@ -0,0 +1,71 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace VirtoCommerce.OrdersModule.Data.SqlServer.Migrations +{ + /// + public partial class AddOrderConfigurationItemPrice : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ProductSnapshot", + table: "OrderLineItem", + type: "nvarchar(max)", + nullable: true); + + migrationBuilder.AddColumn( + name: "Price", + table: "OrderConfigurationItem", + type: "Money", + nullable: false, + defaultValue: 0m); + + migrationBuilder.AddColumn( + name: "SalePrice", + table: "OrderConfigurationItem", + type: "Money", + nullable: false, + defaultValue: 0m); + + migrationBuilder.AddColumn( + name: "SectionId", + table: "OrderConfigurationItem", + type: "nvarchar(128)", + maxLength: 128, + nullable: true); + + migrationBuilder.AddColumn( + name: "ProductSnapshot", + table: "OrderConfigurationItem", + type: "nvarchar(max)", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ProductSnapshot", + table: "OrderLineItem"); + + migrationBuilder.DropColumn( + name: "Price", + table: "OrderConfigurationItem"); + + migrationBuilder.DropColumn( + name: "SalePrice", + table: "OrderConfigurationItem"); + + migrationBuilder.DropColumn( + name: "SectionId", + table: "OrderConfigurationItem"); + + migrationBuilder.DropColumn( + name: "ProductSnapshot", + table: "OrderConfigurationItem"); + } + } +} diff --git a/src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/OrderDbContextModelSnapshot.cs b/src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/OrderDbContextModelSnapshot.cs index 54dea1dc5..7f2b965f3 100644 --- a/src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/OrderDbContextModelSnapshot.cs +++ b/src/VirtoCommerce.OrdersModule.Data.SqlServer/Migrations/OrderDbContextModelSnapshot.cs @@ -1,4 +1,4 @@ -// +// using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -315,13 +315,26 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(1024) .HasColumnType("nvarchar(1024)"); + b.Property("Price") + .HasColumnType("Money"); + b.Property("ProductId") .HasMaxLength(128) .HasColumnType("nvarchar(128)"); + b.Property("ProductSnapshot") + .HasColumnType("nvarchar(max)"); + b.Property("Quantity") .HasColumnType("int"); + b.Property("SalePrice") + .HasColumnType("Money"); + + b.Property("SectionId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + b.Property("Sku") .HasMaxLength(128) .HasColumnType("nvarchar(128)"); @@ -825,6 +838,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(128) .HasColumnType("nvarchar(128)"); + b.Property("ProductSnapshot") + .HasColumnType("nvarchar(max)"); + b.Property("ProductType") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); diff --git a/src/VirtoCommerce.OrdersModule.Data/Model/ConfigurationItemEntity.cs b/src/VirtoCommerce.OrdersModule.Data/Model/ConfigurationItemEntity.cs index b5b1bde93..0a3f3f9c9 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Model/ConfigurationItemEntity.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Model/ConfigurationItemEntity.cs @@ -1,6 +1,7 @@ using System; using System.Collections.ObjectModel; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using VirtoCommerce.OrdersModule.Core.Model; using VirtoCommerce.Platform.Core.Common; @@ -18,6 +19,9 @@ public class ConfigurationItemEntity : AuditableEntity, IDataEntity Files { get; set; } = new NullCollection(); #endregion @@ -57,14 +69,18 @@ public virtual ConfigurationItem ToModel(ConfigurationItem configurationItem) configurationItem.ModifiedDate = ModifiedDate; configurationItem.ProductId = ProductId; + configurationItem.SectionId = SectionId; configurationItem.Name = Name; configurationItem.Sku = Sku; configurationItem.Quantity = Quantity; + configurationItem.Price = Price; + configurationItem.SalePrice = SalePrice; configurationItem.ImageUrl = ImageUrl; configurationItem.CatalogId = CatalogId; configurationItem.CategoryId = CategoryId; configurationItem.Type = Type; configurationItem.CustomText = CustomText; + configurationItem.ProductSnapshot = ProductSnapshot; configurationItem.Files = Files.Select(x => x.ToModel(AbstractTypeFactory.TryCreateInstance())).ToList(); @@ -84,14 +100,18 @@ public virtual ConfigurationItemEntity FromModel(ConfigurationItem configuration ModifiedDate = configurationItem.ModifiedDate; ProductId = configurationItem.ProductId; + SectionId = configurationItem.SectionId; Name = configurationItem.Name; Sku = configurationItem.Sku; Quantity = configurationItem.Quantity; + Price = configurationItem.Price; + SalePrice = configurationItem.SalePrice; ImageUrl = configurationItem.ImageUrl; CatalogId = configurationItem.CatalogId; CategoryId = configurationItem.CategoryId; Type = configurationItem.Type; CustomText = configurationItem.CustomText; + ProductSnapshot = configurationItem.ProductSnapshot; if (configurationItem.Files != null) { @@ -106,14 +126,18 @@ public virtual void Patch(ConfigurationItemEntity target) ArgumentNullException.ThrowIfNull(target); target.ProductId = ProductId; + target.SectionId = SectionId; target.Name = Name; target.Sku = Sku; target.Quantity = Quantity; + target.Price = Price; + target.SalePrice = SalePrice; target.ImageUrl = ImageUrl; target.CatalogId = CatalogId; target.CategoryId = CategoryId; target.Type = Type; target.CustomText = CustomText; + target.ProductSnapshot = ProductSnapshot; if (!Files.IsNullCollection()) { diff --git a/src/VirtoCommerce.OrdersModule.Data/Model/LineItemEntity.cs b/src/VirtoCommerce.OrdersModule.Data/Model/LineItemEntity.cs index e3041af1f..feca37a23 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Model/LineItemEntity.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Model/LineItemEntity.cs @@ -110,6 +110,8 @@ public class LineItemEntity : AuditableEntity, IHasOuterId, IDataEntity x.ToModel(AbstractTypeFactory.TryCreateInstance())).ToList(); lineItem.TaxDetails = TaxDetails.Select(x => x.ToModel(AbstractTypeFactory.TryCreateInstance())).ToList(); @@ -260,6 +263,7 @@ public virtual LineItemEntity FromModel(LineItem lineItem, PrimaryKeyResolvingMa VendorId = lineItem.VendorId; IsConfigured = lineItem.IsConfigured; + ProductSnapshot = lineItem.ProductSnapshot; if (lineItem.Discounts != null) { @@ -326,6 +330,8 @@ public virtual void Patch(LineItemEntity target) target.Fee = Fee; target.FeeWithTax = FeeWithTax; + target.ProductSnapshot = ProductSnapshot; + if (!Discounts.IsNullCollection()) { var discountComparer = AnonymousComparer.Create((DiscountEntity x) => x.PromotionId); diff --git a/src/VirtoCommerce.OrdersModule.Data/Repositories/OrderDbContext.cs b/src/VirtoCommerce.OrdersModule.Data/Repositories/OrderDbContext.cs index 4edd3b0fc..c6400188c 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Repositories/OrderDbContext.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Repositories/OrderDbContext.cs @@ -240,7 +240,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .HasForeignKey(x => x.PaymentInId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().Property(x => x.Rate).HasPrecision(18, 2); - modelBuilder.Entity().Property(x => x.Rate).HasPrecision(18, 2); modelBuilder.Entity().ToTable("OrderTaxDetail"); #endregion @@ -352,7 +351,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) #endregion ConfigurationItemImage // Allows configuration for an entity type for different database types. - // Applies configuration from all + // Applies configuration from all switch (Database.ProviderName) { case "Pomelo.EntityFrameworkCore.MySql": diff --git a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs index 00ae386d1..5b75a2505 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs @@ -305,14 +305,17 @@ protected virtual ConfigurationItem ToOrderModel(CartModule.Core.Model.Configura var retVal = AbstractTypeFactory.TryCreateInstance(); + retVal.SectionId = configurationItem.SectionId; + retVal.Type = configurationItem.Type; + retVal.CatalogId = configurationItem.CatalogId; + retVal.CategoryId = configurationItem.CategoryId; retVal.ProductId = configurationItem.ProductId; retVal.Name = configurationItem.Name; retVal.Sku = configurationItem.Sku; retVal.Quantity = configurationItem.Quantity; + retVal.Price = configurationItem.ListPrice; + retVal.SalePrice = configurationItem.SalePrice; retVal.ImageUrl = configurationItem.ImageUrl; - retVal.CatalogId = configurationItem.CatalogId; - retVal.CategoryId = configurationItem.CategoryId; - retVal.Type = configurationItem.Type; retVal.CustomText = configurationItem.CustomText; if (configurationItem.Files != null) diff --git a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj index e852b4ef1..65800b903 100644 --- a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj +++ b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Web/module.manifest b/src/VirtoCommerce.OrdersModule.Web/module.manifest index b99e1c4d5..22aaca0ae 100644 --- a/src/VirtoCommerce.OrdersModule.Web/module.manifest +++ b/src/VirtoCommerce.OrdersModule.Web/module.manifest @@ -7,8 +7,8 @@ 3.917.0 - - + + From e38fca4b3ddbef1b3f4a8375b7e85dd79b5034b4 Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Sun, 25 Jan 2026 11:45:37 +0300 Subject: [PATCH 02/19] feat: Implement product snapshot saving in customer orders --- .../ModuleConstants.cs | 49 ++++++---- .../Services/CustomerOrderBuilder.cs | 94 ++++++++++++++++++- .../VirtoCommerce.OrdersModule.Data.csproj | 2 +- .../de.VirtoCommerce.Orders.json | 4 + .../en.VirtoCommerce.Orders.json | 4 + .../es.VirtoCommerce.Orders.json | 4 + .../fr.VirtoCommerce.Orders.json | 4 + .../it.VirtoCommerce.Orders.json | 4 + .../ja.VirtoCommerce.Orders.json | 4 + .../pl.VirtoCommerce.Orders.json | 4 + .../pt.VirtoCommerce.Orders.json | 4 + .../ru.VirtoCommerce.Orders.json | 4 + .../zh.VirtoCommerce.Orders.json | 4 + .../CustomerOrderBuilderUnitTests.cs | 33 ++++--- 14 files changed, 182 insertions(+), 36 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Core/ModuleConstants.cs b/src/VirtoCommerce.OrdersModule.Core/ModuleConstants.cs index ce0a17d2f..40ff0527d 100644 --- a/src/VirtoCommerce.OrdersModule.Core/ModuleConstants.cs +++ b/src/VirtoCommerce.OrdersModule.Core/ModuleConstants.cs @@ -61,7 +61,7 @@ public static class Settings { public static class General { - public static SettingDescriptor OrderStatus = new SettingDescriptor + public static SettingDescriptor OrderStatus = new() { Name = "Order.Status", ValueType = SettingValueType.ShortText, @@ -114,7 +114,7 @@ public static class General GroupName = "Orders|General", }; - public static SettingDescriptor ShipmentStatus = new SettingDescriptor + public static SettingDescriptor ShipmentStatus = new() { Name = "Shipment.Status", ValueType = SettingValueType.ShortText, @@ -125,7 +125,7 @@ public static class General AllowedValues = new object[] { "New", "PickPack", "Cancelled", "ReadyToSend", "Sent" } }; - public static SettingDescriptor PaymentInStatus = new SettingDescriptor + public static SettingDescriptor PaymentInStatus = new() { Name = "PaymentIn.Status", ValueType = SettingValueType.ShortText, @@ -136,7 +136,7 @@ public static class General AllowedValues = new object[] { "New", "Pending", "Authorized", "Paid", "PartiallyRefunded", "Refunded", "Voided", "Custom", "Cancelled" } }; - public static SettingDescriptor RefundStatus { get; } = new SettingDescriptor + public static SettingDescriptor RefundStatus { get; } = new() { Name = "Refund.Status", ValueType = SettingValueType.ShortText, @@ -147,7 +147,7 @@ public static class General AllowedValues = new object[] { "Pending", "Rejected", "Processed" } }; - public static SettingDescriptor OrderCustomerOrderNewNumberTemplate = new SettingDescriptor + public static SettingDescriptor OrderCustomerOrderNewNumberTemplate = new() { Name = "Order.CustomerOrderNewNumberTemplate", ValueType = SettingValueType.ShortText, @@ -155,7 +155,7 @@ public static class General DefaultValue = "CO{0:yyMMdd}-{1:D5}" }; - public static SettingDescriptor OrderShipmentNewNumberTemplate = new SettingDescriptor + public static SettingDescriptor OrderShipmentNewNumberTemplate = new() { Name = "Order.ShipmentNewNumberTemplate", ValueType = SettingValueType.ShortText, @@ -163,7 +163,7 @@ public static class General DefaultValue = "SH{0:yyMMdd}-{1:D5}" }; - public static SettingDescriptor OrderPaymentInNewNumberTemplate = new SettingDescriptor + public static SettingDescriptor OrderPaymentInNewNumberTemplate = new() { Name = "Order.PaymentInNewNumberTemplate", ValueType = SettingValueType.ShortText, @@ -171,7 +171,7 @@ public static class General DefaultValue = "PI{0:yyMMdd}-{1:D5}" }; - public static SettingDescriptor RefundNewNumberTemplate { get; } = new SettingDescriptor + public static SettingDescriptor RefundNewNumberTemplate { get; } = new() { Name = "Order.RefundNewNumberTemplate", ValueType = SettingValueType.ShortText, @@ -179,7 +179,7 @@ public static class General DefaultValue = "RE{0:yyMMdd}-{1:D5}" }; - public static SettingDescriptor CaptureNewNumberTemplate { get; } = new SettingDescriptor + public static SettingDescriptor CaptureNewNumberTemplate { get; } = new() { Name = "Order.CaptureNewNumberTemplate", ValueType = SettingValueType.ShortText, @@ -187,7 +187,7 @@ public static class General DefaultValue = "CA{0:yyMMdd}-{1:D5}" }; - public static SettingDescriptor SendOrderNotifications = new SettingDescriptor + public static SettingDescriptor SendOrderNotifications = new() { Name = "Order.SendOrderNotifications", GroupName = "Orders|General", @@ -195,7 +195,7 @@ public static class General DefaultValue = true, }; - public static SettingDescriptor OrderAdjustInventory = new SettingDescriptor + public static SettingDescriptor OrderAdjustInventory = new() { Name = "Order.AdjustInventory", GroupName = "Orders|General", @@ -203,7 +203,7 @@ public static class General DefaultValue = true, }; - public static SettingDescriptor LogOrderChanges { get; } = new SettingDescriptor + public static SettingDescriptor LogOrderChanges { get; } = new() { Name = "Order.LogOrderChanges", GroupName = "Orders|General", @@ -211,7 +211,7 @@ public static class General DefaultValue = true, }; - public static SettingDescriptor EventBasedIndexation { get; } = new SettingDescriptor + public static SettingDescriptor EventBasedIndexation { get; } = new() { Name = "Order.Search.EventBasedIndexation.Enable", GroupName = "Orders|General", @@ -219,7 +219,7 @@ public static class General DefaultValue = true, }; - public static SettingDescriptor CustomerOrderIndexationDate { get; } = new SettingDescriptor + public static SettingDescriptor CustomerOrderIndexationDate { get; } = new() { Name = "VirtoCommerce.Search.IndexingJobs.IndexationDate.CustomerOrder", GroupName = "Orders|General", @@ -227,7 +227,7 @@ public static class General DefaultValue = default(DateTime), }; - public static SettingDescriptor CustomerOrderValidation { get; } = new SettingDescriptor + public static SettingDescriptor CustomerOrderValidation { get; } = new() { Name = "Order.Validation.Enable", GroupName = "Orders|General", @@ -235,7 +235,7 @@ public static class General DefaultValue = false }; - public static SettingDescriptor OrderPaidAndOrderSentNotifications { get; } = new SettingDescriptor + public static SettingDescriptor OrderPaidAndOrderSentNotifications { get; } = new() { Name = "Order.OrderPaidAndOrderSentNotifications.Enable", GroupName = "Orders|Notification", @@ -243,7 +243,7 @@ public static class General DefaultValue = true, }; - public static SettingDescriptor PaymentShipmentStatusChangedNotifications { get; } = new SettingDescriptor + public static SettingDescriptor PaymentShipmentStatusChangedNotifications { get; } = new() { Name = "Order.PaymentShipmentStatusChangedNotifications.Enable", GroupName = "Orders|Notification", @@ -251,7 +251,7 @@ public static class General DefaultValue = false, }; - public static SettingDescriptor PurchasedProductIndexation { get; } = new SettingDescriptor + public static SettingDescriptor PurchasedProductIndexation { get; } = new() { Name = "Order.PurchasedProductIndexation.Enable", GroupName = "Orders|Products", @@ -259,7 +259,7 @@ public static class General DefaultValue = false, }; - public static SettingDescriptor EventBasedPurchasedProductIndexation { get; } = new SettingDescriptor + public static SettingDescriptor EventBasedPurchasedProductIndexation { get; } = new() { Name = "Order.EventBasedPurchasedProductIndexation.Enable", GroupName = "Orders|Products", @@ -267,7 +267,7 @@ public static class General DefaultValue = true }; - public static SettingDescriptor PurchasedProductStoreFilter { get; } = new SettingDescriptor + public static SettingDescriptor PurchasedProductStoreFilter { get; } = new() { Name = "Order.PurchasedProductStoreFilter.Enable", GroupName = "Orders|Products", @@ -276,6 +276,14 @@ public static class General IsPublic = true, }; + public static SettingDescriptor ProductSnapshotEnabled { get; } = new() + { + Name = "Order.ProductSnapshot.Enable", + GroupName = "Orders|Products", + ValueType = SettingValueType.Boolean, + DefaultValue = false, + }; + public static IEnumerable AllSettings { get @@ -301,6 +309,7 @@ public static IEnumerable AllSettings yield return PurchasedProductIndexation; yield return EventBasedPurchasedProductIndexation; yield return PurchasedProductStoreFilter; + yield return ProductSnapshotEnabled; } } } diff --git a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs index 5b75a2505..964509a4a 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs @@ -3,6 +3,8 @@ using System.Linq; using System.Threading.Tasks; using VirtoCommerce.CartModule.Core.Model; +using VirtoCommerce.CatalogModule.Core.Services; +using VirtoCommerce.CatalogModule.Data.Search.Indexing; using VirtoCommerce.CoreModule.Core.Common; using VirtoCommerce.CoreModule.Core.Tax; using VirtoCommerce.OrdersModule.Core.Model; @@ -28,20 +30,30 @@ public class CustomerOrderBuilder : ICustomerOrderBuilder private readonly ICustomerOrderService _customerOrderService; private readonly ISettingsManager _settingsManager; private readonly IPaymentMethodsSearchService _paymentMethodSearchService; + private readonly IItemService _itemService; - public CustomerOrderBuilder(ICustomerOrderService customerOrderService, ISettingsManager settingsManager, IPaymentMethodsSearchService paymentMethodSearchService) + public CustomerOrderBuilder( + ICustomerOrderService customerOrderService, + ISettingsManager settingsManager, + IPaymentMethodsSearchService paymentMethodSearchService, + IItemService itemService) { _customerOrderService = customerOrderService; _settingsManager = settingsManager; _paymentMethodSearchService = paymentMethodSearchService; + _itemService = itemService; } + protected virtual int ProductSnapshotBatchSize => 50; + #region ICustomerOrderConverter Members public virtual async Task PlaceCustomerOrderFromCartAsync(ShoppingCart cart) { var customerOrder = ConvertCartToOrder(cart); + await SaveProductSnapshotsAsync(customerOrder); + await _customerOrderService.SaveChangesAsync([customerOrder]); return customerOrder; @@ -74,7 +86,7 @@ protected virtual CustomerOrder ConvertCartToOrder(ShoppingCart cart) // Copy Shipments if (cart.Shipments != null) { - var cartShipments = vendorIds.Any() + var cartShipments = vendorIds.Count > 0 ? cart.Shipments.Where(x => string.IsNullOrEmpty(x.VendorId) || vendorIds.Contains(x.VendorId)).ToArray() : cart.Shipments; order.Shipments = ToOrderModel(cartShipments, cartLineItemsMap); @@ -83,7 +95,7 @@ protected virtual CustomerOrder ConvertCartToOrder(ShoppingCart cart) // Copy Payments if (cart.Payments != null) { - var cartPayments = vendorIds.Any() + var cartPayments = vendorIds.Count > 0 ? cart.Payments.Where(x => string.IsNullOrEmpty(x.VendorId) || vendorIds.Contains(x.VendorId)).ToArray() : cart.Payments; order.InPayments = ToOrderModel(cart, cartPayments); @@ -542,5 +554,81 @@ protected virtual string GetDefaultLineItemStatus() protected virtual void PostConvertCartToOrder(ShoppingCart cart, CustomerOrder order, Dictionary cartLineItemsMap) { } + + protected virtual async Task SaveProductSnapshotsAsync(CustomerOrder order) + { + if (order.Items.IsNullOrEmpty() || !await _settingsManager.GetValueAsync(OrderSettings.ProductSnapshotEnabled)) + { + return; + } + + // Build map: ProductId → list of items to assign snapshot + var productIdToItems = new Dictionary>(StringComparer.OrdinalIgnoreCase); + + foreach (var lineItem in order.Items) + { + AddToMap(lineItem.ProductId, lineItem); + + if (lineItem.ConfigurationItems.IsNullOrEmpty()) + { + continue; + } + + foreach (var configurationItem in lineItem.ConfigurationItems) + { + AddToMap(configurationItem.ProductId, lineItem, configurationItem); + } + } + + if (productIdToItems.Count == 0) + { + return; + } + + // Process in batches to limit memory usage + foreach (var batchIds in productIdToItems.Keys.Paginate(ProductSnapshotBatchSize)) + { + var products = await _itemService.GetByIdsAsync(batchIds, null, null); + if (products.IsNullOrEmpty()) + { + continue; + } + + foreach (var product in products.Where(x => x != null)) + { + var snapshot = IndexDocumentHelper.SerializeObject(product); + + if (productIdToItems.TryGetValue(product.Id, out var items)) + { + foreach (var (lineItem, configurationItem) in items) + { + if (configurationItem != null) + { + configurationItem.ProductSnapshot = snapshot; + } + else + { + lineItem.ProductSnapshot = snapshot; + } + } + } + } + } + + return; + + void AddToMap(string productId, LineItem lineItem, ConfigurationItem configurationItem = null) + { + if (!string.IsNullOrEmpty(productId)) + { + if (!productIdToItems.TryGetValue(productId, out var itemList)) + { + itemList = []; + productIdToItems[productId] = itemList; + } + itemList.Add((lineItem, configurationItem)); + } + } + } } } diff --git a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj index 65800b903..3349035d3 100644 --- a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj +++ b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Web/Localizations/de.VirtoCommerce.Orders.json b/src/VirtoCommerce.OrdersModule.Web/Localizations/de.VirtoCommerce.Orders.json index 0e7130cca..2d089bc00 100644 --- a/src/VirtoCommerce.OrdersModule.Web/Localizations/de.VirtoCommerce.Orders.json +++ b/src/VirtoCommerce.OrdersModule.Web/Localizations/de.VirtoCommerce.Orders.json @@ -618,6 +618,10 @@ "Order.PurchasedProductStoreFilter.Enable": { "title": "Aktivierung des Store-Filters für gekaufte Produkte", "description": "Zeigt den Filter für gekaufte Produkte im Store an." + }, + "Order.ProductSnapshot.Enable": { + "title": "Produkt-Snapshots in Bestellungen speichern", + "description": "Speichert serialisierte Produktdaten in Bestellpositionen, um historische Informationen zu bewahren" } }, "module": { diff --git a/src/VirtoCommerce.OrdersModule.Web/Localizations/en.VirtoCommerce.Orders.json b/src/VirtoCommerce.OrdersModule.Web/Localizations/en.VirtoCommerce.Orders.json index d063d305f..5242e47a3 100644 --- a/src/VirtoCommerce.OrdersModule.Web/Localizations/en.VirtoCommerce.Orders.json +++ b/src/VirtoCommerce.OrdersModule.Web/Localizations/en.VirtoCommerce.Orders.json @@ -618,6 +618,10 @@ "Order.PurchasedProductStoreFilter.Enable": { "title": "Enable purchased product store filter", "description": "Display the purchased product filter for the store" + }, + "Order.ProductSnapshot.Enable": { + "title": "Save product snapshots in orders", + "description": "Stores serialized product data in order line items to preserve historical information" } }, "module": { diff --git a/src/VirtoCommerce.OrdersModule.Web/Localizations/es.VirtoCommerce.Orders.json b/src/VirtoCommerce.OrdersModule.Web/Localizations/es.VirtoCommerce.Orders.json index 9088dd3e8..39750cbe0 100644 --- a/src/VirtoCommerce.OrdersModule.Web/Localizations/es.VirtoCommerce.Orders.json +++ b/src/VirtoCommerce.OrdersModule.Web/Localizations/es.VirtoCommerce.Orders.json @@ -618,6 +618,10 @@ "Order.PurchasedProductStoreFilter.Enable": { "title": "Habilitar el filtro de productos comprados en la tienda", "description": "Muestra el filtro de productos comprados en la tienda." + }, + "Order.ProductSnapshot.Enable": { + "title": "Guardar instantáneas de productos en pedidos", + "description": "Almacena datos serializados del producto en las líneas del pedido para conservar la información histórica" } }, "module": { diff --git a/src/VirtoCommerce.OrdersModule.Web/Localizations/fr.VirtoCommerce.Orders.json b/src/VirtoCommerce.OrdersModule.Web/Localizations/fr.VirtoCommerce.Orders.json index c2962b126..640fd5fe7 100644 --- a/src/VirtoCommerce.OrdersModule.Web/Localizations/fr.VirtoCommerce.Orders.json +++ b/src/VirtoCommerce.OrdersModule.Web/Localizations/fr.VirtoCommerce.Orders.json @@ -619,6 +619,10 @@ "Order.PurchasedProductStoreFilter.Enable": { "title": "Activer le filtre de produits achetés en magasin", "description": "Affiche le filtre de produits achetés pour le magasin." + }, + "Order.ProductSnapshot.Enable": { + "title": "Enregistrer des instantanés de produits dans les commandes", + "description": "Stocke les données produit sérialisées dans les lignes de commande afin de préserver les informations historiques" } }, "module": { diff --git a/src/VirtoCommerce.OrdersModule.Web/Localizations/it.VirtoCommerce.Orders.json b/src/VirtoCommerce.OrdersModule.Web/Localizations/it.VirtoCommerce.Orders.json index a6920c1c9..1750db7e3 100644 --- a/src/VirtoCommerce.OrdersModule.Web/Localizations/it.VirtoCommerce.Orders.json +++ b/src/VirtoCommerce.OrdersModule.Web/Localizations/it.VirtoCommerce.Orders.json @@ -618,6 +618,10 @@ "Order.PurchasedProductStoreFilter.Enable": { "title": "Abilita il filtro dei prodotti acquistati nel negozio", "description": "Visualizza il filtro dei prodotti acquistati per il negozio." + }, + "Order.ProductSnapshot.Enable": { + "title": "Salvare le istantanee dei prodotti negli ordini", + "description": "Memorizza i dati serializzati del prodotto nelle righe d'ordine per preservare le informazioni storiche" } }, "module": { diff --git a/src/VirtoCommerce.OrdersModule.Web/Localizations/ja.VirtoCommerce.Orders.json b/src/VirtoCommerce.OrdersModule.Web/Localizations/ja.VirtoCommerce.Orders.json index 44b6b0765..994c93dc2 100644 --- a/src/VirtoCommerce.OrdersModule.Web/Localizations/ja.VirtoCommerce.Orders.json +++ b/src/VirtoCommerce.OrdersModule.Web/Localizations/ja.VirtoCommerce.Orders.json @@ -618,6 +618,10 @@ "Order.PurchasedProductStoreFilter.Enable": { "title": "購入済み商品ストアフィルターを有効にする", "description": "ストアで購入済み商品フィルターを表示します。" + }, + "Order.ProductSnapshot.Enable": { + "title": "注文に商品スナップショットを保存", + "description": "過去情報を保持するため、注文明細にシリアル化した商品データを保存します" } }, "module": { diff --git a/src/VirtoCommerce.OrdersModule.Web/Localizations/pl.VirtoCommerce.Orders.json b/src/VirtoCommerce.OrdersModule.Web/Localizations/pl.VirtoCommerce.Orders.json index 27eb84052..38e485fd7 100644 --- a/src/VirtoCommerce.OrdersModule.Web/Localizations/pl.VirtoCommerce.Orders.json +++ b/src/VirtoCommerce.OrdersModule.Web/Localizations/pl.VirtoCommerce.Orders.json @@ -618,6 +618,10 @@ "Order.PurchasedProductStoreFilter.Enable": { "title": "Włącz filtr zakupionych produktów w sklepie", "description": "Wyświetla filtr zakupionych produktów w sklepie." + }, + "Order.ProductSnapshot.Enable": { + "title": "Zapisuj migawki produktów w zamówieniach", + "description": "Przechowuje zserializowane dane produktu w pozycjach zamówienia, aby zachować informacje historyczne" } }, "module": { diff --git a/src/VirtoCommerce.OrdersModule.Web/Localizations/pt.VirtoCommerce.Orders.json b/src/VirtoCommerce.OrdersModule.Web/Localizations/pt.VirtoCommerce.Orders.json index 36273bba2..4f3efa4ee 100644 --- a/src/VirtoCommerce.OrdersModule.Web/Localizations/pt.VirtoCommerce.Orders.json +++ b/src/VirtoCommerce.OrdersModule.Web/Localizations/pt.VirtoCommerce.Orders.json @@ -618,6 +618,10 @@ "Order.PurchasedProductStoreFilter.Enable": { "title": "Ativar filtro de produtos comprados na loja", "description": "Exibe o filtro de produtos comprados para a loja." + }, + "Order.ProductSnapshot.Enable": { + "title": "Salvar instantâneos de produtos em pedidos", + "description": "Armazena dados serializados do produto nas linhas do pedido para preservar informações históricas" } }, "module": { diff --git a/src/VirtoCommerce.OrdersModule.Web/Localizations/ru.VirtoCommerce.Orders.json b/src/VirtoCommerce.OrdersModule.Web/Localizations/ru.VirtoCommerce.Orders.json index 082910e2f..c801b5d65 100644 --- a/src/VirtoCommerce.OrdersModule.Web/Localizations/ru.VirtoCommerce.Orders.json +++ b/src/VirtoCommerce.OrdersModule.Web/Localizations/ru.VirtoCommerce.Orders.json @@ -618,6 +618,10 @@ "Order.PurchasedProductStoreFilter.Enable": { "title": "Включить фильтр приобретенных продуктов в магазине", "description": "Отображает фильтр приобретенных продуктов для магазина" + }, + "Order.ProductSnapshot.Enable": { + "title": "Сохранять снимки продуктов в заказах", + "description": "Сохраняет сериализованные данные продукта в позициях заказа для сохранения исторической информации" } }, "module": { diff --git a/src/VirtoCommerce.OrdersModule.Web/Localizations/zh.VirtoCommerce.Orders.json b/src/VirtoCommerce.OrdersModule.Web/Localizations/zh.VirtoCommerce.Orders.json index 25e65c82a..12b590682 100644 --- a/src/VirtoCommerce.OrdersModule.Web/Localizations/zh.VirtoCommerce.Orders.json +++ b/src/VirtoCommerce.OrdersModule.Web/Localizations/zh.VirtoCommerce.Orders.json @@ -618,6 +618,10 @@ "Order.PurchasedProductStoreFilter.Enable": { "title": "启用已购买产品的商店过滤器", "description": "在商店中显示已购买产品的过滤器。" + }, + "Order.ProductSnapshot.Enable": { + "title": "在订单中保存产品快照", + "description": "在订单明细中存储序列化的产品数据,以保留历史信息" } }, "module": { diff --git a/tests/VirtoCommerce.OrdersModule.Tests/CustomerOrderBuilderUnitTests.cs b/tests/VirtoCommerce.OrdersModule.Tests/CustomerOrderBuilderUnitTests.cs index a97af1c20..caafd17ab 100644 --- a/tests/VirtoCommerce.OrdersModule.Tests/CustomerOrderBuilderUnitTests.cs +++ b/tests/VirtoCommerce.OrdersModule.Tests/CustomerOrderBuilderUnitTests.cs @@ -4,11 +4,16 @@ using System.Threading.Tasks; using FluentAssertions; using Moq; +using VirtoCommerce.CartModule.Core.Model; +using VirtoCommerce.CatalogModule.Core.Services; +using VirtoCommerce.OrdersModule.Core.Model; using VirtoCommerce.OrdersModule.Core.Services; using VirtoCommerce.OrdersModule.Data.Services; using VirtoCommerce.PaymentModule.Core.Services; using VirtoCommerce.Platform.Core.Settings; using Xunit; +using Address = VirtoCommerce.CartModule.Core.Model.Address; +using LineItem = VirtoCommerce.CartModule.Core.Model.LineItem; namespace VirtoCommerce.OrdersModule.Tests { @@ -18,11 +23,11 @@ public class CustomerOrderBuilderUnitTests public async Task PlaceCustomerOrderFromCartAsync_Cart_ComparingWithOrder() { //Arrange - var cartItem1 = new VirtoCommerce.CartModule.Core.Model.LineItem { Id = Guid.NewGuid().ToString(), ListPrice = 10.99m, SalePrice = 9.66m, DiscountAmount = 1.33m, TaxPercentRate = 0.12m, Quantity = 2 }; - var cart = new VirtoCommerce.CartModule.Core.Model.ShoppingCart + var cartItem1 = new LineItem { Id = Guid.NewGuid().ToString(), ListPrice = 10.99m, SalePrice = 9.66m, DiscountAmount = 1.33m, TaxPercentRate = 0.12m, Quantity = 2 }; + var cart = new ShoppingCart { - Addresses = new List(), - Items = new List { cartItem1 } + Addresses = new List
(), + Items = new List { cartItem1 } }; var builder = GetCustomerOrderBuilder(); @@ -33,7 +38,7 @@ public async Task PlaceCustomerOrderFromCartAsync_Cart_ComparingWithOrder() cart.Should() .BeEquivalentTo(result , options => options - .ComparingByMembers() + .ComparingByMembers() //.RespectingDeclaredTypes() .ExcludingMissingMembers() .Excluding(x => x.Id) @@ -46,7 +51,7 @@ public async Task PlaceCustomerOrderFromCartAsync_Cart_ComparingWithOrder() cartItem1.Should() .BeEquivalentTo(orderItem , options => options - .ComparingByMembers() + .ComparingByMembers() .ExcludingMissingMembers() .Excluding(x => x.Id) .Excluding(x => x.ObjectType) @@ -59,7 +64,7 @@ public async Task PlaceCustomerOrderFromCartAsync_Cart_ComparingWithOrder() public async Task PlaceCustomerOrderFromCartAsync_CartLineItem_ComparingWithOrderLineItem() { //Arrange - var cartItem1 = new VirtoCommerce.CartModule.Core.Model.LineItem + var cartItem1 = new LineItem { Id = Guid.NewGuid().ToString(), ListPrice = 10.99m, @@ -71,10 +76,10 @@ public async Task PlaceCustomerOrderFromCartAsync_CartLineItem_ComparingWithOrde Quantity = 2 }; - var cart = new VirtoCommerce.CartModule.Core.Model.ShoppingCart + var cart = new ShoppingCart { - Addresses = new List(), - Items = new List { cartItem1 }, + Addresses = new List
(), + Items = new List { cartItem1 }, }; var builder = GetCustomerOrderBuilder(); @@ -85,7 +90,7 @@ public async Task PlaceCustomerOrderFromCartAsync_CartLineItem_ComparingWithOrde cartItem1.Should() .BeEquivalentTo(orderItem , options => options - .ComparingByMembers() + .ComparingByMembers() .ExcludingMissingMembers() .Excluding(x => x.Id) .Excluding(x => x.ObjectType) @@ -99,7 +104,11 @@ public async Task PlaceCustomerOrderFromCartAsync_CartLineItem_ComparingWithOrde private static CustomerOrderBuilder GetCustomerOrderBuilder() { - return new CustomerOrderBuilder(new Mock().Object, new Mock().Object, new Mock().Object); + return new CustomerOrderBuilder( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object); } } } From d6128c9e0e62663b5fd7f3def86d5d2e0059f74b Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Sun, 25 Jan 2026 12:29:00 +0300 Subject: [PATCH 03/19] feat: Filter configuration items for checkout in customer orders --- .../VirtoCommerce.OrdersModule.Core.csproj | 2 +- .../Services/CustomerOrderBuilder.cs | 88 +++++++++++-------- 2 files changed, 52 insertions(+), 38 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj index fd5f28f00..a1242bfb2 100644 --- a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj +++ b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs index 964509a4a..e0311ccb0 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading.Tasks; using VirtoCommerce.CartModule.Core.Model; +using VirtoCommerce.CatalogModule.Core.Model; using VirtoCommerce.CatalogModule.Core.Services; using VirtoCommerce.CatalogModule.Data.Search.Indexing; using VirtoCommerce.CoreModule.Core.Common; @@ -302,7 +303,7 @@ protected virtual LineItem ToOrderModel(CartModule.Core.Model.LineItem lineItem) if (lineItem.ConfigurationItems != null) { - retVal.ConfigurationItems = lineItem.ConfigurationItems.Select(ToOrderModel).ToList(); + retVal.ConfigurationItems = lineItem.ConfigurationItems.Where(x => x.SelectedForCheckout).Select(ToOrderModel).ToList(); } retVal.TaxDetails = lineItem.TaxDetails; @@ -562,10 +563,25 @@ protected virtual async Task SaveProductSnapshotsAsync(CustomerOrder order) return; } - // Build map: ProductId → list of items to assign snapshot - var productIdToItems = new Dictionary>(StringComparer.OrdinalIgnoreCase); + // Build map: ProductId → list of items to assign snapshots + var productToItemsMap = GetProductToItemsMap(order.Items); + if (productToItemsMap.Count == 0) + { + return; + } - foreach (var lineItem in order.Items) + foreach (var batchIds in productToItemsMap.Keys.Paginate(ProductSnapshotBatchSize)) + { + var products = await _itemService.GetByIdsAsync(batchIds, null, null); + AssignProductSnapshots(products, productToItemsMap); + } + } + + protected virtual IDictionary> GetProductToItemsMap(ICollection items) + { + var map = new Dictionary>(StringComparer.OrdinalIgnoreCase); + + foreach (var lineItem in items) { AddToMap(lineItem.ProductId, lineItem); @@ -580,53 +596,51 @@ protected virtual async Task SaveProductSnapshotsAsync(CustomerOrder order) } } - if (productIdToItems.Count == 0) - { - return; - } + return map; - // Process in batches to limit memory usage - foreach (var batchIds in productIdToItems.Keys.Paginate(ProductSnapshotBatchSize)) + void AddToMap(string productId, LineItem lineItem, ConfigurationItem configurationItem = null) { - var products = await _itemService.GetByIdsAsync(batchIds, null, null); - if (products.IsNullOrEmpty()) + if (string.IsNullOrEmpty(productId)) { - continue; + return; } - foreach (var product in products.Where(x => x != null)) + if (!map.TryGetValue(productId, out var itemList)) { - var snapshot = IndexDocumentHelper.SerializeObject(product); - - if (productIdToItems.TryGetValue(product.Id, out var items)) - { - foreach (var (lineItem, configurationItem) in items) - { - if (configurationItem != null) - { - configurationItem.ProductSnapshot = snapshot; - } - else - { - lineItem.ProductSnapshot = snapshot; - } - } - } + itemList = []; + map[productId] = itemList; } + + itemList.Add((lineItem, configurationItem)); } + } - return; + protected virtual void AssignProductSnapshots(IList products, IDictionary> productToItemsMap) + { + if (products.IsNullOrEmpty()) + { + return; + } - void AddToMap(string productId, LineItem lineItem, ConfigurationItem configurationItem = null) + foreach (var product in products.Where(x => x != null)) { - if (!string.IsNullOrEmpty(productId)) + if (!productToItemsMap.TryGetValue(product.Id, out var items)) + { + continue; + } + + var snapshot = IndexDocumentHelper.SerializeObject(product); + + foreach (var (lineItem, configurationItem) in items) { - if (!productIdToItems.TryGetValue(productId, out var itemList)) + if (configurationItem != null) + { + configurationItem.ProductSnapshot = snapshot; + } + else { - itemList = []; - productIdToItems[productId] = itemList; + lineItem.ProductSnapshot = snapshot; } - itemList.Add((lineItem, configurationItem)); } } } From c127f049c59ece31740f57b99b9889af1f22e1b7 Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Sun, 25 Jan 2026 12:38:28 +0300 Subject: [PATCH 04/19] feat: Update dependency versions for variation configuration type --- src/VirtoCommerce.OrdersModule.Web/module.manifest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Web/module.manifest b/src/VirtoCommerce.OrdersModule.Web/module.manifest index 22aaca0ae..faf655539 100644 --- a/src/VirtoCommerce.OrdersModule.Web/module.manifest +++ b/src/VirtoCommerce.OrdersModule.Web/module.manifest @@ -7,8 +7,8 @@ 3.917.0 - - + + From 7b3fcb382640c4fd70e53a4fbda4232c9d39fe6f Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Sun, 25 Jan 2026 14:17:48 +0300 Subject: [PATCH 05/19] feat: Update product retrieval method to use GetNoCloneAsync without variations for improved performance --- .../Services/CustomerOrderBuilder.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs index e0311ccb0..228130b2f 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs @@ -572,7 +572,9 @@ protected virtual async Task SaveProductSnapshotsAsync(CustomerOrder order) foreach (var batchIds in productToItemsMap.Keys.Paginate(ProductSnapshotBatchSize)) { - var products = await _itemService.GetByIdsAsync(batchIds, null, null); +#pragma warning disable CS0618 // Variations can be used here + var products = await _itemService.GetNoCloneAsync(batchIds, (ItemResponseGroup.Full & ~ItemResponseGroup.Variations).ToString()); +#pragma warning restore CS0618 AssignProductSnapshots(products, productToItemsMap); } } From 3b80d6616b4bcf62e2617e9bfee799883f4809fe Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Fri, 19 Dec 2025 21:13:04 +0300 Subject: [PATCH 06/19] feat: Refactor order indexing logic (#476) (cherry picked from commit d40e7bb482c32d1436f478b2690a5499d5c4f40e) --- VirtoCommerce.OrdersModule.sln.DotSettings | 3 +- .../Model/Address.cs | 7 +- .../IndexCustomerOrderChangedEventHandler.cs | 45 +++- .../LogChangesOrderChangedEventHandler.cs | 243 ++++++++++-------- .../Indexed/CustomerOrderChangesProvider.cs | 82 +++--- 5 files changed, 215 insertions(+), 165 deletions(-) diff --git a/VirtoCommerce.OrdersModule.sln.DotSettings b/VirtoCommerce.OrdersModule.sln.DotSettings index c15dfd8b0..5ab6883d0 100644 --- a/VirtoCommerce.OrdersModule.sln.DotSettings +++ b/VirtoCommerce.OrdersModule.sln.DotSettings @@ -1,4 +1,5 @@ - + + <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="_" Suffix="" Style="aaBb" /></Policy> True True True diff --git a/src/VirtoCommerce.OrdersModule.Core/Model/Address.cs b/src/VirtoCommerce.OrdersModule.Core/Model/Address.cs index b84d1a3ee..884362f4b 100644 --- a/src/VirtoCommerce.OrdersModule.Core/Model/Address.cs +++ b/src/VirtoCommerce.OrdersModule.Core/Model/Address.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; +using System.Reflection; using VirtoCommerce.Platform.Core.Swagger; namespace VirtoCommerce.OrdersModule.Core.Model @@ -5,6 +7,9 @@ namespace VirtoCommerce.OrdersModule.Core.Model [SwaggerSchemaId("OrderAddress")] public class Address : CoreModule.Core.Common.Address { + public virtual IEnumerable GetAllProperties() + { + return GetProperties(); + } } - } diff --git a/src/VirtoCommerce.OrdersModule.Data/Handlers/IndexCustomerOrderChangedEventHandler.cs b/src/VirtoCommerce.OrdersModule.Data/Handlers/IndexCustomerOrderChangedEventHandler.cs index aaf7abd75..2e200af24 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Handlers/IndexCustomerOrderChangedEventHandler.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Handlers/IndexCustomerOrderChangedEventHandler.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -35,20 +34,46 @@ public IndexCustomerOrderChangedEventHandler( _indexingConfigurations = indexingConfigurations; } - public async Task Handle(OrderChangedEvent message) + public virtual async Task Handle(OrderChangedEvent message) { - if (!_configuration.IsOrderFullTextSearchEnabled() || - !await _settingsManager.GetValueAsync(ModuleConstants.Settings.General.EventBasedIndexation)) + if (await ShouldIndexAsync()) { - return; + await IndexOrdersAsync(message); } + } + + protected virtual async Task ShouldIndexAsync() + { + return _configuration.IsOrderFullTextSearchEnabled() && + await _settingsManager.GetValueAsync(ModuleConstants.Settings.General.EventBasedIndexation); + } + + protected virtual Task IndexOrdersAsync(OrderChangedEvent message) + { + var indexEntries = GetOrderIndexEntries(message); - var indexEntries = message?.ChangedEntries - .Select(x => new IndexEntry { Id = x.OldEntry.Id, EntryState = x.EntryState, Type = ModuleConstants.OrderIndexDocumentType }) - .ToArray() ?? Array.Empty(); + if (indexEntries.Count > 0) + { + var documentBuilders = _indexingConfigurations + .GetDocumentBuilders(ModuleConstants.OrderIndexDocumentType, typeof(CustomerOrderChangesProvider)) + .ToList(); + + _indexingJobService.EnqueueIndexAndDeleteDocuments(indexEntries, JobPriority.Normal, documentBuilders); + } - _indexingJobService.EnqueueIndexAndDeleteDocuments(indexEntries, - JobPriority.Normal, _indexingConfigurations.GetDocumentBuilders(ModuleConstants.OrderIndexDocumentType, typeof(CustomerOrderChangesProvider)).ToList()); + return Task.CompletedTask; + } + + protected virtual IList GetOrderIndexEntries(OrderChangedEvent message) + { + return message?.ChangedEntries + .Select(x => new IndexEntry + { + Id = x.OldEntry.Id, + EntryState = x.EntryState, + Type = ModuleConstants.OrderIndexDocumentType, + }) + .ToList() ?? []; } } } diff --git a/src/VirtoCommerce.OrdersModule.Data/Handlers/LogChangesOrderChangedEventHandler.cs b/src/VirtoCommerce.OrdersModule.Data/Handlers/LogChangesOrderChangedEventHandler.cs index 44c22be3d..bb364199c 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Handlers/LogChangesOrderChangedEventHandler.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Handlers/LogChangesOrderChangedEventHandler.cs @@ -2,7 +2,6 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; -using System.Reflection; using System.Threading.Tasks; using AutoCompare; using Hangfire; @@ -25,7 +24,7 @@ public class LogChangesOrderChangedEventHandler : IEventHandler> _auditablePropertiesListByTypeDict = new(); + private static readonly ConcurrentDictionary> _auditablePropertiesListByTypeDict = new(); public LogChangesOrderChangedEventHandler(IChangeLogService changeLogService, IMemberService memberService, ISettingsManager settingsManager) { @@ -40,118 +39,133 @@ public virtual async Task Handle(OrderChangedEvent message) if (logOrderChangesEnabled && message.ChangedEntries.Any()) { - var operationLogs = new List(); + var operationLogs = GetOperationLogs(message.ChangedEntries); - foreach (var changedEntry in message.ChangedEntries) + if (!operationLogs.IsNullOrEmpty()) { - if (changedEntry.EntryState == EntryState.Modified) - { - var originalOperations = changedEntry.OldEntry.GetFlatObjectsListWithInterface().Distinct().ToList(); - var modifiedOperations = changedEntry.NewEntry.GetFlatObjectsListWithInterface().Distinct().ToList(); - - modifiedOperations.CompareTo(originalOperations, EqualityComparer.Default, - (state, modified, original) => operationLogs.AddRange(GetChangedEntryOperationLogs(new GenericChangedEntry(modified, original, state)))); - } - else if (changedEntry.EntryState == EntryState.Added || changedEntry.EntryState == EntryState.Deleted) - { - operationLogs.AddRange(GetChangedEntryOperationLogs(new GenericChangedEntry(changedEntry.NewEntry, changedEntry.OldEntry, changedEntry.EntryState))); - } + BackgroundJob.Enqueue(() => TryToLogChangesBackgroundJob(operationLogs.ToArray())); } + } + } - if (!operationLogs.IsNullOrEmpty()) + protected virtual IList GetOperationLogs(IEnumerable> changedEntries) + { + var operationLogs = new List(); + + foreach (var changedEntry in changedEntries) + { + switch (changedEntry.EntryState) { - BackgroundJob.Enqueue(() => TryToLogChangesBackgroundJob(operationLogs.ToArray())); + case EntryState.Modified: + { + var originalOperations = changedEntry.OldEntry.GetFlatObjectsListWithInterface().Distinct().ToList(); + var modifiedOperations = changedEntry.NewEntry.GetFlatObjectsListWithInterface().Distinct().ToList(); + + modifiedOperations.CompareTo(originalOperations, EqualityComparer.Default, + (state, modified, original) => operationLogs.AddRange(GetChangedEntryOperationLogs(new GenericChangedEntry(modified, original, state)))); + break; + } + case EntryState.Added or EntryState.Deleted: + operationLogs.AddRange(GetChangedEntryOperationLogs(new GenericChangedEntry(changedEntry.NewEntry, changedEntry.OldEntry, changedEntry.EntryState))); + break; } } + + return operationLogs; } - // (!) Do not make this method async, it causes improper user recorded into the log! It happens because the user stored in the current thread. If the thread switched, the user info will lost. - public void TryToLogChangesBackgroundJob(OperationLog[] operationLogs) + public Task TryToLogChangesBackgroundJob(OperationLog[] operationLogs) { - _changeLogService.SaveChangesAsync(operationLogs).GetAwaiter().GetResult(); + return _changeLogService.SaveChangesAsync(operationLogs); } protected virtual IEnumerable GetChangedEntryOperationLogs(GenericChangedEntry changedEntry) { var result = new List(); - if (changedEntry.EntryState == EntryState.Modified) + switch (changedEntry.EntryState) { - var logs = new List(); + case EntryState.Modified: + { + var logs = new List(); + var diff = GetOperationDifferences(changedEntry, logs); + var auditableProperties = GetAuditableProperties(changedEntry); - var diff = GetOperationDifferences(changedEntry, logs); + if (auditableProperties.Count > 0) + { + var observedDifferences = diff + .Where(x => auditableProperties.ContainsIgnoreCase(x.Name)) + .Distinct(new DifferenceComparer()); - var auditableProperties = GetAuditableProperties(changedEntry); + foreach (var difference in observedDifferences) + { + logs.Add($"The {changedEntry.OldEntry.OperationType} {changedEntry.NewEntry.Number} property '{difference.Name}' changed from '{difference.OldValue}' to '{difference.NewValue}'"); + } + } - if (auditableProperties.Count != 0) - { - var observedDifferences = diff.Join(auditableProperties, x => x.Name.ToLowerInvariant(), x => x.ToLowerInvariant(), (x, y) => x).ToArray(); - foreach (var difference in observedDifferences.Distinct(new DifferenceComparer())) + foreach (var log in logs) + { + result.Add(GetLogRecord(changedEntry.NewEntry, log)); + } + + break; + } + case EntryState.Deleted: { - logs.Add($"The {changedEntry.OldEntry.OperationType} {changedEntry.NewEntry.Number} property '{difference.Name}' changed from '{difference.OldValue}' to '{difference.NewValue}'"); + var record = GetLogRecord(changedEntry.NewEntry, + $"The {changedEntry.NewEntry.OperationType} {changedEntry.NewEntry.Number} deleted", + EntryState.Deleted); + result.Add(record); + break; + } + case EntryState.Added: + { + var record = GetLogRecord(changedEntry.NewEntry, + $"The new {changedEntry.NewEntry.OperationType} {changedEntry.NewEntry.Number} added", + EntryState.Added); + result.Add(record); + break; } - } - - result.AddRange(logs.Select(x => GetLogRecord(changedEntry.NewEntry, x))); - } - else if (changedEntry.EntryState == EntryState.Deleted) - { - var record = GetLogRecord(changedEntry.NewEntry, - $"The {changedEntry.NewEntry.OperationType} {changedEntry.NewEntry.Number} deleted", - EntryState.Deleted); - result.Add(record); - } - else if (changedEntry.EntryState == EntryState.Added) - { - var record = GetLogRecord(changedEntry.NewEntry, - $"The new {changedEntry.NewEntry.OperationType} {changedEntry.NewEntry.Number} added", - EntryState.Added); - result.Add(record); } return result; } - protected List GetAuditableProperties(GenericChangedEntry changedEntry) + protected static List GetAuditableProperties(GenericChangedEntry changedEntry) { var type = changedEntry.OldEntry.GetType(); - if (!_auditablePropertiesListByTypeDict.TryGetValue(type.Name, out var auditableProperties)) - { - auditableProperties = type.GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(AuditableAttribute))) - .Select(x => x.Name) - .ToList(); - _auditablePropertiesListByTypeDict[type.Name] = auditableProperties; - } - return auditableProperties; + return _auditablePropertiesListByTypeDict.GetOrAdd(type, t => + t.GetProperties() + .Where(prop => Attribute.IsDefined(prop, typeof(AuditableAttribute))) + .Select(x => x.Name) + .ToList()); } protected virtual IList GetOperationDifferences(GenericChangedEntry changedEntry, List logs) { var diff = Comparer.Compare(changedEntry.OldEntry, changedEntry.NewEntry); - if (changedEntry.OldEntry is Shipment shipment) - { - logs.AddRange(GetShipmentChanges(shipment, changedEntry.NewEntry as Shipment)); - diff.AddRange(Comparer.Compare(shipment, changedEntry.NewEntry as Shipment)); - } - else if (changedEntry.OldEntry is PaymentIn payment) - { - logs.AddRange(GetPaymentChanges(payment, changedEntry.NewEntry as PaymentIn)); - diff.AddRange(Comparer.Compare(payment, changedEntry.NewEntry as PaymentIn)); - } - else if (changedEntry.OldEntry is CustomerOrder order) - { - logs.AddRange(GetCustomerOrderChanges(order, changedEntry.NewEntry as CustomerOrder)); - diff.AddRange(Comparer.Compare(order, changedEntry.NewEntry as CustomerOrder)); - } - else if (changedEntry.OldEntry is Capture capture) + switch (changedEntry.OldEntry) { - diff.AddRange(Comparer.Compare(capture, changedEntry.NewEntry as Capture)); - } - else if (changedEntry.OldEntry is Refund refund) - { - diff.AddRange(Comparer.Compare(refund, changedEntry.NewEntry as Refund)); + case Shipment shipment: + logs.AddRange(GetShipmentChanges(shipment, changedEntry.NewEntry as Shipment)); + diff.AddRange(Comparer.Compare(shipment, changedEntry.NewEntry as Shipment)); + break; + case PaymentIn payment: + logs.AddRange(GetPaymentChanges(payment, changedEntry.NewEntry as PaymentIn)); + diff.AddRange(Comparer.Compare(payment, changedEntry.NewEntry as PaymentIn)); + break; + case CustomerOrder order: + logs.AddRange(GetCustomerOrderChanges(order, changedEntry.NewEntry as CustomerOrder)); + diff.AddRange(Comparer.Compare(order, changedEntry.NewEntry as CustomerOrder)); + break; + case Capture capture: + diff.AddRange(Comparer.Compare(capture, changedEntry.NewEntry as Capture)); + break; + case Refund refund: + diff.AddRange(Comparer.Compare(refund, changedEntry.NewEntry as Refund)); + break; } return diff; @@ -160,63 +174,61 @@ protected virtual IList GetOperationDifferences(GenericChangedEntry< protected virtual IEnumerable GetCustomerOrderChanges(CustomerOrder originalOrder, CustomerOrder modifiedOrder) { var result = new List(); + if (originalOrder.EmployeeId != modifiedOrder.EmployeeId) { var employeeName = "none"; if (!string.IsNullOrEmpty(modifiedOrder.EmployeeId)) { var employee = _memberService.GetByIdAsync(modifiedOrder.EmployeeId).GetAwaiter().GetResult() as Employee; - employeeName = employee != null ? employee.FullName : employeeName; + employeeName = employee?.FullName ?? employeeName; } result.Add($"Order employee was changed to '{employeeName}'"); } + result.AddRange(GetAddressChanges(originalOrder, originalOrder.Addresses, modifiedOrder.Addresses)); - return result.ToArray(); + + return result; } protected virtual IEnumerable GetShipmentChanges(Shipment originalShipment, Shipment modifiedShipment) { - var retVal = new List(); - retVal.AddRange(GetAddressChanges(originalShipment, new[] { originalShipment.DeliveryAddress }, new[] { modifiedShipment.DeliveryAddress })); - return retVal.ToArray(); + return GetAddressChanges(originalShipment, [originalShipment.DeliveryAddress], [modifiedShipment.DeliveryAddress]); } protected virtual IEnumerable GetPaymentChanges(PaymentIn payment, PaymentIn modifiedPayment) { - var result = new List(); - result.AddRange(GetAddressChanges(payment, new[] { payment.BillingAddress }, new[] { modifiedPayment.BillingAddress })); - return result; + return GetAddressChanges(payment, [payment.BillingAddress], [modifiedPayment.BillingAddress]); } protected virtual IEnumerable GetAddressChanges(IOperation operation, IEnumerable
originalAddress, IEnumerable
modifiedAddress) { var result = new List(); - modifiedAddress.Where(x => x != null).ToList().CompareTo(originalAddress.Where(x => x != null).ToList(), EqualityComparer
.Default, - (state, source, target) => - { - if (state == EntryState.Added) - { - result.Add($"The address '{StringifyAddress(target)}' for {operation.OperationType} {operation.Number} added"); - } - else if (state == EntryState.Deleted) - { - result.Add($"The address '{StringifyAddress(target)}' for {operation.OperationType} {operation.Number} deleted"); - } - }); + + var modifiedAddressList = modifiedAddress?.Where(x => x != null).ToList() ?? []; + var originalAddressList = originalAddress?.Where(x => x != null).ToList() ?? []; + + modifiedAddressList.CompareTo(originalAddressList, EqualityComparer
.Default, (state, _, target) => + { + switch (state) + { + case EntryState.Added: + result.Add($"The address '{StringifyAddress(target)}' for {operation.OperationType} {operation.Number} added"); + break; + case EntryState.Deleted: + result.Add($"The address '{StringifyAddress(target)}' for {operation.OperationType} {operation.Number} deleted"); + break; + } + }); + return result; } protected virtual string StringifyAddress(Address address) { - var result = ""; - if (address != null) - { - return string.Join(", ", typeof(Address).GetProperties(BindingFlags.Instance | BindingFlags.Public) - .OrderBy(p => p.Name) - .Select(p => p.GetValue(address)) - .Where(x => x != null)); - } - return result; + return address is null + ? string.Empty + : string.Join(", ", address.GetAllProperties().Select(p => p.GetValue(address)).Where(x => x != null)); } protected virtual OperationLog GetLogRecord(IOperation operation, string template, EntryState operationType = EntryState.Modified) @@ -232,17 +244,28 @@ protected virtual OperationLog GetLogRecord(IOperation operation, string templat } } - internal class DifferenceComparer : EqualityComparer + internal sealed class DifferenceComparer : EqualityComparer { public override bool Equals(Difference x, Difference y) { - return GetHashCode(x) == GetHashCode(y); + if (ReferenceEquals(x, y)) + { + return true; + } + + if (x is null || y is null) + { + return false; + } + + return string.Equals(x.Name, y.Name, StringComparison.Ordinal) && + Equals(x.OldValue, y.OldValue) && + Equals(x.NewValue, y.NewValue); } public override int GetHashCode(Difference obj) { - var result = string.Join(":", obj.Name, obj.NewValue, obj.OldValue); - return result.GetHashCode(); + return HashCode.Combine(obj.Name, obj.OldValue, obj.NewValue); } } } diff --git a/src/VirtoCommerce.OrdersModule.Data/Search/Indexed/CustomerOrderChangesProvider.cs b/src/VirtoCommerce.OrdersModule.Data/Search/Indexed/CustomerOrderChangesProvider.cs index e38acab67..5da548680 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Search/Indexed/CustomerOrderChangesProvider.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Search/Indexed/CustomerOrderChangesProvider.cs @@ -2,8 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using VirtoCommerce.CatalogModule.Core.Model; -using VirtoCommerce.CustomerModule.Core.Model; +using Microsoft.EntityFrameworkCore; using VirtoCommerce.OrdersModule.Core.Model; using VirtoCommerce.OrdersModule.Data.Repositories; using VirtoCommerce.Platform.Core.ChangeLog; @@ -26,28 +25,24 @@ public CustomerOrderChangesProvider(Func orderRepositoryFactor _changeLogSearchService = changeLogSearchService; } - public async Task> GetChangesAsync(DateTime? startDate, DateTime? endDate, long skip, long take) + public virtual Task> GetChangesAsync(DateTime? startDate, DateTime? endDate, long skip, long take) { - if (startDate == null && endDate == null) - { - return GetChangesFromRepository(skip, take); - } - - return await GetChangesFromOperaionLog(startDate, endDate, skip, take); + return startDate == null && endDate == null + ? GetChangesFromRepositoryAsync(skip, take) + : GetChangesFromOperationLogAsync(startDate, endDate, skip, take); } - public async Task GetTotalChangesCountAsync(DateTime? startDate, DateTime? endDate) + public virtual async Task GetTotalChangesCountAsync(DateTime? startDate, DateTime? endDate) { if (startDate == null && endDate == null) { // Get total products count - using (var repository = _orderRepositoryFactory()) - { - return repository.CustomerOrders.Count(); - } + using var repository = _orderRepositoryFactory(); + + return await repository.CustomerOrders.CountAsync(); } - var criteria = GetChangeLogSearchCriteria(startDate, endDate, 0, 0); + var criteria = GetChangeLogSearchCriteria(startDate, endDate, skip: 0, take: 0); // Get changes count from operation log return (await _changeLogSearchService.SearchAsync(criteria)).TotalCount; @@ -56,44 +51,45 @@ public async Task GetTotalChangesCountAsync(DateTime? startDate, DateTime? /// /// Get documents from repository and return them as changes /// - private IList GetChangesFromRepository(long skip, long take) + protected virtual async Task> GetChangesFromRepositoryAsync(long skip, long take) { - using (var repository = _orderRepositoryFactory()) - { - var productIds = repository.CustomerOrders - .OrderBy(i => i.CreatedDate) - .Select(i => i.Id) - .Skip((int)skip) - .Take((int)take) - .ToArray(); - - return productIds.Select(id => + using var repository = _orderRepositoryFactory(); + + var orders = await repository.CustomerOrders + .OrderBy(x => x.CreatedDate) + .Select(x => new { x.Id, ModifiedDate = x.ModifiedDate ?? x.CreatedDate }) + .Skip((int)skip) + .Take((int)take) + .ToArrayAsync(); + + return orders + .Select(x => new IndexDocumentChange { - DocumentId = id, + DocumentId = x.Id, ChangeType = IndexDocumentChangeType.Modified, - ChangeDate = DateTime.UtcNow - } - ).ToArray(); - } + ChangeDate = x.ModifiedDate, + }) + .ToList(); } /// /// Get changes from operation log /// - private async Task> GetChangesFromOperaionLog(DateTime? startDate, DateTime? endDate, long skip, long take) + protected virtual async Task> GetChangesFromOperationLogAsync(DateTime? startDate, DateTime? endDate, long skip, long take) { var criteria = GetChangeLogSearchCriteria(startDate, endDate, skip, take); var operations = (await _changeLogSearchService.SearchAsync(criteria)).Results; - return operations.Select(o => - new IndexDocumentChange - { - DocumentId = o.ObjectId, - ChangeType = o.OperationType == EntryState.Deleted ? IndexDocumentChangeType.Deleted : IndexDocumentChangeType.Modified, - ChangeDate = o.ModifiedDate ?? o.CreatedDate, - } - ).ToArray(); + return operations + .Select(x => + new IndexDocumentChange + { + DocumentId = x.ObjectId, + ChangeType = x.OperationType == EntryState.Deleted ? IndexDocumentChangeType.Deleted : IndexDocumentChangeType.Modified, + ChangeDate = x.ModifiedDate ?? x.CreatedDate, + }) + .ToList(); } protected virtual ChangeLogSearchCriteria GetChangeLogSearchCriteria(DateTime? startDate, DateTime? endDate, long skip, long take) @@ -102,14 +98,14 @@ protected virtual ChangeLogSearchCriteria GetChangeLogSearchCriteria(DateTime? s var types = AbstractTypeFactory.AllTypeInfos.Select(x => x.TypeName).ToList(); - if (types.Count != 0) + if (types.Count > 0) { - types.Add(nameof(CustomerOrder)); + types.Add(ChangeLogObjectType); criteria.ObjectTypes = types; } else { - criteria.ObjectType = nameof(CustomerOrder); + criteria.ObjectType = ChangeLogObjectType; } criteria.StartDate = startDate; From 6b368a15a893d4b229362bb86f4c72e5f398958c Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Tue, 27 Jan 2026 10:56:30 +0300 Subject: [PATCH 07/19] feat: Add LineItemId property to ConfigurationItem and update entity mapping --- src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs | 2 ++ .../Model/ConfigurationItemEntity.cs | 1 + 2 files changed, 3 insertions(+) diff --git a/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs b/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs index 62d3f900d..b0b0a137c 100644 --- a/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs +++ b/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs @@ -8,6 +8,8 @@ namespace VirtoCommerce.OrdersModule.Core.Model; [SwaggerSchemaId("OrderConfigurationItem")] public class ConfigurationItem : AuditableEntity { + public string LineItemId { get; set; } + public string ProductId { get; set; } public string SectionId { get; set; } diff --git a/src/VirtoCommerce.OrdersModule.Data/Model/ConfigurationItemEntity.cs b/src/VirtoCommerce.OrdersModule.Data/Model/ConfigurationItemEntity.cs index 0a3f3f9c9..4bf832fa4 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Model/ConfigurationItemEntity.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Model/ConfigurationItemEntity.cs @@ -68,6 +68,7 @@ public virtual ConfigurationItem ToModel(ConfigurationItem configurationItem) configurationItem.ModifiedBy = ModifiedBy; configurationItem.ModifiedDate = ModifiedDate; + configurationItem.LineItemId = LineItemId; configurationItem.ProductId = ProductId; configurationItem.SectionId = SectionId; configurationItem.Name = Name; From c7fd2edb9a930fbe1cbe717931613a95cc60efb8 Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Tue, 27 Jan 2026 12:03:49 +0300 Subject: [PATCH 08/19] feat: Update dependency versions for Cart and Catalog modules --- .../VirtoCommerce.OrdersModule.Core.csproj | 2 +- .../VirtoCommerce.OrdersModule.Data.csproj | 2 +- src/VirtoCommerce.OrdersModule.Web/module.manifest | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj index a1242bfb2..c523b8c04 100644 --- a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj +++ b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj index 3349035d3..9ca6db48c 100644 --- a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj +++ b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Web/module.manifest b/src/VirtoCommerce.OrdersModule.Web/module.manifest index faf655539..6a28e340c 100644 --- a/src/VirtoCommerce.OrdersModule.Web/module.manifest +++ b/src/VirtoCommerce.OrdersModule.Web/module.manifest @@ -7,8 +7,8 @@ 3.917.0 - - + + From 4c40d22169d5b3f46a07625c38372f8dff8bb13b Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Wed, 28 Jan 2026 19:52:29 +0300 Subject: [PATCH 09/19] Update dependencies to Wave 1 alpha versions - VirtoCommerce.CartModule.Core: 3.841.0-alpha.773-variation-configuration-type - VirtoCommerce.CatalogModule.Data: 3.913.0-alpha.2458-variation-configuration-type --- .../VirtoCommerce.OrdersModule.Core.csproj | 2 +- .../VirtoCommerce.OrdersModule.Data.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj index c523b8c04..d6ec7f045 100644 --- a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj +++ b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj index 9ca6db48c..bdd77d6c4 100644 --- a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj +++ b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj @@ -17,7 +17,7 @@ - + From 5a174e9f574c0cfda3ee1bf1aa4a425113540fa3 Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Wed, 28 Jan 2026 19:56:51 +0300 Subject: [PATCH 10/19] Update module.manifest dependencies to Wave 1 alpha versions --- src/VirtoCommerce.OrdersModule.Web/module.manifest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Web/module.manifest b/src/VirtoCommerce.OrdersModule.Web/module.manifest index fd8c8b9e3..1859a709c 100644 --- a/src/VirtoCommerce.OrdersModule.Web/module.manifest +++ b/src/VirtoCommerce.OrdersModule.Web/module.manifest @@ -7,8 +7,8 @@ 3.917.0 - - + + From bd9d7bfb880a1082cb015dbd7837267fd403f540 Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Wed, 18 Feb 2026 15:31:23 +0300 Subject: [PATCH 11/19] chore: Update Catalog and Cart dependencies to alpha versions Update CatalogModule.Data to 3.1001.0-alpha.2468-variation-configuration-type Update CartModule.Core to 3.1001.0-alpha.776-variation-configuration-type --- .../VirtoCommerce.OrdersModule.Core.csproj | 2 +- .../VirtoCommerce.OrdersModule.Data.csproj | 2 +- src/VirtoCommerce.OrdersModule.Web/module.manifest | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj index 7aad5096a..db37f205a 100644 --- a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj +++ b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj index a6b0c1532..77e174cba 100644 --- a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj +++ b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Web/module.manifest b/src/VirtoCommerce.OrdersModule.Web/module.manifest index 17bab4639..0b91307a0 100644 --- a/src/VirtoCommerce.OrdersModule.Web/module.manifest +++ b/src/VirtoCommerce.OrdersModule.Web/module.manifest @@ -7,8 +7,8 @@ 3.1002.0 - - + + From 70f3fae8acd5f31f0c2c1692606fe60656667f0d Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:37:06 +0300 Subject: [PATCH 12/19] chore: remove .serena from version control Co-Authored-By: Claude Opus 4.6 --- .serena/memories/project_overview.md | 79 ------------------ .serena/memories/project_structure.md | 76 ----------------- .serena/project.yml | 112 -------------------------- 3 files changed, 267 deletions(-) delete mode 100755 .serena/memories/project_overview.md delete mode 100755 .serena/memories/project_structure.md delete mode 100755 .serena/project.yml diff --git a/.serena/memories/project_overview.md b/.serena/memories/project_overview.md deleted file mode 100755 index 368b3dea9..000000000 --- a/.serena/memories/project_overview.md +++ /dev/null @@ -1,79 +0,0 @@ -# VirtoCommerce Orders Module - Project Overview - -## Purpose - -The VirtoCommerce Order Module is a document-based flexible order management system for the VirtoCommerce e-commerce platform. It handles complex order processing workflows including payments, shipments, refunds, and custom document types. - -## Key Features - -- **Document-based structure**: Orders contain related documents (payments, shipments, addresses) -- **Status management**: Independent status tracking for each document type -- **Order editing**: Modify products, quantities, prices, discounts -- **Draft orders**: Save and manage order drafts -- **Order cloning**: Create repeated orders -- **Change history**: Complete audit trail of modifications -- **Dynamic properties**: Extend orders with custom fields -- **Number templates**: Configurable order/payment/shipment number generation -- **FluentValidation**: Validation rules for order documents -- **Search indexing**: Advanced search with event-based indexation -- **Email notifications**: Configurable templates for order lifecycle events -- **Role-based access control**: Granular permissions for order operations - -## Tech Stack - -| Component | Technology | -|-----------|------------| -| Runtime | .NET 8.0 | -| Platform | VirtoCommerce 3.x (platform version 3.917.0+) | -| Database | SQL Server, PostgreSQL, MySQL | -| ORM | Entity Framework Core | -| Validation | FluentValidation | -| Testing | xUnit, MSTest, Moq, FluentAssertions | -| Code Coverage | coverlet | -| Frontend | AngularJS (VirtoCommerce Admin UI) | -| Build | NUKE | - -## Module Version - -Current version: 3.867.0 - -## Dependencies - -| Module | Version | -|--------|---------| -| VirtoCommerce.Assets | 3.814.0 | -| VirtoCommerce.Cart | 3.841.0+ | -| VirtoCommerce.Catalog | 3.913.0+ | -| VirtoCommerce.Core | 3.824.0 | -| VirtoCommerce.Customer | 3.846.0 | -| VirtoCommerce.Inventory | 3.815.0 | -| VirtoCommerce.Notifications | 3.830.0 | -| VirtoCommerce.Payment | 3.811.0 | -| VirtoCommerce.Search | 3.821.0 | -| VirtoCommerce.Shipping | 3.816.0 | -| VirtoCommerce.Store | 3.823.0 | - -## Domain Model - -``` -CustomerOrder (IOperation) -├── LineItem[] -├── Address[] -├── PaymentIn[] (IOperation) -│ ├── Capture[] -│ └── Refund[] -├── Shipment[] (IOperation) -│ ├── ShipmentItem[] -│ ├── ShipmentPackage[] -│ └── Address -└── DynamicProperties[] -``` - -## Key Services - -- **CustomerOrderService**: Core service for order CRUD operations -- **CustomerOrderSearchService**: Advanced search and filtering -- **CustomerOrderTotalsCalculator**: Order totals calculation -- **CustomerOrderValidator**: FluentValidation-based validation -- **OrderDocumentCountValidator**: Document count limit enforcement -- **OrderRepository**: Data access layer with EF Core diff --git a/.serena/memories/project_structure.md b/.serena/memories/project_structure.md deleted file mode 100755 index 8c0706bb2..000000000 --- a/.serena/memories/project_structure.md +++ /dev/null @@ -1,76 +0,0 @@ -# VirtoCommerce Orders Module - Project Structure - -## Solution - -**Solution file**: `VirtoCommerce.OrdersModule.sln` - -## Directory Layout - -``` -vc-module-order/ -├── src/ -│ ├── VirtoCommerce.OrdersModule.Core/ # Domain models, interfaces, events -│ │ ├── Events/ # Domain events -│ │ ├── Extensions/ # Extension methods -│ │ ├── Model/ # Domain models -│ │ ├── Notifications/ # Notification definitions -│ │ ├── Search/ # Search criteria and results -│ │ ├── Services/ # Service interfaces -│ │ └── ModuleConstants.cs # Module constants, settings, permissions -│ │ -│ ├── VirtoCommerce.OrdersModule.Data/ # Data access, services implementation -│ │ ├── Authorization/ # Authorization handlers -│ │ ├── Caching/ # Cache keys -│ │ ├── ExportImport/ # Export/import functionality -│ │ ├── Extensions/ # Extension methods -│ │ ├── Handlers/ # Event handlers -│ │ ├── Model/ # Entity models -│ │ ├── Repositories/ # Data repositories -│ │ ├── Search/ # Search service implementations -│ │ ├── Services/ # Service implementations -│ │ └── Validators/ # FluentValidation validators -│ │ -│ ├── VirtoCommerce.OrdersModule.Data.SqlServer/ # SQL Server migrations -│ ├── VirtoCommerce.OrdersModule.Data.PostgreSql/ # PostgreSQL migrations -│ ├── VirtoCommerce.OrdersModule.Data.MySql/ # MySQL migrations -│ │ -│ └── VirtoCommerce.OrdersModule.Web/ # Web API, module entry point -│ ├── Authorization/ # Web authorization -│ ├── Content/ # Static content -│ ├── Controllers/ # REST API controllers -│ ├── dist/ # Compiled frontend -│ ├── Extensions/ # Web extensions -│ ├── JsonConverters/ # Custom JSON converters -│ ├── Localizations/ # Localization files -│ ├── NotificationTemplates/ # Email templates -│ ├── Scripts/ # AngularJS frontend -│ ├── Module.cs # Module entry point -│ └── module.manifest # Module metadata -│ -├── tests/ -│ └── VirtoCommerce.OrdersModule.Tests/ # Unit and integration tests -│ -├── docs/ # Documentation -├── samples/ # Sample implementations -├── .nuke/ # NUKE build configuration -├── .github/ # GitHub workflows -├── Directory.Build.props # Shared build properties -└── .editorconfig # Code style configuration -``` - -## Key Files - -| File | Purpose | -|------|---------| -| `src/VirtoCommerce.OrdersModule.Web/Module.cs` | Module entry point, dependency registration | -| `src/VirtoCommerce.OrdersModule.Web/module.manifest` | Module metadata, version, dependencies | -| `src/VirtoCommerce.OrdersModule.Core/ModuleConstants.cs` | Settings, permissions, event types | -| `Directory.Build.props` | Shared build configuration, version | -| `.editorconfig` | Code style rules | - -## Database Migrations - -Migrations are database-specific and located in: -- SQL Server: `src/VirtoCommerce.OrdersModule.Data.SqlServer/` -- PostgreSQL: `src/VirtoCommerce.OrdersModule.Data.PostgreSql/` -- MySQL: `src/VirtoCommerce.OrdersModule.Data.MySql/` diff --git a/.serena/project.yml b/.serena/project.yml deleted file mode 100755 index 6bf9bf4ca..000000000 --- a/.serena/project.yml +++ /dev/null @@ -1,112 +0,0 @@ -# the name by which the project can be referenced within Serena -project_name: "vc-module-order" - - -# list of languages for which language servers are started; choose from: -# al bash clojure cpp csharp -# csharp_omnisharp dart elixir elm erlang -# fortran fsharp go groovy haskell -# java julia kotlin lua markdown -# matlab nix pascal perl php -# powershell python python_jedi r rego -# ruby ruby_solargraph rust scala swift -# terraform toml typescript typescript_vts vue -# yaml zig -# (This list may be outdated. For the current list, see values of Language enum here: -# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py -# For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.) -# Note: -# - For C, use cpp -# - For JavaScript, use typescript -# - For Free Pascal/Lazarus, use pascal -# Special requirements: -# Some languages require additional setup/installations. -# See here for details: https://oraios.github.io/serena/01-about/020_programming-languages.html#language-servers -# When using multiple languages, the first language server that supports a given file will be used for that file. -# The first language is the default language and the respective language server will be used as a fallback. -# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored. -languages: -- csharp - -# the encoding used by text files in the project -# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings -encoding: "utf-8" - -# whether to use project's .gitignore files to ignore files -ignore_all_files_in_gitignore: true - -# list of additional paths to ignore in all projects -# same syntax as gitignore, so you can use * and ** -ignored_paths: [] - -# whether the project is in read-only mode -# If set to true, all editing tools will be disabled and attempts to use them will result in an error -# Added on 2025-04-18 -read_only: false - -# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details. -# Below is the complete list of tools for convenience. -# To make sure you have the latest list of tools, and to view their descriptions, -# execute `uv run scripts/print_tool_overview.py`. -# -# * `activate_project`: Activates a project by name. -# * `check_onboarding_performed`: Checks whether project onboarding was already performed. -# * `create_text_file`: Creates/overwrites a file in the project directory. -# * `delete_lines`: Deletes a range of lines within a file. -# * `delete_memory`: Deletes a memory from Serena's project-specific memory store. -# * `execute_shell_command`: Executes a shell command. -# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced. -# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type). -# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type). -# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes. -# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file. -# * `initial_instructions`: Gets the initial instructions for the current project. -# Should only be used in settings where the system prompt cannot be set, -# e.g. in clients you have no control over, like Claude Desktop. -# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol. -# * `insert_at_line`: Inserts content at a given line in a file. -# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol. -# * `list_dir`: Lists files and directories in the given directory (optionally with recursion). -# * `list_memories`: Lists memories in Serena's project-specific memory store. -# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building). -# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context). -# * `read_file`: Reads a file within the project directory. -# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store. -# * `remove_project`: Removes a project from the Serena configuration. -# * `replace_lines`: Replaces a range of lines within a file with new content. -# * `replace_symbol_body`: Replaces the full definition of a symbol. -# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen. -# * `search_for_pattern`: Performs a search for a pattern in the project. -# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase. -# * `switch_modes`: Activates modes by providing a list of their names -# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information. -# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task. -# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed. -# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store. -excluded_tools: [] - -# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default) -included_optional_tools: [] - -# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools. -# This cannot be combined with non-empty excluded_tools or included_optional_tools. -fixed_tools: [] - -# list of mode names to that are always to be included in the set of active modes -# The full set of modes to be activated is base_modes + default_modes. -# If the setting is undefined, the base_modes from the global configuration (serena_config.yml) apply. -# Otherwise, this setting overrides the global configuration. -# Set this to [] to disable base modes for this project. -# Set this to a list of mode names to always include the respective modes for this project. -base_modes: - -# list of mode names that are to be activated by default. -# The full set of modes to be activated is base_modes + default_modes. -# If the setting is undefined, the default_modes from the global configuration (serena_config.yml) apply. -# Otherwise, this overrides the setting from the global configuration (serena_config.yml). -# This setting can, in turn, be overridden by CLI parameters (--mode). -default_modes: - -# initial prompt for the project. It will always be given to the LLM upon activating the project -# (contrary to the memories, which are loaded on demand). -initial_prompt: "" From b880849bb59ffeab92ce503c9224b7d68b560687 Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Tue, 10 Mar 2026 11:59:43 +0300 Subject: [PATCH 13/19] refactor: use ProductJsonSerializer from CatalogModule.Core instead of Data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace CatalogModule.Data dependency with CatalogModule.Core in OrdersModule.Data. Use ProductJsonSerializer.Serialize instead of IndexDocumentHelper.SerializeObject for product snapshot serialization. This removes the cross-layer dependency (Order.Data → Catalog.Data). Co-Authored-By: Claude Opus 4.6 --- .../Services/CustomerOrderBuilder.cs | 4 ++-- .../VirtoCommerce.OrdersModule.Data.csproj | 2 +- src/VirtoCommerce.OrdersModule.Web/module.manifest | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs index 228130b2f..49b20a52e 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs @@ -5,7 +5,7 @@ using VirtoCommerce.CartModule.Core.Model; using VirtoCommerce.CatalogModule.Core.Model; using VirtoCommerce.CatalogModule.Core.Services; -using VirtoCommerce.CatalogModule.Data.Search.Indexing; +using VirtoCommerce.CatalogModule.Core.Serialization; using VirtoCommerce.CoreModule.Core.Common; using VirtoCommerce.CoreModule.Core.Tax; using VirtoCommerce.OrdersModule.Core.Model; @@ -631,7 +631,7 @@ protected virtual void AssignProductSnapshots(IList products, ID continue; } - var snapshot = IndexDocumentHelper.SerializeObject(product); + var snapshot = ProductJsonSerializer.Serialize(product); foreach (var (lineItem, configurationItem) in items) { diff --git a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj index 77e174cba..f9f0cbb28 100644 --- a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj +++ b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Web/module.manifest b/src/VirtoCommerce.OrdersModule.Web/module.manifest index 0b91307a0..843b6d878 100644 --- a/src/VirtoCommerce.OrdersModule.Web/module.manifest +++ b/src/VirtoCommerce.OrdersModule.Web/module.manifest @@ -8,7 +8,7 @@ - + From 6ab6c85fb508801c950936e4c60db3d54ca6e28e Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Tue, 10 Mar 2026 18:27:59 +0300 Subject: [PATCH 14/19] refactor: narrow snapshot response group + fix LineItem.Clone for ConfigurationItems - Use ItemInfo|ItemAssets|ItemProperties|ItemEditorialReviews instead of Full & ~Variations to avoid loading Inventory, Associations, SEO, Links, Outlines into snapshots - Extract ProductSnapshotResponseGroup as protected virtual property for downstream override - Add ICloneable to ConfigurationItem - Deep-clone ConfigurationItems in LineItem.Clone() - Modernize all Clone() collections to use CloneTyped().ToList() Co-Authored-By: Claude Opus 4.6 --- .../Model/ConfigurationItem.cs | 3 ++- .../Model/LineItem.cs | 13 +++++++++---- .../Services/CustomerOrderBuilder.cs | 7 ++++--- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs b/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs index b0b0a137c..9828466a3 100644 --- a/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs +++ b/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using VirtoCommerce.Platform.Core.Common; @@ -6,7 +7,7 @@ namespace VirtoCommerce.OrdersModule.Core.Model; [SwaggerSchemaId("OrderConfigurationItem")] -public class ConfigurationItem : AuditableEntity +public class ConfigurationItem : AuditableEntity, ICloneable { public string LineItemId { get; set; } diff --git a/src/VirtoCommerce.OrdersModule.Core/Model/LineItem.cs b/src/VirtoCommerce.OrdersModule.Core/Model/LineItem.cs index a8bd74f73..71da43cfc 100644 --- a/src/VirtoCommerce.OrdersModule.Core/Model/LineItem.cs +++ b/src/VirtoCommerce.OrdersModule.Core/Model/LineItem.cs @@ -193,22 +193,27 @@ public virtual object Clone() if (DynamicProperties != null) { - result.DynamicProperties = new List(DynamicProperties.Select(x => x.Clone() as DynamicObjectProperty)); + result.DynamicProperties = DynamicProperties.Select(x => x.CloneTyped()).ToList(); } if (Discounts != null) { - result.Discounts = new List(Discounts.Select(x => x.Clone() as Discount)); + result.Discounts = Discounts.Select(x => x.CloneTyped()).ToList(); } if (TaxDetails != null) { - result.TaxDetails = new List(TaxDetails.Select(x => x.Clone() as TaxDetail)); + result.TaxDetails = TaxDetails.Select(x => x.CloneTyped()).ToList(); } if (FeeDetails != null) { - result.FeeDetails = new List(FeeDetails.Select(x => x.Clone() as FeeDetail)); + result.FeeDetails = FeeDetails.Select(x => x.CloneTyped()).ToList(); + } + + if (ConfigurationItems != null) + { + result.ConfigurationItems = ConfigurationItems.Select(x => x.CloneTyped()).ToList(); } return result; diff --git a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs index 49b20a52e..4a7c95a6a 100644 --- a/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs +++ b/src/VirtoCommerce.OrdersModule.Data/Services/CustomerOrderBuilder.cs @@ -47,6 +47,9 @@ public CustomerOrderBuilder( protected virtual int ProductSnapshotBatchSize => 50; + protected virtual string ProductSnapshotResponseGroup { get; } = + (ItemResponseGroup.ItemInfo | ItemResponseGroup.ItemAssets | ItemResponseGroup.ItemProperties | ItemResponseGroup.ItemEditorialReviews).ToString(); + #region ICustomerOrderConverter Members public virtual async Task PlaceCustomerOrderFromCartAsync(ShoppingCart cart) @@ -572,9 +575,7 @@ protected virtual async Task SaveProductSnapshotsAsync(CustomerOrder order) foreach (var batchIds in productToItemsMap.Keys.Paginate(ProductSnapshotBatchSize)) { -#pragma warning disable CS0618 // Variations can be used here - var products = await _itemService.GetNoCloneAsync(batchIds, (ItemResponseGroup.Full & ~ItemResponseGroup.Variations).ToString()); -#pragma warning restore CS0618 + var products = await _itemService.GetNoCloneAsync(batchIds, ProductSnapshotResponseGroup); AssignProductSnapshots(products, productToItemsMap); } } From d061d631d91d172013104d545e8a2330e645cc1b Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Tue, 10 Mar 2026 22:55:50 +0300 Subject: [PATCH 15/19] chore: update CatalogModule.Core to 3.1007.0-alpha.2486 Co-Authored-By: Claude Opus 4.6 --- .../VirtoCommerce.OrdersModule.Data.csproj | 2 +- src/VirtoCommerce.OrdersModule.Web/module.manifest | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj index f9f0cbb28..feb3efeed 100644 --- a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj +++ b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Web/module.manifest b/src/VirtoCommerce.OrdersModule.Web/module.manifest index 0eb397d7f..a9a2b9da2 100644 --- a/src/VirtoCommerce.OrdersModule.Web/module.manifest +++ b/src/VirtoCommerce.OrdersModule.Web/module.manifest @@ -8,7 +8,7 @@ - + From 52f8ed95d85db2340cbead98301b9b3992a5b4d0 Mon Sep 17 00:00:00 2001 From: Alexey Shibanov <83034617+alexeyshibanov@users.noreply.github.com> Date: Wed, 11 Mar 2026 14:02:43 +0300 Subject: [PATCH 16/19] fix: make ConfigurationItem.Clone() virtual for subclass support Co-Authored-By: Claude Opus 4.6 --- src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs b/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs index 9828466a3..4dad8b6cd 100644 --- a/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs +++ b/src/VirtoCommerce.OrdersModule.Core/Model/ConfigurationItem.cs @@ -41,7 +41,7 @@ public class ConfigurationItem : AuditableEntity, ICloneable public IList Files { get; set; } - public object Clone() + public virtual object Clone() { var result = (ConfigurationItem)MemberwiseClone(); From af2a777940ca56537afa2c85a3eae7b217c9e9bb Mon Sep 17 00:00:00 2001 From: Oleg Zhuk Date: Fri, 13 Mar 2026 12:49:11 +0200 Subject: [PATCH 17/19] Bump versions to release --- .../VirtoCommerce.OrdersModule.Core.csproj | 2 +- .../VirtoCommerce.OrdersModule.Data.csproj | 2 +- src/VirtoCommerce.OrdersModule.Web/module.manifest | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj index db37f205a..6f9b6c6f8 100644 --- a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj +++ b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj index feb3efeed..4c207a7b9 100644 --- a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj +++ b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Web/module.manifest b/src/VirtoCommerce.OrdersModule.Web/module.manifest index a9a2b9da2..84ed6694b 100644 --- a/src/VirtoCommerce.OrdersModule.Web/module.manifest +++ b/src/VirtoCommerce.OrdersModule.Web/module.manifest @@ -7,8 +7,8 @@ 3.1002.0 - - + + From a65e08155aba1e0cb7c0aed21c3abefaf7ca96db Mon Sep 17 00:00:00 2001 From: Oleg Zhuk Date: Fri, 13 Mar 2026 12:55:13 +0200 Subject: [PATCH 18/19] Bump platform version to 3.1004 --- .../VirtoCommerce.OrdersModule2.Web.csproj | 2 +- .../VirtoCommerce.OrdersModule.Core.csproj | 2 +- .../VirtoCommerce.OrdersModule.Data.MySql.csproj | 2 +- .../VirtoCommerce.OrdersModule.Data.csproj | 6 +++--- src/VirtoCommerce.OrdersModule.Web/module.manifest | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/samples/VirtoCommerce.OrdersModule2.Web/VirtoCommerce.OrdersModule2.Web.csproj b/samples/VirtoCommerce.OrdersModule2.Web/VirtoCommerce.OrdersModule2.Web.csproj index a2c5cfa20..60990e549 100644 --- a/samples/VirtoCommerce.OrdersModule2.Web/VirtoCommerce.OrdersModule2.Web.csproj +++ b/samples/VirtoCommerce.OrdersModule2.Web/VirtoCommerce.OrdersModule2.Web.csproj @@ -9,7 +9,7 @@ all runtime; build; native; analyzers; buildtransitive - + diff --git a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj index 6f9b6c6f8..930cb3a8e 100644 --- a/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj +++ b/src/VirtoCommerce.OrdersModule.Core/VirtoCommerce.OrdersModule.Core.csproj @@ -20,7 +20,7 @@ - + diff --git a/src/VirtoCommerce.OrdersModule.Data.MySql/VirtoCommerce.OrdersModule.Data.MySql.csproj b/src/VirtoCommerce.OrdersModule.Data.MySql/VirtoCommerce.OrdersModule.Data.MySql.csproj index 32a1f4d04..8ce2e2d0a 100644 --- a/src/VirtoCommerce.OrdersModule.Data.MySql/VirtoCommerce.OrdersModule.Data.MySql.csproj +++ b/src/VirtoCommerce.OrdersModule.Data.MySql/VirtoCommerce.OrdersModule.Data.MySql.csproj @@ -11,7 +11,7 @@ runtime; build; native; analyzers; buildtransitive - + diff --git a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj index 4c207a7b9..86b87a954 100644 --- a/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj +++ b/src/VirtoCommerce.OrdersModule.Data/VirtoCommerce.OrdersModule.Data.csproj @@ -19,9 +19,9 @@ - - - + + + diff --git a/src/VirtoCommerce.OrdersModule.Web/module.manifest b/src/VirtoCommerce.OrdersModule.Web/module.manifest index 84ed6694b..e142a6e5c 100644 --- a/src/VirtoCommerce.OrdersModule.Web/module.manifest +++ b/src/VirtoCommerce.OrdersModule.Web/module.manifest @@ -4,7 +4,7 @@ 3.1002.0 - 3.1002.0 + 3.1004.0 From aeddade7f7aea045f664530362e171f818a00887 Mon Sep 17 00:00:00 2001 From: Oleg Zhuk Date: Fri, 13 Mar 2026 14:07:21 +0200 Subject: [PATCH 19/19] Fix versions --- .../VirtoCommerce.OrdersModule.Data.PostgreSql.csproj | 2 +- .../VirtoCommerce.OrdersModule.Data.SqlServer.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VirtoCommerce.OrdersModule.Data.PostgreSql/VirtoCommerce.OrdersModule.Data.PostgreSql.csproj b/src/VirtoCommerce.OrdersModule.Data.PostgreSql/VirtoCommerce.OrdersModule.Data.PostgreSql.csproj index 841bd7f0c..3162fd2a1 100644 --- a/src/VirtoCommerce.OrdersModule.Data.PostgreSql/VirtoCommerce.OrdersModule.Data.PostgreSql.csproj +++ b/src/VirtoCommerce.OrdersModule.Data.PostgreSql/VirtoCommerce.OrdersModule.Data.PostgreSql.csproj @@ -9,7 +9,7 @@ runtime; build; native; analyzers; buildtransitive - + diff --git a/src/VirtoCommerce.OrdersModule.Data.SqlServer/VirtoCommerce.OrdersModule.Data.SqlServer.csproj b/src/VirtoCommerce.OrdersModule.Data.SqlServer/VirtoCommerce.OrdersModule.Data.SqlServer.csproj index 0fc4c10bf..ecd71d84f 100644 --- a/src/VirtoCommerce.OrdersModule.Data.SqlServer/VirtoCommerce.OrdersModule.Data.SqlServer.csproj +++ b/src/VirtoCommerce.OrdersModule.Data.SqlServer/VirtoCommerce.OrdersModule.Data.SqlServer.csproj @@ -10,7 +10,7 @@ runtime; build; native; analyzers; buildtransitive - +