diff --git a/src/FrontOffice.Main/FrontOffice.Main.csproj b/src/FrontOffice.Main/FrontOffice.Main.csproj index cbd5f4e..8e37fc1 100644 --- a/src/FrontOffice.Main/FrontOffice.Main.csproj +++ b/src/FrontOffice.Main/FrontOffice.Main.csproj @@ -11,7 +11,7 @@ - + @@ -56,12 +56,6 @@ .dockerignore - - - - - - diff --git a/src/FrontOffice.Main/NuGet.config b/src/FrontOffice.Main/NuGet.config index c53f59f..6402f43 100644 --- a/src/FrontOffice.Main/NuGet.config +++ b/src/FrontOffice.Main/NuGet.config @@ -2,6 +2,8 @@ + + diff --git a/src/FrontOffice.Main/Pages/Package/Packages.razor b/src/FrontOffice.Main/Pages/Package/Packages.razor index 6463b59..5b5aee0 100644 --- a/src/FrontOffice.Main/Pages/Package/Packages.razor +++ b/src/FrontOffice.Main/Pages/Package/Packages.razor @@ -64,20 +64,43 @@ @package.FormattedPrice - + - - - عضویت در باشگاه مشتریان - - - - دریافت پاداش هفتگی - - - - تیم‌سازی نامحدود - + @if (package.SupportsDirectPurchase) + { + + + پرداخت مستقیم + + } + @if (package.SupportsDayaPurchase) + { + + + پرداخت با اعتبار دایا + + } + @if (package.DiscountMultiplier > 0) + { + + + ضریب تخفیف: @package.DiscountMultiplier.ToString("F1")x + + } + @if (package.MagicWalletMultiplier > 0) + { + + + کیف پول جادویی: @package.MagicWalletMultiplier.ToString("F1")x + + } + @if (package.IsBasePackage) + { + + + پکیج پایه + + } diff --git a/src/FrontOffice.Main/Pages/PackageDetail.razor.cs b/src/FrontOffice.Main/Pages/PackageDetail.razor.cs index 2ea07bf..cbe5d3c 100644 --- a/src/FrontOffice.Main/Pages/PackageDetail.razor.cs +++ b/src/FrontOffice.Main/Pages/PackageDetail.razor.cs @@ -64,36 +64,38 @@ public partial class PackageDetail : IDisposable try { - // Load package details - var packageResponse = await PackageClient.GetPackageAsync(request: new() { Id = Id}, cancellationToken: _loadCts.Token); + // Load package details via Customer RPC + var response = await PackageClient.GetCustomerPackageDetailsAsync( + new GetCustomerPackageDetailsRequest { PackageId = Id }, + cancellationToken: _loadCts.Token); - if (packageResponse != null) + if (response != null) { + // Build features from API response + var features = response.Features?.Select(f => f.Title).ToList() ?? new List(); + + // Build specifications from API features (highlighted ones) + var specs = response.Features? + .Where(f => f.IsHighlighted) + .Select(f => new Specification + { + Name = f.Title, + Value = f.Description, + Icon = string.IsNullOrEmpty(f.Icon) ? Icons.Material.Filled.Star : f.Icon + }).ToList() ?? new List(); + _package = new PackageDetailDto { - Id = packageResponse.Id, - Title = packageResponse.Title, - Body = packageResponse.Description, - Image = packageResponse.ImagePath ?? string.Empty, - Specifications = new List - { - new() { Name = "ظرفیت", Value = "تا ۲۰۰ عضو", Icon = Icons.Material.Filled.Group }, - new() { Name = "شجره‌نامه", Value = "پیشرفته", Icon = Icons.Material.Filled.AccountTree }, - new() { Name = "گزارش‌گیری", Value = "جامع", Icon = Icons.Material.Filled.Analytics }, - new() { Name = "پشتیبانی", Value = "۲۴ ساعته", Icon = Icons.Material.Filled.Support } - }, - Features = new List - { - "مدیریت تیم نامحدود", - "شجره‌نامه بصری", - "محاسبه کارمزد خودکار", - "گزارش‌های مالی", - "پشتیبانی اولویت‌دار" - }, + Id = response.Id, + Title = response.Title, + Body = response.Description, + Image = response.ImagePath ?? string.Empty, + Specifications = specs, + Features = features, Pricing = new PricingInfo { - OriginalPrice = packageResponse.Price, - FinalPrice = packageResponse.Price, + OriginalPrice = response.Price, + FinalPrice = response.Price, HasDiscount = false, DiscountPercent = 0 } diff --git a/src/FrontOffice.Main/Utilities/PackageService.cs b/src/FrontOffice.Main/Utilities/PackageService.cs index d134663..a326557 100644 --- a/src/FrontOffice.Main/Utilities/PackageService.cs +++ b/src/FrontOffice.Main/Utilities/PackageService.cs @@ -10,7 +10,15 @@ public record PackageDto( string Title, string Description, string ImageUrl, - long Price) + long Price, + long ActivationFee = 0, + double DiscountMultiplier = 0, + double MagicWalletMultiplier = 0, + long MagicWalletMaxDeposit = 0, + long MagicWalletMaxCredit = 0, + bool IsBasePackage = false, + bool SupportsDayaPurchase = false, + bool SupportsDirectPurchase = false) { public string FormattedPrice => string.Format("{0:N0} تومان", Price); } @@ -56,7 +64,15 @@ public class PackageService m.Title, m.Description, m.ImagePath, - m.Price)) + m.Price, + m.ActivationFee, + m.DiscountMultiplier, + m.MagicWalletMultiplier, + m.MagicWalletMaxDeposit, + m.MagicWalletMaxCredit, + m.IsBasePackage, + m.SupportsDayaPurchase, + m.SupportsDirectPurchase)) .ToList(); } catch (Exception ex) @@ -100,16 +116,32 @@ public class PackageService /// /// Get user's package purchase status /// - public Task GetUserPackageStatusAsync(CancellationToken ct = default) + public async Task GetUserPackageStatusAsync(CancellationToken ct = default) { - // TODO: Connect to GetUserPackageStatus RPC when available in FrontOffice.BFF - return Task.FromResult(new UserPackageStatusDto( - HasPurchasedPackage: false, - PackageTitle: null, - PurchaseMethod: null, - IsClubMemberActive: false, - WalletBalance: 0, - CanActivateClubMembership: false, - PurchaseDate: null)); + try + { + var response = await _client.GetUserPackageStatusAsync( + new GetUserPackageStatusRequest(), cancellationToken: ct); + + return new UserPackageStatusDto( + HasPurchasedPackage: response.HasPurchasedPackage, + PackageTitle: null, + PurchaseMethod: response.PackagePurchaseMethod, + IsClubMemberActive: response.IsClubMemberActive, + WalletBalance: response.WalletBalance, + CanActivateClubMembership: response.CanActivateClubMembership, + PurchaseDate: response.LastPurchaseDate?.ToDateTime()); + } + catch + { + return new UserPackageStatusDto( + HasPurchasedPackage: false, + PackageTitle: null, + PurchaseMethod: null, + IsClubMemberActive: false, + WalletBalance: 0, + CanActivateClubMembership: false, + PurchaseDate: null); + } } }