Phase 2: Replace all deprecated SystemConstants with Package entity reads
- ActivateClubMembership: Load Package, set First/Last fields, PackageId on Cycle+Pool - AcceptClubMembershipContract: Load Package, set First/Last fields, PackageId on Pool - CalculateWeeklyBalances: Load base package, use package.MaxBalancesPerLeg/MaxNetworkLevel, set PackageId on NetworkWeeklyBalance - ProcessUserPayouts: Load base package, use package.MaxNetworkLevel, set PackageId on UserCommissionPayout - CheckAndProcessDayaLoans: Load base package (IsBasePackage), replace DayaLoanAmount→package.Price, fix hardcoded p.Id==4 - CreateManualPayment: Load base package, replace BasePackageAmount→package.Price, use DiscountMultiplier - InitiateBasePackagePayment: Remove hardcoded BasePackageId=4, load from IsBasePackage, use package.Price/Id - VerifyBasePackagePayment: Load Package from order.PackageId, use package.Price+DiscountMultiplier - ChargeMagicWallet: Load user's package from current cycle, use package.MagicWalletMaxDeposit - VerifyMagicWalletCharge: Load user's package, use package.MagicWalletMultiplier/MagicWalletMaxDeposit - OrmCommissionCalculationStrategy: Load base package in both methods, set PackageId on Balance+Payout - ConfigurationService: Inject IApplicationDbContext, read package values from DB instead of SystemConstants - UserOrderService: Load user's package for EXIT trigger MagicWalletMaxDeposit check - UserWalletService: Load user's package for GetMagicWalletStatus display All 9 deprecated SystemConstants now have ZERO usages outside SystemConstants.cs Build: 0 errors, 521 warnings (all pre-existing)
This commit is contained in:
+25
-6
@@ -135,13 +135,25 @@ public class AcceptClubMembershipContractCommandHandler
|
||||
};
|
||||
await _context.UserContracts.AddAsync(userContract, cancellationToken);
|
||||
|
||||
// 6. دریافت مقادیر از SystemConstants (استاتیک)
|
||||
long giftValue = SystemConstants.ClubMembershipGiftValue;
|
||||
long activationFeeValue = SystemConstants.ClubActivationFee;
|
||||
// 6. بارگذاری پکیج از آخرین خرید کاربر یا پکیج پایه
|
||||
var latestPurchase = await _context.UserPackagePurchases
|
||||
.Where(p => p.UserId == userId)
|
||||
.OrderByDescending(p => p.PurchasedAt)
|
||||
.FirstOrDefaultAsync(cancellationToken);
|
||||
|
||||
var package = latestPurchase != null
|
||||
? await _context.Packages.FirstOrDefaultAsync(p => p.Id == latestPurchase.PackageId && !p.IsDeleted, cancellationToken)
|
||||
: await _context.Packages.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken);
|
||||
|
||||
if (package == null)
|
||||
throw new NotFoundException("پکیج یافت نشد");
|
||||
|
||||
long giftValue = package.ActivationFee;
|
||||
long activationFeeValue = package.ActivationFee;
|
||||
|
||||
_logger.LogInformation(
|
||||
"Using Club.MembershipGiftValue: {GiftValue}, Club.ActivationFee: {ActivationFee}",
|
||||
giftValue, activationFeeValue
|
||||
"Using Package {PackageId} ({PackageName}): GiftValue={GiftValue}, ActivationFee={ActivationFee}",
|
||||
package.Id, package.Title, giftValue, activationFeeValue
|
||||
);
|
||||
|
||||
// 7. فعالسازی باشگاه مشتریان
|
||||
@@ -156,6 +168,10 @@ public class AcceptClubMembershipContractCommandHandler
|
||||
UserId = user.Id,
|
||||
IsActive = true,
|
||||
ActivatedAt = activationDate,
|
||||
FirstActivationDate = activationDate,
|
||||
FirstPackageId = package.Id,
|
||||
LastActivationDate = activationDate,
|
||||
LastPackageId = package.Id,
|
||||
InitialContribution = activationFeeValue,
|
||||
GiftValue = giftValue,
|
||||
TotalEarned = 0,
|
||||
@@ -175,6 +191,8 @@ public class AcceptClubMembershipContractCommandHandler
|
||||
clubMembership = user.ClubMembership!;
|
||||
clubMembership.IsActive = true;
|
||||
clubMembership.ActivatedAt = activationDate;
|
||||
clubMembership.LastActivationDate = activationDate;
|
||||
clubMembership.LastPackageId = package.Id;
|
||||
clubMembership.PurchaseMethod = user.PackagePurchaseMethod;
|
||||
_context.ClubMemberships.Update(clubMembership);
|
||||
|
||||
@@ -206,13 +224,14 @@ public class AcceptClubMembershipContractCommandHandler
|
||||
// 9. اضافه کردن مبلغ به Pool هفته جاری
|
||||
var currentWeekDefinitionId = GetCurrentWeekDefinitionId();
|
||||
var weeklyPool = await _context.WeeklyCommissionPools
|
||||
.FirstOrDefaultAsync(p => p.WeekDefinitionId == currentWeekDefinitionId, cancellationToken);
|
||||
.FirstOrDefaultAsync(p => p.WeekDefinitionId == currentWeekDefinitionId && p.PackageId == package.Id, cancellationToken);
|
||||
|
||||
if (weeklyPool == null)
|
||||
{
|
||||
weeklyPool = new WeeklyCommissionPool
|
||||
{
|
||||
WeekDefinitionId = currentWeekDefinitionId,
|
||||
PackageId = package.Id,
|
||||
TotalPoolAmount = activationFeeValue,
|
||||
TotalBalances = 0,
|
||||
ValuePerBalance = 0,
|
||||
|
||||
+43
-23
@@ -54,6 +54,9 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
|
||||
throw new NotFoundException(nameof(User), request.UserId);
|
||||
}
|
||||
|
||||
// متغیر پکیج — در هر دو مسیر (عادی و Force) مقداردهی میشود
|
||||
Package package;
|
||||
|
||||
// 2-5: بررسیهای مالی — در حالت ForceActivation (ادمین) رد میشود
|
||||
if (!request.ForceActivation)
|
||||
{
|
||||
@@ -79,17 +82,8 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
|
||||
throw new NotFoundException("کیف پول کاربر یافت نشد");
|
||||
}
|
||||
|
||||
if (wallet.Balance < SystemConstants.BasePackageAmount)
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"User {UserId} has insufficient balance: {Balance}",
|
||||
request.UserId,
|
||||
wallet.Balance
|
||||
);
|
||||
throw new BadRequestException(
|
||||
$"برای فعالسازی باشگاه مشتریان باید حداقل {SystemConstants.BasePackageAmount:N0} ریال موجودی اصلی داشته باشید"
|
||||
);
|
||||
}
|
||||
// NOTE: balance check uses package.Price — loaded after finding order (step 4)
|
||||
// Moved to after package loading
|
||||
|
||||
// 3.5. بررسی وضعیت کیفپول جادویی — اگر در حالت Magic است، فعالسازی مجاز نیست
|
||||
if (wallet.WalletMode == WalletMode.Magic)
|
||||
@@ -146,6 +140,19 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
|
||||
"تراکنش معتبر برای فعالسازی باشگاه یافت نشد"
|
||||
);
|
||||
}
|
||||
|
||||
// 5.5. بارگذاری پکیج از سفارش
|
||||
package = await _context.Packages
|
||||
.FirstOrDefaultAsync(p => p.Id == packageOrder.PackageId && !p.IsDeleted, cancellationToken)
|
||||
?? throw new NotFoundException("پکیج یافت نشد");
|
||||
|
||||
// بررسی موجودی با مبلغ پکیج واقعی
|
||||
if (wallet.Balance < package.Price)
|
||||
{
|
||||
throw new BadRequestException(
|
||||
$"برای فعالسازی باشگاه مشتریان باید حداقل {package.Price:N0} ریال موجودی اصلی داشته باشید"
|
||||
);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -161,19 +168,24 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
|
||||
_context.Users.Update(user);
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
}
|
||||
|
||||
// بارگذاری پکیج پایه برای فعالسازی اجباری
|
||||
package = await _context.Packages
|
||||
.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken)
|
||||
?? throw new NotFoundException("پکیج پایه یافت نشد");
|
||||
}
|
||||
|
||||
// 6. بررسی عضویت فعلی
|
||||
var existingMembership = await _context.ClubMemberships
|
||||
.FirstOrDefaultAsync(c => c.UserId == user.Id, cancellationToken);
|
||||
|
||||
// 6.1. دریافت مبلغ هدیه و هزینه فعالسازی از SystemConstants
|
||||
long giftValue = SystemConstants.ClubMembershipGiftValue;
|
||||
long activationFeeValue = SystemConstants.ClubActivationFee;
|
||||
// 6.1. دریافت مبلغ هدیه و هزینه فعالسازی از پکیج
|
||||
long giftValue = package.ActivationFee;
|
||||
long activationFeeValue = package.ActivationFee;
|
||||
|
||||
_logger.LogInformation(
|
||||
"Using Club.MembershipGiftValue: {GiftValue}, Club.ActivationFee: {ActivationFee}",
|
||||
giftValue, activationFeeValue
|
||||
"Using Package {PackageId} ({PackageName}): GiftValue={GiftValue}, ActivationFee={ActivationFee}, Price={Price}",
|
||||
package.Id, package.Title, giftValue, activationFeeValue, package.Price
|
||||
);
|
||||
|
||||
ClubMembership entity;
|
||||
@@ -188,8 +200,12 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
|
||||
UserId = user.Id,
|
||||
IsActive = true,
|
||||
ActivatedAt = activationDate,
|
||||
InitialContribution =activationFeeValue,
|
||||
GiftValue = giftValue, // مقدار از تنظیمات
|
||||
FirstActivationDate = activationDate,
|
||||
FirstPackageId = package.Id,
|
||||
LastActivationDate = activationDate,
|
||||
LastPackageId = package.Id,
|
||||
InitialContribution = activationFeeValue,
|
||||
GiftValue = giftValue,
|
||||
TotalEarned = 0,
|
||||
PurchaseMethod = user.PackagePurchaseMethod
|
||||
};
|
||||
@@ -214,9 +230,11 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
|
||||
return true;
|
||||
}
|
||||
|
||||
// فعالسازی مجدد — ActivatedAt حفظ میشه (overwrite نمیشه)
|
||||
// فعالسازی مجدد — FirstActivation حفظ میشه (Q21), Last بروزرسانی میشه
|
||||
entity = existingMembership;
|
||||
entity.IsActive = true;
|
||||
entity.LastActivationDate = activationDate;
|
||||
entity.LastPackageId = package.Id;
|
||||
entity.PurchaseMethod = user.PackagePurchaseMethod;
|
||||
|
||||
_context.ClubMemberships.Update(entity);
|
||||
@@ -250,7 +268,8 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
|
||||
CycleNumber = maxCycleNumber + 1,
|
||||
PackagePurchasedAt = activationDate,
|
||||
PurchaseMethod = user.PackagePurchaseMethod,
|
||||
PackageAmount = SystemConstants.BasePackageAmount,
|
||||
PackageAmount = package.Price,
|
||||
PackageId = package.Id,
|
||||
IsCurrentCycle = true
|
||||
};
|
||||
|
||||
@@ -284,15 +303,16 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
|
||||
// ⭐ 8. اضافه کردن مبلغ به Pool هفته جاری
|
||||
var currentWeekDefinitionId = GetCurrentWeekDefinitionId();
|
||||
var weeklyPool = await _context.WeeklyCommissionPools
|
||||
.FirstOrDefaultAsync(p => p.WeekDefinitionId == currentWeekDefinitionId, cancellationToken);
|
||||
.FirstOrDefaultAsync(p => p.WeekDefinitionId == currentWeekDefinitionId && p.PackageId == package.Id, cancellationToken);
|
||||
|
||||
if (weeklyPool == null)
|
||||
{
|
||||
// ایجاد Pool جدید برای این هفته
|
||||
// ایجاد Pool جدید برای این هفته × این پکیج
|
||||
weeklyPool = new WeeklyCommissionPool
|
||||
{
|
||||
WeekDefinitionId = currentWeekDefinitionId,
|
||||
TotalPoolAmount = activationFeeValue, // مبلغ هدیه به Pool اضافه میشه
|
||||
PackageId = package.Id,
|
||||
TotalPoolAmount = activationFeeValue,
|
||||
TotalBalances = 0, // در CalculateWeeklyBalances محاسبه میشه
|
||||
ValuePerBalance = 0, // در CalculateWeeklyCommissionPool محاسبه میشه
|
||||
IsCalculated = false,
|
||||
|
||||
+9
-5
@@ -82,11 +82,14 @@ public class CalculateWeeklyBalancesCommandHandler : IRequestHandler<CalculateWe
|
||||
var balancesList = new List<NetworkWeeklyBalance>();
|
||||
var calculatedAt = DateTime.Now;
|
||||
|
||||
// استفاده از SystemConstants (استاتیک - بدون کوئری به دیتابیس)
|
||||
// سقف تعادل هفتگی برای هر دست (نه کل) - 300 برای چپ + 300 برای راست = حداکثر 600 تعادل
|
||||
var maxBalancesPerLeg = SystemConstants.CommissionMaxWeeklyBalancesPerLeg;
|
||||
// حداکثر عمق شبکه برای شمارش اعضا (15 لول)
|
||||
var maxNetworkLevel = SystemConstants.CommissionMaxNetworkLevel;
|
||||
// بارگذاری پکیج پایه برای خواندن سقفها
|
||||
var package = await _context.Packages
|
||||
.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken)
|
||||
?? throw new InvalidOperationException("پکیج پایه یافت نشد");
|
||||
|
||||
// خواندن سقفها از پکیج (قبلاً از SystemConstants بود)
|
||||
var maxBalancesPerLeg = package.MaxBalancesPerLeg;
|
||||
var maxNetworkLevel = package.MaxNetworkLevel;
|
||||
|
||||
foreach (var user in usersInNetwork.OrderBy(o=>o.Id))
|
||||
{
|
||||
@@ -140,6 +143,7 @@ public class CalculateWeeklyBalancesCommandHandler : IRequestHandler<CalculateWe
|
||||
{
|
||||
UserId = user.Id,
|
||||
WeekDefinitionId = request.WeekDefinitionId,
|
||||
PackageId = package.Id,
|
||||
|
||||
// اطلاعات جدید
|
||||
LeftLegNewMembers = leftNewMembers,
|
||||
|
||||
+6
-2
@@ -49,8 +49,11 @@ public class ProcessUserPayoutsCommandHandler : IRequestHandler<ProcessUserPayou
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
}
|
||||
|
||||
// ⭐ خواندن MaxNetworkLevel از SystemConstants (استاتیک)
|
||||
var maxNetworkLevel = SystemConstants.CommissionMaxNetworkLevel;
|
||||
// بارگذاری پکیج پایه برای خواندن سقفها
|
||||
var package = await _context.Packages
|
||||
.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken)
|
||||
?? throw new InvalidOperationException("پکیج پایه یافت نشد");
|
||||
var maxNetworkLevel = package.MaxNetworkLevel;
|
||||
|
||||
// دریافت همه تعادلهای هفتگی (شامل صفرها هم برای محاسبه زیرمجموعه)
|
||||
var allWeeklyBalances = await _context.NetworkWeeklyBalances
|
||||
@@ -113,6 +116,7 @@ public class ProcessUserPayoutsCommandHandler : IRequestHandler<ProcessUserPayou
|
||||
UserId = userId,
|
||||
WeekDefinitionId = request.WeekDefinitionId,
|
||||
WeeklyPoolId = pool.Id,
|
||||
PackageId = package.Id,
|
||||
BalancesEarned = totalBalancesWithSubordinates, // ⭐ شامل زیرمجموعه
|
||||
ValuePerBalance = pool.ValuePerBalance,
|
||||
TotalAmount = totalAmount,
|
||||
|
||||
+20
-24
@@ -186,10 +186,15 @@ public class CheckAndProcessDayaLoansCommandHandler : IRequestHandler<CheckAndPr
|
||||
string contractNumber,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
// بارگذاری پکیج پایه
|
||||
var package = await _context.Packages
|
||||
.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken)
|
||||
?? throw new InvalidOperationException("پکیج پایه یافت نشد");
|
||||
|
||||
// 1. ایجاد تراکنش
|
||||
var transaction = new Transaction
|
||||
{
|
||||
Amount = SystemConstants.DayaLoanAmount,
|
||||
Amount = package.Price,
|
||||
Description = $"دریافت اعتبار دایا - قرارداد {contractNumber}",
|
||||
PaymentStatus = PaymentStatus.Success,
|
||||
PaymentDate = DateTime.Now,
|
||||
@@ -216,13 +221,13 @@ public class CheckAndProcessDayaLoansCommandHandler : IRequestHandler<CheckAndPr
|
||||
}
|
||||
|
||||
// 3. شارژ کیف پول عادی
|
||||
wallet.Balance += SystemConstants.DayaLoanAmount;
|
||||
wallet.Balance += package.Price;
|
||||
|
||||
var mainLog = new UserWalletChangeLog
|
||||
{
|
||||
WalletId = wallet.Id,
|
||||
CurrentBalance = 0,
|
||||
ChangeValue = SystemConstants.DayaLoanAmount,
|
||||
ChangeValue = package.Price,
|
||||
CurrentNetworkBalance = wallet.NetworkBalance,
|
||||
ChangeNerworkValue = 0,
|
||||
IsIncrease = true,
|
||||
@@ -230,8 +235,8 @@ public class CheckAndProcessDayaLoansCommandHandler : IRequestHandler<CheckAndPr
|
||||
};
|
||||
await _context.UserWalletChangeLogs.AddAsync(mainLog, cancellationToken);
|
||||
|
||||
// 4. شارژ کیف پول تخفیف (دو برابر)
|
||||
var discountAmount = SystemConstants.DayaLoanAmount * 2;
|
||||
// 4. شارژ کیف پول تخفیف
|
||||
var discountAmount = (long)(package.Price * package.DiscountMultiplier);
|
||||
wallet.DiscountBalance += discountAmount;
|
||||
|
||||
var discountLog = new UserWalletChangeLog
|
||||
@@ -253,27 +258,18 @@ public class CheckAndProcessDayaLoansCommandHandler : IRequestHandler<CheckAndPr
|
||||
user.DayaCreditReceivedAt = DateTime.Now;
|
||||
user.PackagePurchaseMethod = PackagePurchaseMethod.DayaLoan;
|
||||
|
||||
// 6. ثبت Order پکیج پایه
|
||||
var goldenPackage = await _context.Packages
|
||||
.FirstOrDefaultAsync(p => p.Id == 4, cancellationToken);
|
||||
|
||||
if (goldenPackage != null)
|
||||
// 6. ثبت UserPackagePurchase برای پکیج پایه
|
||||
var packagePurchase = new UserPackagePurchase
|
||||
{
|
||||
// 6. ثبت UserPackagePurchase برای پکیج پایه
|
||||
var goldenPackageId =goldenPackage.Id;
|
||||
var packagePurchase = new UserPackagePurchase
|
||||
{
|
||||
UserId = user.Id,
|
||||
PackageId = goldenPackageId,
|
||||
PurchaseMethod = PackagePurchaseMethod.DayaLoan,
|
||||
PurchasedAt = DateTime.Now,
|
||||
Amount = SystemConstants.DayaLoanAmount,
|
||||
TransactionId = transaction.Id
|
||||
};
|
||||
UserId = user.Id,
|
||||
PackageId = package.Id,
|
||||
PurchaseMethod = PackagePurchaseMethod.DayaLoan,
|
||||
PurchasedAt = DateTime.Now,
|
||||
Amount = package.Price,
|
||||
TransactionId = transaction.Id
|
||||
};
|
||||
|
||||
await _context.UserPackagePurchases.AddAsync(packagePurchase, cancellationToken);
|
||||
|
||||
}
|
||||
await _context.UserPackagePurchases.AddAsync(packagePurchase, cancellationToken);
|
||||
|
||||
// 7. Domain Event
|
||||
user.AddDomainEvent(new DayaLoanApprovedEvent(user, transaction, contractNumber));
|
||||
|
||||
+7
-3
@@ -70,9 +70,13 @@ public class CreateManualPaymentCommandHandler : IRequestHandler<CreateManualPay
|
||||
throw new NotFoundException($"کیف پول کاربر {request.UserId} یافت نشد");
|
||||
}
|
||||
|
||||
// 4. محاسبه مبالغ
|
||||
var balanceAmount = SystemConstants.BasePackageAmount; // 56M
|
||||
var discountBalanceAmount = SystemConstants.BasePackageAmount * 2; // 112M
|
||||
// 4. بارگذاری پکیج پایه و محاسبه مبالغ
|
||||
var package = await _context.Packages
|
||||
.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken)
|
||||
?? throw new NotFoundException("پکیج پایه یافت نشد");
|
||||
|
||||
var balanceAmount = package.Price;
|
||||
var discountBalanceAmount = (long)(package.Price * package.DiscountMultiplier);
|
||||
|
||||
|
||||
// 5. ثبت تراکنش
|
||||
|
||||
+13
-11
@@ -20,10 +20,7 @@ public class InitiateBasePackagePaymentCommandHandler : IRequestHandler<Initiate
|
||||
private readonly IApplicationDbContext _context;
|
||||
private readonly ILogger<InitiateBasePackagePaymentCommandHandler> _logger;
|
||||
|
||||
/// <summary>
|
||||
/// شناسه پکیج پایه در دیتابیس
|
||||
/// </summary>
|
||||
private const long BasePackageId = 4;
|
||||
// شناسه پکیج پایه از دیتابیس خوانده میشود (Package.IsBasePackage)
|
||||
|
||||
public InitiateBasePackagePaymentCommandHandler(
|
||||
IApplicationDbContext context,
|
||||
@@ -68,12 +65,17 @@ public class InitiateBasePackagePaymentCommandHandler : IRequestHandler<Initiate
|
||||
};
|
||||
}
|
||||
|
||||
// 2.5. بارگذاری پکیج پایه
|
||||
var package = await _context.Packages
|
||||
.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken)
|
||||
?? throw new NotFoundException("پکیج پایه یافت نشد");
|
||||
|
||||
// 3. بررسی عدم وجود سفارش Pending
|
||||
var pendingOrder = await _context.UserOrders
|
||||
.FirstOrDefaultAsync(o =>
|
||||
o.UserId == request.UserId &&
|
||||
o.PaymentStatus == PaymentStatus.Pending &&
|
||||
o.PackageId == BasePackageId,
|
||||
o.PackageId == package.Id,
|
||||
cancellationToken);
|
||||
|
||||
if (pendingOrder != null)
|
||||
@@ -93,7 +95,7 @@ public class InitiateBasePackagePaymentCommandHandler : IRequestHandler<Initiate
|
||||
Message = "سفارش قبلی در انتظار پرداخت یافت شد.",
|
||||
OrderId = pendingOrder.Id,
|
||||
TransactionId = existingTransaction?.Id ?? 0,
|
||||
Amount = SystemConstants.BasePackageAmount
|
||||
Amount = package.Price
|
||||
};
|
||||
}
|
||||
|
||||
@@ -112,8 +114,8 @@ public class InitiateBasePackagePaymentCommandHandler : IRequestHandler<Initiate
|
||||
// 5. ایجاد Transaction با وضعیت Pending
|
||||
var transaction = new Transaction
|
||||
{
|
||||
Amount = SystemConstants.BasePackageAmount,
|
||||
Description = $"خرید پکیج پایه ۵۶ میلیونی - کاربر #{user.Id}",
|
||||
Amount = package.Price,
|
||||
Description = $"خرید پکیج {package.Title} - کاربر #{user.Id}",
|
||||
PaymentStatus = PaymentStatus.Pending,
|
||||
Type = TransactionType.DepositIpg
|
||||
};
|
||||
@@ -130,8 +132,8 @@ public class InitiateBasePackagePaymentCommandHandler : IRequestHandler<Initiate
|
||||
var order = new UserOrder
|
||||
{
|
||||
UserId = user.Id,
|
||||
PackageId = BasePackageId,
|
||||
Amount = SystemConstants.BasePackageAmount,
|
||||
PackageId = package.Id,
|
||||
Amount = package.Price,
|
||||
PaymentStatus = PaymentStatus.Pending,
|
||||
DeliveryStatus = DeliveryStatus.None,
|
||||
UserAddressId = defaultAddress.Id,
|
||||
@@ -154,7 +156,7 @@ public class InitiateBasePackagePaymentCommandHandler : IRequestHandler<Initiate
|
||||
Message = "تراکنش و سفارش با موفقیت ثبت شد.",
|
||||
OrderId = order.Id,
|
||||
TransactionId = transaction.Id,
|
||||
Amount = SystemConstants.BasePackageAmount
|
||||
Amount = package.Price
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
+13
-5
@@ -128,12 +128,20 @@ public class VerifyBasePackagePaymentCommandHandler : IRequestHandler<VerifyBase
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
}
|
||||
|
||||
// 5.5. بارگذاری پکیج از سفارش
|
||||
var package = order.PackageId.HasValue
|
||||
? await _context.Packages.FirstOrDefaultAsync(p => p.Id == order.PackageId.Value, cancellationToken)
|
||||
: await _context.Packages.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken);
|
||||
|
||||
if (package == null)
|
||||
throw new NotFoundException("پکیج یافت نشد");
|
||||
|
||||
// 6. شارژ کیف پول (هم Balance و هم DiscountBalance)
|
||||
var oldBalance = userWallet.Balance;
|
||||
var oldDiscountBalance = userWallet.DiscountBalance;
|
||||
|
||||
userWallet.Balance += SystemConstants.BasePackageAmount;
|
||||
userWallet.DiscountBalance += SystemConstants.BasePackageAmount * 2;
|
||||
userWallet.Balance += package.Price;
|
||||
userWallet.DiscountBalance += (long)(package.Price * package.DiscountMultiplier);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Charging wallet for user {UserId}. Balance: {OldBalance} -> {NewBalance}, DiscountBalance: {OldDiscount} -> {NewDiscount}",
|
||||
@@ -153,11 +161,11 @@ public class VerifyBasePackagePaymentCommandHandler : IRequestHandler<VerifyBase
|
||||
{
|
||||
WalletId = userWallet.Id,
|
||||
CurrentBalance = userWallet.Balance,
|
||||
ChangeValue = SystemConstants.BasePackageAmount,
|
||||
ChangeValue = package.Price,
|
||||
CurrentNetworkBalance = userWallet.NetworkBalance,
|
||||
ChangeNerworkValue = 0,
|
||||
CurrentDiscountBalance = userWallet.DiscountBalance,
|
||||
ChangeDiscountValue = SystemConstants.BasePackageAmount * 2,
|
||||
ChangeDiscountValue = (long)(package.Price * package.DiscountMultiplier),
|
||||
IsIncrease = true,
|
||||
RefrenceId = transaction.Id
|
||||
};
|
||||
@@ -173,7 +181,7 @@ public class VerifyBasePackagePaymentCommandHandler : IRequestHandler<VerifyBase
|
||||
PackageId = order.PackageId.Value,
|
||||
PurchaseMethod = PackagePurchaseMethod.DirectPurchase,
|
||||
PurchasedAt = DateTime.Now,
|
||||
Amount = SystemConstants.BasePackageAmount,
|
||||
Amount = package.Price,
|
||||
OrderId = order.Id,
|
||||
TransactionId = transaction.Id
|
||||
};
|
||||
|
||||
+10
-1
@@ -76,8 +76,17 @@ public class ChargeMagicWalletCommandHandler
|
||||
);
|
||||
}
|
||||
|
||||
// 3.5. بارگذاری پکیج کاربر برای سقف کیفپول جادویی
|
||||
var currentCycle = await _context.ClubMembershipCycles
|
||||
.FirstOrDefaultAsync(c => c.UserId == request.UserId && c.IsCurrentCycle, cancellationToken);
|
||||
var package = currentCycle != null
|
||||
? await _context.Packages.FirstOrDefaultAsync(p => p.Id == currentCycle.PackageId, cancellationToken)
|
||||
: await _context.Packages.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken);
|
||||
if (package == null)
|
||||
throw new NotFoundException("پکیج یافت نشد");
|
||||
|
||||
// 4. بررسی سقف واریزی (per-cycle)
|
||||
var remainingDeposit = SystemConstants.MagicWalletMaxDeposit - wallet.MagicTotalDeposited;
|
||||
var remainingDeposit = package.MagicWalletMaxDeposit - wallet.MagicTotalDeposited;
|
||||
|
||||
if (remainingDeposit <= 0)
|
||||
{
|
||||
|
||||
+14
-5
@@ -121,8 +121,17 @@ public class VerifyMagicWalletChargeCommandHandler
|
||||
throw new BadRequestException("کیفپول در حالت جادویی نیست");
|
||||
}
|
||||
|
||||
// 5. محاسبه اعتبار ×2.5
|
||||
var creditAmount = (long)(depositAmount * SystemConstants.MagicWalletMultiplier); // مبلغ × 2.5
|
||||
// 4.5. بارگذاری پکیج کاربر برای ضریب جادویی
|
||||
var currentCycle = await _context.ClubMembershipCycles
|
||||
.FirstOrDefaultAsync(c => c.UserId == userId && c.IsCurrentCycle, cancellationToken);
|
||||
var package = currentCycle != null
|
||||
? await _context.Packages.FirstOrDefaultAsync(p => p.Id == currentCycle.PackageId, cancellationToken)
|
||||
: await _context.Packages.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken);
|
||||
if (package == null)
|
||||
throw new NotFoundException("پکیج یافت نشد");
|
||||
|
||||
// 5. محاسبه اعتبار
|
||||
var creditAmount = (long)(depositAmount * package.MagicWalletMultiplier); // مبلغ × 2.5
|
||||
var bonusAmount = creditAmount - depositAmount; // بونوس = مبلغ × 1.5
|
||||
|
||||
// 6. ثبت تراکنش واریز واقعی (MagicWalletDeposit)
|
||||
@@ -143,7 +152,7 @@ public class VerifyMagicWalletChargeCommandHandler
|
||||
var bonusTransaction = new Transaction
|
||||
{
|
||||
Amount = bonusAmount,
|
||||
Description = $"شارژ کیفپول جادویی - بونوس ×{SystemConstants.MagicWalletMultiplier - 1} - کاربر {userId}",
|
||||
Description = $"شارژ کیفپول جادویی - بونوس ×{package.MagicWalletMultiplier - 1} - کاربر {userId}",
|
||||
PaymentStatus = PaymentStatus.Success,
|
||||
PaymentDate = DateTime.UtcNow,
|
||||
RefId = $"MAGIC_BONUS_{depositTransaction.Id}",
|
||||
@@ -186,10 +195,10 @@ public class VerifyMagicWalletChargeCommandHandler
|
||||
userId,
|
||||
depositAmount,
|
||||
creditAmount,
|
||||
SystemConstants.MagicWalletMultiplier,
|
||||
package.MagicWalletMultiplier,
|
||||
bonusAmount,
|
||||
wallet.MagicTotalDeposited,
|
||||
SystemConstants.MagicWalletMaxDeposit,
|
||||
package.MagicWalletMaxDeposit,
|
||||
wallet.Balance
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user