feat: refactor week number handling to use WeekDefinitionId across multiple entities and queries
This commit is contained in:
@@ -21,16 +21,19 @@ public class WeeklyCommissionJob
|
||||
private readonly IMediator _mediator;
|
||||
private readonly ILogger<WeeklyCommissionJob> _logger;
|
||||
private readonly IApplicationDbContext _context;
|
||||
private readonly IWeekDefinitionRepository _weekRepository;
|
||||
private readonly ResiliencePipeline _retryPipeline;
|
||||
|
||||
public WeeklyCommissionJob(
|
||||
IMediator mediator,
|
||||
ILogger<WeeklyCommissionJob> logger,
|
||||
IApplicationDbContext context)
|
||||
IApplicationDbContext context,
|
||||
IWeekDefinitionRepository weekRepository)
|
||||
{
|
||||
_mediator = mediator;
|
||||
_logger = logger;
|
||||
_context = context;
|
||||
_weekRepository = weekRepository;
|
||||
|
||||
// Polly Retry: 3 attempts, exponential backoff (5min → 10min → 20min)
|
||||
_retryPipeline = new ResiliencePipelineBuilder()
|
||||
@@ -57,38 +60,42 @@ public class WeeklyCommissionJob
|
||||
/// Execute weekly commission calculation with retry logic
|
||||
/// Called by Hangfire scheduler or manually triggered
|
||||
/// </summary>
|
||||
/// <param name="weekNumber">Week number in YYYY-Www format (e.g., 2025-W48). If null, uses previous week.</param>
|
||||
/// <param name="weekDefinitionId">شناسه هفته. اگر null باشد، هفته قبلی محاسبه میشود</param>
|
||||
/// <param name="cancellationToken">Cancellation token</param>
|
||||
public async Task ExecuteAsync(string? weekNumber = null, CancellationToken cancellationToken = default)
|
||||
public async Task ExecuteAsync(long? weekDefinitionId = null, CancellationToken cancellationToken = default)
|
||||
{
|
||||
var executionId = Guid.NewGuid();
|
||||
var startTime = DateTime.Now;
|
||||
|
||||
// Use provided week number or calculate for PREVIOUS week (completed week)
|
||||
string targetWeekNumber;
|
||||
if (!string.IsNullOrWhiteSpace(weekNumber))
|
||||
// Use provided WeekDefinitionId or calculate for PREVIOUS week (completed week)
|
||||
long targetWeekDefinitionId;
|
||||
if (weekDefinitionId.HasValue && weekDefinitionId.Value > 0)
|
||||
{
|
||||
targetWeekNumber = weekNumber;
|
||||
_logger.LogInformation("📅 Using manually specified week: {WeekNumber}", targetWeekNumber);
|
||||
targetWeekDefinitionId = weekDefinitionId.Value;
|
||||
_logger.LogInformation("📅 Using manually specified WeekDefinitionId: {WeekDefinitionId}", targetWeekDefinitionId);
|
||||
}
|
||||
else
|
||||
{
|
||||
var previousWeek = DateTime.Now.AddDays(-7);
|
||||
targetWeekNumber = GetWeekNumber(previousWeek);
|
||||
_logger.LogInformation("📅 Using previous week (auto-calculated): {WeekNumber}", targetWeekNumber);
|
||||
var weekDef = _weekRepository.GetWeekByDate(previousWeek);
|
||||
if (weekDef == null)
|
||||
{
|
||||
throw new InvalidOperationException($"هفته برای تاریخ {previousWeek:yyyy-MM-dd} تعریف نشده است");
|
||||
}
|
||||
targetWeekDefinitionId = weekDef.Id;
|
||||
_logger.LogInformation("📅 Using previous week (auto-calculated): WeekDefinitionId={WeekDefinitionId}, WeekNumber={WeekNumber}",
|
||||
targetWeekDefinitionId, weekDef.GregorianWeekNumber);
|
||||
}
|
||||
|
||||
var previousWeekNumber = targetWeekNumber;
|
||||
|
||||
_logger.LogInformation(
|
||||
"🚀 [{ExecutionId}] Starting weekly commission calculation for {WeekNumber}",
|
||||
executionId, previousWeekNumber);
|
||||
"🚀 [{ExecutionId}] Starting weekly commission calculation for WeekDefinitionId={WeekDefinitionId}",
|
||||
executionId, targetWeekDefinitionId);
|
||||
|
||||
// Create execution log entry
|
||||
var log = new WorkerExecutionLog
|
||||
{
|
||||
ExecutionId = executionId,
|
||||
WeekNumber = previousWeekNumber,
|
||||
WeekDefinitionId = targetWeekDefinitionId,
|
||||
StartedAt = startTime,
|
||||
Status = WorkerExecutionStatus.Running
|
||||
};
|
||||
@@ -100,7 +107,7 @@ public class WeeklyCommissionJob
|
||||
// Execute with retry pipeline
|
||||
await _retryPipeline.ExecuteAsync(async ct =>
|
||||
{
|
||||
await ExecuteWeeklyCalculationAsync(executionId, previousWeekNumber, ct);
|
||||
await ExecuteWeeklyCalculationAsync(executionId, targetWeekDefinitionId, ct);
|
||||
}, cancellationToken);
|
||||
|
||||
// Update log on success
|
||||
@@ -113,9 +120,9 @@ public class WeeklyCommissionJob
|
||||
|
||||
// Get counts from database
|
||||
var balancesCount = await _context.NetworkWeeklyBalances
|
||||
.CountAsync(x => x.WeekNumber == previousWeekNumber, cancellationToken);
|
||||
.CountAsync(x => x.WeekDefinitionId == targetWeekDefinitionId, cancellationToken);
|
||||
var payoutsCount = await _context.UserCommissionPayouts
|
||||
.CountAsync(x => x.WeekNumber == previousWeekNumber, cancellationToken);
|
||||
.CountAsync(x => x.WeekDefinitionId == targetWeekDefinitionId, cancellationToken);
|
||||
|
||||
log.ProcessedCount = balancesCount + payoutsCount;
|
||||
|
||||
@@ -149,21 +156,28 @@ public class WeeklyCommissionJob
|
||||
|
||||
private async Task ExecuteWeeklyCalculationAsync(
|
||||
Guid executionId,
|
||||
string weekNumber,
|
||||
long weekDefinitionId,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
// Check idempotency: Skip if already calculated
|
||||
var existingPool = await _context.WeeklyCommissionPools
|
||||
.FirstOrDefaultAsync(x => x.WeekNumber == weekNumber, cancellationToken);
|
||||
.FirstOrDefaultAsync(x => x.WeekDefinitionId == weekDefinitionId, cancellationToken);
|
||||
|
||||
if (existingPool != null && existingPool.IsCalculated)
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"⚠️ [{ExecutionId}] Week {WeekNumber} already calculated. Skipping.",
|
||||
executionId, weekNumber);
|
||||
"⚠️ [{ExecutionId}] WeekDefinitionId={WeekDefinitionId} already calculated. Skipping.",
|
||||
executionId, weekDefinitionId);
|
||||
return;
|
||||
}
|
||||
|
||||
// دریافت WeekNumber برای command ها (فعلاً هنوز از WeekNumber استفاده میکنند)
|
||||
var GregorianWeekNumber = _weekRepository.GetGregorianWeekNumber(weekDefinitionId);
|
||||
if (string.IsNullOrEmpty(GregorianWeekNumber))
|
||||
{
|
||||
throw new InvalidOperationException($"WeekDefinitionId={weekDefinitionId} یافت نشد");
|
||||
}
|
||||
|
||||
using var transaction = new System.Transactions.TransactionScope(
|
||||
System.Transactions.TransactionScopeOption.Required,
|
||||
new System.Transactions.TransactionOptions
|
||||
@@ -182,41 +196,14 @@ public class WeeklyCommissionJob
|
||||
|
||||
await _mediator.Send(new TriggerWeeklyCalculationCommand
|
||||
{
|
||||
WeekNumber = weekNumber,
|
||||
WeekDefinitionId = weekDefinitionId,
|
||||
ForceRecalculate = false
|
||||
}, cancellationToken);
|
||||
// await _mediator.Send(new CalculateWeeklyBalancesCommand
|
||||
// {
|
||||
// WeekNumber = weekNumber,
|
||||
// ForceRecalculate = false
|
||||
// }, cancellationToken);
|
||||
//
|
||||
// // Step 2: Calculate global commission pool
|
||||
// _logger.LogInformation(
|
||||
// "💰 [{ExecutionId}] Step 2/3: Calculating commission pool...",
|
||||
// executionId);
|
||||
//
|
||||
// await _mediator.Send(new CalculateWeeklyCommissionPoolCommand
|
||||
// {
|
||||
// WeekNumber = weekNumber,
|
||||
// ForceRecalculate = false
|
||||
// }, cancellationToken);
|
||||
//
|
||||
// // Step 3: Distribute commissions to users
|
||||
// _logger.LogInformation(
|
||||
// "💸 [{ExecutionId}] Step 3/3: Processing user payouts...",
|
||||
// executionId);
|
||||
//
|
||||
// await _mediator.Send(new ProcessUserPayoutsCommand
|
||||
// {
|
||||
// WeekNumber = weekNumber,
|
||||
// ForceReprocess = false
|
||||
// }, cancellationToken);
|
||||
|
||||
transaction.Complete();
|
||||
|
||||
_logger.LogInformation(
|
||||
"✅ [{ExecutionId}] All 2 steps completed successfully",
|
||||
"✅ [{ExecutionId}] All steps completed successfully",
|
||||
executionId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -227,24 +214,4 @@ public class WeeklyCommissionJob
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get ISO 8601 week number (YYYY-Www format)
|
||||
/// </summary>
|
||||
private static string GetWeekNumber(DateTime date)
|
||||
{
|
||||
var calendar = System.Globalization.CultureInfo.InvariantCulture.Calendar;
|
||||
var weekNumber = calendar.GetWeekOfYear(
|
||||
date,
|
||||
System.Globalization.CalendarWeekRule.FirstDay,
|
||||
DayOfWeek.Saturday);
|
||||
|
||||
var year = date.Year;
|
||||
if (weekNumber >= 52 && date.Month == 1)
|
||||
year--;
|
||||
else if (weekNumber == 1 && date.Month == 12)
|
||||
year++;
|
||||
|
||||
return $"{year}-W{weekNumber:D2}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ using CMSMicroservice.Infrastructure.BackgroundJobs;
|
||||
using CMSMicroservice.Infrastructure.Services.Monitoring;
|
||||
using CMSMicroservice.Infrastructure.Configuration;
|
||||
using CMSMicroservice.Infrastructure.Services.Payment;
|
||||
using CMSMicroservice.Infrastructure.Repositories;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||
@@ -83,6 +84,10 @@ public static class ConfigureServices
|
||||
|
||||
services.AddScoped<IApplicationDbContext>(p => p.GetRequiredService<ApplicationDbContext>());
|
||||
|
||||
// Week Definition Repository - کش در حافظه برای هفتهها (Singleton برای کش، با IServiceScopeFactory برای دسترسی به DbContext)
|
||||
services.AddSingleton<WeekDefinitionRepository>();
|
||||
services.AddSingleton<IWeekDefinitionRepository>(sp => sp.GetRequiredService<WeekDefinitionRepository>());
|
||||
|
||||
// Background Workers - Deprecated: Using Hangfire instead
|
||||
// services.AddHostedService<WeeklyNetworkCommissionWorker>();
|
||||
services.AddScoped<WeeklyCommissionJob>(); // Hangfire Job (Scoped for DI)
|
||||
|
||||
@@ -0,0 +1,255 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using CMSMicroservice.Domain.Entities;
|
||||
using CMSMicroservice.Infrastructure.Persistence;
|
||||
using System.Globalization;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace CMSMicroservice.Infrastructure.Data.Seeding;
|
||||
|
||||
/// <summary>
|
||||
/// Seeder برای پر کردن جدول WeekDefinitions
|
||||
/// هفته اول سیستم: 2025-W46 میلادی = 1404-W35 شمسی
|
||||
/// شروع هفته شمسی: شنبه | شروع هفته میلادی ISO: دوشنبه
|
||||
/// </summary>
|
||||
public class WeekDefinitionSeeder
|
||||
{
|
||||
private readonly ApplicationDbContext _context;
|
||||
private readonly ILogger<WeekDefinitionSeeder> _logger;
|
||||
private readonly PersianCalendar _persianCalendar;
|
||||
|
||||
/// <summary>
|
||||
/// تاریخ شروع هفته اول سیستم (شنبه 17 آبان 1404 = 8 نوامبر 2025)
|
||||
/// این شنبه در هفته 46 میلادی (ISO) و هفته 35 شمسی قرار دارد
|
||||
/// </summary>
|
||||
private static readonly DateTime BaseWeekStartDate = new DateTime(2025, 11, 8); // شنبه 8 نوامبر 2025
|
||||
|
||||
public WeekDefinitionSeeder(
|
||||
ApplicationDbContext context,
|
||||
ILogger<WeekDefinitionSeeder> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
_persianCalendar = new PersianCalendar();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Seed هفتهها از هفته مبدأ تا یک سال بعد
|
||||
/// </summary>
|
||||
public async Task SeedAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
_logger.LogInformation("=== WeekDefinitionSeeder: Starting ===");
|
||||
_logger.LogInformation("Base week starts at: {BaseDate:yyyy-MM-dd} (Saturday)", BaseWeekStartDate);
|
||||
|
||||
try
|
||||
{
|
||||
var existingCount = await _context.WeekDefinitions.CountAsync(cancellationToken);
|
||||
|
||||
if (existingCount > 0)
|
||||
{
|
||||
_logger.LogInformation("WeekDefinitions already has {Count} records. Checking for missing weeks...", existingCount);
|
||||
}
|
||||
|
||||
// شروع از هفته مبدأ
|
||||
var startDate = BaseWeekStartDate;
|
||||
// پایان تا یک سال بعد از الان
|
||||
var endDate = GetEndOfWeek(DateTime.Today.AddYears(1));
|
||||
|
||||
var currentDate = startDate;
|
||||
var addedCount = 0;
|
||||
|
||||
while (currentDate <= endDate)
|
||||
{
|
||||
var weekStart = currentDate; // شنبه
|
||||
var weekEnd = currentDate.AddDays(6); // جمعه
|
||||
|
||||
// محاسبه شماره ترتیبی هفته (از 1 شروع میشود)
|
||||
var weekOrder = CalculateWeekOrder(weekStart);
|
||||
|
||||
// نام نمایشی: هفته یکم، هفته دوم، ...
|
||||
var displayName = GetPersianOrdinalWeekName(weekOrder);
|
||||
|
||||
// شماره هفته میلادی ISO (بر اساس دوشنبه)
|
||||
var gregorianWeekNumber = GetISOWeekNumber(weekStart);
|
||||
|
||||
// شماره هفته شمسی (بر اساس شنبه)
|
||||
var persianWeekNumber = GetPersianWeekNumber(weekStart);
|
||||
|
||||
// چک کنیم که این هفته قبلاً ثبت نشده باشه
|
||||
var exists = await _context.WeekDefinitions
|
||||
.AnyAsync(w => w.StartDate == weekStart, cancellationToken);
|
||||
|
||||
if (!exists)
|
||||
{
|
||||
var weekDefinition = new WeekDefinition
|
||||
{
|
||||
WeekOrder = weekOrder,
|
||||
DisplayName = displayName,
|
||||
GregorianWeekNumber = gregorianWeekNumber,
|
||||
PersianWeekNumber = persianWeekNumber,
|
||||
StartDate = weekStart,
|
||||
EndDate = weekEnd,
|
||||
GregorianYear = weekStart.Year,
|
||||
PersianYear = _persianCalendar.GetYear(weekStart),
|
||||
IsActive = true
|
||||
};
|
||||
|
||||
_context.WeekDefinitions.Add(weekDefinition);
|
||||
addedCount++;
|
||||
|
||||
_logger.LogDebug("Added: {DisplayName} | {GregorianWeek} | {PersianWeek} | {Start:yyyy-MM-dd} - {End:yyyy-MM-dd}",
|
||||
displayName, gregorianWeekNumber, persianWeekNumber, weekStart, weekEnd);
|
||||
}
|
||||
|
||||
// رفتن به هفته بعد (7 روز)
|
||||
currentDate = currentDate.AddDays(7);
|
||||
}
|
||||
|
||||
if (addedCount > 0)
|
||||
{
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
_logger.LogInformation("Successfully added {Count} week definitions", addedCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogInformation("No new week definitions needed");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error seeding WeekDefinitions");
|
||||
throw;
|
||||
}
|
||||
|
||||
_logger.LogInformation("=== WeekDefinitionSeeder: Completed ===");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// محاسبه شماره ترتیبی هفته بر اساس فاصله از هفته مبدأ
|
||||
/// هفته مبدأ = 1، هفته بعد = 2، ...
|
||||
/// </summary>
|
||||
private static int CalculateWeekOrder(DateTime weekStartDate)
|
||||
{
|
||||
var daysDiff = (weekStartDate - BaseWeekStartDate).Days;
|
||||
var weeksDiff = daysDiff / 7;
|
||||
return weeksDiff + 1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// تبدیل عدد به نام ترتیبی فارسی
|
||||
/// 1 -> هفته یکم، 2 -> هفته دوم، ...
|
||||
/// </summary>
|
||||
private static string GetPersianOrdinalWeekName(int weekOrder)
|
||||
{
|
||||
var ordinals = new Dictionary<int, string>
|
||||
{
|
||||
{ 1, "یکم" }, { 2, "دوم" }, { 3, "سوم" }, { 4, "چهارم" }, { 5, "پنجم" },
|
||||
{ 6, "ششم" }, { 7, "هفتم" }, { 8, "هشتم" }, { 9, "نهم" }, { 10, "دهم" },
|
||||
{ 11, "یازدهم" }, { 12, "دوازدهم" }, { 13, "سیزدهم" }, { 14, "چهاردهم" }, { 15, "پانزدهم" },
|
||||
{ 16, "شانزدهم" }, { 17, "هفدهم" }, { 18, "هجدهم" }, { 19, "نوزدهم" }, { 20, "بیستم" },
|
||||
{ 21, "بیست و یکم" }, { 22, "بیست و دوم" }, { 23, "بیست و سوم" }, { 24, "بیست و چهارم" }, { 25, "بیست و پنجم" },
|
||||
{ 26, "بیست و ششم" }, { 27, "بیست و هفتم" }, { 28, "بیست و هشتم" }, { 29, "بیست و نهم" }, { 30, "سیام" },
|
||||
{ 31, "سی و یکم" }, { 32, "سی و دوم" }, { 33, "سی و سوم" }, { 34, "سی و چهارم" }, { 35, "سی و پنجم" },
|
||||
{ 36, "سی و ششم" }, { 37, "سی و هفتم" }, { 38, "سی و هشتم" }, { 39, "سی و نهم" }, { 40, "چهلم" },
|
||||
{ 41, "چهل و یکم" }, { 42, "چهل و دوم" }, { 43, "چهل و سوم" }, { 44, "چهل و چهارم" }, { 45, "چهل و پنجم" },
|
||||
{ 46, "چهل و ششم" }, { 47, "چهل و هفتم" }, { 48, "چهل و هشتم" }, { 49, "چهل و نهم" }, { 50, "پنجاهم" },
|
||||
{ 51, "پنجاه و یکم" }, { 52, "پنجاه و دوم" }, { 53, "پنجاه و سوم" }, { 54, "پنجاه و چهارم" }, { 55, "پنجاه و پنجم" },
|
||||
{ 56, "پنجاه و ششم" }, { 57, "پنجاه و هفتم" }, { 58, "پنجاه و هشتم" }, { 59, "پنجاه و نهم" }, { 60, "شصتم" }
|
||||
};
|
||||
|
||||
if (ordinals.TryGetValue(weekOrder, out var ordinal))
|
||||
{
|
||||
return $"هفته {ordinal}";
|
||||
}
|
||||
|
||||
// برای اعداد بزرگتر از 60
|
||||
return $"هفته {weekOrder}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// پیدا کردن شنبه این هفته (شروع هفته شمسی)
|
||||
/// </summary>
|
||||
private static DateTime GetStartOfWeek(DateTime date)
|
||||
{
|
||||
var diff = (7 + (date.DayOfWeek - DayOfWeek.Saturday)) % 7;
|
||||
return date.AddDays(-diff).Date;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// پیدا کردن جمعه این هفته (پایان هفته شمسی)
|
||||
/// </summary>
|
||||
private static DateTime GetEndOfWeek(DateTime date)
|
||||
{
|
||||
return GetStartOfWeek(date).AddDays(6);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// شماره هفته میلادی ISO 8601
|
||||
/// هفته ISO از دوشنبه شروع میشود
|
||||
/// برای تاریخ شنبه، باید دوشنبه همان هفته را پیدا کنیم (2 روز بعد)
|
||||
/// </summary>
|
||||
private static string GetISOWeekNumber(DateTime saturdayDate)
|
||||
{
|
||||
// شنبه + 2 روز = دوشنبه همان هفته ISO
|
||||
var mondayOfWeek = saturdayDate.AddDays(2);
|
||||
|
||||
// محاسبه شماره هفته ISO
|
||||
var cal = CultureInfo.InvariantCulture.Calendar;
|
||||
var weekNumber = cal.GetWeekOfYear(mondayOfWeek, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
|
||||
var year = mondayOfWeek.Year;
|
||||
|
||||
// تصحیح سال برای هفتههای لبهای
|
||||
if (weekNumber == 1 && mondayOfWeek.Month == 12)
|
||||
{
|
||||
year++;
|
||||
}
|
||||
else if (weekNumber >= 52 && mondayOfWeek.Month == 1)
|
||||
{
|
||||
year--;
|
||||
}
|
||||
|
||||
return $"{year}-W{weekNumber:D2}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// شماره هفته شمسی
|
||||
/// هفته شمسی از شنبه شروع میشود
|
||||
/// </summary>
|
||||
private string GetPersianWeekNumber(DateTime saturdayDate)
|
||||
{
|
||||
var persianYear = _persianCalendar.GetYear(saturdayDate);
|
||||
var dayOfYear = _persianCalendar.GetDayOfYear(saturdayDate);
|
||||
|
||||
// اول فروردین این سال
|
||||
var firstDayOfYear = _persianCalendar.ToDateTime(persianYear, 1, 1, 0, 0, 0, 0);
|
||||
|
||||
// پیدا کردن اولین شنبه سال
|
||||
var daysUntilFirstSaturday = ((int)DayOfWeek.Saturday - (int)firstDayOfYear.DayOfWeek + 7) % 7;
|
||||
|
||||
// اگر اول فروردین شنبه باشه، daysUntilFirstSaturday = 0
|
||||
// در غیر این صورت روزهای قبل از اولین شنبه، هفته 0 یا هفته آخر سال قبل هستند
|
||||
|
||||
int weekNumber;
|
||||
if (daysUntilFirstSaturday == 0)
|
||||
{
|
||||
// اول فروردین شنبه است
|
||||
weekNumber = ((dayOfYear - 1) / 7) + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// روزهای قبل از اولین شنبه
|
||||
if (dayOfYear <= daysUntilFirstSaturday)
|
||||
{
|
||||
// این روزها متعلق به آخرین هفته سال قبل هستند
|
||||
// اما برای سادگی، هفته 1 در نظر میگیریم
|
||||
weekNumber = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
weekNumber = ((dayOfYear - daysUntilFirstSaturday - 1) / 7) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $"{persianYear}-W{weekNumber:D2}";
|
||||
}
|
||||
}
|
||||
@@ -98,6 +98,9 @@ public class ApplicationDbContext : DbContext, IApplicationDbContext
|
||||
public DbSet<NetworkWeeklyBalance> NetworkWeeklyBalances => Set<NetworkWeeklyBalance>();
|
||||
public DbSet<NetworkMembershipHistory> NetworkMembershipHistories => Set<NetworkMembershipHistory>();
|
||||
|
||||
// Week Definitions
|
||||
public DbSet<WeekDefinition> WeekDefinitions => Set<WeekDefinition>();
|
||||
|
||||
// Commission
|
||||
public DbSet<WeeklyCommissionPool> WeeklyCommissionPools => Set<WeeklyCommissionPool>();
|
||||
public DbSet<UserCommissionPayout> UserCommissionPayouts => Set<UserCommissionPayout>();
|
||||
|
||||
+11
-4
@@ -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)
|
||||
|
||||
+14
-8
@@ -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)
|
||||
|
||||
+11
-7
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
+51
@@ -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");
|
||||
}
|
||||
}
|
||||
+11
-4
@@ -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)
|
||||
|
||||
+10
-4
@@ -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);
|
||||
|
||||
+3599
File diff suppressed because it is too large
Load Diff
+81
@@ -0,0 +1,81 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddWeekDefinitionTable : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "WeekDefinitions",
|
||||
schema: "CMS",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<long>(type: "bigint", nullable: false)
|
||||
.Annotation("SqlServer:Identity", "1, 1"),
|
||||
WeekOrder = table.Column<int>(type: "int", nullable: false),
|
||||
DisplayName = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
||||
GregorianWeekNumber = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false),
|
||||
PersianWeekNumber = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false),
|
||||
StartDate = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
EndDate = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
GregorianYear = table.Column<int>(type: "int", nullable: false),
|
||||
PersianYear = table.Column<int>(type: "int", nullable: false),
|
||||
IsActive = table.Column<bool>(type: "bit", nullable: false, defaultValue: true),
|
||||
Created = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
CreatedBy = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
||||
LastModified = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||
LastModifiedBy = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
||||
IsDeleted = table.Column<bool>(type: "bit", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_WeekDefinitions", x => x.Id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WeekDefinition_GregorianWeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WeekDefinitions",
|
||||
column: "GregorianWeekNumber",
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WeekDefinition_GregorianYear",
|
||||
schema: "CMS",
|
||||
table: "WeekDefinitions",
|
||||
column: "GregorianYear");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WeekDefinition_PersianWeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WeekDefinitions",
|
||||
column: "PersianWeekNumber");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WeekDefinition_PersianYear",
|
||||
schema: "CMS",
|
||||
table: "WeekDefinitions",
|
||||
column: "PersianYear");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WeekDefinition_StartDate",
|
||||
schema: "CMS",
|
||||
table: "WeekDefinitions",
|
||||
column: "StartDate");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "WeekDefinitions",
|
||||
schema: "CMS");
|
||||
}
|
||||
}
|
||||
}
|
||||
+3682
File diff suppressed because it is too large
Load Diff
+296
@@ -0,0 +1,296 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddWeekDefinitionIdToCommissionTables : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs",
|
||||
type: "bigint",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AlterColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
type: "nvarchar(10)",
|
||||
maxLength: 10,
|
||||
nullable: false,
|
||||
oldClrType: typeof(string),
|
||||
oldType: "nvarchar(20)",
|
||||
oldMaxLength: 20);
|
||||
|
||||
migrationBuilder.AddColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
type: "bigint",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AlterColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
type: "nvarchar(10)",
|
||||
maxLength: 10,
|
||||
nullable: false,
|
||||
oldClrType: typeof(string),
|
||||
oldType: "nvarchar(20)",
|
||||
oldMaxLength: 20);
|
||||
|
||||
migrationBuilder.AddColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
type: "bigint",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AlterColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
type: "nvarchar(10)",
|
||||
maxLength: 10,
|
||||
nullable: false,
|
||||
oldClrType: typeof(string),
|
||||
oldType: "nvarchar(20)",
|
||||
oldMaxLength: 20);
|
||||
|
||||
migrationBuilder.AddColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
type: "bigint",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AlterColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
type: "nvarchar(10)",
|
||||
maxLength: 10,
|
||||
nullable: false,
|
||||
oldClrType: typeof(string),
|
||||
oldType: "nvarchar(20)",
|
||||
oldMaxLength: 20);
|
||||
|
||||
migrationBuilder.AddColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
type: "bigint",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WorkerExecutionLogs_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs",
|
||||
column: "WeekDefinitionId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WeeklyCommissionPool_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
column: "WeekDefinitionId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_UserCommissionPayout_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
column: "WeekDefinitionId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_NetworkWeeklyBalance_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
column: "WeekDefinitionId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_CommissionPayoutHistory_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
column: "WeekDefinitionId");
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_CommissionPayoutHistories_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.SetNull);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_NetworkWeeklyBalances_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.SetNull);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_UserCommissionPayouts_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.SetNull);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_WeeklyCommissionPools_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.SetNull);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_WorkerExecutionLogs_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.SetNull);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_CommissionPayoutHistories_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_NetworkWeeklyBalances_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_UserCommissionPayouts_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_WeeklyCommissionPools_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_WorkerExecutionLogs_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_WorkerExecutionLogs_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_WeeklyCommissionPool_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_UserCommissionPayout_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_NetworkWeeklyBalance_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_CommissionPayoutHistory_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories");
|
||||
|
||||
migrationBuilder.AlterColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
type: "nvarchar(20)",
|
||||
maxLength: 20,
|
||||
nullable: false,
|
||||
oldClrType: typeof(string),
|
||||
oldType: "nvarchar(10)",
|
||||
oldMaxLength: 10);
|
||||
|
||||
migrationBuilder.AlterColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
type: "nvarchar(20)",
|
||||
maxLength: 20,
|
||||
nullable: false,
|
||||
oldClrType: typeof(string),
|
||||
oldType: "nvarchar(10)",
|
||||
oldMaxLength: 10);
|
||||
|
||||
migrationBuilder.AlterColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
type: "nvarchar(20)",
|
||||
maxLength: 20,
|
||||
nullable: false,
|
||||
oldClrType: typeof(string),
|
||||
oldType: "nvarchar(10)",
|
||||
oldMaxLength: 10);
|
||||
|
||||
migrationBuilder.AlterColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
type: "nvarchar(20)",
|
||||
maxLength: 20,
|
||||
nullable: false,
|
||||
oldClrType: typeof(string),
|
||||
oldType: "nvarchar(10)",
|
||||
oldMaxLength: 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
+3647
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,477 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class u16 : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_CommissionPayoutHistories_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_NetworkWeeklyBalances_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_UserCommissionPayouts_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_WeeklyCommissionPools_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_WorkerExecutionLogs_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_WorkerExecutionLogs_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_WeeklyCommissionPool_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_WeeklyCommissionPool_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_UserCommissionPayout_UserId_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_UserCommissionPayout_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_NetworkWeeklyBalance_UserId_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_NetworkWeeklyBalance_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_CommissionPayoutHistory_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories");
|
||||
|
||||
migrationBuilder.RenameIndex(
|
||||
name: "IX_UserCommissionPayout_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
newName: "IX_UserCommissionPayouts_WeekDefinitionId");
|
||||
|
||||
migrationBuilder.AlterColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs",
|
||||
type: "bigint",
|
||||
nullable: false,
|
||||
defaultValue: 0L,
|
||||
oldClrType: typeof(long),
|
||||
oldType: "bigint",
|
||||
oldNullable: true);
|
||||
|
||||
migrationBuilder.AlterColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
type: "bigint",
|
||||
nullable: false,
|
||||
defaultValue: 0L,
|
||||
oldClrType: typeof(long),
|
||||
oldType: "bigint",
|
||||
oldNullable: true);
|
||||
|
||||
migrationBuilder.AlterColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
type: "bigint",
|
||||
nullable: false,
|
||||
defaultValue: 0L,
|
||||
oldClrType: typeof(long),
|
||||
oldType: "bigint",
|
||||
oldNullable: true);
|
||||
|
||||
migrationBuilder.AlterColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
type: "bigint",
|
||||
nullable: false,
|
||||
defaultValue: 0L,
|
||||
oldClrType: typeof(long),
|
||||
oldType: "bigint",
|
||||
oldNullable: true);
|
||||
|
||||
migrationBuilder.AlterColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
type: "bigint",
|
||||
nullable: false,
|
||||
defaultValue: 0L,
|
||||
oldClrType: typeof(long),
|
||||
oldType: "bigint",
|
||||
oldNullable: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WeeklyCommissionPool_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
column: "WeekDefinitionId",
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_UserCommissionPayout_UserId_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
columns: new[] { "UserId", "WeekDefinitionId" },
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_NetworkWeeklyBalance_UserId_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
columns: new[] { "UserId", "WeekDefinitionId" },
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_CommissionPayoutHistories_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_NetworkWeeklyBalances_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_UserCommissionPayouts_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_WeeklyCommissionPools_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_WorkerExecutionLogs_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_CommissionPayoutHistories_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_NetworkWeeklyBalances_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_UserCommissionPayouts_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_WeeklyCommissionPools_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_WorkerExecutionLogs_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_WeeklyCommissionPool_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_UserCommissionPayout_UserId_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_NetworkWeeklyBalance_UserId_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances");
|
||||
|
||||
migrationBuilder.RenameIndex(
|
||||
name: "IX_UserCommissionPayouts_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
newName: "IX_UserCommissionPayout_WeekDefinitionId");
|
||||
|
||||
migrationBuilder.AlterColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs",
|
||||
type: "bigint",
|
||||
nullable: true,
|
||||
oldClrType: typeof(long),
|
||||
oldType: "bigint");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs",
|
||||
type: "nvarchar(10)",
|
||||
maxLength: 10,
|
||||
nullable: false,
|
||||
defaultValue: "");
|
||||
|
||||
migrationBuilder.AlterColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
type: "bigint",
|
||||
nullable: true,
|
||||
oldClrType: typeof(long),
|
||||
oldType: "bigint");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
type: "nvarchar(10)",
|
||||
maxLength: 10,
|
||||
nullable: false,
|
||||
defaultValue: "");
|
||||
|
||||
migrationBuilder.AlterColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
type: "bigint",
|
||||
nullable: true,
|
||||
oldClrType: typeof(long),
|
||||
oldType: "bigint");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
type: "nvarchar(10)",
|
||||
maxLength: 10,
|
||||
nullable: false,
|
||||
defaultValue: "");
|
||||
|
||||
migrationBuilder.AlterColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
type: "bigint",
|
||||
nullable: true,
|
||||
oldClrType: typeof(long),
|
||||
oldType: "bigint");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
type: "nvarchar(10)",
|
||||
maxLength: 10,
|
||||
nullable: false,
|
||||
defaultValue: "");
|
||||
|
||||
migrationBuilder.AlterColumn<long>(
|
||||
name: "WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
type: "bigint",
|
||||
nullable: true,
|
||||
oldClrType: typeof(long),
|
||||
oldType: "bigint");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
type: "nvarchar(10)",
|
||||
maxLength: 10,
|
||||
nullable: false,
|
||||
defaultValue: "");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WorkerExecutionLogs_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs",
|
||||
column: "WeekNumber");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WeeklyCommissionPool_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
column: "WeekDefinitionId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_WeeklyCommissionPool_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
column: "WeekNumber",
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_UserCommissionPayout_UserId_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
columns: new[] { "UserId", "WeekNumber" },
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_UserCommissionPayout_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
column: "WeekNumber");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_NetworkWeeklyBalance_UserId_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
columns: new[] { "UserId", "WeekNumber" },
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_NetworkWeeklyBalance_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
column: "WeekNumber");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_CommissionPayoutHistory_WeekNumber",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
column: "WeekNumber");
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_CommissionPayoutHistories_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "CommissionPayoutHistories",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.SetNull);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_NetworkWeeklyBalances_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "NetworkWeeklyBalances",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.SetNull);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_UserCommissionPayouts_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "UserCommissionPayouts",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.SetNull);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_WeeklyCommissionPools_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WeeklyCommissionPools",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.SetNull);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_WorkerExecutionLogs_WeekDefinitions_WeekDefinitionId",
|
||||
schema: "CMS",
|
||||
table: "WorkerExecutionLogs",
|
||||
column: "WeekDefinitionId",
|
||||
principalSchema: "CMS",
|
||||
principalTable: "WeekDefinitions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.SetNull);
|
||||
}
|
||||
}
|
||||
}
|
||||
+3647
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,22 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class u17 : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
+160
-33
@@ -301,10 +301,8 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
b.Property<long>("ValuePerBalance")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.Property<string>("WeekNumber")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("nvarchar(20)");
|
||||
b.Property<long>("WeekDefinitionId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.Property<long>("WeeklyPoolId")
|
||||
.HasColumnType("bigint");
|
||||
@@ -320,15 +318,14 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
b.HasIndex("Status")
|
||||
.HasDatabaseName("IX_UserCommissionPayout_Status");
|
||||
|
||||
b.HasIndex("WeekNumber")
|
||||
.HasDatabaseName("IX_UserCommissionPayout_WeekNumber");
|
||||
b.HasIndex("WeekDefinitionId");
|
||||
|
||||
b.HasIndex("WeeklyPoolId")
|
||||
.HasDatabaseName("IX_UserCommissionPayout_WeeklyPoolId");
|
||||
|
||||
b.HasIndex("UserId", "WeekNumber")
|
||||
b.HasIndex("UserId", "WeekDefinitionId")
|
||||
.IsUnique()
|
||||
.HasDatabaseName("IX_UserCommissionPayout_UserId_WeekNumber");
|
||||
.HasDatabaseName("IX_UserCommissionPayout_UserId_WeekDefinitionId");
|
||||
|
||||
b.ToTable("UserCommissionPayouts", "CMS");
|
||||
});
|
||||
@@ -371,19 +368,17 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
b.Property<long>("ValuePerBalance")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.Property<string>("WeekNumber")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("nvarchar(20)");
|
||||
b.Property<long>("WeekDefinitionId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("IsCalculated")
|
||||
.HasDatabaseName("IX_WeeklyCommissionPool_IsCalculated");
|
||||
|
||||
b.HasIndex("WeekNumber")
|
||||
b.HasIndex("WeekDefinitionId")
|
||||
.IsUnique()
|
||||
.HasDatabaseName("IX_WeeklyCommissionPool_WeekNumber");
|
||||
.HasDatabaseName("IX_WeeklyCommissionPool_WeekDefinitionId");
|
||||
|
||||
b.ToTable("WeeklyCommissionPools", "CMS");
|
||||
});
|
||||
@@ -442,10 +437,8 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
b.Property<int>("Status")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("WeekNumber")
|
||||
.IsRequired()
|
||||
.HasMaxLength(10)
|
||||
.HasColumnType("nvarchar(10)");
|
||||
b.Property<long>("WeekDefinitionId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
@@ -453,7 +446,7 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
|
||||
b.HasIndex("Status");
|
||||
|
||||
b.HasIndex("WeekNumber");
|
||||
b.HasIndex("WeekDefinitionId");
|
||||
|
||||
b.ToTable("WorkerExecutionLogs", "CMS");
|
||||
});
|
||||
@@ -1379,10 +1372,8 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
b.Property<long>("UserId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.Property<string>("WeekNumber")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("nvarchar(20)");
|
||||
b.Property<long>("WeekDefinitionId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
@@ -1392,8 +1383,8 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
b.HasIndex("UserCommissionPayoutId")
|
||||
.HasDatabaseName("IX_CommissionPayoutHistory_PayoutId");
|
||||
|
||||
b.HasIndex("WeekNumber")
|
||||
.HasDatabaseName("IX_CommissionPayoutHistory_WeekNumber");
|
||||
b.HasIndex("WeekDefinitionId")
|
||||
.HasDatabaseName("IX_CommissionPayoutHistory_WeekDefinitionId");
|
||||
|
||||
b.HasIndex("UserId", "Created")
|
||||
.HasDatabaseName("IX_CommissionPayoutHistory_UserId_Created");
|
||||
@@ -1598,10 +1589,8 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
b.Property<long>("UserId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.Property<string>("WeekNumber")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("nvarchar(20)");
|
||||
b.Property<long>("WeekDefinitionId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.Property<long>("WeeklyPoolContribution")
|
||||
.HasColumnType("bigint");
|
||||
@@ -1611,12 +1600,12 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
b.HasIndex("IsExpired")
|
||||
.HasDatabaseName("IX_NetworkWeeklyBalance_IsExpired");
|
||||
|
||||
b.HasIndex("WeekNumber")
|
||||
.HasDatabaseName("IX_NetworkWeeklyBalance_WeekNumber");
|
||||
b.HasIndex("WeekDefinitionId")
|
||||
.HasDatabaseName("IX_NetworkWeeklyBalance_WeekDefinitionId");
|
||||
|
||||
b.HasIndex("UserId", "WeekNumber")
|
||||
b.HasIndex("UserId", "WeekDefinitionId")
|
||||
.IsUnique()
|
||||
.HasDatabaseName("IX_NetworkWeeklyBalance_UserId_WeekNumber");
|
||||
.HasDatabaseName("IX_NetworkWeeklyBalance_UserId_WeekDefinitionId");
|
||||
|
||||
b.ToTable("NetworkWeeklyBalances", "CMS");
|
||||
});
|
||||
@@ -2841,6 +2830,85 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
b.ToTable("UserWalletChangeLogs", "CMS");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("CMSMicroservice.Domain.Entities.WeekDefinition", b =>
|
||||
{
|
||||
b.Property<long>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bigint");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"));
|
||||
|
||||
b.Property<DateTime>("Created")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<string>("CreatedBy")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("DisplayName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<DateTime>("EndDate")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<string>("GregorianWeekNumber")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("nvarchar(20)");
|
||||
|
||||
b.Property<int>("GregorianYear")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<bool>("IsActive")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bit")
|
||||
.HasDefaultValue(true);
|
||||
|
||||
b.Property<bool>("IsDeleted")
|
||||
.HasColumnType("bit");
|
||||
|
||||
b.Property<DateTime?>("LastModified")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<string>("LastModifiedBy")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("PersianWeekNumber")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("nvarchar(20)");
|
||||
|
||||
b.Property<int>("PersianYear")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<DateTime>("StartDate")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<int>("WeekOrder")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("GregorianWeekNumber")
|
||||
.IsUnique()
|
||||
.HasDatabaseName("IX_WeekDefinition_GregorianWeekNumber");
|
||||
|
||||
b.HasIndex("GregorianYear")
|
||||
.HasDatabaseName("IX_WeekDefinition_GregorianYear");
|
||||
|
||||
b.HasIndex("PersianWeekNumber")
|
||||
.HasDatabaseName("IX_WeekDefinition_PersianWeekNumber");
|
||||
|
||||
b.HasIndex("PersianYear")
|
||||
.HasDatabaseName("IX_WeekDefinition_PersianYear");
|
||||
|
||||
b.HasIndex("StartDate")
|
||||
.HasDatabaseName("IX_WeekDefinition_StartDate");
|
||||
|
||||
b.ToTable("WeekDefinitions", "CMS");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("CMSMicroservice.Domain.Entities.Category", b =>
|
||||
{
|
||||
b.HasOne("CMSMicroservice.Domain.Entities.Category", "Parent")
|
||||
@@ -2896,6 +2964,12 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("CMSMicroservice.Domain.Entities.WeekDefinition", "WeekDefinition")
|
||||
.WithMany("UserCommissionPayouts")
|
||||
.HasForeignKey("WeekDefinitionId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("CMSMicroservice.Domain.Entities.Commission.WeeklyCommissionPool", "WeeklyPool")
|
||||
.WithMany("UserCommissionPayouts")
|
||||
.HasForeignKey("WeeklyPoolId")
|
||||
@@ -2904,9 +2978,33 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
|
||||
b.Navigation("User");
|
||||
|
||||
b.Navigation("WeekDefinition");
|
||||
|
||||
b.Navigation("WeeklyPool");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("CMSMicroservice.Domain.Entities.Commission.WeeklyCommissionPool", b =>
|
||||
{
|
||||
b.HasOne("CMSMicroservice.Domain.Entities.WeekDefinition", "WeekDefinition")
|
||||
.WithMany("WeeklyCommissionPools")
|
||||
.HasForeignKey("WeekDefinitionId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("WeekDefinition");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("CMSMicroservice.Domain.Entities.Commission.WorkerExecutionLog", b =>
|
||||
{
|
||||
b.HasOne("CMSMicroservice.Domain.Entities.WeekDefinition", "WeekDefinition")
|
||||
.WithMany("WorkerExecutionLogs")
|
||||
.HasForeignKey("WeekDefinitionId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("WeekDefinition");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("CMSMicroservice.Domain.Entities.DayaLoanContract", b =>
|
||||
{
|
||||
b.HasOne("CMSMicroservice.Domain.Entities.Transaction", "Transaction")
|
||||
@@ -3077,7 +3175,15 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("CMSMicroservice.Domain.Entities.WeekDefinition", "WeekDefinition")
|
||||
.WithMany("CommissionPayoutHistories")
|
||||
.HasForeignKey("WeekDefinitionId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("UserCommissionPayout");
|
||||
|
||||
b.Navigation("WeekDefinition");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("CMSMicroservice.Domain.Entities.History.SystemConfigurationHistory", b =>
|
||||
@@ -3099,7 +3205,15 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("CMSMicroservice.Domain.Entities.WeekDefinition", "WeekDefinition")
|
||||
.WithMany("NetworkWeeklyBalances")
|
||||
.HasForeignKey("WeekDefinitionId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("User");
|
||||
|
||||
b.Navigation("WeekDefinition");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("CMSMicroservice.Domain.Entities.Order.OrderVAT", b =>
|
||||
@@ -3511,6 +3625,19 @@ namespace CMSMicroservice.Infrastructure.Persistence.Migrations
|
||||
{
|
||||
b.Navigation("UserWalletChangeLogs");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("CMSMicroservice.Domain.Entities.WeekDefinition", b =>
|
||||
{
|
||||
b.Navigation("CommissionPayoutHistories");
|
||||
|
||||
b.Navigation("NetworkWeeklyBalances");
|
||||
|
||||
b.Navigation("UserCommissionPayouts");
|
||||
|
||||
b.Navigation("WeeklyCommissionPools");
|
||||
|
||||
b.Navigation("WorkerExecutionLogs");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,359 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using CMSMicroservice.Application.Common.Interfaces;
|
||||
using CMSMicroservice.Domain.Entities;
|
||||
using CMSMicroservice.Infrastructure.Persistence;
|
||||
|
||||
namespace CMSMicroservice.Infrastructure.Repositories;
|
||||
|
||||
/// <summary>
|
||||
/// ریپازیتوری هفتهها با کش در حافظه
|
||||
/// موقع استارت برنامه از دیتابیس لود میشود و در حافظه نگهداری میشود
|
||||
/// Thread-safe است و میتوان از آن در محیطهای multi-threaded استفاده کرد
|
||||
/// Singleton است و از IServiceScopeFactory برای دسترسی به DbContext استفاده میکند
|
||||
/// </summary>
|
||||
public class WeekDefinitionRepository : IWeekDefinitionRepository
|
||||
{
|
||||
private readonly IServiceScopeFactory _scopeFactory;
|
||||
private readonly ILogger<WeekDefinitionRepository> _logger;
|
||||
private readonly PersianCalendar _persianCalendar;
|
||||
|
||||
// کش در حافظه
|
||||
private readonly ConcurrentDictionary<string, WeekDefinition> _cacheByGregorianWeek = new();
|
||||
private readonly ConcurrentDictionary<string, WeekDefinition> _cacheByPersianWeek = new();
|
||||
private readonly ConcurrentDictionary<int, WeekDefinition> _cacheByOrder = new();
|
||||
private List<WeekDefinition> _allWeeks = new();
|
||||
private readonly object _cacheLock = new();
|
||||
private bool _isCacheLoaded;
|
||||
|
||||
public WeekDefinitionRepository(
|
||||
IServiceScopeFactory scopeFactory,
|
||||
ILogger<WeekDefinitionRepository> logger)
|
||||
{
|
||||
_scopeFactory = scopeFactory;
|
||||
_logger = logger;
|
||||
_persianCalendar = new PersianCalendar();
|
||||
}
|
||||
|
||||
public bool IsCacheLoaded => _isCacheLoaded;
|
||||
public int CachedWeeksCount => _allWeeks.Count;
|
||||
|
||||
#region Load Cache
|
||||
|
||||
/// <summary>
|
||||
/// بارگذاری اولیه کش از دیتابیس
|
||||
/// این متد باید موقع استارت برنامه فراخوانی شود
|
||||
/// </summary>
|
||||
public async Task ReloadCacheAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
_logger.LogInformation("Loading WeekDefinitions into memory cache...");
|
||||
|
||||
try
|
||||
{
|
||||
using var scope = _scopeFactory.CreateScope();
|
||||
var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
|
||||
|
||||
var weeks = await context.WeekDefinitions
|
||||
.AsNoTracking()
|
||||
.Where(w => w.IsActive)
|
||||
.OrderBy(w => w.WeekOrder)
|
||||
.ToListAsync(cancellationToken);
|
||||
|
||||
lock (_cacheLock)
|
||||
{
|
||||
_cacheByGregorianWeek.Clear();
|
||||
_cacheByPersianWeek.Clear();
|
||||
_cacheByOrder.Clear();
|
||||
_allWeeks = weeks;
|
||||
|
||||
foreach (var week in weeks)
|
||||
{
|
||||
_cacheByGregorianWeek.TryAdd(week.GregorianWeekNumber, week);
|
||||
_cacheByPersianWeek.TryAdd(week.PersianWeekNumber, week);
|
||||
_cacheByOrder.TryAdd(week.WeekOrder, week);
|
||||
}
|
||||
|
||||
_isCacheLoaded = true;
|
||||
}
|
||||
|
||||
_logger.LogInformation("Successfully loaded {Count} week definitions into cache", weeks.Count);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error loading WeekDefinitions into cache");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Current Week Methods
|
||||
|
||||
public WeekDefinition? GetCurrentWeek()
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
return GetWeekByDate(DateTime.Today);
|
||||
}
|
||||
|
||||
public Task<WeekDefinition?> GetCurrentWeekAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
return Task.FromResult(GetCurrentWeek());
|
||||
}
|
||||
|
||||
public string GetCurrentGregorianWeekNumber()
|
||||
{
|
||||
var currentWeek = GetCurrentWeek();
|
||||
return currentWeek?.GregorianWeekNumber ?? CalculateGregorianWeekNumber(DateTime.Today);
|
||||
}
|
||||
|
||||
public string GetCurrentPersianWeekNumber()
|
||||
{
|
||||
var currentWeek = GetCurrentWeek();
|
||||
return currentWeek?.PersianWeekNumber ?? CalculatePersianWeekNumber(DateTime.Today);
|
||||
}
|
||||
|
||||
public string GetCurrentWeekDisplayName()
|
||||
{
|
||||
var currentWeek = GetCurrentWeek();
|
||||
return currentWeek?.DisplayName ?? "نامشخص";
|
||||
}
|
||||
|
||||
public bool IsDateInCurrentWeek(DateTime date)
|
||||
{
|
||||
var currentWeek = GetCurrentWeek();
|
||||
if (currentWeek == null) return false;
|
||||
|
||||
return date.Date >= currentWeek.StartDate.Date && date.Date <= currentWeek.EndDate.Date;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Navigation Methods
|
||||
|
||||
public WeekDefinition? GetNextWeek()
|
||||
{
|
||||
var currentWeek = GetCurrentWeek();
|
||||
if (currentWeek == null) return null;
|
||||
return GetNextWeek(currentWeek);
|
||||
}
|
||||
|
||||
public WeekDefinition? GetNextWeek(WeekDefinition currentWeek)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
return _cacheByOrder.TryGetValue(currentWeek.WeekOrder + 1, out var nextWeek) ? nextWeek : null;
|
||||
}
|
||||
|
||||
public WeekDefinition? GetPreviousWeek()
|
||||
{
|
||||
var currentWeek = GetCurrentWeek();
|
||||
if (currentWeek == null) return null;
|
||||
return GetPreviousWeek(currentWeek);
|
||||
}
|
||||
|
||||
public WeekDefinition? GetPreviousWeek(WeekDefinition currentWeek)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
if (currentWeek.WeekOrder <= 1) return null;
|
||||
return _cacheByOrder.TryGetValue(currentWeek.WeekOrder - 1, out var prevWeek) ? prevWeek : null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Lookup Methods
|
||||
|
||||
public WeekDefinition? GetWeekByDate(DateTime date)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
|
||||
// شنبه اول هفته (تقویم شمسی)
|
||||
var saturday = GetStartOfWeek(date);
|
||||
|
||||
return _allWeeks.FirstOrDefault(w =>
|
||||
w.StartDate.Date == saturday.Date);
|
||||
}
|
||||
|
||||
public WeekDefinition? GetWeekByGregorianWeekNumber(string gregorianWeekNumber)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
return _cacheByGregorianWeek.TryGetValue(gregorianWeekNumber, out var week) ? week : null;
|
||||
}
|
||||
|
||||
public WeekDefinition? GetWeekByPersianWeekNumber(string persianWeekNumber)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
return _cacheByPersianWeek.TryGetValue(persianWeekNumber, out var week) ? week : null;
|
||||
}
|
||||
|
||||
public WeekDefinition? GetWeekByOrder(int weekOrder)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
return _cacheByOrder.TryGetValue(weekOrder, out var week) ? week : null;
|
||||
}
|
||||
|
||||
public IReadOnlyList<WeekDefinition> GetAllWeeks()
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
return _allWeeks.AsReadOnly();
|
||||
}
|
||||
|
||||
public IReadOnlyList<WeekDefinition> GetWeeksByGregorianYear(int year)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
return _allWeeks.Where(w => w.GregorianYear == year).ToList().AsReadOnly();
|
||||
}
|
||||
|
||||
public IReadOnlyList<WeekDefinition> GetWeeksByPersianYear(int year)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
return _allWeeks.Where(w => w.PersianYear == year).ToList().AsReadOnly();
|
||||
}
|
||||
|
||||
public (DateTime startDate, DateTime endDate)? GetWeekDateRange(string gregorianWeekNumber)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
var week = GetWeekByGregorianWeekNumber(gregorianWeekNumber);
|
||||
if (week == null) return null;
|
||||
|
||||
return (week.StartDate, week.EndDate.AddHours(23).AddMinutes(59).AddSeconds(59));
|
||||
}
|
||||
public (DateTime startDate, DateTime endDate)? GetWeekDateRange(long WeekDefinitionId)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
var week = GetWeekById(WeekDefinitionId);
|
||||
if (week == null) return null;
|
||||
|
||||
return (week.StartDate, week.EndDate.AddHours(23).AddMinutes(59).AddSeconds(59));
|
||||
}
|
||||
public string? GetPreviousWeekNumber(string gregorianWeekNumber)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
var currentWeek = GetWeekByGregorianWeekNumber(gregorianWeekNumber);
|
||||
if (currentWeek == null) return null;
|
||||
|
||||
var previousWeek = GetWeekByOrder(currentWeek.WeekOrder - 1);
|
||||
return previousWeek?.GregorianWeekNumber;
|
||||
}
|
||||
|
||||
public string? GetNextWeekNumber(string gregorianWeekNumber)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
var currentWeek = GetWeekByGregorianWeekNumber(gregorianWeekNumber);
|
||||
if (currentWeek == null) return null;
|
||||
|
||||
var nextWeek = GetWeekByOrder(currentWeek.WeekOrder + 1);
|
||||
return nextWeek?.GregorianWeekNumber;
|
||||
}
|
||||
|
||||
public string GetDisplayNameByGregorianWeekNumber(string gregorianWeekNumber)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
var week = GetWeekByGregorianWeekNumber(gregorianWeekNumber);
|
||||
return week?.DisplayName ?? gregorianWeekNumber; // اگر پیدا نشد، خود شماره میلادی رو برگردون
|
||||
}
|
||||
|
||||
public IEnumerable<WeekDefinition> SearchWeeksByDisplayName(string? filter = null)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
|
||||
var weeks = _cacheByOrder.Values.OrderBy(w => w.WeekOrder);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(filter))
|
||||
{
|
||||
return weeks;
|
||||
}
|
||||
|
||||
return weeks.Where(w => w.DisplayName.Contains(filter, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
public long? GetWeekDefinitionId(string gregorianWeekNumber)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
var week = GetWeekByGregorianWeekNumber(gregorianWeekNumber);
|
||||
return week?.Id;
|
||||
}
|
||||
|
||||
public string? GetGregorianWeekNumber(long weekDefinitionId)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
var week = _allWeeks.FirstOrDefault(w => w.Id == weekDefinitionId);
|
||||
return week?.GregorianWeekNumber;
|
||||
}
|
||||
public WeekDefinition? GetWeekById(long weekDefinitionId)
|
||||
{
|
||||
EnsureCacheLoaded();
|
||||
var week = _allWeeks.FirstOrDefault(w => w.Id == weekDefinitionId);
|
||||
return week;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Calculation Methods (Fallback when not in cache)
|
||||
|
||||
public string CalculateGregorianWeekNumber(DateTime date)
|
||||
{
|
||||
// پیدا کردن شنبه این هفته
|
||||
var saturday = GetStartOfWeek(date);
|
||||
// دوشنبه همان هفته ISO
|
||||
var monday = saturday.AddDays(2);
|
||||
|
||||
var cal = CultureInfo.InvariantCulture.Calendar;
|
||||
var weekNumber = cal.GetWeekOfYear(monday, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
|
||||
var year = monday.Year;
|
||||
|
||||
if (weekNumber == 1 && monday.Month == 12) year++;
|
||||
else if (weekNumber >= 52 && monday.Month == 1) year--;
|
||||
|
||||
return $"{year}-W{weekNumber:D2}";
|
||||
}
|
||||
|
||||
public string CalculatePersianWeekNumber(DateTime date)
|
||||
{
|
||||
var saturday = GetStartOfWeek(date);
|
||||
var persianYear = _persianCalendar.GetYear(saturday);
|
||||
var dayOfYear = _persianCalendar.GetDayOfYear(saturday);
|
||||
|
||||
var firstDayOfYear = _persianCalendar.ToDateTime(persianYear, 1, 1, 0, 0, 0, 0);
|
||||
var daysUntilFirstSaturday = ((int)DayOfWeek.Saturday - (int)firstDayOfYear.DayOfWeek + 7) % 7;
|
||||
|
||||
int weekNumber;
|
||||
if (daysUntilFirstSaturday == 0)
|
||||
{
|
||||
weekNumber = ((dayOfYear - 1) / 7) + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dayOfYear <= daysUntilFirstSaturday)
|
||||
weekNumber = 1;
|
||||
else
|
||||
weekNumber = ((dayOfYear - daysUntilFirstSaturday - 1) / 7) + 1;
|
||||
}
|
||||
|
||||
return $"{persianYear}-W{weekNumber:D2}";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Helper Methods
|
||||
|
||||
private void EnsureCacheLoaded()
|
||||
{
|
||||
if (!_isCacheLoaded)
|
||||
{
|
||||
_logger.LogWarning("WeekDefinition cache is not loaded. Some methods may return null.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// پیدا کردن شنبه این هفته (شروع هفته شمسی)
|
||||
/// </summary>
|
||||
private static DateTime GetStartOfWeek(DateTime date)
|
||||
{
|
||||
var diff = (7 + (date.DayOfWeek - DayOfWeek.Saturday)) % 7;
|
||||
return date.AddDays(-diff).Date;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user