diff --git a/src/CMSMicroservice.Application/Common/Interfaces/IApplicationDbContext.cs b/src/CMSMicroservice.Application/Common/Interfaces/IApplicationDbContext.cs index 17b0b88..e219676 100644 --- a/src/CMSMicroservice.Application/Common/Interfaces/IApplicationDbContext.cs +++ b/src/CMSMicroservice.Application/Common/Interfaces/IApplicationDbContext.cs @@ -39,6 +39,8 @@ public interface IApplicationDbContext DbSet ClubMemberships { get; } DbSet ClubMembershipHistories { get; } DbSet ClubMembershipCycles { get; } + DbSet ClubMembershipCycleHistories { get; } + DbSet PackageHistories { get; } DbSet PackageFeatures { get; } DbSet ClubFeatures { get; } DbSet UserClubFeatures { get; } diff --git a/src/CMSMicroservice.Domain/Entities/Club/ClubMembershipCycle.cs b/src/CMSMicroservice.Domain/Entities/Club/ClubMembershipCycle.cs index 2b1f787..05efe12 100644 --- a/src/CMSMicroservice.Domain/Entities/Club/ClubMembershipCycle.cs +++ b/src/CMSMicroservice.Domain/Entities/Club/ClubMembershipCycle.cs @@ -71,4 +71,7 @@ public class ClubMembershipCycle : BaseAuditableEntity /// آیا این دور فعلی است؟ فقط یک رکورد true می‌باشد /// public bool IsCurrentCycle { get; set; } + + /// تاریخچه تغییرات دوره (Q27) + public virtual ICollection? CycleHistories { get; set; } } diff --git a/src/CMSMicroservice.Domain/Entities/History/ClubMembershipCycleHistory.cs b/src/CMSMicroservice.Domain/Entities/History/ClubMembershipCycleHistory.cs new file mode 100644 index 0000000..4de59d2 --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/History/ClubMembershipCycleHistory.cs @@ -0,0 +1,73 @@ +namespace CMSMicroservice.Domain.Entities.History; + +/// +/// تاریخچه تغییرات دوره عضویت باشگاه (Q27) +/// هر بار تغییر وضعیت چرخه (شروع، ورود/خروج جادویی، تکمیل)، یک رکورد ذخیره می‌شود. +/// +public class ClubMembershipCycleHistory : BaseAuditableEntity +{ + /// + /// شناسه چرخه + /// + public long ClubMembershipCycleId { get; set; } + + /// + /// ClubMembershipCycle Navigation Property + /// + public virtual Club.ClubMembershipCycle? ClubMembershipCycle { get; set; } + + /// + /// شناسه کاربر + /// + public long UserId { get; set; } + + /// + /// شماره دور + /// + public int CycleNumber { get; set; } + + /// + /// IsCurrentCycle قبل از تغییر + /// + public bool OldIsCurrentCycle { get; set; } + + /// + /// IsCurrentCycle بعد از تغییر + /// + public bool NewIsCurrentCycle { get; set; } + + /// + /// تاریخ شروع جادویی قبل از تغییر + /// + public DateTime? OldMagicStartedAt { get; set; } + + /// + /// تاریخ شروع جادویی بعد از تغییر + /// + public DateTime? NewMagicStartedAt { get; set; } + + /// + /// تاریخ تکمیل جادویی قبل از تغییر + /// + public DateTime? OldMagicCompletedAt { get; set; } + + /// + /// تاریخ تکمیل جادویی بعد از تغییر + /// + public DateTime? NewMagicCompletedAt { get; set; } + + /// + /// نوع عملیات + /// + public ClubMembershipCycleAction Action { get; set; } + + /// + /// چه کسی انجام داده (UserId یا "System") + /// + public string? PerformedBy { get; set; } + + /// + /// دلیل تغییر (اختیاری) + /// + public string? Reason { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/History/PackageHistory.cs b/src/CMSMicroservice.Domain/Entities/History/PackageHistory.cs new file mode 100644 index 0000000..9b8e081 --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/History/PackageHistory.cs @@ -0,0 +1,93 @@ +namespace CMSMicroservice.Domain.Entities.History; + +/// +/// تاریخچه تغییرات پکیج (Q27) +/// هر بار تغییر قیمت، تنظیمات جادویی یا کمیسیون، یک رکورد ذخیره می‌شود. +/// +public class PackageHistory : BaseAuditableEntity +{ + /// + /// شناسه پکیج + /// + public long PackageId { get; set; } + + /// + /// Package Navigation Property + /// + public virtual Package? Package { get; set; } + + /// + /// قیمت قبل از تغییر (ریال) + /// + public long? OldPrice { get; set; } + + /// + /// قیمت بعد از تغییر (ریال) + /// + public long? NewPrice { get; set; } + + /// + /// سهم Commission Pool قبل از تغییر + /// + public long? OldActivationFee { get; set; } + + /// + /// سهم Commission Pool بعد از تغییر + /// + public long? NewActivationFee { get; set; } + + /// + /// ضریب جادویی قبل از تغییر + /// + public decimal? OldMagicMultiplier { get; set; } + + /// + /// ضریب جادویی بعد از تغییر + /// + public decimal? NewMagicMultiplier { get; set; } + + /// + /// سقف شارژ جادویی قبل از تغییر + /// + public long? OldMagicMaxDeposit { get; set; } + + /// + /// سقف شارژ جادویی بعد از تغییر + /// + public long? NewMagicMaxDeposit { get; set; } + + /// + /// سقف تعادل هر پا قبل از تغییر + /// + public int? OldMaxBalancesPerLeg { get; set; } + + /// + /// سقف تعادل هر پا بعد از تغییر + /// + public int? NewMaxBalancesPerLeg { get; set; } + + /// + /// وضعیت فعال قبل از تغییر + /// + public bool? OldIsActive { get; set; } + + /// + /// وضعیت فعال بعد از تغییر + /// + public bool? NewIsActive { get; set; } + + /// + /// نوع عملیات + /// + public PackageAction Action { get; set; } + + /// + /// چه کسی انجام داده (UserId یا "System") + /// + public string? PerformedBy { get; set; } + + /// + /// دلیل تغییر (اختیاری) + /// + public string? Reason { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/Package.cs b/src/CMSMicroservice.Domain/Entities/Package.cs index 394e899..9950886 100644 --- a/src/CMSMicroservice.Domain/Entities/Package.cs +++ b/src/CMSMicroservice.Domain/Entities/Package.cs @@ -73,4 +73,7 @@ public class Package : BaseAuditableEntity /// خریدهای پکیج public virtual ICollection? Purchases { get; set; } + + /// تاریخچه تغییرات پکیج (Q27) + public virtual ICollection? PackageHistories { get; set; } } diff --git a/src/CMSMicroservice.Domain/Enums/ClubMembershipCycleAction.cs b/src/CMSMicroservice.Domain/Enums/ClubMembershipCycleAction.cs new file mode 100644 index 0000000..5d40c05 --- /dev/null +++ b/src/CMSMicroservice.Domain/Enums/ClubMembershipCycleAction.cs @@ -0,0 +1,14 @@ +namespace CMSMicroservice.Domain.Enums; + +/// +/// نوع عملیات تغییر دوره عضویت باشگاه (Q27) +/// +public enum ClubMembershipCycleAction +{ + Started = 0, + MagicEntered = 1, + MagicCompleted = 2, + Completed = 3, + Cancelled = 4, + ManualFix = 5 +} diff --git a/src/CMSMicroservice.Domain/Enums/PackageAction.cs b/src/CMSMicroservice.Domain/Enums/PackageAction.cs new file mode 100644 index 0000000..d74f691 --- /dev/null +++ b/src/CMSMicroservice.Domain/Enums/PackageAction.cs @@ -0,0 +1,16 @@ +namespace CMSMicroservice.Domain.Enums; + +/// +/// نوع عملیات تغییر پکیج (Q27) +/// +public enum PackageAction +{ + Created = 0, + Updated = 1, + PriceChanged = 2, + Deactivated = 3, + Reactivated = 4, + MagicSettingsChanged = 5, + CommissionSettingsChanged = 6, + ManualFix = 7 +} diff --git a/src/CMSMicroservice.Infrastructure/Persistence/ApplicationDbContext.cs b/src/CMSMicroservice.Infrastructure/Persistence/ApplicationDbContext.cs index 5d8ca45..3d8b33a 100644 --- a/src/CMSMicroservice.Infrastructure/Persistence/ApplicationDbContext.cs +++ b/src/CMSMicroservice.Infrastructure/Persistence/ApplicationDbContext.cs @@ -110,6 +110,8 @@ public class ApplicationDbContext : DbContext, IApplicationDbContext public DbSet UserClubFeatures => Set(); public DbSet ClubMembershipHistories => Set(); public DbSet ClubMembershipCycles => Set(); + public DbSet ClubMembershipCycleHistories => Set(); + public DbSet PackageHistories => Set(); public DbSet PackageFeatures => Set(); // Network diff --git a/src/CMSMicroservice.Infrastructure/Persistence/Configurations/ClubMembershipCycleHistoryConfiguration.cs b/src/CMSMicroservice.Infrastructure/Persistence/Configurations/ClubMembershipCycleHistoryConfiguration.cs new file mode 100644 index 0000000..08cbbb4 --- /dev/null +++ b/src/CMSMicroservice.Infrastructure/Persistence/Configurations/ClubMembershipCycleHistoryConfiguration.cs @@ -0,0 +1,51 @@ +using CMSMicroservice.Domain.Entities.History; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace CMSMicroservice.Infrastructure.Persistence.Configurations; + +/// +/// تاریخچه تغییرات دوره عضویت باشگاه (Q27) +/// +public class ClubMembershipCycleHistoryConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasQueryFilter(p => !p.IsDeleted); + builder.Ignore(entity => entity.DomainEvents); + + builder.HasKey(entity => entity.Id); + builder.Property(entity => entity.Id).UseIdentityColumn(); + + builder.Property(entity => entity.ClubMembershipCycleId).IsRequired(); + builder.Property(entity => entity.UserId).IsRequired(); + builder.Property(entity => entity.CycleNumber).IsRequired(); + builder.Property(entity => entity.OldIsCurrentCycle).IsRequired(); + builder.Property(entity => entity.NewIsCurrentCycle).IsRequired(); + builder.Property(entity => entity.OldMagicStartedAt).IsRequired(false); + builder.Property(entity => entity.NewMagicStartedAt).IsRequired(false); + builder.Property(entity => entity.OldMagicCompletedAt).IsRequired(false); + builder.Property(entity => entity.NewMagicCompletedAt).IsRequired(false); + builder.Property(entity => entity.Action).IsRequired(); + builder.Property(entity => entity.PerformedBy).IsRequired(false).HasMaxLength(100); + builder.Property(entity => entity.Reason).IsRequired(false).HasMaxLength(500); + + // رابطه با ClubMembershipCycle + builder.HasOne(entity => entity.ClubMembershipCycle) + .WithMany(c => c.CycleHistories) + .HasForeignKey(entity => entity.ClubMembershipCycleId) + .OnDelete(DeleteBehavior.Restrict); + + // Index برای UserId و Created + builder.HasIndex(e => new { e.UserId, e.Created }) + .HasDatabaseName("IX_ClubMembershipCycleHistory_UserId_Created"); + + // Index برای ClubMembershipCycleId + builder.HasIndex(e => e.ClubMembershipCycleId) + .HasDatabaseName("IX_ClubMembershipCycleHistory_CycleId"); + + // Index برای Action + builder.HasIndex(e => e.Action) + .HasDatabaseName("IX_ClubMembershipCycleHistory_Action"); + } +} diff --git a/src/CMSMicroservice.Infrastructure/Persistence/Configurations/PackageHistoryConfiguration.cs b/src/CMSMicroservice.Infrastructure/Persistence/Configurations/PackageHistoryConfiguration.cs new file mode 100644 index 0000000..77e6f8c --- /dev/null +++ b/src/CMSMicroservice.Infrastructure/Persistence/Configurations/PackageHistoryConfiguration.cs @@ -0,0 +1,51 @@ +using CMSMicroservice.Domain.Entities.History; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace CMSMicroservice.Infrastructure.Persistence.Configurations; + +/// +/// تاریخچه تغییرات پکیج (Q27) +/// +public class PackageHistoryConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasQueryFilter(p => !p.IsDeleted); + builder.Ignore(entity => entity.DomainEvents); + + builder.HasKey(entity => entity.Id); + builder.Property(entity => entity.Id).UseIdentityColumn(); + + builder.Property(entity => entity.PackageId).IsRequired(); + builder.Property(entity => entity.OldPrice).IsRequired(false); + builder.Property(entity => entity.NewPrice).IsRequired(false); + builder.Property(entity => entity.OldActivationFee).IsRequired(false); + builder.Property(entity => entity.NewActivationFee).IsRequired(false); + builder.Property(entity => entity.OldMagicMultiplier).IsRequired(false).HasPrecision(18, 4); + builder.Property(entity => entity.NewMagicMultiplier).IsRequired(false).HasPrecision(18, 4); + builder.Property(entity => entity.OldMagicMaxDeposit).IsRequired(false); + builder.Property(entity => entity.NewMagicMaxDeposit).IsRequired(false); + builder.Property(entity => entity.OldMaxBalancesPerLeg).IsRequired(false); + builder.Property(entity => entity.NewMaxBalancesPerLeg).IsRequired(false); + builder.Property(entity => entity.OldIsActive).IsRequired(false); + builder.Property(entity => entity.NewIsActive).IsRequired(false); + builder.Property(entity => entity.Action).IsRequired(); + builder.Property(entity => entity.PerformedBy).IsRequired(false).HasMaxLength(100); + builder.Property(entity => entity.Reason).IsRequired(false).HasMaxLength(500); + + // رابطه با Package + builder.HasOne(entity => entity.Package) + .WithMany(p => p.PackageHistories) + .HasForeignKey(entity => entity.PackageId) + .OnDelete(DeleteBehavior.Restrict); + + // Index برای PackageId و Created + builder.HasIndex(e => new { e.PackageId, e.Created }) + .HasDatabaseName("IX_PackageHistory_PackageId_Created"); + + // Index برای Action + builder.HasIndex(e => e.Action) + .HasDatabaseName("IX_PackageHistory_Action"); + } +}