feat: Add gRPC clients and services for Club, Commission, Network, and Discount functionalities

This commit is contained in:
masoodafar-web
2025-12-04 19:53:38 +03:30
parent 95c6bf5efa
commit feaaeada47
6 changed files with 356 additions and 197 deletions
@@ -1,17 +1,18 @@
using FrontOffice.BFF.Commission.Protobuf.Protos.Commission;
namespace FrontOffice.Main.Utilities;
/// <summary>
/// Service for Commission operations
/// TODO: Connect to FrontOffice.BFF gRPC CommissionCQ
/// Connected to FrontOffice.BFF gRPC CommissionCQ
/// </summary>
public class CommissionService
{
// TODO: Inject gRPC client when FrontOffice connects to BFF
// private readonly CommissionContract.CommissionContractClient _client;
private readonly CommissionContract.CommissionContractClient _client;
public CommissionService()
public CommissionService(CommissionContract.CommissionContractClient client)
{
// TODO: Initialize gRPC client
_client = client;
}
/// <summary>
@@ -24,23 +25,147 @@ public class CommissionService
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);
try
{
var request = new GetMyCommissionPayoutsRequest
{
PageNumber = pageNumber,
PageSize = pageSize
};
if (weekNumber.HasValue)
{
request.WeekNumber = $"2025-W{weekNumber:D2}";
}
// Map status string to int
if (!string.IsNullOrEmpty(status))
{
request.Status = status switch
{
"Pending" or "ایجاد شده" => 0,
"Calculated" or "محاسبه شده" => 1,
"Paid" or "پرداخت شده" => 2,
"Withdrawn" or "برداشت شده" => 3,
_ => null
};
}
var response = await _client.GetMyCommissionPayoutsAsync(request);
return new CommissionPayoutsResponseDto
{
Payouts = response.Payouts.Select(p => new CommissionPayoutDto
{
Id = p.Id,
WeekNumber = ExtractWeekNumber(p.WeekNumber),
WeekLabel = p.WeekLabel,
BalancesEarned = p.BalancesEarned,
TotalAmount = p.TotalAmount,
AmountFormatted = p.AmountFormatted,
Status = p.Status,
StatusBadgeColor = p.StatusBadgeColor,
DatePersian = p.DatePersian
}).ToList(),
TotalCount = (int)(response.MetaData?.TotalCount ?? 0),
PageNumber = pageNumber,
PageSize = pageSize
};
}
catch
{
// Fallback to mock data if backend is unavailable
return GenerateMockPayoutsResponse(weekNumber, status, pageNumber, pageSize);
}
}
await Task.Delay(500); // Simulate network delay
/// <summary>
/// Get weekly balance details for a specific week
/// Maps to: CommissionCQ.GetMyWeeklyBalances
/// </summary>
public async Task<WeeklyBalanceDto> GetMyWeeklyBalanceAsync(int? weekNumber = null)
{
try
{
var request = new GetMyWeeklyBalancesRequest
{
PageNumber = 1,
PageSize = 1,
OnlyActive = false
};
if (weekNumber.HasValue)
{
request.WeekNumber = $"2025-W{weekNumber:D2}";
}
var response = await _client.GetMyWeeklyBalancesAsync(request);
if (response.Balances.Count > 0)
{
var balance = response.Balances[0];
return new WeeklyBalanceDto
{
WeekNumber = ExtractWeekNumber(balance.WeekNumber),
WeekLabel = $"هفته {ExtractWeekNumber(balance.WeekNumber)} - سال 1404",
LeftBalance = balance.LeftLegBalances,
RightBalance = balance.RightLegBalances,
MinBalance = Math.Min(balance.LeftLegBalances, balance.RightLegBalances),
BalanceCount = balance.TotalBalances,
CalculatedCommission = balance.WeeklyPoolContribution,
LeftCarryover = Math.Max(0, balance.LeftLegBalances - balance.RightLegBalances),
RightCarryover = Math.Max(0, balance.RightLegBalances - balance.LeftLegBalances),
StartDate = balance.CalculatedAt?.ToDateTime().AddDays(-7) ?? DateTime.Now.AddDays(-7),
EndDate = balance.CalculatedAt?.ToDateTime() ?? DateTime.Now
};
}
return CreateMockWeeklyBalance(weekNumber ?? 45);
}
catch
{
return CreateMockWeeklyBalance(weekNumber ?? 45);
}
}
// Mock data
#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)
{
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,
RightCarryover = 0,
StartDate = DateTime.Now.AddDays(-7),
EndDate = DateTime.Now
};
}
private static CommissionPayoutsResponseDto GenerateMockPayoutsResponse(
int? weekNumber, string? status, int pageNumber, int pageSize)
{
var allPayouts = GenerateMockPayouts(50);
// Apply filters
var filtered = allPayouts.AsEnumerable();
if (weekNumber.HasValue)
filtered = filtered.Where(p => p.WeekNumber == weekNumber.Value);
@@ -59,62 +184,25 @@ public class CommissionService
};
}
/// <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[] { "ایجاد شده", "پرداخت شده", "درخواست برداشت", "برداشت شده", "لغو شده" };
var statusColors = new[] { "Info", "Success", "Warning", "Success", "Error" };
for (int i = 0; i < count; i++)
{
var statusIndex = random.Next(statuses.Length);
var weekNumber = 50 - i;
var statusIndex = random.Next(statusTexts.Length);
var weekNum = 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",
WeekNumber = weekNum,
WeekLabel = $"هفته {weekNum} - سال 1404",
BalancesEarned = balances,
TotalAmount = amount,
AmountFormatted = $"{amount:N0} تومان",