feat: Implement Commission and Network Statistics Pages with DTOs and Services

- Added CommissionDashboardPage and CommissionHistoryPage for displaying commission payouts and history.
- Implemented WeeklyBalancePage to show weekly balance details.
- Created NetworkStatisticsPage to display network statistics and tree structure.
- Developed corresponding services (CommissionService, NetworkMembershipService) for data retrieval.
- Introduced DTOs for Commission and Network data structures (CommissionPayoutDto, WeeklyBalanceDto, NetworkStatisticsDto).
- Added mock data generation for testing purposes in services.
- Enhanced UI with MudBlazor components for better user experience.
This commit is contained in:
masoodafar-web
2025-12-04 17:29:16 +03:30
parent a8e6693c70
commit 95c6bf5efa
25 changed files with 1882 additions and 26 deletions
@@ -0,0 +1,131 @@
namespace FrontOffice.Main.Utilities;
/// <summary>
/// Service for Commission operations
/// TODO: Connect to FrontOffice.BFF gRPC CommissionCQ
/// </summary>
public class CommissionService
{
// TODO: Inject gRPC client when FrontOffice connects to BFF
// private readonly CommissionContract.CommissionContractClient _client;
public CommissionService()
{
// TODO: Initialize gRPC client
}
/// <summary>
/// Get commission payouts with pagination and filters
/// Maps to: CommissionCQ.GetMyCommissionPayouts
/// </summary>
public async Task<CommissionPayoutsResponseDto> GetMyCommissionPayoutsAsync(
int? weekNumber,
string? status,
int pageNumber,
int pageSize)
{
// TODO: Replace with actual gRPC call to BFF
// var request = new GetMyCommissionPayoutsRequest
// {
// WeekNumber = weekNumber,
// Status = status ?? string.Empty,
// PageNumber = pageNumber,
// PageSize = pageSize
// };
// var response = await _client.GetMyCommissionPayoutsAsync(request);
// return MapToDto(response);
await Task.Delay(500); // Simulate network delay
// Mock data
var allPayouts = GenerateMockPayouts(50);
// Apply filters
var filtered = allPayouts.AsEnumerable();
if (weekNumber.HasValue)
filtered = filtered.Where(p => p.WeekNumber == weekNumber.Value);
if (!string.IsNullOrEmpty(status))
filtered = filtered.Where(p => p.Status == status);
var total = filtered.Count();
var paged = filtered.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();
return new CommissionPayoutsResponseDto
{
Payouts = paged,
TotalCount = total,
PageNumber = pageNumber,
PageSize = pageSize
};
}
/// <summary>
/// Get weekly balance details for a specific week
/// Maps to: CommissionCQ.GetMyWeeklyBalances
/// </summary>
public async Task<WeeklyBalanceDto> GetMyWeeklyBalanceAsync(int? weekNumber = null)
{
// TODO: Replace with actual gRPC call to BFF
// var request = new GetMyWeeklyBalancesRequest
// {
// WeekNumber = weekNumber
// };
// var response = await _client.GetMyWeeklyBalancesAsync(request);
// return MapToDto(response);
await Task.Delay(500); // Simulate network delay
// Mock current week data
var currentWeek = weekNumber ?? 45;
return new WeeklyBalanceDto
{
WeekNumber = currentWeek,
WeekLabel = $"هفته {currentWeek} - سال 1404",
LeftBalance = 15_000_000,
RightBalance = 12_000_000,
MinBalance = 12_000_000,
BalanceCount = 12,
CalculatedCommission = 1_200_000,
LeftCarryover = 3_000_000,
RightCarryover = 0,
StartDate = DateTime.Now.AddDays(-7),
EndDate = DateTime.Now
};
}
#region Mock Data Helpers
private static List<CommissionPayoutDto> GenerateMockPayouts(int count)
{
var payouts = new List<CommissionPayoutDto>();
var random = new Random();
var statuses = new[] { "Created", "Paid", "WithdrawalRequested", "Withdrawn", "Cancelled" };
var statusColors = new[] { "Info", "Success", "Warning", "Success", "Error" };
var statusTexts = new[] { "ایجاد شده", "پرداخت شده", "درخواست برداشت", "برداشت شده", "لغو شده" };
for (int i = 0; i < count; i++)
{
var statusIndex = random.Next(statuses.Length);
var weekNumber = 50 - i;
var balances = random.Next(5, 20);
var amount = balances * 100_000;
payouts.Add(new CommissionPayoutDto
{
Id = i + 1,
WeekNumber = weekNumber,
WeekLabel = $"هفته {weekNumber} - سال 1404",
BalancesEarned = balances,
TotalAmount = amount,
AmountFormatted = $"{amount:N0} تومان",
Status = statusTexts[statusIndex],
StatusBadgeColor = statusColors[statusIndex],
DatePersian = DateTime.Now.AddDays(-i * 7).ToString("yyyy/MM/dd")
});
}
return payouts;
}
#endregion
}