fix: Phase 0 — critical bugs in package purchase handlers
B1: VerifyGoldenPackagePurchase — DiscountBalance was NOT charged (Amount × 2)
Now charges DiscountBalance same as all other handlers.
B2: VerifyGoldenPackagePurchase — UserPackagePurchase record was NOT created
Now creates UPP with OrderId and TransactionId.
B3: VerifyPackagePurchase — UserPackagePurchase record was NOT created
Now creates UPP after wallet charge.
B4: VerifyBasePackagePayment — UserPackagePurchase record was NOT created
Now creates UPP after wallet change log.
Also: VerifyGolden WalletChangeLog split into 2 logs (Balance + Discount)
to match the pattern used by VerifyPackagePurchase.
Transaction description changed from 'پکیج طلایی' to 'پکیج' (generic).
Impact: Only Daya Loan handler was creating UserPackagePurchase before.
Now all 4 payment paths create it consistently.
This commit is contained in:
+22
-2
@@ -164,13 +164,33 @@ public class VerifyBasePackagePaymentCommandHandler : IRequestHandler<VerifyBase
|
|||||||
|
|
||||||
await _context.UserWalletChangeLogs.AddAsync(changeLog, cancellationToken);
|
await _context.UserWalletChangeLogs.AddAsync(changeLog, cancellationToken);
|
||||||
|
|
||||||
// 9. بهروزرسانی Order
|
// 9. ثبت UserPackagePurchase
|
||||||
|
if (order.PackageId.HasValue)
|
||||||
|
{
|
||||||
|
var packagePurchase = new UserPackagePurchase
|
||||||
|
{
|
||||||
|
UserId = order.UserId,
|
||||||
|
PackageId = order.PackageId.Value,
|
||||||
|
PurchaseMethod = PackagePurchaseMethod.DirectPurchase,
|
||||||
|
PurchasedAt = DateTime.Now,
|
||||||
|
Amount = SystemConstants.BasePackageAmount,
|
||||||
|
OrderId = order.Id,
|
||||||
|
TransactionId = transaction.Id
|
||||||
|
};
|
||||||
|
await _context.UserPackagePurchases.AddAsync(packagePurchase, cancellationToken);
|
||||||
|
|
||||||
|
_logger.LogInformation(
|
||||||
|
"Created UserPackagePurchase for UserId {UserId}, PackageId {PackageId}",
|
||||||
|
order.UserId, order.PackageId.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 10. بهروزرسانی Order
|
||||||
order.TransactionId = transaction.Id;
|
order.TransactionId = transaction.Id;
|
||||||
order.PaymentStatus = PaymentStatus.Success;
|
order.PaymentStatus = PaymentStatus.Success;
|
||||||
order.PaymentDate = DateTime.Now;
|
order.PaymentDate = DateTime.Now;
|
||||||
order.PaymentMethod = PaymentMethod.IPG;
|
order.PaymentMethod = PaymentMethod.IPG;
|
||||||
|
|
||||||
// 10. بهروزرسانی User
|
// 11. بهروزرسانی User
|
||||||
order.User.PackagePurchaseMethod = PackagePurchaseMethod.DirectPurchase;
|
order.User.PackagePurchaseMethod = PackagePurchaseMethod.DirectPurchase;
|
||||||
|
|
||||||
await _context.SaveChangesAsync(cancellationToken);
|
await _context.SaveChangesAsync(cancellationToken);
|
||||||
|
|||||||
+48
-8
@@ -113,17 +113,23 @@ public class VerifyGoldenPackagePurchaseCommandHandler : IRequestHandler<VerifyG
|
|||||||
var oldBalance = wallet.Balance;
|
var oldBalance = wallet.Balance;
|
||||||
wallet.Balance += order.Amount;
|
wallet.Balance += order.Amount;
|
||||||
|
|
||||||
|
// شارژ DiscountBalance (موجودی اعتباری) — دو برابر مبلغ سفارش
|
||||||
|
var oldDiscountBalance = wallet.DiscountBalance;
|
||||||
|
wallet.DiscountBalance += order.Amount * 2;
|
||||||
|
|
||||||
_logger.LogInformation(
|
_logger.LogInformation(
|
||||||
"Charging wallet Balance for user {UserId} from {OldBalance} to {NewBalance}",
|
"Charging wallet for user {UserId}. Balance: {OldBalance} -> {NewBalance}, DiscountBalance: {OldDiscount} -> {NewDiscount}",
|
||||||
order.UserId,
|
order.UserId,
|
||||||
oldBalance,
|
oldBalance,
|
||||||
wallet.Balance);
|
wallet.Balance,
|
||||||
|
oldDiscountBalance,
|
||||||
|
wallet.DiscountBalance);
|
||||||
|
|
||||||
// 5. ثبت Transaction
|
// 5. ثبت Transaction
|
||||||
var transaction = new Transaction
|
var transaction = new Transaction
|
||||||
{
|
{
|
||||||
Amount = order.Amount,
|
Amount = order.Amount,
|
||||||
Description = $"خرید پکیج طلایی از درگاه - سفارش #{order.Id}",
|
Description = $"خرید پکیج از درگاه - سفارش #{order.Id}",
|
||||||
PaymentStatus = PaymentStatus.Success,
|
PaymentStatus = PaymentStatus.Success,
|
||||||
PaymentDate = DateTime.Now,
|
PaymentDate = DateTime.Now,
|
||||||
RefId = verifyResult.RefId,
|
RefId = verifyResult.RefId,
|
||||||
@@ -133,23 +139,57 @@ public class VerifyGoldenPackagePurchaseCommandHandler : IRequestHandler<VerifyG
|
|||||||
_context.Transactions.Add(transaction);
|
_context.Transactions.Add(transaction);
|
||||||
await _context.SaveChangesAsync(cancellationToken);
|
await _context.SaveChangesAsync(cancellationToken);
|
||||||
|
|
||||||
// 6. ثبت لاگ تغییر کیف پول
|
// 6. ثبت لاگ تغییر Balance
|
||||||
var changeLog = new UserWalletChangeLog
|
var balanceLog = new UserWalletChangeLog
|
||||||
{
|
{
|
||||||
WalletId = wallet.Id,
|
WalletId = wallet.Id,
|
||||||
CurrentBalance = wallet.Balance,
|
CurrentBalance = wallet.Balance,
|
||||||
ChangeValue = order.Amount,
|
ChangeValue = order.Amount,
|
||||||
CurrentNetworkBalance = wallet.NetworkBalance,
|
CurrentNetworkBalance = wallet.NetworkBalance,
|
||||||
ChangeNerworkValue = 0,
|
ChangeNerworkValue = 0,
|
||||||
CurrentDiscountBalance = wallet.DiscountBalance,
|
CurrentDiscountBalance = oldDiscountBalance,
|
||||||
ChangeDiscountValue = 0,
|
ChangeDiscountValue = 0,
|
||||||
IsIncrease = true,
|
IsIncrease = true,
|
||||||
RefrenceId = transaction.Id
|
RefrenceId = transaction.Id
|
||||||
};
|
};
|
||||||
|
await _context.UserWalletChangeLogs.AddAsync(balanceLog, cancellationToken);
|
||||||
|
|
||||||
await _context.UserWalletChangeLogs.AddAsync(changeLog, cancellationToken);
|
// 7. ثبت لاگ تغییر DiscountBalance
|
||||||
|
var discountLog = new UserWalletChangeLog
|
||||||
|
{
|
||||||
|
WalletId = wallet.Id,
|
||||||
|
CurrentBalance = wallet.Balance,
|
||||||
|
ChangeValue = 0,
|
||||||
|
CurrentNetworkBalance = wallet.NetworkBalance,
|
||||||
|
ChangeNerworkValue = 0,
|
||||||
|
CurrentDiscountBalance = wallet.DiscountBalance,
|
||||||
|
ChangeDiscountValue = order.Amount * 2,
|
||||||
|
IsIncrease = true,
|
||||||
|
RefrenceId = transaction.Id
|
||||||
|
};
|
||||||
|
await _context.UserWalletChangeLogs.AddAsync(discountLog, cancellationToken);
|
||||||
|
|
||||||
// 7. بهروزرسانی سفارش و کاربر
|
// 8. ثبت UserPackagePurchase
|
||||||
|
if (order.PackageId.HasValue)
|
||||||
|
{
|
||||||
|
var packagePurchase = new UserPackagePurchase
|
||||||
|
{
|
||||||
|
UserId = order.UserId,
|
||||||
|
PackageId = order.PackageId.Value,
|
||||||
|
PurchaseMethod = PackagePurchaseMethod.DirectPurchase,
|
||||||
|
PurchasedAt = DateTime.Now,
|
||||||
|
Amount = order.Amount,
|
||||||
|
OrderId = order.Id,
|
||||||
|
TransactionId = transaction.Id
|
||||||
|
};
|
||||||
|
await _context.UserPackagePurchases.AddAsync(packagePurchase, cancellationToken);
|
||||||
|
|
||||||
|
_logger.LogInformation(
|
||||||
|
"Created UserPackagePurchase for UserId {UserId}, PackageId {PackageId}",
|
||||||
|
order.UserId, order.PackageId.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 9. بهروزرسانی سفارش و کاربر
|
||||||
order.TransactionId = transaction.Id;
|
order.TransactionId = transaction.Id;
|
||||||
order.PaymentStatus = PaymentStatus.Success;
|
order.PaymentStatus = PaymentStatus.Success;
|
||||||
order.PaymentDate = DateTime.Now;
|
order.PaymentDate = DateTime.Now;
|
||||||
|
|||||||
+22
-2
@@ -154,13 +154,33 @@ public class VerifyPackagePurchaseCommandHandler
|
|||||||
};
|
};
|
||||||
await _context.UserWalletChangeLogs.AddAsync(discountLog, cancellationToken);
|
await _context.UserWalletChangeLogs.AddAsync(discountLog, cancellationToken);
|
||||||
|
|
||||||
// 8. بهروزرسانی Order
|
// 8. ثبت UserPackagePurchase
|
||||||
|
if (order.PackageId.HasValue)
|
||||||
|
{
|
||||||
|
var packagePurchase = new UserPackagePurchase
|
||||||
|
{
|
||||||
|
UserId = order.UserId,
|
||||||
|
PackageId = order.PackageId.Value,
|
||||||
|
PurchaseMethod = PackagePurchaseMethod.DirectPurchase,
|
||||||
|
PurchasedAt = DateTime.Now,
|
||||||
|
Amount = order.Amount,
|
||||||
|
OrderId = order.Id,
|
||||||
|
TransactionId = transaction.Id
|
||||||
|
};
|
||||||
|
await _context.UserPackagePurchases.AddAsync(packagePurchase, cancellationToken);
|
||||||
|
|
||||||
|
_logger.LogInformation(
|
||||||
|
"Created UserPackagePurchase for UserId {UserId}, PackageId {PackageId}",
|
||||||
|
order.UserId, order.PackageId.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 9. بهروزرسانی Order
|
||||||
order.TransactionId = transaction.Id;
|
order.TransactionId = transaction.Id;
|
||||||
order.PaymentStatus = PaymentStatus.Success;
|
order.PaymentStatus = PaymentStatus.Success;
|
||||||
order.PaymentDate = DateTime.Now;
|
order.PaymentDate = DateTime.Now;
|
||||||
order.PaymentMethod = PaymentMethod.IPG;
|
order.PaymentMethod = PaymentMethod.IPG;
|
||||||
|
|
||||||
// 9. تغییر User.PackagePurchaseMethod
|
// 10. تغییر User.PackagePurchaseMethod
|
||||||
order.User.PackagePurchaseMethod = PackagePurchaseMethod.DirectPurchase;
|
order.User.PackagePurchaseMethod = PackagePurchaseMethod.DirectPurchase;
|
||||||
|
|
||||||
await _context.SaveChangesAsync(cancellationToken);
|
await _context.SaveChangesAsync(cancellationToken);
|
||||||
|
|||||||
Reference in New Issue
Block a user