feat: refactor week number handling to use WeekDefinitionId across multiple entities and queries

This commit is contained in:
masoodafar-web
2025-12-19 10:41:22 +03:30
parent 3cb95dc349
commit 8b784101be
83 changed files with 17592 additions and 566 deletions
@@ -18,7 +18,7 @@ public class CommissionPayoutHistoryConfiguration : IEntityTypeConfiguration<Com
builder.Property(entity => entity.UserCommissionPayoutId).IsRequired();
builder.Property(entity => entity.UserId).IsRequired();
builder.Property(entity => entity.WeekNumber).IsRequired().HasMaxLength(20);
builder.Property(entity => entity.WeekDefinitionId).IsRequired();
builder.Property(entity => entity.AmountBefore).IsRequired();
builder.Property(entity => entity.AmountAfter).IsRequired();
builder.Property(entity => entity.OldStatus).IsRequired();
@@ -33,6 +33,13 @@ public class CommissionPayoutHistoryConfiguration : IEntityTypeConfiguration<Com
.HasForeignKey(entity => entity.UserCommissionPayoutId)
.OnDelete(DeleteBehavior.Restrict);
// رابطه با WeekDefinition (Required FK)
builder.HasOne(entity => entity.WeekDefinition)
.WithMany(wd => wd.CommissionPayoutHistories)
.HasForeignKey(entity => entity.WeekDefinitionId)
.IsRequired()
.OnDelete(DeleteBehavior.Restrict);
// Index برای UserId و Created
builder.HasIndex(e => new { e.UserId, e.Created })
.HasDatabaseName("IX_CommissionPayoutHistory_UserId_Created");
@@ -41,9 +48,9 @@ public class CommissionPayoutHistoryConfiguration : IEntityTypeConfiguration<Com
builder.HasIndex(e => e.UserCommissionPayoutId)
.HasDatabaseName("IX_CommissionPayoutHistory_PayoutId");
// Index برای WeekNumber
builder.HasIndex(e => e.WeekNumber)
.HasDatabaseName("IX_CommissionPayoutHistory_WeekNumber");
// Index برای WeekDefinitionId
builder.HasIndex(e => e.WeekDefinitionId)
.HasDatabaseName("IX_CommissionPayoutHistory_WeekDefinitionId");
// Index برای Action
builder.HasIndex(e => e.Action)
@@ -17,7 +17,7 @@ public class NetworkWeeklyBalanceConfiguration : IEntityTypeConfiguration<Networ
builder.Property(entity => entity.Id).UseIdentityColumn();
builder.Property(entity => entity.UserId).IsRequired();
builder.Property(entity => entity.WeekNumber).IsRequired().HasMaxLength(20);
builder.Property(entity => entity.WeekDefinitionId).IsRequired();
builder.Property(entity => entity.LeftLegBalances).IsRequired();
builder.Property(entity => entity.RightLegBalances).IsRequired();
builder.Property(entity => entity.TotalBalances).IsRequired();
@@ -31,14 +31,20 @@ public class NetworkWeeklyBalanceConfiguration : IEntityTypeConfiguration<Networ
.HasForeignKey(entity => entity.UserId)
.OnDelete(DeleteBehavior.Restrict);
// Composite Index برای UserId و WeekNumber
builder.HasIndex(e => new { e.UserId, e.WeekNumber })
.IsUnique()
.HasDatabaseName("IX_NetworkWeeklyBalance_UserId_WeekNumber");
// رابطه با WeekDefinition
builder.HasOne(entity => entity.WeekDefinition)
.WithMany(wd => wd.NetworkWeeklyBalances)
.HasForeignKey(entity => entity.WeekDefinitionId)
.OnDelete(DeleteBehavior.Restrict);
// Index برای WeekNumber
builder.HasIndex(e => e.WeekNumber)
.HasDatabaseName("IX_NetworkWeeklyBalance_WeekNumber");
// Composite Index برای UserId و WeekDefinitionId
builder.HasIndex(e => new { e.UserId, e.WeekDefinitionId })
.IsUnique()
.HasDatabaseName("IX_NetworkWeeklyBalance_UserId_WeekDefinitionId");
// Index برای WeekDefinitionId
builder.HasIndex(e => e.WeekDefinitionId)
.HasDatabaseName("IX_NetworkWeeklyBalance_WeekDefinitionId");
// Index برای IsExpired
builder.HasIndex(e => e.IsExpired)
@@ -17,7 +17,7 @@ public class UserCommissionPayoutConfiguration : IEntityTypeConfiguration<UserCo
builder.Property(entity => entity.Id).UseIdentityColumn();
builder.Property(entity => entity.UserId).IsRequired();
builder.Property(entity => entity.WeekNumber).IsRequired().HasMaxLength(20);
builder.Property(entity => entity.WeekDefinitionId).IsRequired();
builder.Property(entity => entity.WeeklyPoolId).IsRequired();
builder.Property(entity => entity.BalancesEarned).IsRequired();
builder.Property(entity => entity.ValuePerBalance).IsRequired();
@@ -43,10 +43,17 @@ public class UserCommissionPayoutConfiguration : IEntityTypeConfiguration<UserCo
.HasForeignKey(entity => entity.WeeklyPoolId)
.OnDelete(DeleteBehavior.Restrict);
// Composite Index برای UserId و WeekNumber
builder.HasIndex(e => new { e.UserId, e.WeekNumber })
// رابطه با WeekDefinition (Required FK)
builder.HasOne(entity => entity.WeekDefinition)
.WithMany(wd => wd.UserCommissionPayouts)
.HasForeignKey(entity => entity.WeekDefinitionId)
.IsRequired()
.OnDelete(DeleteBehavior.Restrict);
// Composite Index برای UserId و WeekDefinitionId
builder.HasIndex(e => new { e.UserId, e.WeekDefinitionId })
.IsUnique()
.HasDatabaseName("IX_UserCommissionPayout_UserId_WeekNumber");
.HasDatabaseName("IX_UserCommissionPayout_UserId_WeekDefinitionId");
// Index برای WeeklyPoolId
builder.HasIndex(e => e.WeeklyPoolId)
@@ -56,8 +63,5 @@ public class UserCommissionPayoutConfiguration : IEntityTypeConfiguration<UserCo
builder.HasIndex(e => e.Status)
.HasDatabaseName("IX_UserCommissionPayout_Status");
// Index برای WeekNumber
builder.HasIndex(e => e.WeekNumber)
.HasDatabaseName("IX_UserCommissionPayout_WeekNumber");
}
}
@@ -0,0 +1,51 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace CMSMicroservice.Infrastructure.Persistence.Configurations;
/// <summary>
/// تنظیمات جدول تعریف هفته‌ها
/// </summary>
public class WeekDefinitionConfiguration : IEntityTypeConfiguration<WeekDefinition>
{
public void Configure(EntityTypeBuilder<WeekDefinition> 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.WeekOrder).IsRequired();
builder.Property(entity => entity.DisplayName).IsRequired().HasMaxLength(50);
builder.Property(entity => entity.GregorianWeekNumber).IsRequired().HasMaxLength(20);
builder.Property(entity => entity.PersianWeekNumber).IsRequired().HasMaxLength(20);
builder.Property(entity => entity.StartDate).IsRequired();
builder.Property(entity => entity.EndDate).IsRequired();
builder.Property(entity => entity.GregorianYear).IsRequired();
builder.Property(entity => entity.PersianYear).IsRequired();
builder.Property(entity => entity.IsActive).IsRequired().HasDefaultValue(true);
// Unique Index برای GregorianWeekNumber
builder.HasIndex(e => e.GregorianWeekNumber)
.IsUnique()
.HasDatabaseName("IX_WeekDefinition_GregorianWeekNumber");
// Index برای PersianWeekNumber
builder.HasIndex(e => e.PersianWeekNumber)
.HasDatabaseName("IX_WeekDefinition_PersianWeekNumber");
// Index برای StartDate
builder.HasIndex(e => e.StartDate)
.HasDatabaseName("IX_WeekDefinition_StartDate");
// Index برای سال‌ها
builder.HasIndex(e => e.GregorianYear)
.HasDatabaseName("IX_WeekDefinition_GregorianYear");
builder.HasIndex(e => e.PersianYear)
.HasDatabaseName("IX_WeekDefinition_PersianYear");
builder.ToTable("WeekDefinitions");
}
}
@@ -16,17 +16,24 @@ public class WeeklyCommissionPoolConfiguration : IEntityTypeConfiguration<Weekly
builder.HasKey(entity => entity.Id);
builder.Property(entity => entity.Id).UseIdentityColumn();
builder.Property(entity => entity.WeekNumber).IsRequired().HasMaxLength(20);
builder.Property(entity => entity.WeekDefinitionId).IsRequired();
builder.Property(entity => entity.TotalPoolAmount).IsRequired();
builder.Property(entity => entity.TotalBalances).IsRequired();
builder.Property(entity => entity.ValuePerBalance).IsRequired();
builder.Property(entity => entity.IsCalculated).IsRequired();
builder.Property(entity => entity.CalculatedAt).IsRequired(false);
// Index یونیک برای WeekNumber
builder.HasIndex(e => e.WeekNumber)
// رابطه با WeekDefinition (Required FK)
builder.HasOne(entity => entity.WeekDefinition)
.WithMany(wd => wd.WeeklyCommissionPools)
.HasForeignKey(entity => entity.WeekDefinitionId)
.IsRequired()
.OnDelete(DeleteBehavior.Restrict);
// Index یونیک برای WeekDefinitionId
builder.HasIndex(e => e.WeekDefinitionId)
.IsUnique()
.HasDatabaseName("IX_WeeklyCommissionPool_WeekNumber");
.HasDatabaseName("IX_WeeklyCommissionPool_WeekDefinitionId");
// Index برای IsCalculated
builder.HasIndex(e => e.IsCalculated)
@@ -15,8 +15,7 @@ public class WorkerExecutionLogConfiguration : IEntityTypeConfiguration<WorkerEx
builder.Property(x => x.ExecutionId)
.IsRequired();
builder.Property(x => x.WeekNumber)
.HasMaxLength(10)
builder.Property(x => x.WeekDefinitionId)
.IsRequired();
builder.Property(x => x.StartedAt)
@@ -31,8 +30,15 @@ public class WorkerExecutionLogConfiguration : IEntityTypeConfiguration<WorkerEx
builder.Property(x => x.Details)
.HasColumnType("nvarchar(max)");
// Index for querying by week
builder.HasIndex(x => x.WeekNumber);
// رابطه با WeekDefinition (Required FK)
builder.HasOne(x => x.WeekDefinition)
.WithMany(wd => wd.WorkerExecutionLogs)
.HasForeignKey(x => x.WeekDefinitionId)
.IsRequired()
.OnDelete(DeleteBehavior.Restrict);
// Index for querying by WeekDefinitionId
builder.HasIndex(x => x.WeekDefinitionId);
// Index for querying by execution time
builder.HasIndex(x => x.StartedAt);