feat: manual payment - replace amount with package selector
Build and Deploy to Kubernetes / build-and-deploy (push) Failing after 1m39s
Build and Deploy to Kubernetes / build-and-deploy (push) Failing after 1m39s
- Remove manual amount input field - Add package selector dropdown (shows name + price) - Pre-select base package, show price in alert - Validate package selection before submit - Send package_id to CMS, proto NuGet 0.0.192
This commit is contained in:
@@ -138,7 +138,7 @@
|
||||
|
||||
<!-- CMS Protobuf NuGet package (used for both local dev and Docker builds) -->
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.189" />
|
||||
<PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.192" />
|
||||
</ItemGroup>
|
||||
|
||||
<!-- ============================================================ -->
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
@using CMSMicroservice.Protobuf.Protos.ManualPayment
|
||||
@using CMSMicroservice.Protobuf.Protos.Package
|
||||
@using BackOffice.Pages.Payment.Components
|
||||
@using BackOffice.Pages.AutoComplete
|
||||
@using Microsoft.AspNetCore.Components.Forms
|
||||
@@ -13,15 +14,28 @@
|
||||
<UserAutoComplete Label="انتخاب کاربر"
|
||||
@bind-SelectedUserId="_selectedUserId" />
|
||||
|
||||
<MudNumericField T="long"
|
||||
Label="مبلغ"
|
||||
<MudSelect T="long?"
|
||||
Label="انتخاب پکیج"
|
||||
Value="@_selectedPackageId"
|
||||
ValueChanged="OnPackageChanged"
|
||||
Variant="Variant.Outlined"
|
||||
Adornment="Adornment.End"
|
||||
AdornmentText="تومان"
|
||||
Margin="Margin.Dense"
|
||||
Required="true"
|
||||
RequiredError="مبلغ الزامی است"
|
||||
Min="1"
|
||||
@bind-Value="_createModel.Amount" />
|
||||
RequiredError="انتخاب پکیج الزامی است">
|
||||
@foreach (var pkg in _packages)
|
||||
{
|
||||
<MudSelectItem T="long?" Value="@((long?)pkg.Id)">
|
||||
@pkg.Title — @pkg.Price.ToString("N0") تومان
|
||||
</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
|
||||
@if (_selectedPackagePrice.HasValue)
|
||||
{
|
||||
<MudAlert Severity="Severity.Info" Dense="true" Variant="Variant.Text">
|
||||
مبلغ پکیج: <strong>@_selectedPackagePrice.Value.ToString("N0") تومان</strong> — این مبلغ به کیفپول کاربر اضافه میشود.
|
||||
</MudAlert>
|
||||
}
|
||||
|
||||
<MudSelect T="int"
|
||||
Label="نوع پرداخت"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using CMSMicroservice.Protobuf.Protos.ManualPayment;
|
||||
using CMSMicroservice.Protobuf.Protos.Package;
|
||||
using Google.Protobuf;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
@@ -24,19 +25,23 @@ public partial class ManualPaymentDialog
|
||||
{
|
||||
[CascadingParameter] IMudDialogInstance MudDialog { get; set; } = default!;
|
||||
[Inject] public ManualPaymentContract.ManualPaymentContractClient ManualPaymentClient { get; set; } = default!;
|
||||
[Inject] public PackageContract.PackageContractClient PackageClient { get; set; } = default!;
|
||||
// Snackbar is injected via _Imports.razor
|
||||
|
||||
[Parameter] public ManualPaymentDialogMode Mode { get; set; }
|
||||
[Parameter] public ManualPaymentModel? Model { get; set; }
|
||||
|
||||
private ManualPaymentModel _createModel = new(){
|
||||
Amount = 0,
|
||||
};
|
||||
private ManualPaymentModel _createModel = new(){ Amount = 0 };
|
||||
private string? _adminNote;
|
||||
|
||||
// User selection
|
||||
private long? _selectedUserId;
|
||||
|
||||
// Package selection
|
||||
private long? _selectedPackageId;
|
||||
private long? _selectedPackagePrice;
|
||||
private List<GetAllPackageByFilterResponseModel> _packages = new();
|
||||
|
||||
// Type and Description
|
||||
private int _selectedType = 1; // Default: CashDeposit
|
||||
private string _description = "عضویت دستی باشگاه مشتریان";
|
||||
@@ -48,6 +53,46 @@ public partial class ManualPaymentDialog
|
||||
|
||||
private bool _isSubmitting;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await LoadPackages();
|
||||
}
|
||||
|
||||
private async Task LoadPackages()
|
||||
{
|
||||
try
|
||||
{
|
||||
var request = new GetAllPackageByFilterRequest
|
||||
{
|
||||
PaginationState = new() { PageNumber = 1, PageSize = 100 },
|
||||
Filter = new()
|
||||
};
|
||||
|
||||
var result = await PackageClient.GetAllPackageByFilterAsync(request);
|
||||
_packages = result.Models?.OrderBy(p => p.SortOrder).ToList()
|
||||
?? new List<GetAllPackageByFilterResponseModel>();
|
||||
|
||||
// اگر پکیج پایه وجود دارد، پیشفرض انتخاب کن
|
||||
var basePackage = _packages.FirstOrDefault(p => p.IsBasePackage);
|
||||
if (basePackage != null)
|
||||
{
|
||||
_selectedPackageId = basePackage.Id;
|
||||
_selectedPackagePrice = basePackage.Price;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
_packages = new List<GetAllPackageByFilterResponseModel>();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnPackageChanged(long? packageId)
|
||||
{
|
||||
_selectedPackageId = packageId;
|
||||
var pkg = _packages.FirstOrDefault(p => p.Id == packageId);
|
||||
_selectedPackagePrice = pkg?.Price;
|
||||
}
|
||||
|
||||
private async Task OnImageFileSelected(IBrowserFile? file)
|
||||
{
|
||||
if (file == null)
|
||||
@@ -81,6 +126,12 @@ public partial class ManualPaymentDialog
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_selectedPackageId.HasValue || _selectedPackageId.Value <= 0)
|
||||
{
|
||||
Snackbar.Add("لطفاً پکیج را انتخاب کنید.", Severity.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_selectedType <= 0)
|
||||
{
|
||||
Snackbar.Add("لطفاً نوع پرداخت را انتخاب کنید.", Severity.Warning);
|
||||
@@ -101,7 +152,8 @@ public partial class ManualPaymentDialog
|
||||
var request = new CreateManualPaymentRequest
|
||||
{
|
||||
UserId = _selectedUserId.Value,
|
||||
Amount = _createModel.Amount,
|
||||
Amount = 0, // deprecated — مبلغ از پکیج خوانده میشود
|
||||
PackageId = _selectedPackageId.Value,
|
||||
Type = (ManualPaymentType)_selectedType,
|
||||
Description = _description
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user