From d20dc86d2fc26e07e255b6de12e02564f9124cb1 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Sat, 29 Nov 2025 03:44:41 +0330 Subject: [PATCH] feat: Add core entities and history tables for network-club system Core Entities: - Add SystemConfiguration for dynamic config management - Add ClubMembership, ClubFeature, UserClubFeature for club management - Add NetworkWeeklyBalance for binary network tracking - Add WeeklyCommissionPool, UserCommissionPayout for commission system History Entities (Audit Trail): - Add ClubMembershipHistory - Add NetworkMembershipHistory - Add CommissionPayoutHistory - Add SystemConfigurationHistory Updates to Existing Entities: - User: Add NetworkParentId, LegPosition, and navigation properties - UserWallet: Add NetworkBalance and DiscountBalance fields - Products: Add IsClubExclusive and ClubDiscountPercent fields - GlobalUsings: Add new namespaces for club/network/commission entities --- .../Entities/Club/ClubFeature.cs | 37 +++++++++ .../Entities/Club/ClubMembership.cs | 47 +++++++++++ .../Entities/Club/UserClubFeature.cs | 47 +++++++++++ .../Commission/UserCommissionPayout.cs | 77 +++++++++++++++++++ .../Commission/WeeklyCommissionPool.cs | 42 ++++++++++ .../Configuration/SystemConfiguration.cs | 42 ++++++++++ .../Entities/History/ClubMembershipHistory.cs | 57 ++++++++++++++ .../History/CommissionPayoutHistory.cs | 62 +++++++++++++++ .../History/NetworkMembershipHistory.cs | 47 +++++++++++ .../History/SystemConfigurationHistory.cs | 47 +++++++++++ .../Entities/Network/NetworkWeeklyBalance.cs | 52 +++++++++++++ .../Entities/Products.cs | 15 ++++ src/CMSMicroservice.Domain/Entities/User.cs | 30 ++++++++ .../Entities/UserWallet.cs | 11 ++- src/CMSMicroservice.Domain/GlobalUsings.cs | 7 +- 15 files changed, 618 insertions(+), 2 deletions(-) create mode 100644 src/CMSMicroservice.Domain/Entities/Club/ClubFeature.cs create mode 100644 src/CMSMicroservice.Domain/Entities/Club/ClubMembership.cs create mode 100644 src/CMSMicroservice.Domain/Entities/Club/UserClubFeature.cs create mode 100644 src/CMSMicroservice.Domain/Entities/Commission/UserCommissionPayout.cs create mode 100644 src/CMSMicroservice.Domain/Entities/Commission/WeeklyCommissionPool.cs create mode 100644 src/CMSMicroservice.Domain/Entities/Configuration/SystemConfiguration.cs create mode 100644 src/CMSMicroservice.Domain/Entities/History/ClubMembershipHistory.cs create mode 100644 src/CMSMicroservice.Domain/Entities/History/CommissionPayoutHistory.cs create mode 100644 src/CMSMicroservice.Domain/Entities/History/NetworkMembershipHistory.cs create mode 100644 src/CMSMicroservice.Domain/Entities/History/SystemConfigurationHistory.cs create mode 100644 src/CMSMicroservice.Domain/Entities/Network/NetworkWeeklyBalance.cs diff --git a/src/CMSMicroservice.Domain/Entities/Club/ClubFeature.cs b/src/CMSMicroservice.Domain/Entities/Club/ClubFeature.cs new file mode 100644 index 0000000..281336b --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/Club/ClubFeature.cs @@ -0,0 +1,37 @@ +namespace CMSMicroservice.Domain.Entities.Club; + +/// +/// فیچرهای باشگاه مشتریان (امکانات ویژه) +/// +public class ClubFeature : BaseAuditableEntity +{ + /// + /// نام فیچر + /// + public string Title { get; set; } + + /// + /// توضیحات + /// + public string? Description { get; set; } + + /// + /// وضعیت فعال/غیرفعال + /// + public bool IsActive { get; set; } + + /// + /// امتیاز لازم برای دریافت (اختیاری) + /// + public int? RequiredPoints { get; set; } + + /// + /// ترتیب نمایش + /// + public int SortOrder { get; set; } + + /// + /// UserClubFeature Collection Navigation Reference + /// + public virtual ICollection? UserClubFeatures { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/Club/ClubMembership.cs b/src/CMSMicroservice.Domain/Entities/Club/ClubMembership.cs new file mode 100644 index 0000000..a0c63df --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/Club/ClubMembership.cs @@ -0,0 +1,47 @@ +namespace CMSMicroservice.Domain.Entities.Club; + +/// +/// عضویت در باشگاه مشتریان +/// +public class ClubMembership : BaseAuditableEntity +{ + /// + /// شناسه کاربر + /// + public long UserId { get; set; } + + /// + /// User Navigation Property + /// + public virtual User User { get; set; } + + /// + /// وضعیت فعال/غیرفعال عضویت + /// + public bool IsActive { get; set; } + + /// + /// تاریخ فعال‌سازی عضویت + /// + public DateTime? ActivatedAt { get; set; } + + /// + /// مبلغ اولیه پرداختی برای فعال‌سازی (معمولاً ۲۵ میلیون تومان) + /// + public long InitialContribution { get; set; } + + /// + /// مجموع درآمد کارمزد تاکنون (ریال) + /// + public long TotalEarned { get; set; } + + /// + /// UserClubFeature Collection Navigation Reference + /// + public virtual ICollection? UserClubFeatures { get; set; } + + /// + /// ClubMembershipHistory Collection Navigation Reference + /// + public virtual ICollection? ClubMembershipHistories { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/Club/UserClubFeature.cs b/src/CMSMicroservice.Domain/Entities/Club/UserClubFeature.cs new file mode 100644 index 0000000..4160091 --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/Club/UserClubFeature.cs @@ -0,0 +1,47 @@ +namespace CMSMicroservice.Domain.Entities.Club; + +/// +/// جدول واسط: کاربر – فیچر (فیچرهای فعال شده برای کاربر) +/// +public class UserClubFeature : BaseAuditableEntity +{ + /// + /// شناسه کاربر + /// + public long UserId { get; set; } + + /// + /// User Navigation Property + /// + public virtual User User { get; set; } + + /// + /// شناسه عضویت باشگاه + /// + public long ClubMembershipId { get; set; } + + /// + /// ClubMembership Navigation Property + /// + public virtual ClubMembership ClubMembership { get; set; } + + /// + /// شناسه فیچر + /// + public long ClubFeatureId { get; set; } + + /// + /// ClubFeature Navigation Property + /// + public virtual ClubFeature ClubFeature { get; set; } + + /// + /// تاریخ فعال‌سازی فیچر برای کاربر + /// + public DateTime GrantedAt { get; set; } + + /// + /// یادداشت اختیاری + /// + public string? Notes { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/Commission/UserCommissionPayout.cs b/src/CMSMicroservice.Domain/Entities/Commission/UserCommissionPayout.cs new file mode 100644 index 0000000..5cb67c7 --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/Commission/UserCommissionPayout.cs @@ -0,0 +1,77 @@ +namespace CMSMicroservice.Domain.Entities.Commission; + +/// +/// پرداخت کمیسیون به کاربران +/// +public class UserCommissionPayout : BaseAuditableEntity +{ + /// + /// شناسه کاربر + /// + public long UserId { get; set; } + + /// + /// User Navigation Property + /// + public virtual User User { get; set; } + + /// + /// شماره هفته + /// + public string WeekNumber { get; set; } + + /// + /// شناسه استخر هفتگی + /// + public long WeeklyPoolId { get; set; } + + /// + /// WeeklyCommissionPool Navigation Property + /// + public virtual WeeklyCommissionPool WeeklyPool { get; set; } + + /// + /// تعداد امتیازی که کاربر داشت + /// + public int BalancesEarned { get; set; } + + /// + /// ارزش هر امتیاز (ریال) + /// + public long ValuePerBalance { get; set; } + + /// + /// مبلغ کل: BalancesEarned × ValuePerBalance + /// + public long TotalAmount { get; set; } + + /// + /// وضعیت پرداخت + /// + public CommissionPayoutStatus Status { get; set; } + + /// + /// تاریخ واریز به کیف پول + /// + public DateTime? PaidAt { get; set; } + + /// + /// روش برداشت (اگر کاربر درخواست برداشت داده) + /// + public WithdrawalMethod? WithdrawalMethod { get; set; } + + /// + /// شماره شبای برداشت (اگر نقدی) + /// + public string? IbanNumber { get; set; } + + /// + /// تاریخ برداشت نقدی/الماس + /// + public DateTime? WithdrawnAt { get; set; } + + /// + /// CommissionPayoutHistory Collection Navigation Reference + /// + public virtual ICollection? CommissionPayoutHistories { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/Commission/WeeklyCommissionPool.cs b/src/CMSMicroservice.Domain/Entities/Commission/WeeklyCommissionPool.cs new file mode 100644 index 0000000..83ee4ce --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/Commission/WeeklyCommissionPool.cs @@ -0,0 +1,42 @@ +namespace CMSMicroservice.Domain.Entities.Commission; + +/// +/// استخر کارمزد هفتگی +/// +public class WeeklyCommissionPool : BaseAuditableEntity +{ + /// + /// شماره هفته (مثال: "2025-W48") + /// + public string WeekNumber { get; set; } + + /// + /// مجموع مبلغ جمع‌شده در استخر (ریال) + /// + public long TotalPoolAmount { get; set; } + + /// + /// مجموع تعادل‌های کل سیستم در این هفته + /// + public int TotalBalances { get; set; } + + /// + /// مبلغ ریالی هر امتیاز (TotalPoolAmount ÷ TotalBalances) + /// + public long ValuePerBalance { get; set; } + + /// + /// آیا محاسبه و توزیع شده + /// + public bool IsCalculated { get; set; } + + /// + /// تاریخ محاسبه و توزیع + /// + public DateTime? CalculatedAt { get; set; } + + /// + /// UserCommissionPayout Collection Navigation Reference + /// + public virtual ICollection? UserCommissionPayouts { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/Configuration/SystemConfiguration.cs b/src/CMSMicroservice.Domain/Entities/Configuration/SystemConfiguration.cs new file mode 100644 index 0000000..3281388 --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/Configuration/SystemConfiguration.cs @@ -0,0 +1,42 @@ +namespace CMSMicroservice.Domain.Entities.Configuration; + +/// +/// تنظیمات پویای سیستم - قابل تغییر بدون Deployment +/// +public class SystemConfiguration : BaseAuditableEntity +{ + /// + /// محدوده تنظیمات (System, Network, Club, Commission) + /// + public ConfigurationScope Scope { get; set; } + + /// + /// کلید تنظیم (مثلاً "MaxWeeklyBalancesPerUser") + /// + public string Key { get; set; } + + /// + /// مقدار به‌صورت رشته (تفسیر در Application Layer) + /// + public string Value { get; set; } + + /// + /// نوع داده برای Validation و UI (Int/Decimal/Bool/String/Json) + /// + public string? DataType { get; set; } + + /// + /// توضیحات برای ادمین + /// + public string? Description { get; set; } + + /// + /// فعال یا غیرفعال + /// + public bool IsActive { get; set; } + + /// + /// SystemConfigurationHistory Collection Navigation Reference + /// + public virtual ICollection? SystemConfigurationHistories { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/History/ClubMembershipHistory.cs b/src/CMSMicroservice.Domain/Entities/History/ClubMembershipHistory.cs new file mode 100644 index 0000000..68c9af1 --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/History/ClubMembershipHistory.cs @@ -0,0 +1,57 @@ +namespace CMSMicroservice.Domain.Entities.History; + +/// +/// تاریخچه تغییرات عضویت باشگاه (برای Audit) +/// +public class ClubMembershipHistory : BaseAuditableEntity +{ + /// + /// شناسه عضویت باشگاه + /// + public long ClubMembershipId { get; set; } + + /// + /// ClubMembership Navigation Property + /// + public virtual ClubMembership? ClubMembership { get; set; } + + /// + /// شناسه کاربر + /// + public long UserId { get; set; } + + /// + /// وضعیت فعال قبل از تغییر + /// + public bool OldIsActive { get; set; } + + /// + /// وضعیت فعال بعد از تغییر + /// + public bool NewIsActive { get; set; } + + /// + /// مبلغ مشارکت قبل از تغییر + /// + public long? OldInitialContribution { get; set; } + + /// + /// مبلغ مشارکت بعد از تغییر + /// + public long? NewInitialContribution { get; set; } + + /// + /// نوع عملیات (Activated, Deactivated, Updated, ManualFix) + /// + public ClubMembershipAction Action { get; set; } + + /// + /// دلیل تغییر (اختیاری) + /// + public string? Reason { get; set; } + + /// + /// چه کسی انجام داده (UserId یا "System") + /// + public string? PerformedBy { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/History/CommissionPayoutHistory.cs b/src/CMSMicroservice.Domain/Entities/History/CommissionPayoutHistory.cs new file mode 100644 index 0000000..f4dc40d --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/History/CommissionPayoutHistory.cs @@ -0,0 +1,62 @@ +namespace CMSMicroservice.Domain.Entities.History; + +/// +/// تاریخچه تغییرات پرداخت کمیسیون (برای Audit) +/// +public class CommissionPayoutHistory : BaseAuditableEntity +{ + /// + /// شناسه پرداخت کمیسیون + /// + public long UserCommissionPayoutId { get; set; } + + /// + /// UserCommissionPayout Navigation Property + /// + public virtual UserCommissionPayout? UserCommissionPayout { get; set; } + + /// + /// شناسه کاربر + /// + public long UserId { get; set; } + + /// + /// شماره هفته + /// + public string WeekNumber { get; set; } + + /// + /// مبلغ قبل از تغییر + /// + public long AmountBefore { get; set; } + + /// + /// مبلغ بعد از تغییر + /// + public long AmountAfter { get; set; } + + /// + /// وضعیت قبل از تغییر + /// + public CommissionPayoutStatus OldStatus { get; set; } + + /// + /// وضعیت بعد از تغییر + /// + public CommissionPayoutStatus NewStatus { get; set; } + + /// + /// نوع عملیات (Created, Paid, WithdrawRequested, Withdrawn, Cancelled, ManualFix) + /// + public CommissionPayoutAction Action { get; set; } + + /// + /// چه کسی انجام داده (UserId یا "System") + /// + public string? PerformedBy { get; set; } + + /// + /// دلیل تغییر (اختیاری) + /// + public string? Reason { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/History/NetworkMembershipHistory.cs b/src/CMSMicroservice.Domain/Entities/History/NetworkMembershipHistory.cs new file mode 100644 index 0000000..60f0e1e --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/History/NetworkMembershipHistory.cs @@ -0,0 +1,47 @@ +namespace CMSMicroservice.Domain.Entities.History; + +/// +/// تاریخچه جابجایی در شبکه باینری (برای Audit) +/// +public class NetworkMembershipHistory : BaseAuditableEntity +{ + /// + /// شناسه کاربر + /// + public long UserId { get; set; } + + /// + /// شناسه والد قبل از تغییر + /// + public long? OldParentId { get; set; } + + /// + /// شناسه والد بعد از تغییر + /// + public long? NewParentId { get; set; } + + /// + /// موقعیت شاخه قبل از تغییر + /// + public NetworkLeg? OldLegPosition { get; set; } + + /// + /// موقعیت شاخه بعد از تغییر + /// + public NetworkLeg? NewLegPosition { get; set; } + + /// + /// نوع عملیات (Join, Move, Remove) + /// + public NetworkMembershipAction Action { get; set; } + + /// + /// دلیل تغییر (اختیاری) + /// + public string? Reason { get; set; } + + /// + /// چه کسی انجام داده (UserId یا "System") + /// + public string? PerformedBy { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/History/SystemConfigurationHistory.cs b/src/CMSMicroservice.Domain/Entities/History/SystemConfigurationHistory.cs new file mode 100644 index 0000000..e7f980c --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/History/SystemConfigurationHistory.cs @@ -0,0 +1,47 @@ +namespace CMSMicroservice.Domain.Entities.History; + +/// +/// تاریخچه تغییرات تنظیمات سیستم (برای Audit) +/// +public class SystemConfigurationHistory : BaseAuditableEntity +{ + /// + /// شناسه تنظیم + /// + public long ConfigurationId { get; set; } + + /// + /// SystemConfiguration Navigation Property + /// + public virtual SystemConfiguration? Configuration { get; set; } + + /// + /// محدوده تنظیمات + /// + public ConfigurationScope Scope { get; set; } + + /// + /// کلید تنظیم + /// + public string Key { get; set; } + + /// + /// مقدار قبل از تغییر + /// + public string OldValue { get; set; } + + /// + /// مقدار بعد از تغییر + /// + public string NewValue { get; set; } + + /// + /// دلیل تغییر (اختیاری) + /// + public string? Reason { get; set; } + + /// + /// چه کسی انجام داده (UserId یا "System") + /// + public string? PerformedBy { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/Network/NetworkWeeklyBalance.cs b/src/CMSMicroservice.Domain/Entities/Network/NetworkWeeklyBalance.cs new file mode 100644 index 0000000..707fa7e --- /dev/null +++ b/src/CMSMicroservice.Domain/Entities/Network/NetworkWeeklyBalance.cs @@ -0,0 +1,52 @@ +namespace CMSMicroservice.Domain.Entities.Network; + +/// +/// تعادل‌های هفتگی شبکه باینری +/// +public class NetworkWeeklyBalance : BaseAuditableEntity +{ + /// + /// شناسه کاربر + /// + public long UserId { get; set; } + + /// + /// User Navigation Property + /// + public virtual User User { get; set; } + + /// + /// شماره هفته (مثال: "2025-W48") + /// + public string WeekNumber { get; set; } + + /// + /// تعداد تعادل شاخه چپ در این هفته + /// + public int LeftLegBalances { get; set; } + + /// + /// تعداد تعادل شاخه راست در این هفته + /// + public int RightLegBalances { get; set; } + + /// + /// امتیاز کاربر: MIN(LeftLegBalances, RightLegBalances) + /// + public int TotalBalances { get; set; } + + /// + /// مبلغی که از این کاربر به استخر هفتگی اضافه شد (ریال) + /// + public long WeeklyPoolContribution { get; set; } + + /// + /// زمان محاسبه توسط Worker + /// + public DateTime? CalculatedAt { get; set; } + + /// + /// آیا منقضی شده (بعد از توزیع کمیسیون) + /// + public bool IsExpired { get; set; } +} diff --git a/src/CMSMicroservice.Domain/Entities/Products.cs b/src/CMSMicroservice.Domain/Entities/Products.cs index 8a693c0..3a6ba93 100644 --- a/src/CMSMicroservice.Domain/Entities/Products.cs +++ b/src/CMSMicroservice.Domain/Entities/Products.cs @@ -14,6 +14,21 @@ public class Products : BaseAuditableEntity public int SaleCount { get; set; } public int ViewCount { get; set; } public int RemainingCount { get; set; } + + // ============= Club Shop Fields ============= + + /// + /// آیا این محصول فقط در فروشگاه باشگاه موجود است + /// + public bool IsClubExclusive { get; set; } + + /// + /// درصد تخفیف باشگاه (0 تا 100) + /// + public int ClubDiscountPercent { get; set; } + + // ============= Navigation Properties ============= + //UserCarts Collection Navigation Reference public virtual ICollection UserCartss { get; set; } //ProductGallerys Collection Navigation Reference diff --git a/src/CMSMicroservice.Domain/Entities/User.cs b/src/CMSMicroservice.Domain/Entities/User.cs index ea787f7..eb58f22 100644 --- a/src/CMSMicroservice.Domain/Entities/User.cs +++ b/src/CMSMicroservice.Domain/Entities/User.cs @@ -36,6 +36,26 @@ public class User : BaseAuditableEntity public DateTime? BirthDate { get; set; } //پسوورد هش کاربر public string? HashPassword { get; set; } + + // ============= Network Club System Fields ============= + + /// + /// شناسه والد در شبکه باینری + /// + public long? NetworkParentId { get; set; } + + /// + /// Network Parent Navigation Property + /// + public virtual User? NetworkParent { get; set; } + + /// + /// موقعیت در شبکه (شاخه چپ یا راست) + /// + public NetworkLeg? LegPosition { get; set; } + + // ============= Navigation Properties ============= + //UserAddress Collection Navigation Reference public virtual ICollection UserAddresss { get; set; } //UserRole Collection Navigation Reference @@ -50,4 +70,14 @@ public class User : BaseAuditableEntity public virtual ICollection UserOrders { get; set; } //UserWallet Collection Navigation Reference public virtual ICollection UserWallets { get; set; } + //NetworkChildren Collection Navigation Reference (فرزندان در شبکه باینری) + public virtual ICollection? NetworkChildren { get; set; } + //ClubMembership Navigation Reference + public virtual ClubMembership? ClubMembership { get; set; } + //UserClubFeature Collection Navigation Reference + public virtual ICollection? UserClubFeatures { get; set; } + //NetworkWeeklyBalance Collection Navigation Reference + public virtual ICollection? NetworkWeeklyBalances { get; set; } + //UserCommissionPayout Collection Navigation Reference + public virtual ICollection? CommissionPayouts { get; set; } } diff --git a/src/CMSMicroservice.Domain/Entities/UserWallet.cs b/src/CMSMicroservice.Domain/Entities/UserWallet.cs index d0c47fe..a24d42e 100644 --- a/src/CMSMicroservice.Domain/Entities/UserWallet.cs +++ b/src/CMSMicroservice.Domain/Entities/UserWallet.cs @@ -8,8 +8,17 @@ public class UserWallet : BaseAuditableEntity public virtual User User { get; set; } //موجودی public long Balance { get; set; } - //موجودی شبکه + + /// + /// موجودی شبکه/کارمزد (کیف پول طلایی) - قابل برداشت نقدی یا خرید الماس + /// public long NetworkBalance { get; set; } + + /// + /// موجودی تخفیف - فقط برای خرید از فروشگاه باشگاه مشتریان + /// + public long DiscountBalance { get; set; } + //UserWalletChangeLog Collection Navigation Reference public virtual ICollection UserWalletChangeLogs { get; set; } } diff --git a/src/CMSMicroservice.Domain/GlobalUsings.cs b/src/CMSMicroservice.Domain/GlobalUsings.cs index e6d77cb..b3106db 100644 --- a/src/CMSMicroservice.Domain/GlobalUsings.cs +++ b/src/CMSMicroservice.Domain/GlobalUsings.cs @@ -1,6 +1,11 @@ global using CMSMicroservice.Domain.Common; global using CMSMicroservice.Domain.Entities; - +global using CMSMicroservice.Domain.Entities.Club; +global using CMSMicroservice.Domain.Entities.Network; +global using CMSMicroservice.Domain.Entities.Commission; +global using CMSMicroservice.Domain.Entities.Configuration; +global using CMSMicroservice.Domain.Entities.History; +global using CMSMicroservice.Domain.Enums; global using CMSMicroservice.Domain.Events; global using System.Threading; global using System.Threading.Tasks;