feat: Enhance withdrawal request handling with additional fields and network level configurations
This commit is contained in:
@@ -54,12 +54,16 @@ public class CalculateWeeklyBalancesCommandHandler : IRequestHandler<CalculateWe
|
|||||||
.Where(x => x.IsActive && (
|
.Where(x => x.IsActive && (
|
||||||
x.Key == "Club.ActivationFee" ||
|
x.Key == "Club.ActivationFee" ||
|
||||||
x.Key == "Commission.WeeklyPoolContributionPercent" ||
|
x.Key == "Commission.WeeklyPoolContributionPercent" ||
|
||||||
x.Key == "Commission.MaxWeeklyBalancesPerUser"))
|
x.Key == "Commission.MaxWeeklyBalancesPerLeg" ||
|
||||||
|
x.Key == "Commission.MaxNetworkLevel"))
|
||||||
.ToDictionaryAsync(x => x.Key, x => x.Value, cancellationToken);
|
.ToDictionaryAsync(x => x.Key, x => x.Value, cancellationToken);
|
||||||
|
|
||||||
var activationFee = long.Parse(configs.GetValueOrDefault("Club.ActivationFee", "25000000"));
|
var activationFee = long.Parse(configs.GetValueOrDefault("Club.ActivationFee", "25000000"));
|
||||||
var poolPercent = decimal.Parse(configs.GetValueOrDefault("Commission.WeeklyPoolContributionPercent", "20")) / 100m;
|
var poolPercent = decimal.Parse(configs.GetValueOrDefault("Commission.WeeklyPoolContributionPercent", "20")) / 100m;
|
||||||
var maxWeeklyBalances = int.Parse(configs.GetValueOrDefault("Commission.MaxWeeklyBalancesPerUser", "300"));
|
// سقف تعادل هفتگی برای هر دست (نه کل) - 300 برای چپ + 300 برای راست = حداکثر 600 تعادل
|
||||||
|
var maxBalancesPerLeg = int.Parse(configs.GetValueOrDefault("Commission.MaxWeeklyBalancesPerLeg", "300"));
|
||||||
|
// حداکثر عمق شبکه برای شمارش اعضا (15 لول)
|
||||||
|
var maxNetworkLevel = int.Parse(configs.GetValueOrDefault("Commission.MaxNetworkLevel", "15"));
|
||||||
|
|
||||||
foreach (var user in usersInNetwork)
|
foreach (var user in usersInNetwork)
|
||||||
{
|
{
|
||||||
@@ -72,31 +76,32 @@ public class CalculateWeeklyBalancesCommandHandler : IRequestHandler<CalculateWe
|
|||||||
rightCarryover = previousWeekCarryovers[user.Id].RightLegRemainder;
|
rightCarryover = previousWeekCarryovers[user.Id].RightLegRemainder;
|
||||||
}
|
}
|
||||||
|
|
||||||
// محاسبه تعداد اعضای جدید در این هفته (فقط فرزندان مستقیم که در این هفته فعال شدند)
|
// محاسبه تعداد اعضای جدید در این هفته (تا maxNetworkLevel لول پایینتر)
|
||||||
var leftNewMembers = await CountNewMembersInLeg(user.Id, NetworkLeg.Left, request.WeekNumber, cancellationToken);
|
var leftNewMembers = await CountNewMembersInLeg(user.Id, NetworkLeg.Left, request.WeekNumber, maxNetworkLevel, cancellationToken);
|
||||||
var rightNewMembers = await CountNewMembersInLeg(user.Id, NetworkLeg.Right, request.WeekNumber, cancellationToken);
|
var rightNewMembers = await CountNewMembersInLeg(user.Id, NetworkLeg.Right, request.WeekNumber, maxNetworkLevel, cancellationToken);
|
||||||
|
|
||||||
// محاسبه مجموع هر پا (جدید + باقیمانده)
|
// محاسبه مجموع هر پا (جدید + باقیمانده)
|
||||||
var leftTotal = leftNewMembers + leftCarryover;
|
var leftTotal = leftNewMembers + leftCarryover;
|
||||||
var rightTotal = rightNewMembers + rightCarryover;
|
var rightTotal = rightNewMembers + rightCarryover;
|
||||||
|
|
||||||
// محاسبه تعادل (کمترین مقدار)
|
// ✅ اصلاح شده: اعمال سقف روی هر دست جداگانه (نه روی کل)
|
||||||
var totalBalances = Math.Min(leftTotal, rightTotal);
|
// سقف 300 برای دست چپ + 300 برای دست راست = حداکثر 600 تعادل در هفته
|
||||||
|
var cappedLeftTotal = Math.Min(leftTotal, maxBalancesPerLeg);
|
||||||
|
var cappedRightTotal = Math.Min(rightTotal, maxBalancesPerLeg);
|
||||||
|
|
||||||
// اعمال محدودیت سقف تعادل هفتگی (مثلاً 300)
|
// محاسبه تعادل (کمترین مقدار بعد از اعمال سقف)
|
||||||
var cappedBalances = Math.Min(totalBalances, maxWeeklyBalances);
|
var totalBalances = Math.Min(cappedLeftTotal, cappedRightTotal);
|
||||||
|
|
||||||
// محاسبه باقیمانده برای هفته بعد (Flash Out Logic)
|
// محاسبه باقیمانده برای هفته بعد
|
||||||
|
// باقیمانده = مقداری که از سقف هر دست رد شده
|
||||||
// مثال: چپ=350، راست=450، سقف=300
|
// مثال: چپ=350، راست=450، سقف=300
|
||||||
// تعادل پرداختی = MIN(MIN(350, 450), 300) = 300
|
// cappedLeft = MIN(350, 300) = 300
|
||||||
// از هر طرف نصف تعادل پرداختی کسر میشود: 300÷2 = 150
|
// cappedRight = MIN(450, 300) = 300
|
||||||
// باقیمانده چپ: 350 - 150 = 200
|
// totalBalances = MIN(300, 300) = 300
|
||||||
// باقیمانده راست: 450 - 150 = 300
|
// leftRemainder = 350 - 300 = 50 (مازاد سقف)
|
||||||
var balancesToPay = cappedBalances; // تعادل نهایی قابل پرداخت
|
// rightRemainder = 450 - 300 = 150 (مازاد سقف)
|
||||||
var balancesConsumedPerSide = balancesToPay / 2; // هر طرف نصف تعادل را مصرف میکند
|
var leftRemainder = leftTotal - cappedLeftTotal;
|
||||||
|
var rightRemainder = rightTotal - cappedRightTotal;
|
||||||
var leftRemainder = leftTotal - balancesConsumedPerSide;
|
|
||||||
var rightRemainder = rightTotal - balancesConsumedPerSide;
|
|
||||||
|
|
||||||
// محاسبه سهم استخر (20% از مجموع فعالسازیهای جدید کل شبکه)
|
// محاسبه سهم استخر (20% از مجموع فعالسازیهای جدید کل شبکه)
|
||||||
// طبق گفته دکتر: کل افراد جدید در شبکه × هزینه فعالسازی × 20%
|
// طبق گفته دکتر: کل افراد جدید در شبکه × هزینه فعالسازی × 20%
|
||||||
@@ -117,9 +122,9 @@ public class CalculateWeeklyBalancesCommandHandler : IRequestHandler<CalculateWe
|
|||||||
// مجموع
|
// مجموع
|
||||||
LeftLegTotal = leftTotal,
|
LeftLegTotal = leftTotal,
|
||||||
RightLegTotal = rightTotal,
|
RightLegTotal = rightTotal,
|
||||||
TotalBalances = cappedBalances, // تعادل واقعی بعد از اعمال سقف
|
TotalBalances = totalBalances, // تعادل واقعی بعد از اعمال سقف روی هر دست
|
||||||
|
|
||||||
// باقیمانده برای هفته بعد
|
// باقیمانده برای هفته بعد (مازاد سقف هر دست)
|
||||||
LeftLegRemainder = leftRemainder,
|
LeftLegRemainder = leftRemainder,
|
||||||
RightLegRemainder = rightRemainder,
|
RightLegRemainder = rightRemainder,
|
||||||
|
|
||||||
@@ -165,24 +170,38 @@ public class CalculateWeeklyBalancesCommandHandler : IRequestHandler<CalculateWe
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// شمارش اعضای جدیدی که در این هفته به یک پا اضافه شدند
|
/// شمارش اعضای جدیدی که در این هفته به یک پا اضافه شدند
|
||||||
/// فقط فرزندان مستقیم که ActivatedAt آنها در این هفته است
|
/// تا maxLevel لول پایینتر شمارش میشود
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private async Task<int> CountNewMembersInLeg(long userId, NetworkLeg leg, string weekNumber, CancellationToken cancellationToken)
|
private async Task<int> CountNewMembersInLeg(long userId, NetworkLeg leg, string weekNumber, int maxLevel, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// تبدیل WeekNumber به بازه تاریخی
|
// تبدیل WeekNumber به بازه تاریخی
|
||||||
var (startDate, endDate) = GetWeekDateRange(weekNumber);
|
var (startDate, endDate) = GetWeekDateRange(weekNumber);
|
||||||
|
|
||||||
// شمارش تمام اعضای زیرمجموعه که در این هفته فعال شدند
|
// شمارش تمام اعضای زیرمجموعه که در این هفته فعال شدند (تا maxLevel لول)
|
||||||
var count = await CountNewMembersRecursive(userId, leg, startDate, endDate, cancellationToken);
|
var count = await CountNewMembersRecursive(userId, leg, startDate, endDate, 0, maxLevel, cancellationToken);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// شمارش بازگشتی اعضای جدید در یک پا
|
/// شمارش بازگشتی اعضای جدید در یک پا
|
||||||
|
/// محدودیت عمق: تا maxLevel لول پایینتر شمارش میشود
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private async Task<int> CountNewMembersRecursive(long userId, NetworkLeg leg, DateTime startDate, DateTime endDate, CancellationToken cancellationToken)
|
private async Task<int> CountNewMembersRecursive(
|
||||||
|
long userId,
|
||||||
|
NetworkLeg leg,
|
||||||
|
DateTime startDate,
|
||||||
|
DateTime endDate,
|
||||||
|
int currentLevel,
|
||||||
|
int maxLevel,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
// ⭐ محدودیت عمق: اگر به حداکثر لول رسیدیم، توقف
|
||||||
|
if (currentLevel >= maxLevel)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// پیدا کردن فرزند مستقیم در پای مورد نظر
|
// پیدا کردن فرزند مستقیم در پای مورد نظر
|
||||||
var child = await _context.Users
|
var child = await _context.Users
|
||||||
.FirstOrDefaultAsync(x => x.NetworkParentId == userId && x.LegPosition == leg, cancellationToken);
|
.FirstOrDefaultAsync(x => x.NetworkParentId == userId && x.LegPosition == leg, cancellationToken);
|
||||||
@@ -203,9 +222,9 @@ public class CalculateWeeklyBalancesCommandHandler : IRequestHandler<CalculateWe
|
|||||||
count = 1;
|
count = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// جمع کردن اعضای جدید از پای چپ و راست فرزند
|
// جمع کردن اعضای جدید از پای چپ و راست فرزند (با افزایش لول)
|
||||||
var childLeft = await CountNewMembersRecursive(child.Id, NetworkLeg.Left, startDate, endDate, cancellationToken);
|
var childLeft = await CountNewMembersRecursive(child.Id, NetworkLeg.Left, startDate, endDate, currentLevel + 1, maxLevel, cancellationToken);
|
||||||
var childRight = await CountNewMembersRecursive(child.Id, NetworkLeg.Right, startDate, endDate, cancellationToken);
|
var childRight = await CountNewMembersRecursive(child.Id, NetworkLeg.Right, startDate, endDate, currentLevel + 1, maxLevel, cancellationToken);
|
||||||
|
|
||||||
return count + childLeft + childRight;
|
return count + childLeft + childRight;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,24 +37,75 @@ public class ProcessUserPayoutsCommandHandler : IRequestHandler<ProcessUserPayou
|
|||||||
await _context.SaveChangesAsync(cancellationToken);
|
await _context.SaveChangesAsync(cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
// دریافت تعادلهای هفتگی
|
// ⭐ خواندن MaxNetworkLevel از Config
|
||||||
var weeklyBalances = await _context.NetworkWeeklyBalances
|
var maxNetworkLevelConfig = await _context.SystemConfigurations
|
||||||
|
.Where(x => x.Key == "Commission.MaxNetworkLevel" && x.IsActive)
|
||||||
|
.Select(x => x.Value)
|
||||||
|
.FirstOrDefaultAsync(cancellationToken);
|
||||||
|
var maxNetworkLevel = int.Parse(maxNetworkLevelConfig ?? "15");
|
||||||
|
|
||||||
|
// دریافت همه تعادلهای هفتگی (شامل صفرها هم برای محاسبه زیرمجموعه)
|
||||||
|
var allWeeklyBalances = await _context.NetworkWeeklyBalances
|
||||||
|
.Where(x => x.WeekNumber == request.WeekNumber)
|
||||||
|
.ToDictionaryAsync(x => x.UserId, cancellationToken);
|
||||||
|
|
||||||
|
// دریافت کاربرانی که تعادل > 0 دارند (یا زیرمجموعهشان دارد)
|
||||||
|
var usersWithBalances = await _context.NetworkWeeklyBalances
|
||||||
.Where(x => x.WeekNumber == request.WeekNumber && x.TotalBalances > 0)
|
.Where(x => x.WeekNumber == request.WeekNumber && x.TotalBalances > 0)
|
||||||
|
.Select(x => x.UserId)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
|
// پیدا کردن تمام کاربرانی که باید کمیسیون بگیرند (شامل والدین)
|
||||||
|
var usersToProcess = new HashSet<long>(usersWithBalances);
|
||||||
|
|
||||||
|
// اضافه کردن والدین تا 15 لول بالاتر
|
||||||
|
foreach (var userId in usersWithBalances)
|
||||||
|
{
|
||||||
|
var ancestors = await GetAncestors(userId, maxNetworkLevel, cancellationToken);
|
||||||
|
foreach (var ancestorId in ancestors)
|
||||||
|
{
|
||||||
|
usersToProcess.Add(ancestorId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var payoutsList = new List<UserCommissionPayout>();
|
var payoutsList = new List<UserCommissionPayout>();
|
||||||
|
|
||||||
foreach (var balance in weeklyBalances)
|
foreach (var userId in usersToProcess)
|
||||||
{
|
{
|
||||||
|
// ⭐ محاسبه تعادل شخصی
|
||||||
|
var personalBalances = 0;
|
||||||
|
if (allWeeklyBalances.ContainsKey(userId))
|
||||||
|
{
|
||||||
|
personalBalances = allWeeklyBalances[userId].TotalBalances;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ⭐ محاسبه مجموع تعادلهای زیرمجموعه تا maxNetworkLevel لول
|
||||||
|
var subordinateBalances = await CalculateSubordinateBalancesAsync(
|
||||||
|
userId,
|
||||||
|
request.WeekNumber,
|
||||||
|
allWeeklyBalances,
|
||||||
|
maxNetworkLevel,
|
||||||
|
cancellationToken
|
||||||
|
);
|
||||||
|
|
||||||
|
// ⭐ مجموع تعادل = شخصی + زیرمجموعه
|
||||||
|
var totalBalancesWithSubordinates = personalBalances + subordinateBalances;
|
||||||
|
|
||||||
|
// اگر مجموع تعادل صفر است، نیازی به ثبت نیست
|
||||||
|
if (totalBalancesWithSubordinates <= 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// محاسبه مبلغ کمیسیون
|
// محاسبه مبلغ کمیسیون
|
||||||
var totalAmount = (long)(balance.TotalBalances * pool.ValuePerBalance);
|
var totalAmount = (long)(totalBalancesWithSubordinates * pool.ValuePerBalance);
|
||||||
|
|
||||||
var payout = new UserCommissionPayout
|
var payout = new UserCommissionPayout
|
||||||
{
|
{
|
||||||
UserId = balance.UserId,
|
UserId = userId,
|
||||||
WeekNumber = request.WeekNumber,
|
WeekNumber = request.WeekNumber,
|
||||||
WeeklyPoolId = pool.Id,
|
WeeklyPoolId = pool.Id,
|
||||||
BalancesEarned = balance.TotalBalances,
|
BalancesEarned = totalBalancesWithSubordinates, // ⭐ شامل زیرمجموعه
|
||||||
ValuePerBalance = pool.ValuePerBalance,
|
ValuePerBalance = pool.ValuePerBalance,
|
||||||
TotalAmount = totalAmount,
|
TotalAmount = totalAmount,
|
||||||
Status = CommissionPayoutStatus.Pending,
|
Status = CommissionPayoutStatus.Pending,
|
||||||
@@ -96,4 +147,92 @@ public class ProcessUserPayoutsCommandHandler : IRequestHandler<ProcessUserPayou
|
|||||||
|
|
||||||
return payoutsList.Count;
|
return payoutsList.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیدا کردن والدین یک کاربر تا N لول بالاتر
|
||||||
|
/// </summary>
|
||||||
|
private async Task<List<long>> GetAncestors(long userId, int maxLevels, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var ancestors = new List<long>();
|
||||||
|
var currentUserId = userId;
|
||||||
|
|
||||||
|
for (int level = 0; level < maxLevels; level++)
|
||||||
|
{
|
||||||
|
var user = await _context.Users
|
||||||
|
.Where(x => x.Id == currentUserId)
|
||||||
|
.Select(x => x.NetworkParentId)
|
||||||
|
.FirstOrDefaultAsync(cancellationToken);
|
||||||
|
|
||||||
|
if (user == null || !user.HasValue)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ancestors.Add(user.Value);
|
||||||
|
currentUserId = user.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ancestors;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// محاسبه مجموع تعادلهای زیرمجموعه یک کاربر تا N لول پایینتر
|
||||||
|
/// </summary>
|
||||||
|
private async Task<int> CalculateSubordinateBalancesAsync(
|
||||||
|
long userId,
|
||||||
|
string weekNumber,
|
||||||
|
Dictionary<long, NetworkWeeklyBalance> allBalances,
|
||||||
|
int maxLevel,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// پیدا کردن همه زیرمجموعهها تا maxLevel لول
|
||||||
|
var subordinates = await GetSubordinatesRecursive(userId, 1, maxLevel, cancellationToken);
|
||||||
|
|
||||||
|
// جمع تعادلهای آنها
|
||||||
|
var totalSubordinateBalances = 0;
|
||||||
|
foreach (var subordinateId in subordinates)
|
||||||
|
{
|
||||||
|
if (allBalances.ContainsKey(subordinateId))
|
||||||
|
{
|
||||||
|
totalSubordinateBalances += allBalances[subordinateId].TotalBalances;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return totalSubordinateBalances;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیدا کردن بازگشتی زیرمجموعهها تا N لول
|
||||||
|
/// </summary>
|
||||||
|
private async Task<List<long>> GetSubordinatesRecursive(
|
||||||
|
long userId,
|
||||||
|
int currentLevel,
|
||||||
|
int maxLevel,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// محدودیت عمق
|
||||||
|
if (currentLevel > maxLevel)
|
||||||
|
{
|
||||||
|
return new List<long>();
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = new List<long>();
|
||||||
|
|
||||||
|
// پیدا کردن فرزندان مستقیم
|
||||||
|
var children = await _context.Users
|
||||||
|
.Where(x => x.NetworkParentId == userId)
|
||||||
|
.Select(x => x.Id)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
|
result.AddRange(children);
|
||||||
|
|
||||||
|
// بازگشت برای هر فرزند
|
||||||
|
foreach (var childId in children)
|
||||||
|
{
|
||||||
|
var grandChildren = await GetSubordinatesRecursive(childId, currentLevel + 1, maxLevel, cancellationToken);
|
||||||
|
result.AddRange(grandChildren);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ public class GetWithdrawalRequestsQuery : IRequest<GetWithdrawalRequestsResponse
|
|||||||
public int? Status { get; set; } // CommissionPayoutStatus enum
|
public int? Status { get; set; } // CommissionPayoutStatus enum
|
||||||
public long? UserId { get; set; }
|
public long? UserId { get; set; }
|
||||||
public string? WeekNumber { get; set; }
|
public string? WeekNumber { get; set; }
|
||||||
|
public string? IbanNumber { get; set; }
|
||||||
public PaginationState? PaginationState { get; set; }
|
public PaginationState? PaginationState { get; set; }
|
||||||
public string? SortBy { get; set; }
|
public string? SortBy { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,11 @@ public class GetWithdrawalRequestsQueryHandler : IRequestHandler<GetWithdrawalRe
|
|||||||
query = query.Where(x => x.WeekNumber == request.WeekNumber);
|
query = query.Where(x => x.WeekNumber == request.WeekNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(request.IbanNumber))
|
||||||
|
{
|
||||||
|
query = query.Where(x => x.IbanNumber != null && x.IbanNumber.Contains(request.IbanNumber));
|
||||||
|
}
|
||||||
|
|
||||||
query = query.ApplyOrder(sortBy: request.SortBy ?? "-Created");
|
query = query.ApplyOrder(sortBy: request.SortBy ?? "-Created");
|
||||||
|
|
||||||
var meta = await query.GetMetaData(request.PaginationState, cancellationToken);
|
var meta = await query.GetMetaData(request.PaginationState, cancellationToken);
|
||||||
@@ -53,8 +58,11 @@ public class GetWithdrawalRequestsQueryHandler : IRequestHandler<GetWithdrawalRe
|
|||||||
IbanNumber = x.IbanNumber,
|
IbanNumber = x.IbanNumber,
|
||||||
RequestedAt = x.WithdrawnAt ?? x.Created,
|
RequestedAt = x.WithdrawnAt ?? x.Created,
|
||||||
ProcessedAt = x.LastModified,
|
ProcessedAt = x.LastModified,
|
||||||
ProcessedBy = null, // TODO: Add admin user tracking
|
ProcessedBy = x.ProcessedBy,
|
||||||
Reason = null, // TODO: Add rejection reason field
|
Reason = x.RejectionReason,
|
||||||
|
BankReferenceId = x.BankReferenceId,
|
||||||
|
BankTrackingCode = x.BankTrackingCode,
|
||||||
|
PaymentFailureReason = x.PaymentFailureReason,
|
||||||
Created = x.Created
|
Created = x.Created
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
|
|||||||
@@ -20,5 +20,8 @@ public class WithdrawalRequestModel
|
|||||||
public DateTime? ProcessedAt { get; set; }
|
public DateTime? ProcessedAt { get; set; }
|
||||||
public string? ProcessedBy { get; set; }
|
public string? ProcessedBy { get; set; }
|
||||||
public string? Reason { get; set; }
|
public string? Reason { get; set; }
|
||||||
|
public string? BankReferenceId { get; set; }
|
||||||
|
public string? BankTrackingCode { get; set; }
|
||||||
|
public string? PaymentFailureReason { get; set; }
|
||||||
public DateTime Created { get; set; }
|
public DateTime Created { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,9 +71,17 @@ public class ApplicationDbContextInitialiser
|
|||||||
// Commission Configuration
|
// Commission Configuration
|
||||||
new SystemConfiguration
|
new SystemConfiguration
|
||||||
{
|
{
|
||||||
Key = "Commission.MaxWeeklyBalancesPerUser",
|
Key = "Commission.MaxWeeklyBalancesPerLeg",
|
||||||
Value = "300",
|
Value = "300",
|
||||||
Description = "سقف امتیاز/تعادل هفتگی برای هر کاربر",
|
Description = "سقف تعادل هفتگی برای هر دست (چپ یا راست) - حداکثر کل = 600",
|
||||||
|
Scope = ConfigurationScope.Commission,
|
||||||
|
IsActive = true
|
||||||
|
},
|
||||||
|
new SystemConfiguration
|
||||||
|
{
|
||||||
|
Key = "Commission.MaxNetworkLevel",
|
||||||
|
Value = "15",
|
||||||
|
Description = "حداکثر عمق شبکه برای محاسبه کمیسیون (تعداد لول زیرمجموعه)",
|
||||||
Scope = ConfigurationScope.Commission,
|
Scope = ConfigurationScope.Commission,
|
||||||
IsActive = true
|
IsActive = true
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -316,6 +316,7 @@ message GetWithdrawalRequestsRequest
|
|||||||
google.protobuf.StringValue week_number = 3;
|
google.protobuf.StringValue week_number = 3;
|
||||||
int32 page_index = 4;
|
int32 page_index = 4;
|
||||||
int32 page_size = 5;
|
int32 page_size = 5;
|
||||||
|
string iban_number = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
message GetWithdrawalRequestsResponse
|
message GetWithdrawalRequestsResponse
|
||||||
@@ -454,4 +455,7 @@ message WithdrawalRequestModel
|
|||||||
string processed_by = 11;
|
string processed_by = 11;
|
||||||
string reason = 12;
|
string reason = 12;
|
||||||
google.protobuf.Timestamp created = 13;
|
google.protobuf.Timestamp created = 13;
|
||||||
|
string bank_reference_id = 14;
|
||||||
|
string bank_tracking_code = 15;
|
||||||
|
string payment_failure_reason = 16;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user