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);
+ }
}
}