diff --git a/src/CMSMicroservice.Application/CommissionCQ/Queries/GetWithdrawalRequests/GetWithdrawalRequestsQueryHandler.cs b/src/CMSMicroservice.Application/CommissionCQ/Queries/GetWithdrawalRequests/GetWithdrawalRequestsQueryHandler.cs index 67fe1f9..aaa91b1 100644 --- a/src/CMSMicroservice.Application/CommissionCQ/Queries/GetWithdrawalRequests/GetWithdrawalRequestsQueryHandler.cs +++ b/src/CMSMicroservice.Application/CommissionCQ/Queries/GetWithdrawalRequests/GetWithdrawalRequestsQueryHandler.cs @@ -51,6 +51,15 @@ public class GetWithdrawalRequestsQueryHandler : IRequestHandler x.UserId).Distinct().ToList(); + var userPackageNames = await _context.UserPackagePurchases + .Where(p => userIds.Contains(p.UserId)) + .Include(p => p.Package) + .GroupBy(p => p.UserId) + .Select(g => new { UserId = g.Key, PackageName = g.OrderByDescending(x => x.PurchasedAt).First().Package.Title }) + .ToDictionaryAsync(x => x.UserId, x => x.PackageName, cancellationToken); + var result = models.Select(x => new WithdrawalRequestModel { Id = x.Id, @@ -69,7 +78,8 @@ public class GetWithdrawalRequestsQueryHandler : IRequestHandler /// ارسال اعلان فعال‌سازی عضویت باشگاه /// Task SendClubActivationNotificationAsync( - long userId, + long userId, + string? packageName = null, CancellationToken cancellationToken = default); /// @@ -49,6 +51,7 @@ public interface IUserNotificationService /// Task SendPayoutErrorNotificationAsync( long userId, - string errorMessage, + string errorMessage, + string? packageName = null, CancellationToken cancellationToken = default); } diff --git a/src/CMSMicroservice.Application/DayaLoanCQ/Commands/CheckAndProcessDayaLoans/CheckAndProcessDayaLoansCommandHandler.cs b/src/CMSMicroservice.Application/DayaLoanCQ/Commands/CheckAndProcessDayaLoans/CheckAndProcessDayaLoansCommandHandler.cs index 68defb2..f2d86b7 100644 --- a/src/CMSMicroservice.Application/DayaLoanCQ/Commands/CheckAndProcessDayaLoans/CheckAndProcessDayaLoansCommandHandler.cs +++ b/src/CMSMicroservice.Application/DayaLoanCQ/Commands/CheckAndProcessDayaLoans/CheckAndProcessDayaLoansCommandHandler.cs @@ -122,6 +122,7 @@ public class CheckAndProcessDayaLoansCommandHandler : IRequestHandler /// پردازش مالی وام دایا /// - private async Task<(long NewBalance, long TransactionId)> ProcessDayaLoanAsync( + private async Task<(long NewBalance, long TransactionId, string PackageName)> ProcessDayaLoanAsync( User user, string contractNumber, CancellationToken cancellationToken) @@ -279,25 +280,25 @@ public class CheckAndProcessDayaLoansCommandHandler : IRequestHandler /// ارسال SMS اطلاع‌رسانی /// - private async Task SendDayaLoanSmsAsync(User user) + private async Task SendDayaLoanSmsAsync(User user, string packageName) { try { var userName = SmsTemplates.GetUserName(user.FirstName+" "+user.LastName); - var message = SmsTemplates.DayaLoanReceived(userName); + var message = SmsTemplates.DayaLoanReceived(userName, packageName); await _smsService.SendAsync(user.Mobile, message); // ارسال SMS به ادمین برای اطلاع - var adminMessage = $"وام دایا دریافت شد\nکاربر: {user.FirstName} {user.LastName}\nموبایل: {user.Mobile}\nکدملی: {user.NationalCode}"; + var adminMessage = $"وام دایا دریافت شد\nکاربر: {user.FirstName} {user.LastName}\nموبایل: {user.Mobile}\nکدملی: {user.NationalCode}\nپکیج: {packageName}"; await _smsService.SendAsync("09199877503", adminMessage); _logger.LogInformation("Daya loan SMS sent to User {UserId}", user.Id); diff --git a/src/CMSMicroservice.Application/DayaLoanCQ/Commands/CheckAndProcessDayaLoans/CheckAndProcessDayaLoansResponseDto.cs b/src/CMSMicroservice.Application/DayaLoanCQ/Commands/CheckAndProcessDayaLoans/CheckAndProcessDayaLoansResponseDto.cs index fb7942c..74a0128 100644 --- a/src/CMSMicroservice.Application/DayaLoanCQ/Commands/CheckAndProcessDayaLoans/CheckAndProcessDayaLoansResponseDto.cs +++ b/src/CMSMicroservice.Application/DayaLoanCQ/Commands/CheckAndProcessDayaLoans/CheckAndProcessDayaLoansResponseDto.cs @@ -63,6 +63,11 @@ public class DayaLoanProcessResult /// public long? NewWalletBalance { get; set; } + /// + /// نام پکیج + /// + public string? PackageName { get; set; } + /// /// پیام /// diff --git a/src/CMSMicroservice.Application/ManualPaymentCQ/Commands/CreateManualPayment/CreateManualPaymentCommandValidator.cs b/src/CMSMicroservice.Application/ManualPaymentCQ/Commands/CreateManualPayment/CreateManualPaymentCommandValidator.cs index 325bec9..9dae429 100644 --- a/src/CMSMicroservice.Application/ManualPaymentCQ/Commands/CreateManualPayment/CreateManualPaymentCommandValidator.cs +++ b/src/CMSMicroservice.Application/ManualPaymentCQ/Commands/CreateManualPayment/CreateManualPaymentCommandValidator.cs @@ -1,3 +1,4 @@ +using CMSMicroservice.Domain.Common; using FluentValidation; namespace CMSMicroservice.Application.ManualPaymentCQ.Commands.CreateManualPayment; @@ -10,11 +11,12 @@ public class CreateManualPaymentCommandValidator : AbstractValidator x.Amount) .GreaterThan(0) .WithMessage("مبلغ باید بزرگتر از صفر باشد") - .LessThanOrEqualTo(1_000_000_000) - .WithMessage("مبلغ نمی‌تواند بیشتر از 1 میلیارد ریال باشد"); + .LessThanOrEqualTo(SystemConstants.WalletMaxSafeAmount) + .WithMessage("مبلغ وارد شده بیش از حد مجاز است"); RuleFor(x => x.Type) .IsInEnum() diff --git a/src/CMSMicroservice.Application/ManualPaymentCQ/Queries/GetAllManualPayments/GetAllManualPaymentsQueryHandler.cs b/src/CMSMicroservice.Application/ManualPaymentCQ/Queries/GetAllManualPayments/GetAllManualPaymentsQueryHandler.cs index 15f5902..2a087ba 100644 --- a/src/CMSMicroservice.Application/ManualPaymentCQ/Queries/GetAllManualPayments/GetAllManualPaymentsQueryHandler.cs +++ b/src/CMSMicroservice.Application/ManualPaymentCQ/Queries/GetAllManualPayments/GetAllManualPaymentsQueryHandler.cs @@ -69,6 +69,14 @@ public class GetAllManualPaymentsQueryHandler // Pagination var skip = (request.PageNumber - 1) * request.PageSize; + + // دریافت PackageName از آخرین خرید پکیج کاربر + var userPackageNames = await _context.UserPackagePurchases + .Include(p => p.Package) + .GroupBy(p => p.UserId) + .Select(g => new { UserId = g.Key, PackageName = g.OrderByDescending(x => x.PurchasedAt).First().Package.Title }) + .ToDictionaryAsync(x => x.UserId, x => x.PackageName, cancellationToken); + var data = await query .Skip(skip) .Take(request.PageSize) @@ -95,6 +103,13 @@ public class GetAllManualPaymentsQueryHandler Created = m.Created }) .ToListAsync(cancellationToken); + + // تکمیل PackageName + foreach (var item in data) + { + if (userPackageNames.TryGetValue(item.UserId, out var pkgName)) + item.PackageName = pkgName; + } var metaData = new MetaData { diff --git a/src/CMSMicroservice.Application/ManualPaymentCQ/Queries/GetAllManualPayments/GetAllManualPaymentsResponseDto.cs b/src/CMSMicroservice.Application/ManualPaymentCQ/Queries/GetAllManualPayments/GetAllManualPaymentsResponseDto.cs index 938b5fa..44e418d 100644 --- a/src/CMSMicroservice.Application/ManualPaymentCQ/Queries/GetAllManualPayments/GetAllManualPaymentsResponseDto.cs +++ b/src/CMSMicroservice.Application/ManualPaymentCQ/Queries/GetAllManualPayments/GetAllManualPaymentsResponseDto.cs @@ -30,4 +30,5 @@ public class ManualPaymentDto public string? RejectionReason { get; set; } public long? TransactionId { get; set; } public DateTime Created { get; set; } + public string? PackageName { get; set; } } diff --git a/src/CMSMicroservice.Application/WalletCQ/Commands/ChargeDiscountWallet/ChargeDiscountWalletCommandValidator.cs b/src/CMSMicroservice.Application/WalletCQ/Commands/ChargeDiscountWallet/ChargeDiscountWalletCommandValidator.cs index e2f6c02..2e8af6f 100644 --- a/src/CMSMicroservice.Application/WalletCQ/Commands/ChargeDiscountWallet/ChargeDiscountWalletCommandValidator.cs +++ b/src/CMSMicroservice.Application/WalletCQ/Commands/ChargeDiscountWallet/ChargeDiscountWalletCommandValidator.cs @@ -1,3 +1,4 @@ +using CMSMicroservice.Domain.Common; using FluentValidation; namespace CMSMicroservice.Application.WalletCQ.Commands.ChargeDiscountWallet; @@ -10,10 +11,11 @@ public class ChargeDiscountWalletCommandValidator : AbstractValidator x.Amount) - .GreaterThanOrEqualTo(10_000) - .WithMessage("حداقل مبلغ شارژ 10,000 تومان است") - .LessThanOrEqualTo(1_000_000_000) - .WithMessage("حداکثر مبلغ شارژ 1,000,000,000 تومان است"); + .GreaterThanOrEqualTo(SystemConstants.DiscountWalletMinCharge) + .WithMessage("حداقل مبلغ شارژ ۱,۰۰۰ تومان است") + .LessThanOrEqualTo(SystemConstants.WalletMaxSafeAmount) + .WithMessage("مبلغ وارد شده بیش از حد مجاز است"); } } diff --git a/src/CMSMicroservice.Application/WalletCQ/Commands/ChargeMagicWallet/ChargeMagicWalletCommandValidator.cs b/src/CMSMicroservice.Application/WalletCQ/Commands/ChargeMagicWallet/ChargeMagicWalletCommandValidator.cs index 175f12f..dcda819 100644 --- a/src/CMSMicroservice.Application/WalletCQ/Commands/ChargeMagicWallet/ChargeMagicWalletCommandValidator.cs +++ b/src/CMSMicroservice.Application/WalletCQ/Commands/ChargeMagicWallet/ChargeMagicWalletCommandValidator.cs @@ -1,3 +1,4 @@ +using CMSMicroservice.Domain.Common; using FluentValidation; namespace CMSMicroservice.Application.WalletCQ.Commands.ChargeMagicWallet; @@ -10,10 +11,11 @@ public class ChargeMagicWalletCommandValidator : AbstractValidator x.Amount) - .GreaterThanOrEqualTo(100_000) + .GreaterThanOrEqualTo(SystemConstants.MagicWalletMinCharge) .WithMessage("حداقل مبلغ شارژ جادویی ۱۰,۰۰۰ تومان است") - .LessThanOrEqualTo(1_000_000_000) - .WithMessage("حداکثر مبلغ شارژ جادویی ۱۰۰,۰۰۰,۰۰۰ تومان است"); + .LessThanOrEqualTo(SystemConstants.WalletMaxSafeAmount) + .WithMessage("مبلغ وارد شده بیش از حد مجاز است"); } } diff --git a/src/CMSMicroservice.Domain/Common/SmsTemplates.cs b/src/CMSMicroservice.Domain/Common/SmsTemplates.cs index 680730c..ec945a4 100644 --- a/src/CMSMicroservice.Domain/Common/SmsTemplates.cs +++ b/src/CMSMicroservice.Domain/Common/SmsTemplates.cs @@ -8,14 +8,18 @@ public static class SmsTemplates /// /// پیام دریافت اعتبار دایا /// - public static string DayaLoanReceived(string userName) => - $"{userName} عزیز، تامین اعتبار شما انجام شد. شما می‌توانید با مراجعه به سامانه کارابازار فرایند فعال‌سازی خود را ادامه دهید. با تشکر از حسن انتخاب شما"; + public static string DayaLoanReceived(string userName, string? packageName = null) => + packageName != null + ? $"{userName} عزیز، تامین اعتبار {packageName} شما انجام شد. شما می‌توانید با مراجعه به سامانه کارابازار فرایند فعال‌سازی خود را ادامه دهید. با تشکر از حسن انتخاب شما" + : $"{userName} عزیز، تامین اعتبار شما انجام شد. شما می‌توانید با مراجعه به سامانه کارابازار فرایند فعال‌سازی خود را ادامه دهید. با تشکر از حسن انتخاب شما"; /// /// پیام فعال‌سازی باشگاه مشتریان /// - public static string ClubActivated(string userName) => - $"{userName} گرامی، عضویت شما در باشگاه مشتریان کارابازار با موفقیت فعال شد. با تشکر از حسن انتخاب شما"; + public static string ClubActivated(string userName, string? packageName = null) => + packageName != null + ? $"{userName} گرامی، عضویت شما در باشگاه مشتریان کارابازار با {packageName} فعال شد. با تشکر از حسن انتخاب شما" + : $"{userName} گرامی، عضویت شما در باشگاه مشتریان کارابازار با موفقیت فعال شد. با تشکر از حسن انتخاب شما"; /// /// پیام خرید پکیج @@ -26,8 +30,10 @@ public static class SmsTemplates /// /// پیام واریز کمیسیون /// - public static string CommissionDeposited(string userName, long amount) => - $"{userName} گرامی، مبلغ {amount:N0} ریال بابت کمیسیون به کیف پول شما واریز شد."; + public static string CommissionDeposited(string userName, long amount, string? packageName = null) => + packageName != null + ? $"{userName} گرامی، مبلغ {amount:N0} ریال بابت کمیسیون {packageName} به کیف پول شما واریز شد." + : $"{userName} گرامی، مبلغ {amount:N0} ریال بابت کمیسیون به کیف پول شما واریز شد."; /// /// پیام برداشت موفق diff --git a/src/CMSMicroservice.Domain/Common/SystemConstants.cs b/src/CMSMicroservice.Domain/Common/SystemConstants.cs index 634a85e..0bf961c 100644 --- a/src/CMSMicroservice.Domain/Common/SystemConstants.cs +++ b/src/CMSMicroservice.Domain/Common/SystemConstants.cs @@ -66,6 +66,41 @@ public static class SystemConstants /// public const long MagicWalletEntryThreshold = 1_000_000; + /// + /// مقدار پیش‌فرض ضریب جادویی وقتی پکیج یافت نشود (بازگشت به پایه) + /// + public const double MagicWalletDefaultMultiplier = 2.5; + + /// + /// مقدار پیش‌فرض حداکثر واریز جادویی وقتی پکیج یافت نشود (ریال) + /// + public const long MagicWalletDefaultMaxDeposit = 1_000_000_000; + + /// + /// مقدار پیش‌فرض حداکثر اعتبار جادویی وقتی پکیج یافت نشود (ریال) + /// + public const long MagicWalletDefaultMaxCredit = 2_500_000_000; + + #endregion + + #region Wallet Validation Settings + + /// + /// حداکثر مبلغ مجاز در ولیدیتور (حصار ایمنی — مقدار واقعی از پکیج خوانده می‌شود). + /// ۱۰ میلیارد ریال = ۱ میلیارد تومان + /// + public const long WalletMaxSafeAmount = 10_000_000_000; + + /// + /// حداقل مبلغ شارژ جادویی (ریال) — ۱۰۰٬۰۰۰ ریال = ۱۰ هزار تومان + /// + public const long MagicWalletMinCharge = 100_000; + + /// + /// حداقل مبلغ شارژ تخفیفی (ریال) — ۱۰٬۰۰۰ ریال = ۱ هزار تومان + /// + public const long DiscountWalletMinCharge = 10_000; + #endregion #region Shop Settings diff --git a/src/CMSMicroservice.Infrastructure/Services/Monitoring/UserNotificationService.cs b/src/CMSMicroservice.Infrastructure/Services/Monitoring/UserNotificationService.cs index 865d6b3..9d1118b 100644 --- a/src/CMSMicroservice.Infrastructure/Services/Monitoring/UserNotificationService.cs +++ b/src/CMSMicroservice.Infrastructure/Services/Monitoring/UserNotificationService.cs @@ -49,6 +49,7 @@ public class UserNotificationService : IUserNotificationService long userId, decimal amount, int weekNumber, + string? packageName = null, CancellationToken cancellationToken = default) { _logger.LogInformation( @@ -69,14 +70,15 @@ public class UserNotificationService : IUserNotificationService if (string.IsNullOrEmpty(userFullName)) userFullName = "کاربر عزیز"; var formattedAmount = amount.ToString("N0", new System.Globalization.CultureInfo("fa-IR")); + var packageInfo = !string.IsNullOrEmpty(packageName) ? $" ({packageName})" : ""; // Send Email if (_emailSettings.Enabled && !string.IsNullOrEmpty(user.Email)) { - var emailSubject = $"واریز کمیسیون هفته {weekNumber}"; + var emailSubject = $"واریز کمیسیون هفته {weekNumber}{packageInfo}"; var emailBody = "
" + $"

سلام {userFullName}

" + - $"

کمیسیون هفته {weekNumber} شما به مبلغ {formattedAmount} ریال به کیف پول شما واریز شد.

" + + $"

کمیسیون هفته {weekNumber} شما{packageInfo} به مبلغ {formattedAmount} ریال به کیف پول شما واریز شد.

" + "

از اعتماد شما سپاسگزاریم.

" + "
" + "

FourSat - سیستم مدیریت باشگاه مشتریان

" + @@ -95,7 +97,7 @@ public class UserNotificationService : IUserNotificationService { await SendSmsAsync( phoneNumber: user.Mobile, - message: $"سلام {userFullName}\nکمیسیون هفته {weekNumber} شما به مبلغ {formattedAmount} ریال واریز شد.\nFourSat", + message: $"سلام {userFullName}\nکمیسیون هفته {weekNumber} شما{packageInfo} به مبلغ {formattedAmount} ریال واریز شد.\nFourSat", cancellationToken: cancellationToken); } @@ -109,6 +111,7 @@ public class UserNotificationService : IUserNotificationService public async Task SendClubActivationNotificationAsync( long userId, + string? packageName = null, CancellationToken cancellationToken = default) { _logger.LogInformation("🎉 Sending club activation notification: User={UserId}", userId); @@ -120,6 +123,7 @@ public class UserNotificationService : IUserNotificationService var userFullName = $"{user.FirstName} {user.LastName}".Trim(); if (string.IsNullOrEmpty(userFullName)) userFullName = "کاربر عزیز"; + var packageInfo = !string.IsNullOrEmpty(packageName) ? $" با {packageName}" : ""; // Send Email if (_emailSettings.Enabled && !string.IsNullOrEmpty(user.Email)) @@ -127,7 +131,7 @@ public class UserNotificationService : IUserNotificationService var emailSubject = "فعال‌سازی باشگاه مشتریان FourSat"; var emailBody = "
" + $"

تبریک {userFullName}!

" + - "

عضویت شما در باشگاه مشتریان FourSat با موفقیت فعال شد.

" + + $"

عضویت شما در باشگاه مشتریان FourSat{packageInfo} با موفقیت فعال شد.

" + "

از این پس می‌توانید از مزایای ویژه باشگاه بهره‌مند شوید.

" + "
" + "

FourSat - سیستم مدیریت باشگاه مشتریان

" + @@ -146,7 +150,7 @@ public class UserNotificationService : IUserNotificationService { await SendSmsAsync( phoneNumber: user.Mobile, - message: $"تبریک! عضویت شما در باشگاه مشتریان FourSat فعال شد.", + message: $"تبریک! عضویت شما در باشگاه مشتریان FourSat{packageInfo} فعال شد.", cancellationToken: cancellationToken); } } @@ -159,6 +163,7 @@ public class UserNotificationService : IUserNotificationService public async Task SendPayoutErrorNotificationAsync( long userId, string errorMessage, + string? packageName = null, CancellationToken cancellationToken = default) { _logger.LogWarning( diff --git a/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj b/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj index 672fe4f..9f0ac68 100644 --- a/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj +++ b/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj @@ -3,7 +3,7 @@ net9.0 enable enable - 0.0.188 + 0.0.189 None False False diff --git a/src/CMSMicroservice.Protobuf/Protos/commission.proto b/src/CMSMicroservice.Protobuf/Protos/commission.proto index 1315e1d..9518c04 100644 --- a/src/CMSMicroservice.Protobuf/Protos/commission.proto +++ b/src/CMSMicroservice.Protobuf/Protos/commission.proto @@ -531,6 +531,7 @@ message WithdrawalRequestModel string bank_reference_id = 15; string bank_tracking_code = 16; string payment_failure_reason = 17; + google.protobuf.StringValue package_name = 18; // نام پکیج کاربر } // ============ Week Definitions (for dropdowns) ============ diff --git a/src/CMSMicroservice.Protobuf/Protos/manualpayment.proto b/src/CMSMicroservice.Protobuf/Protos/manualpayment.proto index 150e1ca..edd0cab 100644 --- a/src/CMSMicroservice.Protobuf/Protos/manualpayment.proto +++ b/src/CMSMicroservice.Protobuf/Protos/manualpayment.proto @@ -138,6 +138,7 @@ message ManualPaymentModel google.protobuf.Timestamp created = 19; google.protobuf.StringValue image_path = 20; google.protobuf.Int64Value image_document_id = 21; + google.protobuf.StringValue package_name = 22; // نام پکیج کاربر } message ProcessManualMembershipPaymentRequest diff --git a/src/CMSMicroservice.Protobuf/Protos/userwallet.proto b/src/CMSMicroservice.Protobuf/Protos/userwallet.proto index 096f3ea..a48af72 100644 --- a/src/CMSMicroservice.Protobuf/Protos/userwallet.proto +++ b/src/CMSMicroservice.Protobuf/Protos/userwallet.proto @@ -251,6 +251,8 @@ message GetMagicWalletStatusResponse int64 balance = 6; google.protobuf.Timestamp magic_activated_at = 7; int32 purchase_cycle_count = 8; // تعداد دورهای خرید پکیج (0 = هنوز هیچ دوری تکمیل نشده) + double magic_multiplier = 9; // ضریب جادویی (مثلاً 2.5) + int64 magic_max_credit = 10; // حداکثر اعتبار (ریال) } // ============= Discount Wallet Messages ============= diff --git a/src/CMSMicroservice.WebApi/Services/UserWalletService.cs b/src/CMSMicroservice.WebApi/Services/UserWalletService.cs index 8ce2b1e..96594c9 100644 --- a/src/CMSMicroservice.WebApi/Services/UserWalletService.cs +++ b/src/CMSMicroservice.WebApi/Services/UserWalletService.cs @@ -233,7 +233,9 @@ public class UserWalletService : UserWalletContract.UserWalletContractBase var package = currentCycle != null ? await _context.Packages.FirstOrDefaultAsync(p => p.Id == currentCycle.PackageId, context.CancellationToken) : await _context.Packages.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, context.CancellationToken); - var magicMaxDeposit = package?.MagicWalletMaxDeposit ?? 1_000_000_000; + var magicMaxDeposit = package?.MagicWalletMaxDeposit ?? SystemConstants.MagicWalletDefaultMaxDeposit; + var magicMultiplier = package != null ? (double)package.MagicWalletMultiplier : SystemConstants.MagicWalletDefaultMultiplier; + var magicMaxCredit = package?.MagicWalletMaxCredit ?? SystemConstants.MagicWalletDefaultMaxCredit; var response = new GetMagicWalletStatusResponse { @@ -243,7 +245,9 @@ public class UserWalletService : UserWalletContract.UserWalletContractBase MagicMaxDeposit = magicMaxDeposit, MagicRemainingDeposit = Math.Max(0, magicMaxDeposit - wallet.MagicTotalDeposited), Balance = wallet.Balance, - PurchaseCycleCount = cycleCount + PurchaseCycleCount = cycleCount, + MagicMultiplier = magicMultiplier, + MagicMaxCredit = magicMaxCredit }; if (wallet.MagicActivatedAt.HasValue)