feat: implement Magic Wallet feature with charging and status display
Build and Deploy to Kubernetes / build-and-deploy (push) Failing after 6m25s
Build and Deploy to Kubernetes / build-and-deploy (push) Failing after 6m25s
This commit is contained in:
@@ -11,8 +11,8 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="DateTimeConverterCL" Version="1.0.0" />
|
<PackageReference Include="DateTimeConverterCL" Version="1.0.0" />
|
||||||
<!-- Replace all FrontOffice.BFF protobuf packages with CMS protobuf -->
|
<!-- Replace all FrontOffice.BFF protobuf packages with CMS protobuf -->
|
||||||
<PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.180" />
|
<!--<PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.180" />-->
|
||||||
<!--<ProjectReference Include="../../../CMS/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj" />-->
|
<ProjectReference Include="../../../CMS/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj" />
|
||||||
<PackageReference Include="MudBlazor" Version="8.14.0" />
|
<PackageReference Include="MudBlazor" Version="8.14.0" />
|
||||||
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
|
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
|
||||||
<PackageReference Include="Mapster" Version="7.4.0" />
|
<PackageReference Include="Mapster" Version="7.4.0" />
|
||||||
|
|||||||
@@ -118,7 +118,7 @@
|
|||||||
</MudStack>
|
</MudStack>
|
||||||
|
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
<MudText Typo="Typo.body2" Class="mud-text-secondary">مالیات بر ارزش افزوده (۹٪):</MudText>
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">مالیات بر ارزش افزوده (۱۰٪):</MudText>
|
||||||
<MudText Typo="Typo.body2" Class="mud-text-secondary">@FormatPrice(VatAmount)+ تومان</MudText>
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">@FormatPrice(VatAmount)+ تومان</MudText>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
|
||||||
|
|||||||
@@ -18,12 +18,12 @@ public partial class Checkout
|
|||||||
private string? _notes;
|
private string? _notes;
|
||||||
private bool _placing;
|
private bool _placing;
|
||||||
|
|
||||||
private const decimal VAT_RATE = 0.09m;
|
private const decimal VAT_RATE = 0.10m;
|
||||||
|
|
||||||
/// <summary>مبلغ درگاه قبل از مالیات (جمع کل - تخفیف)</summary>
|
/// <summary>مبلغ درگاه قبل از مالیات (جمع کل - تخفیف)</summary>
|
||||||
private long NetGatewayAmount => DiscountCart.TotalPrice - DiscountCart.TotalDiscount;
|
private long NetGatewayAmount => DiscountCart.TotalPrice - DiscountCart.TotalDiscount;
|
||||||
|
|
||||||
/// <summary>مالیات بر ارزش افزوده ۹٪</summary>
|
/// <summary>مالیات بر ارزش افزوده ۱۰٪</summary>
|
||||||
private long VatAmount => (long)(NetGatewayAmount * VAT_RATE);
|
private long VatAmount => (long)(NetGatewayAmount * VAT_RATE);
|
||||||
|
|
||||||
/// <summary>مبلغ نهایی قابل پرداخت (شامل VAT)</summary>
|
/// <summary>مبلغ نهایی قابل پرداخت (شامل VAT)</summary>
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ public partial class Index
|
|||||||
new(RouteConstants.Profile.Tree, Icons.Material.Filled.AccountTree, "شجرهنامه", "ساختار تیم", "background:rgba(99,102,241,.12); color:#6366f1;"),
|
new(RouteConstants.Profile.Tree, Icons.Material.Filled.AccountTree, "شجرهنامه", "ساختار تیم", "background:rgba(99,102,241,.12); color:#6366f1;"),
|
||||||
new(RouteConstants.Gateway.StoreChooser, Icons.Material.Filled.Store, "فروشگاهها", "ورود به فروشگاه", "background:rgba(16,185,129,.12); color:#10b981;"),
|
new(RouteConstants.Gateway.StoreChooser, Icons.Material.Filled.Store, "فروشگاهها", "ورود به فروشگاه", "background:rgba(16,185,129,.12); color:#10b981;"),
|
||||||
new(RouteConstants.Profile.Wallet, Icons.Material.Filled.AccountBalanceWallet, "کیف پول", "مدیریت و تاریخچه", "background:rgba(16,185,129,.12); color:#10b981;"),
|
new(RouteConstants.Profile.Wallet, Icons.Material.Filled.AccountBalanceWallet, "کیف پول", "مدیریت و تاریخچه", "background:rgba(16,185,129,.12); color:#10b981;"),
|
||||||
|
new(RouteConstants.Profile.MagicWallet, Icons.Material.Filled.AutoAwesome, "کیفپول جادویی", "شارژ ×2.5", "background:rgba(168,85,247,.12); color:#a855f7;"),
|
||||||
new(RouteConstants.Profile.WithdrawalRequests, Icons.Material.Filled.RequestPage, "درخواست برداشت", "ثبت و پیگیری", "background:rgba(245,158,11,.12); color:#f59e0b;"),
|
new(RouteConstants.Profile.WithdrawalRequests, Icons.Material.Filled.RequestPage, "درخواست برداشت", "ثبت و پیگیری", "background:rgba(245,158,11,.12); color:#f59e0b;"),
|
||||||
new(RouteConstants.Club.Membership, Icons.Material.Filled.CardMembership, "باشگاه مشتریان", "عضویت و مزایا", "background:rgba(168,85,247,.12); color:#a855f7;"),
|
new(RouteConstants.Club.Membership, Icons.Material.Filled.CardMembership, "باشگاه مشتریان", "عضویت و مزایا", "background:rgba(168,85,247,.12); color:#a855f7;"),
|
||||||
new(RouteConstants.Network.Statistics, Icons.Material.Filled.Groups, "آمار باشگاه", "جزئیات باشگاه", "background:rgba(59,130,246,.12); color:#3b82f6;"),
|
new(RouteConstants.Network.Statistics, Icons.Material.Filled.Groups, "آمار باشگاه", "جزئیات باشگاه", "background:rgba(59,130,246,.12); color:#3b82f6;"),
|
||||||
|
|||||||
@@ -0,0 +1,209 @@
|
|||||||
|
@attribute [Route(RouteConstants.Profile.MagicWallet)]
|
||||||
|
@attribute [Authorize]
|
||||||
|
|
||||||
|
<PageTitle>کیفپول جادویی</PageTitle>
|
||||||
|
|
||||||
|
<MudContainer MaxWidth="MaxWidth.Medium" Class="py-6">
|
||||||
|
<MudStack Spacing="3">
|
||||||
|
<PageHeader Title="🪄 کیفپول جادویی" BackHref="@RouteConstants.Profile.Wallet" />
|
||||||
|
|
||||||
|
@if (_isLoading)
|
||||||
|
{
|
||||||
|
<MudPaper Elevation="2" Class="pa-6 rounded-lg text-center">
|
||||||
|
<MudProgressCircular Color="Color.Primary" Indeterminate="true" />
|
||||||
|
<MudText Class="mt-3">در حال بارگذاری...</MudText>
|
||||||
|
</MudPaper>
|
||||||
|
}
|
||||||
|
else if (_status.WalletMode != 1)
|
||||||
|
{
|
||||||
|
@* ═══ حالت عادی — Magic فعال نیست ═══ *@
|
||||||
|
<MudPaper Elevation="2" Class="pa-6 rounded-lg text-center">
|
||||||
|
<MudIcon Icon="@Icons.Material.Filled.Lock" Color="Color.Default" Size="Size.Large" Style="font-size: 64px;" />
|
||||||
|
<MudText Typo="Typo.h5" Class="mt-4">کیفپول جادویی فعال نیست</MudText>
|
||||||
|
<MudText Typo="Typo.body1" Class="mt-2 mud-text-secondary">
|
||||||
|
برای فعال شدن کیفپول جادویی، ابتدا پکیج پایه را خریداری کنید و سپس
|
||||||
|
تمام موجودی عادی خود را از فروشگاه خرج کنید. وقتی موجودی عادی به صفر برسد،
|
||||||
|
کیفپول جادویی فعال میشود.
|
||||||
|
</MudText>
|
||||||
|
<MudButton Variant="Variant.Filled" Color="Color.Primary" Class="mt-4 rounded-pill"
|
||||||
|
Href="@RouteConstants.Profile.Wallet"
|
||||||
|
StartIcon="@Icons.Material.Filled.AccountBalanceWallet">
|
||||||
|
بازگشت به کیف پول
|
||||||
|
</MudButton>
|
||||||
|
</MudPaper>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@* ═══ حالت جادویی فعال ═══ *@
|
||||||
|
|
||||||
|
@* ─── وضعیت و پیشرفت ─── *@
|
||||||
|
<MudPaper Elevation="2" Class="pa-5 rounded-xl" Style="background: linear-gradient(135deg, #7c3aed 0%, #a855f7 100%); color: white;">
|
||||||
|
<MudStack Spacing="2">
|
||||||
|
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="2">
|
||||||
|
<MudIcon Icon="@Icons.Material.Filled.AutoAwesome" Size="Size.Large" />
|
||||||
|
<MudText Typo="Typo.h5">حالت جادویی فعال</MudText>
|
||||||
|
</MudStack>
|
||||||
|
|
||||||
|
<MudGrid Spacing="2">
|
||||||
|
<MudItem xs="6" sm="3">
|
||||||
|
<MudText Typo="Typo.caption" Style="opacity:0.8">موجودی فعلی</MudText>
|
||||||
|
<MudText Typo="Typo.h6">@FormatPrice(_status.Balance)</MudText>
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="6" sm="3">
|
||||||
|
<MudText Typo="Typo.caption" Style="opacity:0.8">مجموع واریزی</MudText>
|
||||||
|
<MudText Typo="Typo.h6">@FormatPrice(_status.MagicTotalDeposited)</MudText>
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="6" sm="3">
|
||||||
|
<MudText Typo="Typo.caption" Style="opacity:0.8">مجموع اعتبار</MudText>
|
||||||
|
<MudText Typo="Typo.h6">@FormatPrice(_status.MagicTotalCredited)</MudText>
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="6" sm="3">
|
||||||
|
<MudText Typo="Typo.caption" Style="opacity:0.8">سقف باقیمانده</MudText>
|
||||||
|
<MudText Typo="Typo.h6">@FormatPrice(_status.MagicRemainingDeposit)</MudText>
|
||||||
|
</MudItem>
|
||||||
|
</MudGrid>
|
||||||
|
|
||||||
|
@* نوار پیشرفت *@
|
||||||
|
<MudStack Spacing="0" Class="mt-1">
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
|
<MudText Typo="Typo.caption" Style="opacity:0.8">پیشرفت سقف واریز</MudText>
|
||||||
|
<MudText Typo="Typo.caption" Style="opacity:0.8">@(_progressPercent.ToString("0"))%</MudText>
|
||||||
|
</MudStack>
|
||||||
|
<MudProgressLinear Value="@_progressPercent" Color="Color.Warning" Size="Size.Medium"
|
||||||
|
Rounded="true" Class="mt-1" Style="background: rgba(255,255,255,0.3);" />
|
||||||
|
</MudStack>
|
||||||
|
|
||||||
|
@if (_status.MagicActivatedAt.HasValue)
|
||||||
|
{
|
||||||
|
<MudText Typo="Typo.caption" Style="opacity:0.7">
|
||||||
|
فعال از: @_status.MagicActivatedAt.Value.MiladiToJalaliWithTime()
|
||||||
|
</MudText>
|
||||||
|
}
|
||||||
|
</MudStack>
|
||||||
|
</MudPaper>
|
||||||
|
|
||||||
|
@* ─── فرم شارژ ─── *@
|
||||||
|
@if (_status.MagicRemainingDeposit > 0)
|
||||||
|
{
|
||||||
|
<MudPaper Elevation="2" Class="pa-5 rounded-lg">
|
||||||
|
<MudText Typo="Typo.h6" Class="mb-3">
|
||||||
|
<MudIcon Icon="@Icons.Material.Filled.CreditCard" Class="ml-1" />
|
||||||
|
شارژ کیفپول جادویی
|
||||||
|
</MudText>
|
||||||
|
|
||||||
|
<MudAlert Severity="MudBlazor.Severity.Info" Dense="true" Class="mb-3" Icon="@Icons.Material.Filled.Info">
|
||||||
|
مبلغ واریزی شما <strong>×۲.۵</strong> به موجودی اضافه میشود.
|
||||||
|
مثلاً ۱۰ میلیون واریز = ۲۵ میلیون اعتبار.
|
||||||
|
</MudAlert>
|
||||||
|
|
||||||
|
<MudStack Spacing="2">
|
||||||
|
<MudNumericField @bind-Value="_chargeAmount"
|
||||||
|
Label="مبلغ واریز (تومان)"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
Min="10_000"
|
||||||
|
Max="@(_status.MagicRemainingDeposit / 10)"
|
||||||
|
Format="N0"
|
||||||
|
Adornment="Adornment.Start"
|
||||||
|
AdornmentIcon="@Icons.Material.Filled.Payments"
|
||||||
|
HelperText="@($"حداکثر: {FormatPrice(_status.MagicRemainingDeposit)} (ریال)")" />
|
||||||
|
|
||||||
|
@if (_chargeAmount > 0)
|
||||||
|
{
|
||||||
|
<MudPaper Outlined="true" Class="pa-3 rounded-lg" Style="background: #f0fdf4;">
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
|
<MudText Typo="Typo.body2">مبلغ واریز:</MudText>
|
||||||
|
<MudText Typo="Typo.body2">@FormatToman(_chargeAmount)</MudText>
|
||||||
|
</MudStack>
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
|
<MudText Typo="Typo.body2" Color="Color.Success"><strong>اعتبار دریافتی (×۲.۵):</strong></MudText>
|
||||||
|
<MudText Typo="Typo.body2" Color="Color.Success"><strong>@FormatToman((long)(_chargeAmount * 2.5m))</strong></MudText>
|
||||||
|
</MudStack>
|
||||||
|
</MudPaper>
|
||||||
|
}
|
||||||
|
|
||||||
|
@* دکمههای مبلغ سریع *@
|
||||||
|
<MudStack Row="true" Spacing="1" Class="flex-wrap">
|
||||||
|
@foreach (var preset in _presetAmounts)
|
||||||
|
{
|
||||||
|
if (preset * 10 <= _status.MagicRemainingDeposit)
|
||||||
|
{
|
||||||
|
<MudButton Variant="Variant.Outlined" Size="Size.Small"
|
||||||
|
Color="@(_chargeAmount == preset ? Color.Primary : Color.Default)"
|
||||||
|
OnClick="() => _chargeAmount = preset"
|
||||||
|
Class="rounded-pill">
|
||||||
|
@FormatToman(preset)
|
||||||
|
</MudButton>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</MudStack>
|
||||||
|
|
||||||
|
<MudButton Variant="Variant.Filled"
|
||||||
|
Color="Color.Primary"
|
||||||
|
Size="Size.Large"
|
||||||
|
FullWidth="true"
|
||||||
|
Disabled="@(_chargeAmount <= 0 || _isProcessing)"
|
||||||
|
OnClick="StartMagicCharge"
|
||||||
|
StartIcon="@Icons.Material.Filled.Payment"
|
||||||
|
Class="rounded-lg mt-2">
|
||||||
|
@if (_isProcessing)
|
||||||
|
{
|
||||||
|
<MudProgressCircular Indeterminate="true" Size="Size.Small" Class="ml-2" />
|
||||||
|
<span>در حال انتقال به درگاه...</span>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<span>پرداخت از درگاه</span>
|
||||||
|
}
|
||||||
|
</MudButton>
|
||||||
|
</MudStack>
|
||||||
|
</MudPaper>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudAlert Severity="MudBlazor.Severity.Warning" Class="rounded-lg">
|
||||||
|
سقف شارژ جادویی در این دور پر شده است.
|
||||||
|
با خرج کردن موجودی و خرید مجدد پکیج، سقف ریست میشود.
|
||||||
|
</MudAlert>
|
||||||
|
}
|
||||||
|
|
||||||
|
@* ─── قوانین ─── *@
|
||||||
|
<MudExpansionPanels Elevation="1" Class="rounded-lg">
|
||||||
|
<MudExpansionPanel Text="قوانین کیفپول جادویی" MaxHeight="500" IsInitiallyExpanded="false">
|
||||||
|
<MudList T="string" Dense="true">
|
||||||
|
<MudListItem T="string" Icon="@Icons.Material.Filled.CheckCircle" IconColor="Color.Success">
|
||||||
|
هر مبلغ واریزی ×۲.۵ به موجودی اضافه میشود
|
||||||
|
</MudListItem>
|
||||||
|
<MudListItem T="string" Icon="@Icons.Material.Filled.CheckCircle" IconColor="Color.Success">
|
||||||
|
سقف واریز در هر دور: ۱۰۰ میلیون تومان
|
||||||
|
</MudListItem>
|
||||||
|
<MudListItem T="string" Icon="@Icons.Material.Filled.CheckCircle" IconColor="Color.Success">
|
||||||
|
حداکثر اعتبار: ۲۵۰ میلیون تومان (سود ۱۵۰٪)
|
||||||
|
</MudListItem>
|
||||||
|
<MudListItem T="string" Icon="@Icons.Material.Filled.Warning" IconColor="Color.Warning">
|
||||||
|
در حالت جادویی، کمیسیون و پورسانت غیرفعال است
|
||||||
|
</MudListItem>
|
||||||
|
<MudListItem T="string" Icon="@Icons.Material.Filled.Info" IconColor="Color.Info">
|
||||||
|
بعد از اتمام سقف و خرج موجودی، با خرید مجدد پکیج دور جدید شروع میشود
|
||||||
|
</MudListItem>
|
||||||
|
</MudList>
|
||||||
|
</MudExpansionPanel>
|
||||||
|
</MudExpansionPanels>
|
||||||
|
}
|
||||||
|
|
||||||
|
@* ─── نتیجه پرداخت (اگه از callback برگشته) ─── *@
|
||||||
|
@if (_paymentResult != null)
|
||||||
|
{
|
||||||
|
<MudAlert Severity="@(_paymentResult == "success" ? MudBlazor.Severity.Success : MudBlazor.Severity.Error)"
|
||||||
|
Class="rounded-lg" Variant="Variant.Filled">
|
||||||
|
@if (_paymentResult == "success")
|
||||||
|
{
|
||||||
|
<span>شارژ جادویی با موفقیت انجام شد! ✅</span>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<span>پرداخت ناموفق بود. لطفاً دوباره تلاش کنید.</span>
|
||||||
|
}
|
||||||
|
</MudAlert>
|
||||||
|
}
|
||||||
|
</MudStack>
|
||||||
|
</MudContainer>
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
using DateTimeConverterCL;
|
||||||
|
using FrontOffice.Main.Utilities;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using MudBlazor;
|
||||||
|
|
||||||
|
namespace FrontOffice.Main.Pages.Profile;
|
||||||
|
|
||||||
|
public partial class MagicWallet : ComponentBase
|
||||||
|
{
|
||||||
|
private MagicWalletStatus _status = new(0, 0, 0, 0, 0, 0, null);
|
||||||
|
private bool _isLoading = true;
|
||||||
|
private bool _isProcessing;
|
||||||
|
private long _chargeAmount;
|
||||||
|
private double _progressPercent;
|
||||||
|
private string? _paymentResult;
|
||||||
|
|
||||||
|
private readonly long[] _presetAmounts = { 1_000_000, 5_000_000, 10_000_000, 20_000_000, 50_000_000, 100_000_000 };
|
||||||
|
|
||||||
|
[SupplyParameterFromQuery(Name = "payment")]
|
||||||
|
public string? PaymentQueryParam { get; set; }
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
_paymentResult = PaymentQueryParam;
|
||||||
|
await LoadStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task LoadStatus()
|
||||||
|
{
|
||||||
|
_isLoading = true;
|
||||||
|
_status = await WalletService.GetMagicWalletStatusAsync();
|
||||||
|
|
||||||
|
_progressPercent = _status.MagicMaxDeposit > 0
|
||||||
|
? (double)_status.MagicTotalDeposited / _status.MagicMaxDeposit * 100
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
_isLoading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task StartMagicCharge()
|
||||||
|
{
|
||||||
|
if (_chargeAmount <= 0 || _isProcessing) return;
|
||||||
|
|
||||||
|
_isProcessing = true;
|
||||||
|
StateHasChanged();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// تبدیل تومان به ریال
|
||||||
|
var amountInRial = _chargeAmount * 10;
|
||||||
|
|
||||||
|
var (success, gatewayUrl, error) = await WalletService.InitiateMagicChargeAsync(amountInRial);
|
||||||
|
|
||||||
|
if (success && !string.IsNullOrEmpty(gatewayUrl))
|
||||||
|
{
|
||||||
|
Navigation.NavigateTo(gatewayUrl, forceLoad: true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Snackbar.Add(error ?? "خطا در ایجاد درخواست پرداخت", Severity.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Snackbar.Add($"خطا: {ex.Message}", Severity.Error);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_isProcessing = false;
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string FormatPrice(long priceInRial)
|
||||||
|
=> string.Format("{0:N0} تومان", priceInRial / 10);
|
||||||
|
|
||||||
|
private static string FormatToman(long toman)
|
||||||
|
=> string.Format("{0:N0} تومان", toman);
|
||||||
|
}
|
||||||
@@ -22,6 +22,7 @@ public static class RouteConstants
|
|||||||
public const string ChangePassword = "/profile/change-password";
|
public const string ChangePassword = "/profile/change-password";
|
||||||
public const string Tree = "/profile/tree";
|
public const string Tree = "/profile/tree";
|
||||||
public const string Wallet = "/profile/wallet";
|
public const string Wallet = "/profile/wallet";
|
||||||
|
public const string MagicWallet = "/profile/magic-wallet";
|
||||||
public const string WithdrawalRequests = "/profile/withdrawal-requests";
|
public const string WithdrawalRequests = "/profile/withdrawal-requests";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ public class VATService
|
|||||||
private const string VAT_PERCENTAGE_KEY = "vat_percentage";
|
private const string VAT_PERCENTAGE_KEY = "vat_percentage";
|
||||||
private const string VAT_DATE_KEY = "vat_date";
|
private const string VAT_DATE_KEY = "vat_date";
|
||||||
|
|
||||||
// مقادیر پیشفرض
|
// مقادیر پیشفرض (10%)
|
||||||
private double _vatRate = 0.0999;
|
private double _vatRate = 0.10;
|
||||||
private int _vatPercentage = 99;
|
private int _vatPercentage = 10;
|
||||||
private bool _isEnabled = true;
|
private bool _isEnabled = true;
|
||||||
private bool _isLoaded = false;
|
private bool _isLoaded = false;
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,16 @@ public enum WithdrawalMethodClient
|
|||||||
}
|
}
|
||||||
public record WithdrawalSettings(long MinWithdrawalAmount);
|
public record WithdrawalSettings(long MinWithdrawalAmount);
|
||||||
|
|
||||||
|
public record MagicWalletStatus(
|
||||||
|
int WalletMode,
|
||||||
|
long MagicTotalDeposited,
|
||||||
|
long MagicTotalCredited,
|
||||||
|
long MagicMaxDeposit,
|
||||||
|
long MagicRemainingDeposit,
|
||||||
|
long Balance,
|
||||||
|
DateTime? MagicActivatedAt
|
||||||
|
);
|
||||||
|
|
||||||
public class WalletService
|
public class WalletService
|
||||||
{
|
{
|
||||||
private readonly CMSMicroservice.Protobuf.Protos.UserWallet.UserWalletContract.UserWalletContractClient _client;
|
private readonly CMSMicroservice.Protobuf.Protos.UserWallet.UserWalletContract.UserWalletContractClient _client;
|
||||||
@@ -183,4 +193,64 @@ public class WalletService
|
|||||||
return new WithdrawalSettings(0);
|
return new WithdrawalSettings(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ============= Magic Wallet =============
|
||||||
|
|
||||||
|
public async Task<MagicWalletStatus> GetMagicWalletStatusAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var response = await _client.GetMagicWalletStatusAsync(new Empty());
|
||||||
|
DateTime? activatedAt = response.MagicActivatedAt != null
|
||||||
|
? response.MagicActivatedAt.ToDateTime().ToLocalTime()
|
||||||
|
: null;
|
||||||
|
|
||||||
|
return new MagicWalletStatus(
|
||||||
|
response.WalletMode,
|
||||||
|
response.MagicTotalDeposited,
|
||||||
|
response.MagicTotalCredited,
|
||||||
|
response.MagicMaxDeposit,
|
||||||
|
response.MagicRemainingDeposit,
|
||||||
|
response.Balance,
|
||||||
|
activatedAt
|
||||||
|
);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return new MagicWalletStatus(0, 0, 0, 0, 0, 0, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<(bool Success, string? GatewayUrl, string? Error)> InitiateMagicChargeAsync(long amount)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var response = await _client.InitiateMagicChargeAsync(new InitiateMagicChargeRequest
|
||||||
|
{
|
||||||
|
Amount = amount
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.IsSuccess)
|
||||||
|
return (true, response.GatewayUrl, null);
|
||||||
|
|
||||||
|
return (false, null, response.ErrorMessage);
|
||||||
|
}
|
||||||
|
catch (Grpc.Core.RpcException ex)
|
||||||
|
{
|
||||||
|
return (false, null, ex.Status.Detail ?? "خطا در ارتباط با سرور");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetWalletMode()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var response = _client.GetCustomerWallet(new Empty());
|
||||||
|
return response.WalletMode;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user