From 85208da1b50a5a662d77005808f46bb51bcea408 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Wed, 11 Mar 2026 23:44:36 +0330 Subject: [PATCH] feat: manual payment - replace amount with package selector - 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 --- src/BackOffice/BackOffice.csproj | 2 +- .../Components/ManualPaymentDialog.razor | 32 +++++++--- .../Components/ManualPaymentDialog.razor.cs | 60 +++++++++++++++++-- 3 files changed, 80 insertions(+), 14 deletions(-) diff --git a/src/BackOffice/BackOffice.csproj b/src/BackOffice/BackOffice.csproj index 32ce305..f626858 100644 --- a/src/BackOffice/BackOffice.csproj +++ b/src/BackOffice/BackOffice.csproj @@ -138,7 +138,7 @@ - + diff --git a/src/BackOffice/Pages/Payment/Components/ManualPaymentDialog.razor b/src/BackOffice/Pages/Payment/Components/ManualPaymentDialog.razor index dd34aeb..0d357d3 100644 --- a/src/BackOffice/Pages/Payment/Components/ManualPaymentDialog.razor +++ b/src/BackOffice/Pages/Payment/Components/ManualPaymentDialog.razor @@ -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 @@ - + + @foreach (var pkg in _packages) + { + + @pkg.Title — @pkg.Price.ToString("N0") تومان + + } + + + @if (_selectedPackagePrice.HasValue) + { + + مبلغ پکیج: @_selectedPackagePrice.Value.ToString("N0") تومان — این مبلغ به کیف‌پول کاربر اضافه می‌شود. + + } _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(); + + // اگر پکیج پایه وجود دارد، پیش‌فرض انتخاب کن + var basePackage = _packages.FirstOrDefault(p => p.IsBasePackage); + if (basePackage != null) + { + _selectedPackageId = basePackage.Id; + _selectedPackagePrice = basePackage.Price; + } + } + catch + { + _packages = new List(); + } + } + + 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 };