Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a11a3765b8 | |||
| 2fa9dbc900 | |||
| 8e1f7d7a0c | |||
| 93b7375db5 | |||
| 00da4b98dd | |||
| 7371a263e8 | |||
| 214fe9efbd | |||
| 8cef475877 | |||
| 28695a88f8 | |||
| a2e1e1fead |
@@ -11,7 +11,7 @@
|
|||||||
<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.181" />
|
<PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.182" />
|
||||||
<!-- <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" />
|
||||||
|
|||||||
@@ -23,9 +23,9 @@
|
|||||||
<HeaderContent>
|
<HeaderContent>
|
||||||
<MudTh>محصول</MudTh>
|
<MudTh>محصول</MudTh>
|
||||||
<MudTh>قیمت واحد</MudTh>
|
<MudTh>قیمت واحد</MudTh>
|
||||||
<MudTh>سقف تخفیف</MudTh>
|
<MudTh>سقف اعتبار</MudTh>
|
||||||
<MudTh>تعداد</MudTh>
|
<MudTh>تعداد</MudTh>
|
||||||
<MudTh>تخفیف</MudTh>
|
<MudTh>اعتبار</MudTh>
|
||||||
<MudTh>قیمت نهایی</MudTh>
|
<MudTh>قیمت نهایی</MudTh>
|
||||||
<MudTh></MudTh>
|
<MudTh></MudTh>
|
||||||
</HeaderContent>
|
</HeaderContent>
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
<MudTd>@FormatPrice(context.UnitPrice)</MudTd>
|
<MudTd>@FormatPrice(context.UnitPrice)</MudTd>
|
||||||
<MudTd>
|
<MudTd>
|
||||||
<MudChip T="string" Color="Color.Error" Variant="Variant.Outlined" Size="Size.Small">
|
<MudChip T="string" Color="Color.Error" Variant="Variant.Outlined" Size="Size.Small">
|
||||||
@context.MaxDiscountPercent% تخفیف
|
@context.MaxDiscountPercent% اعتبار
|
||||||
</MudChip>
|
</MudChip>
|
||||||
</MudTd>
|
</MudTd>
|
||||||
<MudTd>
|
<MudTd>
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<MudText Typo="Typo.subtitle2">@item.Title</MudText>
|
<MudText Typo="Typo.subtitle2">@item.Title</MudText>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
<MudChip T="string" Color="Color.Error" Variant="Variant.Outlined" Size="Size.Small">
|
<MudChip T="string" Color="Color.Error" Variant="Variant.Outlined" Size="Size.Small">
|
||||||
@item.MaxDiscountPercent% تخفیف
|
@item.MaxDiscountPercent% اعتبار
|
||||||
</MudChip>
|
</MudChip>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@
|
|||||||
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
||||||
@if (item.DiscountAmount > 0)
|
@if (item.DiscountAmount > 0)
|
||||||
{
|
{
|
||||||
<MudText Typo="Typo.caption" Color="Color.Success">تخفیف: @FormatPrice(item.DiscountAmount)-</MudText>
|
<MudText Typo="Typo.caption" Color="Color.Success">اعتبار: @FormatPrice(item.DiscountAmount)-</MudText>
|
||||||
}
|
}
|
||||||
<MudText>جمع: @FormatPrice(item.FinalPrice)</MudText>
|
<MudText>جمع: @FormatPrice(item.FinalPrice)</MudText>
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Delete" Color="Color.Error"
|
<MudIconButton Icon="@Icons.Material.Filled.Delete" Color="Color.Error"
|
||||||
@@ -131,13 +131,20 @@
|
|||||||
@if (DiscountCart.TotalDiscount > 0)
|
@if (DiscountCart.TotalDiscount > 0)
|
||||||
{
|
{
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
||||||
<MudText Typo="Typo.caption" Color="Color.Success">سقف تخفیف قابل اعمال:</MudText>
|
<MudText Typo="Typo.caption" Color="Color.Success">سقف اعتبار قابل اعمال:</MudText>
|
||||||
<MudText Typo="Typo.caption" Color="Color.Success">@FormatPrice(DiscountCart.TotalDiscount)- تومان</MudText>
|
<MudText Typo="Typo.caption" Color="Color.Success">@FormatPrice(DiscountCart.TotalDiscount)- تومان</MudText>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
}
|
}
|
||||||
|
@if (VAT.IsEnabled)
|
||||||
|
{
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
||||||
|
<MudText Typo="Typo.caption" Class="mud-text-secondary">مالیات ارزش افزوده (@VAT.VatPercentage%):</MudText>
|
||||||
|
<MudText Typo="Typo.caption" Class="mud-text-secondary">@FormatPrice(VatAmount)+ تومان</MudText>
|
||||||
|
</MudStack>
|
||||||
|
}
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
||||||
<MudText Typo="Typo.h6" Class="fw-bold">حداقل پرداخت:</MudText>
|
<MudText Typo="Typo.h6" Class="fw-bold">حداقل پرداخت:</MudText>
|
||||||
<MudText Typo="Typo.h6" Color="Color.Primary" Class="fw-bold">@FormatPrice(DiscountCart.FinalPrice) تومان</MudText>
|
<MudText Typo="Typo.h6" Color="Color.Primary" Class="fw-bold">@FormatPrice(TotalWithVat) تومان</MudText>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
|
||||||
@@ -161,14 +168,21 @@
|
|||||||
@if (DiscountCart.TotalDiscount > 0)
|
@if (DiscountCart.TotalDiscount > 0)
|
||||||
{
|
{
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
<MudText Typo="Typo.body2" Color="Color.Success">سقف تخفیف قابل اعمال:</MudText>
|
<MudText Typo="Typo.body2" Color="Color.Success">سقف اعتبار قابل اعمال:</MudText>
|
||||||
<MudText Typo="Typo.body2" Color="Color.Success">@FormatPrice(DiscountCart.TotalDiscount)- تومان</MudText>
|
<MudText Typo="Typo.body2" Color="Color.Success">@FormatPrice(DiscountCart.TotalDiscount)- تومان</MudText>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
}
|
}
|
||||||
|
@if (VAT.IsEnabled)
|
||||||
|
{
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">مالیات بر ارزش افزوده (@VAT.VatPercentage%):</MudText>
|
||||||
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">@FormatPrice(VatAmount)+ تومان</MudText>
|
||||||
|
</MudStack>
|
||||||
|
}
|
||||||
<MudDivider Class="my-1" />
|
<MudDivider Class="my-1" />
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
<MudText Typo="Typo.subtitle1" Class="fw-bold">حداقل مبلغ پرداخت درگاه:</MudText>
|
<MudText Typo="Typo.subtitle1" Class="fw-bold">حداقل مبلغ پرداخت درگاه:</MudText>
|
||||||
<MudText Typo="Typo.subtitle1" Color="Color.Primary" Class="fw-bold">@FormatPrice(DiscountCart.FinalPrice) تومان</MudText>
|
<MudText Typo="Typo.subtitle1" Color="Color.Primary" Class="fw-bold">@FormatPrice(TotalWithVat) تومان</MudText>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
<MudText Typo="Typo.caption" Class="mud-text-secondary">
|
<MudText Typo="Typo.caption" Class="mud-text-secondary">
|
||||||
مبلغ دقیق پرداخت در مرحله تسویه مشخص خواهد شد.
|
مبلغ دقیق پرداخت در مرحله تسویه مشخص خواهد شد.
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ namespace FrontOffice.Main.Pages.DiscountStore;
|
|||||||
public partial class Cart : IDisposable
|
public partial class Cart : IDisposable
|
||||||
{
|
{
|
||||||
[Inject] private DiscountCartService DiscountCart { get; set; } = default!;
|
[Inject] private DiscountCartService DiscountCart { get; set; } = default!;
|
||||||
|
[Inject] private VATService VAT { get; set; } = default!;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
@@ -44,6 +45,18 @@ public partial class Cart : IDisposable
|
|||||||
Navigation.NavigateTo(RouteConstants.DiscountStore.Checkout);
|
Navigation.NavigateTo(RouteConstants.DiscountStore.Checkout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||||
|
{
|
||||||
|
if (firstRender)
|
||||||
|
{
|
||||||
|
await VAT.LoadAsync();
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private long VatAmount => VAT.CalculateVAT(DiscountCart.FinalPrice);
|
||||||
|
private long TotalWithVat => DiscountCart.FinalPrice + VatAmount;
|
||||||
|
|
||||||
private static string FormatPrice(long price) => $"{price:N0} ";
|
private static string FormatPrice(long price) => $"{price:N0} ";
|
||||||
|
|
||||||
private static string GetImageUrl(string? imageUrl)
|
private static string GetImageUrl(string? imageUrl)
|
||||||
|
|||||||
@@ -90,7 +90,7 @@
|
|||||||
</MudText>
|
</MudText>
|
||||||
@if (item.MaxDiscountPercent > 0)
|
@if (item.MaxDiscountPercent > 0)
|
||||||
{
|
{
|
||||||
<MudText Typo="Typo.caption" Color="Color.Error">@item.MaxDiscountPercent% تخفیف</MudText>
|
<MudText Typo="Typo.caption" Color="Color.Error">@item.MaxDiscountPercent% اعتبار</MudText>
|
||||||
}
|
}
|
||||||
</MudStack>
|
</MudStack>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
@@ -108,17 +108,17 @@
|
|||||||
</MudStack>
|
</MudStack>
|
||||||
|
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
<MudText Typo="Typo.body2" Color="Color.Success">تخفیف از کیف اعتباری:</MudText>
|
<MudText Typo="Typo.body2" Color="Color.Success">اعتبار از کیف اعتباری:</MudText>
|
||||||
<MudText Typo="Typo.body2" Color="Color.Success">@FormatPrice(DiscountCart.TotalDiscount)- تومان</MudText>
|
<MudText Typo="Typo.body2" Color="Color.Success">@FormatPrice(DiscountCart.TotalDiscount)- تومان</MudText>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
<MudText Typo="Typo.body2">مبلغ پس از تخفیف:</MudText>
|
<MudText Typo="Typo.body2">مبلغ پس از اعتبار:</MudText>
|
||||||
<MudText Typo="Typo.body2">@FormatPrice(NetGatewayAmount) تومان</MudText>
|
<MudText Typo="Typo.body2">@FormatPrice(NetGatewayAmount) تومان</MudText>
|
||||||
</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">مالیات بر ارزش افزوده (@VAT.VatPercentage٪):</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>
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ public partial class Checkout
|
|||||||
[Inject] private DiscountCartService DiscountCart { get; set; } = default!;
|
[Inject] private DiscountCartService DiscountCart { get; set; } = default!;
|
||||||
[Inject] private DiscountOrderService DiscountOrderService { get; set; } = default!;
|
[Inject] private DiscountOrderService DiscountOrderService { get; set; } = default!;
|
||||||
[Inject] private UserAddressContract.UserAddressContractClient UserAddressContract { get; set; } = default!;
|
[Inject] private UserAddressContract.UserAddressContractClient UserAddressContract { get; set; } = default!;
|
||||||
|
[Inject] private VATService VAT { get; set; } = default!;
|
||||||
|
|
||||||
private List<CustomerAddressModel> _addresses = new();
|
private List<CustomerAddressModel> _addresses = new();
|
||||||
private CustomerAddressModel? _selectedAddress;
|
private CustomerAddressModel? _selectedAddress;
|
||||||
@@ -18,13 +19,11 @@ public partial class Checkout
|
|||||||
private string? _notes;
|
private string? _notes;
|
||||||
private bool _placing;
|
private bool _placing;
|
||||||
|
|
||||||
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 => VAT.CalculateVAT(NetGatewayAmount);
|
||||||
|
|
||||||
/// <summary>مبلغ نهایی قابل پرداخت (شامل VAT)</summary>
|
/// <summary>مبلغ نهایی قابل پرداخت (شامل VAT)</summary>
|
||||||
private long FinalGatewayAmount => NetGatewayAmount + VatAmount;
|
private long FinalGatewayAmount => NetGatewayAmount + VatAmount;
|
||||||
@@ -33,6 +32,7 @@ public partial class Checkout
|
|||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
|
await VAT.LoadAsync();
|
||||||
await DiscountCart.EnsureInitializedAsync();
|
await DiscountCart.EnsureInitializedAsync();
|
||||||
await LoadAddresses();
|
await LoadAddresses();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,8 +82,8 @@ else
|
|||||||
<MudTh>محصول</MudTh>
|
<MudTh>محصول</MudTh>
|
||||||
<MudTh>قیمت واحد</MudTh>
|
<MudTh>قیمت واحد</MudTh>
|
||||||
<MudTh>تعداد</MudTh>
|
<MudTh>تعداد</MudTh>
|
||||||
<MudTh>سقف تخفیف</MudTh>
|
<MudTh>سقف اعتبار</MudTh>
|
||||||
<MudTh>تخفیف</MudTh>
|
<MudTh>اعتبار</MudTh>
|
||||||
<MudTh>قیمت نهایی</MudTh>
|
<MudTh>قیمت نهایی</MudTh>
|
||||||
</HeaderContent>
|
</HeaderContent>
|
||||||
<RowTemplate>
|
<RowTemplate>
|
||||||
@@ -131,7 +131,7 @@ else
|
|||||||
@if (item.DiscountAmount > 0)
|
@if (item.DiscountAmount > 0)
|
||||||
{
|
{
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
<MudText Typo="Typo.body2" Color="Color.Success">تخفیف (@item.MaxDiscountPercent%):</MudText>
|
<MudText Typo="Typo.body2" Color="Color.Success">اعتبار (@item.MaxDiscountPercent%):</MudText>
|
||||||
<MudText Typo="Typo.body2" Color="Color.Success">@FormatPrice(item.DiscountAmount)-</MudText>
|
<MudText Typo="Typo.body2" Color="Color.Success">@FormatPrice(item.DiscountAmount)-</MudText>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
}
|
}
|
||||||
@@ -163,6 +163,14 @@ else
|
|||||||
</MudStack>
|
</MudStack>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@if (VAT.IsEnabled)
|
||||||
|
{
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">مالیات بر ارزش افزوده (@VAT.VatPercentage%):</MudText>
|
||||||
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">@FormatPrice(OrderVatAmount)+</MudText>
|
||||||
|
</MudStack>
|
||||||
|
}
|
||||||
|
|
||||||
<MudDivider Class="my-1" />
|
<MudDivider Class="my-1" />
|
||||||
|
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
|
|||||||
@@ -12,12 +12,28 @@ public partial class OrderDetail
|
|||||||
public string? PaymentResult { get; set; }
|
public string? PaymentResult { get; set; }
|
||||||
|
|
||||||
[Inject] private DiscountOrderService DiscountOrderService { get; set; } = default!;
|
[Inject] private DiscountOrderService DiscountOrderService { get; set; } = default!;
|
||||||
|
[Inject] private VATService VAT { get; set; } = default!;
|
||||||
|
|
||||||
private DiscountOrderDetail? _order;
|
private DiscountOrderDetail? _order;
|
||||||
private bool _loading = true;
|
private bool _loading = true;
|
||||||
private string? _paymentMessage;
|
private string? _paymentMessage;
|
||||||
private MudBlazor.Severity _paymentSeverity;
|
private MudBlazor.Severity _paymentSeverity;
|
||||||
|
|
||||||
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||||
|
{
|
||||||
|
if (firstRender)
|
||||||
|
{
|
||||||
|
await VAT.LoadAsync();
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>مبلغ قبل از مالیات (جمع کل - اعتبار)</summary>
|
||||||
|
private long PreVatGateway => _order is null ? 0 : (_order.TotalPrice - _order.DiscountBalanceUsed);
|
||||||
|
|
||||||
|
/// <summary>مالیات بر ارزش افزوده</summary>
|
||||||
|
private long OrderVatAmount => VAT.CalculateVAT(PreVatGateway);
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
// نمایش پیام نتیجه پرداخت (بعد از بازگشت از درگاه)
|
// نمایش پیام نتیجه پرداخت (بعد از بازگشت از درگاه)
|
||||||
|
|||||||
@@ -67,14 +67,38 @@
|
|||||||
<MudStack Spacing="2">
|
<MudStack Spacing="2">
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
||||||
<MudText Typo="Typo.body2" Class="mud-text-secondary">قیمت محصول:</MudText>
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">قیمت محصول:</MudText>
|
||||||
<MudText Typo="Typo.h5" Color="Color.Primary" Class="fw-bold">
|
<MudText Typo="Typo.body1" Class="fw-bold">
|
||||||
@($"{_product.Price:N0}") تومان
|
@($"{_product.Price:N0}") تومان
|
||||||
</MudText>
|
</MudText>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
@if (VAT.IsEnabled)
|
||||||
|
{
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
||||||
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">مالیات ارزش افزوده (@VAT.VatPercentage%):</MudText>
|
||||||
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">
|
||||||
|
@($"{VAT.CalculateVAT(_product.Price):N0}") تومان
|
||||||
|
</MudText>
|
||||||
|
</MudStack>
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
||||||
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">قیمت با مالیات:</MudText>
|
||||||
|
<MudText Typo="Typo.h5" Color="Color.Primary" Class="fw-bold">
|
||||||
|
@($"{VAT.AddVAT(_product.Price):N0}") تومان
|
||||||
|
</MudText>
|
||||||
|
</MudStack>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
||||||
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">قیمت نهایی:</MudText>
|
||||||
|
<MudText Typo="Typo.h5" Color="Color.Primary" Class="fw-bold">
|
||||||
|
@($"{_product.Price:N0}") تومان
|
||||||
|
</MudText>
|
||||||
|
</MudStack>
|
||||||
|
}
|
||||||
@if (_product.MaxDiscountPercent > 0)
|
@if (_product.MaxDiscountPercent > 0)
|
||||||
{
|
{
|
||||||
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center">
|
||||||
<MudText Typo="Typo.body2" Class="mud-text-secondary">تخفیف از کیف اعتباری:</MudText>
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">اعتبار از کیف اعتباری:</MudText>
|
||||||
<MudChip T="string" Color="Color.Error" Variant="Variant.Filled" Size="Size.Small">
|
<MudChip T="string" Color="Color.Error" Variant="Variant.Filled" Size="Size.Small">
|
||||||
@_product.MaxDiscountPercent% (@($"{_product.Price * _product.MaxDiscountPercent / 100:N0}") تومان)
|
@_product.MaxDiscountPercent% (@($"{_product.Price * _product.MaxDiscountPercent / 100:N0}") تومان)
|
||||||
</MudChip>
|
</MudChip>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ public partial class ProductDetail
|
|||||||
|
|
||||||
[Inject] private DiscountProductService DiscountProductService { get; set; } = default!;
|
[Inject] private DiscountProductService DiscountProductService { get; set; } = default!;
|
||||||
[Inject] private DiscountCartService DiscountCartService { get; set; } = default!;
|
[Inject] private DiscountCartService DiscountCartService { get; set; } = default!;
|
||||||
|
[Inject] private VATService VAT { get; set; } = default!;
|
||||||
|
|
||||||
private DiscountProductDetail? _product;
|
private DiscountProductDetail? _product;
|
||||||
private string _selectedImage = string.Empty;
|
private string _selectedImage = string.Empty;
|
||||||
@@ -21,6 +22,15 @@ public partial class ProductDetail
|
|||||||
await LoadProductAsync();
|
await LoadProductAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||||
|
{
|
||||||
|
if (firstRender)
|
||||||
|
{
|
||||||
|
await VAT.LoadAsync();
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async Task LoadProductAsync()
|
private async Task LoadProductAsync()
|
||||||
{
|
{
|
||||||
_loading = true;
|
_loading = true;
|
||||||
|
|||||||
@@ -97,13 +97,16 @@
|
|||||||
{
|
{
|
||||||
<MudChip T="string" Color="Color.Error" Variant="Variant.Filled" Size="Size.Small"
|
<MudChip T="string" Color="Color.Error" Variant="Variant.Filled" Size="Size.Small"
|
||||||
Style="position:absolute;top:8px;left:8px;">
|
Style="position:absolute;top:8px;left:8px;">
|
||||||
@p.MaxDiscountPercent% تخفیف
|
@p.MaxDiscountPercent% اعتبار
|
||||||
</MudChip>
|
</MudChip>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
<div class="pa-1 flex-grow-1 d-flex flex-column justify-space-between">
|
<div class="pa-1 flex-grow-1 d-flex flex-column justify-space-between">
|
||||||
<MudText Typo="Typo.subtitle1">@p.Title</MudText>
|
<MudText Typo="Typo.subtitle1">@p.Title</MudText>
|
||||||
<MudText Typo="Typo.subtitle2" Color="Color.Primary">@FormatPrice(p.Price)</MudText>
|
<div>
|
||||||
|
<MudText Typo="Typo.subtitle2" Color="Color.Primary">@FormatPrice(p.Price)</MudText>
|
||||||
|
<MudText Typo="Typo.overline" Class="mud-text-secondary" Style="font-size:0.6rem;line-height:1;">(+ ارزش افزوده)</MudText>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
<MudCardActions Class="mt-auto d-flex justify-space-between pa-2">
|
<MudCardActions Class="mt-auto d-flex justify-space-between pa-2">
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ else
|
|||||||
<MudGrid Spacing="4" Justify="Justify.Center">
|
<MudGrid Spacing="4" Justify="Justify.Center">
|
||||||
@foreach (var license in _licenseImages)
|
@foreach (var license in _licenseImages)
|
||||||
{
|
{
|
||||||
<MudItem xs="12" sm="6" md="4">
|
<MudItem xs="6" sm="6" md="4">
|
||||||
<MudCard Elevation="2" Class="h-100">
|
<MudCard Elevation="2" Class="h-100">
|
||||||
<MudCardMedia Image="@license.ImagePath" Height="250" />
|
<MudCardMedia Image="@license.ImagePath" Height="250" />
|
||||||
<MudCardContent>
|
<MudCardContent>
|
||||||
|
|||||||
@@ -0,0 +1,121 @@
|
|||||||
|
@attribute [Route(RouteConstants.Profile.ChargeDiscountWallet)]
|
||||||
|
@attribute [Authorize]
|
||||||
|
|
||||||
|
<PageTitle>شارژ کیفپول اعتباری</PageTitle>
|
||||||
|
|
||||||
|
<MudContainer MaxWidth="MaxWidth.Medium" Class="py-6">
|
||||||
|
<MudStack Spacing="3">
|
||||||
|
<PageHeader Title="💳 شارژ کیفپول اعتباری" BackHref="@RouteConstants.Profile.Wallet" />
|
||||||
|
|
||||||
|
@* ─── نتیجه پرداخت (اگه از 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 if (_paymentResult == "cancelled")
|
||||||
|
{
|
||||||
|
<span>پرداخت توسط شما لغو شد.</span>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<span>پرداخت ناموفق بود. لطفاً دوباره تلاش کنید.</span>
|
||||||
|
}
|
||||||
|
</MudAlert>
|
||||||
|
}
|
||||||
|
|
||||||
|
@* ─── فرم شارژ ─── *@
|
||||||
|
<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">
|
||||||
|
مبلغ وارد شده (به تومان) از طریق درگاه پرداخت به موجودی اعتباری شما اضافه میشود.
|
||||||
|
از موجودی اعتباری فقط برای خرید از فروشگاه اعتباری میتوانید استفاده کنید.
|
||||||
|
</MudAlert>
|
||||||
|
|
||||||
|
<MudStack Spacing="2">
|
||||||
|
<MudNumericField @bind-Value="_chargeAmount"
|
||||||
|
Label="مبلغ (تومان)"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
Min="10_000"
|
||||||
|
Max="100_000_000"
|
||||||
|
Format="N0"
|
||||||
|
Adornment="Adornment.Start"
|
||||||
|
AdornmentIcon="@Icons.Material.Filled.Payments"
|
||||||
|
HelperText="حداقل ۱۰,۰۰۰ و حداکثر ۱۰۰,۰۰۰,۰۰۰ تومان" />
|
||||||
|
|
||||||
|
@* دکمههای مبلغ سریع *@
|
||||||
|
<MudStack Row="true" Spacing="1" Class="flex-wrap">
|
||||||
|
@foreach (var preset in _presetAmounts)
|
||||||
|
{
|
||||||
|
<MudButton Variant="Variant.Outlined" Size="Size.Small"
|
||||||
|
Color="@(_chargeAmount == preset ? Color.Primary : Color.Default)"
|
||||||
|
OnClick="() => _chargeAmount = preset"
|
||||||
|
Class="rounded-pill">
|
||||||
|
@FormatToman(preset)
|
||||||
|
</MudButton>
|
||||||
|
}
|
||||||
|
</MudStack>
|
||||||
|
|
||||||
|
@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"><strong>@FormatToman(_chargeAmount)</strong></MudText>
|
||||||
|
</MudStack>
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
|
<MudText Typo="Typo.body2">اعتبار دریافتی:</MudText>
|
||||||
|
<MudText Typo="Typo.body2" Color="Color.Success"><strong>@FormatToman(_chargeAmount)</strong></MudText>
|
||||||
|
</MudStack>
|
||||||
|
</MudPaper>
|
||||||
|
}
|
||||||
|
|
||||||
|
<MudButton Variant="Variant.Filled"
|
||||||
|
Color="Color.Primary"
|
||||||
|
Size="Size.Large"
|
||||||
|
FullWidth="true"
|
||||||
|
Disabled="@(_isProcessing || _chargeAmount < 10_000)"
|
||||||
|
OnClick="StartDiscountCharge"
|
||||||
|
StartIcon="@Icons.Material.Filled.Payment"
|
||||||
|
Class="rounded-lg mt-2">
|
||||||
|
@if (_isProcessing)
|
||||||
|
{
|
||||||
|
<MudProgressCircular Size="Size.Small" Indeterminate="true" Class="me-2" />
|
||||||
|
<span>در حال انتقال به درگاه...</span>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<span>پرداخت با کارت بانکی</span>
|
||||||
|
}
|
||||||
|
</MudButton>
|
||||||
|
</MudStack>
|
||||||
|
</MudPaper>
|
||||||
|
|
||||||
|
@* ─── قوانین ─── *@
|
||||||
|
<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.Info" IconColor="Color.Info">
|
||||||
|
پرداخت از طریق درگاه بانکی انجام میشود
|
||||||
|
</MudListItem>
|
||||||
|
</MudList>
|
||||||
|
</MudExpansionPanel>
|
||||||
|
</MudExpansionPanels>
|
||||||
|
</MudStack>
|
||||||
|
</MudContainer>
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
using FrontOffice.Main.Utilities;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using MudBlazor;
|
||||||
|
|
||||||
|
namespace FrontOffice.Main.Pages.Profile;
|
||||||
|
|
||||||
|
public partial class ChargeDiscountWallet : ComponentBase
|
||||||
|
{
|
||||||
|
private bool _isProcessing;
|
||||||
|
private long _chargeAmount;
|
||||||
|
private string? _paymentResult;
|
||||||
|
|
||||||
|
private readonly long[] _presetAmounts = { 500_000, 1_000_000, 5_000_000, 10_000_000, 20_000_000, 50_000_000 };
|
||||||
|
|
||||||
|
[SupplyParameterFromQuery(Name = "payment")]
|
||||||
|
public string? PaymentQueryParam { get; set; }
|
||||||
|
|
||||||
|
protected override void OnInitialized()
|
||||||
|
{
|
||||||
|
_paymentResult = PaymentQueryParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task StartDiscountCharge()
|
||||||
|
{
|
||||||
|
if (_chargeAmount <= 0 || _isProcessing) return;
|
||||||
|
|
||||||
|
_isProcessing = true;
|
||||||
|
StateHasChanged();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// تبدیل تومان به ریال
|
||||||
|
var amountInRial = _chargeAmount * 10;
|
||||||
|
|
||||||
|
var (success, gatewayUrl, error) = await WalletService.InitiateDiscountChargeAsync(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 FormatToman(long toman)
|
||||||
|
=> string.Format("{0:N0} تومان", toman);
|
||||||
|
}
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
<div class="wallet-strip-item">
|
<div class="wallet-strip-item">
|
||||||
<div class="wallet-strip-label">
|
<div class="wallet-strip-label">
|
||||||
<MudIcon Icon="@Icons.Material.Outlined.Discount" Size="Size.Small" Color="Color.Success" />
|
<MudIcon Icon="@Icons.Material.Outlined.Discount" Size="Size.Small" Color="Color.Success" />
|
||||||
<MudText Typo="Typo.caption" Class="mud-text-secondary">تخفیف باشگاه</MudText>
|
<MudText Typo="Typo.caption" Class="mud-text-secondary">کیف اعتباری</MudText>
|
||||||
</div>
|
</div>
|
||||||
<MudText Typo="Typo.subtitle2" Color="Color.Success">@_walletDiscount</MudText>
|
<MudText Typo="Typo.subtitle2" Color="Color.Success">@_walletDiscount</MudText>
|
||||||
</div>
|
</div>
|
||||||
@@ -214,26 +214,65 @@
|
|||||||
<MudText Typo="Typo.subtitle1" Color="Color.Primary"><b>پرداخت مستقیم</b></MudText>
|
<MudText Typo="Typo.subtitle1" Color="Color.Primary"><b>پرداخت مستقیم</b></MudText>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
<MudText Typo="Typo.body2" Class="mud-text-secondary">پرداخت آنی از طریق درگاه بانکی</MudText>
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">پرداخت آنی از طریق درگاه بانکی</MudText>
|
||||||
<MudButton Variant="Variant.Filled" Disabled="true" Color="Color.Primary" FullWidth="true"
|
@if (_purchaseCycleCount > 0)
|
||||||
StartIcon="@Icons.Material.Filled.Payment" OnClick="DirectPayment">
|
{
|
||||||
پرداخت با کارت بانکی(بزودی)
|
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true"
|
||||||
</MudButton>
|
Disabled="@_isProcessingPayment"
|
||||||
|
StartIcon="@Icons.Material.Filled.Payment"
|
||||||
|
OnClick="DirectPayment">
|
||||||
|
@if (_isProcessingPayment)
|
||||||
|
{
|
||||||
|
<MudProgressCircular Size="Size.Small" Indeterminate="true" Class="me-2" />
|
||||||
|
<span>در حال انتقال به درگاه...</span>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<span>پرداخت با کارت بانکی</span>
|
||||||
|
}
|
||||||
|
</MudButton>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true"
|
||||||
|
Disabled="@_isProcessingPayment"
|
||||||
|
StartIcon="@Icons.Material.Filled.Payment"
|
||||||
|
OnClick="DirectPayment">
|
||||||
|
@if (_isProcessingPayment)
|
||||||
|
{
|
||||||
|
<MudProgressCircular Size="Size.Small" Indeterminate="true" Class="me-2" />
|
||||||
|
<span>در حال انتقال به درگاه...</span>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<span>پرداخت با کارت بانکی</span>
|
||||||
|
}
|
||||||
|
</MudButton>
|
||||||
|
}
|
||||||
</MudStack>
|
</MudStack>
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
|
|
||||||
<MudPaper Elevation="0" Class="pa-4 rounded-lg" Style="border: 2px solid var(--mud-palette-tertiary);">
|
@if (_purchaseCycleCount == 0)
|
||||||
<MudStack Spacing="2">
|
{
|
||||||
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="2">
|
<MudPaper Elevation="0" Class="pa-4 rounded-lg" Style="border: 2px solid var(--mud-palette-tertiary);">
|
||||||
<MudIcon Icon="@Icons.Material.Filled.Diamond" Color="Color.Tertiary" Size="Size.Medium" />
|
<MudStack Spacing="2">
|
||||||
<MudText Typo="Typo.subtitle1" Color="Color.Tertiary"><b>اعتبار الماسی دایا</b></MudText>
|
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="2">
|
||||||
|
<MudIcon Icon="@Icons.Material.Filled.Diamond" Color="Color.Tertiary" Size="Size.Medium" />
|
||||||
|
<MudText Typo="Typo.subtitle1" Color="Color.Tertiary"><b>اعتبار الماسی دایا</b></MudText>
|
||||||
|
</MudStack>
|
||||||
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">تأمین اعتبار از طریق خرید توکن الماس و دریافت وام</MudText>
|
||||||
|
<MudButton Variant="Variant.Filled" Color="Color.Tertiary" FullWidth="true"
|
||||||
|
StartIcon="@Icons.Material.Filled.AccountBalance" OnClick="DayaLoanPayment">
|
||||||
|
تأمین اعتبار الماسی
|
||||||
|
</MudButton>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
<MudText Typo="Typo.body2" Class="mud-text-secondary">تأمین اعتبار از طریق خرید توکن الماس و دریافت وام</MudText>
|
</MudPaper>
|
||||||
<MudButton Variant="Variant.Filled" Color="Color.Tertiary" FullWidth="true"
|
}
|
||||||
StartIcon="@Icons.Material.Filled.AccountBalance" OnClick="DayaLoanPayment">
|
else
|
||||||
تأمین اعتبار الماسی
|
{
|
||||||
</MudButton>
|
<MudAlert Severity="Severity.Info" Dense="true" Class="mt-1">
|
||||||
</MudStack>
|
از دور دوم به بعد، خرید پکیج فقط از طریق درگاه بانکی امکانپذیر است.
|
||||||
</MudPaper>
|
</MudAlert>
|
||||||
|
}
|
||||||
|
|
||||||
<MudButton Variant="Variant.Text" Color="Color.Default" FullWidth="true" OnClick="ClosePurchaseOptions">
|
<MudButton Variant="Variant.Text" Color="Color.Default" FullWidth="true" OnClick="ClosePurchaseOptions">
|
||||||
بستن
|
بستن
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ public partial class Index
|
|||||||
// Purchase Options Bottom Sheet
|
// Purchase Options Bottom Sheet
|
||||||
private bool _showPurchaseBottomSheet;
|
private bool _showPurchaseBottomSheet;
|
||||||
private bool _isProcessingPayment;
|
private bool _isProcessingPayment;
|
||||||
|
private int _purchaseCycleCount; // تعداد دورهای خرید — اگر > 0 فقط IPG مجاز
|
||||||
|
|
||||||
// Dashboard Tiles
|
// Dashboard Tiles
|
||||||
private readonly List<DashTile> _dashTiles = new()
|
private readonly List<DashTile> _dashTiles = new()
|
||||||
@@ -148,6 +149,11 @@ public partial class Index
|
|||||||
var discount = FormatPrice(b.DiscountBalance);
|
var discount = FormatPrice(b.DiscountBalance);
|
||||||
_walletNetwork = FormatPrice(b.NetworkBalance);
|
_walletNetwork = FormatPrice(b.NetworkBalance);
|
||||||
_walletDiscount = discount;
|
_walletDiscount = discount;
|
||||||
|
|
||||||
|
// بارگذاری تعداد دورهای خرید برای کنترل روشهای پرداخت
|
||||||
|
var magicStatus = await WalletService.GetMagicWalletStatusAsync();
|
||||||
|
_purchaseCycleCount = magicStatus.PurchaseCycleCount;
|
||||||
|
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,7 @@
|
|||||||
Format="N0"
|
Format="N0"
|
||||||
Adornment="Adornment.Start"
|
Adornment="Adornment.Start"
|
||||||
AdornmentIcon="@Icons.Material.Filled.Payments"
|
AdornmentIcon="@Icons.Material.Filled.Payments"
|
||||||
HelperText="@($"حداکثر: {FormatPrice(_status.MagicRemainingDeposit)} (ریال)")" />
|
HelperText="@($"حداکثر: {FormatPrice(_status.MagicRemainingDeposit)} (تومان)")" />
|
||||||
|
|
||||||
@if (_chargeAmount > 0)
|
@if (_chargeAmount > 0)
|
||||||
{
|
{
|
||||||
@@ -141,18 +141,18 @@
|
|||||||
Color="Color.Primary"
|
Color="Color.Primary"
|
||||||
Size="Size.Large"
|
Size="Size.Large"
|
||||||
FullWidth="true"
|
FullWidth="true"
|
||||||
Disabled="@(_chargeAmount <= 0 || _isProcessing)"
|
Disabled="@(_isProcessing || _chargeAmount < 10_000)"
|
||||||
OnClick="StartMagicCharge"
|
OnClick="StartMagicCharge"
|
||||||
StartIcon="@Icons.Material.Filled.Payment"
|
StartIcon="@Icons.Material.Filled.Payment"
|
||||||
Class="rounded-lg mt-2">
|
Class="rounded-lg mt-2">
|
||||||
@if (_isProcessing)
|
@if (_isProcessing)
|
||||||
{
|
{
|
||||||
<MudProgressCircular Indeterminate="true" Size="Size.Small" Class="ml-2" />
|
<MudProgressCircular Size="Size.Small" Indeterminate="true" Class="me-2" />
|
||||||
<span>در حال انتقال به درگاه...</span>
|
<span>در حال انتقال به درگاه...</span>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<span>پرداخت از درگاه</span>
|
<span>پرداخت با کارت بانکی</span>
|
||||||
}
|
}
|
||||||
</MudButton>
|
</MudButton>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace FrontOffice.Main.Pages.Profile;
|
|||||||
|
|
||||||
public partial class MagicWallet : ComponentBase
|
public partial class MagicWallet : ComponentBase
|
||||||
{
|
{
|
||||||
private MagicWalletStatus _status = new(0, 0, 0, 0, 0, 0, null);
|
private MagicWalletStatus _status = new(0, 0, 0, 0, 0, 0, null, 0);
|
||||||
private bool _isLoading = true;
|
private bool _isLoading = true;
|
||||||
private bool _isProcessing;
|
private bool _isProcessing;
|
||||||
private long _chargeAmount;
|
private long _chargeAmount;
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
موجودی کیف پول: @FormatPrice(_walletBalance)
|
موجودی کیف پول: @FormatPrice(_walletBalance)
|
||||||
</MudText>
|
</MudText>
|
||||||
<MudText Typo="Typo.body2" Color="Color.Secondary">
|
<MudText Typo="Typo.body2" Color="Color.Secondary">
|
||||||
موجودی اعتبار تخفیف: @FormatPrice(_discountBalance)
|
موجودی کیف پول اعتباری: @FormatPrice(_discountBalance)
|
||||||
</MudText>
|
</MudText>
|
||||||
|
|
||||||
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="mt-6"
|
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="mt-6"
|
||||||
|
|||||||
@@ -38,6 +38,17 @@
|
|||||||
درخواستهای برداشت
|
درخواستهای برداشت
|
||||||
</MudButton>
|
</MudButton>
|
||||||
|
|
||||||
|
<!-- دکمه شارژ کیفپول اعتباری -->
|
||||||
|
<MudButton Variant="Variant.Filled"
|
||||||
|
Color="Color.Info"
|
||||||
|
Size="Size.Large"
|
||||||
|
FullWidth="true"
|
||||||
|
StartIcon="@Icons.Material.Filled.CreditCard"
|
||||||
|
Href="@RouteConstants.Profile.ChargeDiscountWallet"
|
||||||
|
Class="rounded-lg">
|
||||||
|
شارژ کیفپول اعتباری
|
||||||
|
</MudButton>
|
||||||
|
|
||||||
<MudPaper Elevation="2" Class="pa-4 rounded-lg">
|
<MudPaper Elevation="2" Class="pa-4 rounded-lg">
|
||||||
<MudText Typo="Typo.h6" Class="mb-2">تراکنشها و مسیرهای شارژ</MudText>
|
<MudText Typo="Typo.h6" Class="mb-2">تراکنشها و مسیرهای شارژ</MudText>
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ public static class RouteConstants
|
|||||||
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 MagicWallet = "/profile/magic-wallet";
|
||||||
|
public const string ChargeDiscountWallet = "/profile/charge-discount-wallet";
|
||||||
public const string WithdrawalRequests = "/profile/withdrawal-requests";
|
public const string WithdrawalRequests = "/profile/withdrawal-requests";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ public record MagicWalletStatus(
|
|||||||
long MagicMaxDeposit,
|
long MagicMaxDeposit,
|
||||||
long MagicRemainingDeposit,
|
long MagicRemainingDeposit,
|
||||||
long Balance,
|
long Balance,
|
||||||
DateTime? MagicActivatedAt
|
DateTime? MagicActivatedAt,
|
||||||
|
int PurchaseCycleCount
|
||||||
);
|
);
|
||||||
|
|
||||||
public class WalletService
|
public class WalletService
|
||||||
@@ -212,12 +213,13 @@ public class WalletService
|
|||||||
response.MagicMaxDeposit,
|
response.MagicMaxDeposit,
|
||||||
response.MagicRemainingDeposit,
|
response.MagicRemainingDeposit,
|
||||||
response.Balance,
|
response.Balance,
|
||||||
activatedAt
|
activatedAt,
|
||||||
|
response.PurchaseCycleCount
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
return new MagicWalletStatus(0, 0, 0, 0, 0, 0, null);
|
return new MagicWalletStatus(0, 0, 0, 0, 0, 0, null, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,6 +243,26 @@ public class WalletService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<(bool Success, string? GatewayUrl, string? Error)> InitiateDiscountChargeAsync(long amount)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var response = await _client.InitiateDiscountChargeAsync(new InitiateDiscountChargeRequest
|
||||||
|
{
|
||||||
|
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()
|
public int GetWalletMode()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
Reference in New Issue
Block a user