feat: add withdrawal requests feature and update VAT loading mechanism
Build and Deploy / build (push) Successful in 1m25s

This commit is contained in:
masoodafar-web
2025-12-20 04:03:11 +03:30
parent 9ee464b8b4
commit 025e8d3c3e
24 changed files with 961 additions and 398 deletions
@@ -15,12 +15,67 @@ public class CommissionService
_client = client;
}
/// <summary>
/// Get week definitions for dropdown
/// Maps to: CommissionCQ.GetWeekDefinitions
/// </summary>
public async Task<List<WeekDefinitionDto>> GetWeekDefinitionsAsync(
string? searchText = null,
int? gregorianYear = null,
int? persianYear = null,
bool? isActive = null,
int pageSize = 100)
{
try
{
var request = new GetWeekDefinitionsRequest
{
PageNumber = 1,
PageSize = pageSize
};
if (!string.IsNullOrWhiteSpace(searchText))
request.SearchText = searchText;
if (gregorianYear.HasValue)
request.GregorianYear = gregorianYear.Value;
if (persianYear.HasValue)
request.PersianYear = persianYear.Value;
if (isActive.HasValue)
request.IsActive = isActive.Value;
var response = await _client.GetWeekDefinitionsAsync(request);
return response.Data.Select(w => new WeekDefinitionDto
{
Id = w.Id,
WeekOrder = w.WeekOrder,
DisplayName = w.DisplayName,
StartDate = w.StartDate?.ToDateTime() ?? DateTime.MinValue,
EndDate = w.EndDate?.ToDateTime() ?? DateTime.MinValue,
GregorianYear = w.GregorianYear,
PersianYear = w.PersianYear,
IsActive = w.IsActive,
IsCurrentWeek = w.IsCurrentWeek,
StartDatePersian = w.StartDatePersian,
EndDatePersian = w.EndDatePersian
}).ToList();
}
catch
{
// Fallback to mock data if backend is unavailable
return GenerateMockWeekDefinitions();
}
}
/// <summary>
/// Get commission payouts with pagination and filters
/// Maps to: CommissionCQ.GetMyCommissionPayouts
/// </summary>
public async Task<CommissionPayoutsResponseDto> GetMyCommissionPayoutsAsync(
int? weekNumber,
long? weekDefinitionId,
string? status,
int pageNumber,
int pageSize)
@@ -33,9 +88,9 @@ public class CommissionService
PageSize = pageSize
};
if (weekNumber.HasValue)
if (weekDefinitionId.HasValue)
{
request.WeekNumber = $"2025-W{weekNumber:D2}";
request.WeekDefinitionId = weekDefinitionId.Value;
}
// Map status string to int
@@ -58,8 +113,8 @@ public class CommissionService
Payouts = response.Payouts.Select(p => new CommissionPayoutDto
{
Id = p.Id,
WeekNumber = ExtractWeekNumber(p.WeekNumber),
WeekLabel = p.WeekLabel,
WeekDefinitionId = p.WeekDefinitionId,
WeekDisplayName = p.WeekDisplayName,
BalancesEarned = p.BalancesEarned,
TotalAmount = p.TotalAmount,
AmountFormatted = p.AmountFormatted,
@@ -75,7 +130,7 @@ public class CommissionService
catch
{
// Fallback to mock data if backend is unavailable
return GenerateMockPayoutsResponse(weekNumber, status, pageNumber, pageSize);
return GenerateMockPayoutsResponse(weekDefinitionId, status, pageNumber, pageSize);
}
}
@@ -83,7 +138,7 @@ public class CommissionService
/// Get weekly balance details for a specific week
/// Maps to: CommissionCQ.GetMyWeeklyBalances
/// </summary>
public async Task<WeeklyBalanceDto> GetMyWeeklyBalanceAsync(int? weekNumber = null)
public async Task<WeeklyBalanceDto> GetMyWeeklyBalanceAsync(long? weekDefinitionId = null)
{
try
{
@@ -94,9 +149,9 @@ public class CommissionService
OnlyActive = false
};
if (weekNumber.HasValue)
if (weekDefinitionId.HasValue)
{
request.WeekNumber = $"2025-W{weekNumber:D2}";
request.WeekDefinitionId = weekDefinitionId.Value;
}
var response = await _client.GetMyWeeklyBalancesAsync(request);
@@ -106,8 +161,8 @@ public class CommissionService
var balance = response.Balances[0];
return new WeeklyBalanceDto
{
WeekNumber = ExtractWeekNumber(balance.WeekNumber),
WeekLabel = $"هفته {ExtractWeekNumber(balance.WeekNumber)} - سال 1404",
WeekDefinitionId = balance.WeekDefinitionId,
WeekDisplayName = balance.WeekDisplayName,
LeftBalance = balance.LeftLegBalances,
RightBalance = balance.RightLegBalances,
MinBalance = Math.Min(balance.LeftLegBalances, balance.RightLegBalances),
@@ -120,41 +175,28 @@ public class CommissionService
};
}
return CreateMockWeeklyBalance(weekNumber ?? 45);
return CreateMockWeeklyBalance();
}
catch
{
return CreateMockWeeklyBalance(weekNumber ?? 45);
return CreateMockWeeklyBalance();
}
}
#region Helper Methods
private static int ExtractWeekNumber(string weekNumberStr)
{
// Format: "2025-W48" → 48
if (string.IsNullOrEmpty(weekNumberStr)) return 0;
var parts = weekNumberStr.Split('W');
if (parts.Length > 1 && int.TryParse(parts[1], out var week))
{
return week;
}
return 0;
}
private static WeeklyBalanceDto CreateMockWeeklyBalance(int weekNumber)
private static WeeklyBalanceDto CreateMockWeeklyBalance()
{
return new WeeklyBalanceDto
{
WeekNumber = weekNumber,
WeekLabel = $"هفته {weekNumber} - سال 1404",
LeftBalance = 15_000_000,
RightBalance = 12_000_000,
MinBalance = 12_000_000,
BalanceCount = 12,
CalculatedCommission = 1_200_000,
LeftCarryover = 3_000_000,
WeekDefinitionId = 0,
WeekDisplayName = "داده‌ای یافت نشد",
LeftBalance = 0,
RightBalance = 0,
MinBalance = 0,
BalanceCount = 0,
CalculatedCommission = 0,
LeftCarryover = 0,
RightCarryover = 0,
StartDate = DateTime.Now.AddDays(-7),
EndDate = DateTime.Now
@@ -162,13 +204,13 @@ public class CommissionService
}
private static CommissionPayoutsResponseDto GenerateMockPayoutsResponse(
int? weekNumber, string? status, int pageNumber, int pageSize)
long? weekDefinitionId, string? status, int pageNumber, int pageSize)
{
var allPayouts = GenerateMockPayouts(50);
var filtered = allPayouts.AsEnumerable();
if (weekNumber.HasValue)
filtered = filtered.Where(p => p.WeekNumber == weekNumber.Value);
if (weekDefinitionId.HasValue)
filtered = filtered.Where(p => p.WeekDefinitionId == weekDefinitionId.Value);
if (!string.IsNullOrEmpty(status))
filtered = filtered.Where(p => p.Status == status);
@@ -201,8 +243,8 @@ public class CommissionService
payouts.Add(new CommissionPayoutDto
{
Id = i + 1,
WeekNumber = weekNum,
WeekLabel = $"هفته {weekNum} - سال 1404",
WeekDefinitionId = i + 1,
WeekDisplayName = $"هفته {weekNum} - سال 1404",
BalancesEarned = balances,
TotalAmount = amount,
AmountFormatted = $"{amount:N0} تومان",
@@ -215,5 +257,35 @@ public class CommissionService
return payouts;
}
private static List<WeekDefinitionDto> GenerateMockWeekDefinitions()
{
var weeks = new List<WeekDefinitionDto>();
var persianOrdinals = new[] { "یکم", "دوم", "سوم", "چهارم", "پنجم", "ششم", "هفتم", "هشتم", "نهم", "دهم" };
// Generate 10 weeks starting from week 46
for (int i = 0; i < 10; i++)
{
var weekOrder = i + 1;
var startDate = new DateTime(2025, 11, 8).AddDays(i * 7);
weeks.Add(new WeekDefinitionDto
{
Id = i + 1,
WeekOrder = weekOrder,
DisplayName = weekOrder <= 10 ? $"هفته {persianOrdinals[weekOrder - 1]}" : $"هفته {weekOrder}",
StartDate = startDate,
EndDate = startDate.AddDays(6),
GregorianYear = 2025,
PersianYear = 1404,
IsActive = true,
IsCurrentWeek = weekOrder == 6, // Assume week 6 is current
StartDatePersian = $"1404/{8 + i}/17",
EndDatePersian = $"1404/{8 + i}/23"
});
}
return weeks;
}
#endregion
}