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
This commit is contained in:
masoodafar-web
2025-11-29 03:44:41 +03:30
parent 462ae5dcc0
commit d20dc86d2f
15 changed files with 618 additions and 2 deletions

View File

@@ -0,0 +1,37 @@
namespace CMSMicroservice.Domain.Entities.Club;
/// <summary>
/// فیچرهای باشگاه مشتریان (امکانات ویژه)
/// </summary>
public class ClubFeature : BaseAuditableEntity
{
/// <summary>
/// نام فیچر
/// </summary>
public string Title { get; set; }
/// <summary>
/// توضیحات
/// </summary>
public string? Description { get; set; }
/// <summary>
/// وضعیت فعال/غیرفعال
/// </summary>
public bool IsActive { get; set; }
/// <summary>
/// امتیاز لازم برای دریافت (اختیاری)
/// </summary>
public int? RequiredPoints { get; set; }
/// <summary>
/// ترتیب نمایش
/// </summary>
public int SortOrder { get; set; }
/// <summary>
/// UserClubFeature Collection Navigation Reference
/// </summary>
public virtual ICollection<UserClubFeature>? UserClubFeatures { get; set; }
}

View File

@@ -0,0 +1,47 @@
namespace CMSMicroservice.Domain.Entities.Club;
/// <summary>
/// عضویت در باشگاه مشتریان
/// </summary>
public class ClubMembership : BaseAuditableEntity
{
/// <summary>
/// شناسه کاربر
/// </summary>
public long UserId { get; set; }
/// <summary>
/// User Navigation Property
/// </summary>
public virtual User User { get; set; }
/// <summary>
/// وضعیت فعال/غیرفعال عضویت
/// </summary>
public bool IsActive { get; set; }
/// <summary>
/// تاریخ فعال‌سازی عضویت
/// </summary>
public DateTime? ActivatedAt { get; set; }
/// <summary>
/// مبلغ اولیه پرداختی برای فعال‌سازی (معمولاً ۲۵ میلیون تومان)
/// </summary>
public long InitialContribution { get; set; }
/// <summary>
/// مجموع درآمد کارمزد تاکنون (ریال)
/// </summary>
public long TotalEarned { get; set; }
/// <summary>
/// UserClubFeature Collection Navigation Reference
/// </summary>
public virtual ICollection<UserClubFeature>? UserClubFeatures { get; set; }
/// <summary>
/// ClubMembershipHistory Collection Navigation Reference
/// </summary>
public virtual ICollection<ClubMembershipHistory>? ClubMembershipHistories { get; set; }
}

View File

@@ -0,0 +1,47 @@
namespace CMSMicroservice.Domain.Entities.Club;
/// <summary>
/// جدول واسط: کاربر فیچر (فیچرهای فعال شده برای کاربر)
/// </summary>
public class UserClubFeature : BaseAuditableEntity
{
/// <summary>
/// شناسه کاربر
/// </summary>
public long UserId { get; set; }
/// <summary>
/// User Navigation Property
/// </summary>
public virtual User User { get; set; }
/// <summary>
/// شناسه عضویت باشگاه
/// </summary>
public long ClubMembershipId { get; set; }
/// <summary>
/// ClubMembership Navigation Property
/// </summary>
public virtual ClubMembership ClubMembership { get; set; }
/// <summary>
/// شناسه فیچر
/// </summary>
public long ClubFeatureId { get; set; }
/// <summary>
/// ClubFeature Navigation Property
/// </summary>
public virtual ClubFeature ClubFeature { get; set; }
/// <summary>
/// تاریخ فعال‌سازی فیچر برای کاربر
/// </summary>
public DateTime GrantedAt { get; set; }
/// <summary>
/// یادداشت اختیاری
/// </summary>
public string? Notes { get; set; }
}

View File

@@ -0,0 +1,77 @@
namespace CMSMicroservice.Domain.Entities.Commission;
/// <summary>
/// پرداخت کمیسیون به کاربران
/// </summary>
public class UserCommissionPayout : BaseAuditableEntity
{
/// <summary>
/// شناسه کاربر
/// </summary>
public long UserId { get; set; }
/// <summary>
/// User Navigation Property
/// </summary>
public virtual User User { get; set; }
/// <summary>
/// شماره هفته
/// </summary>
public string WeekNumber { get; set; }
/// <summary>
/// شناسه استخر هفتگی
/// </summary>
public long WeeklyPoolId { get; set; }
/// <summary>
/// WeeklyCommissionPool Navigation Property
/// </summary>
public virtual WeeklyCommissionPool WeeklyPool { get; set; }
/// <summary>
/// تعداد امتیازی که کاربر داشت
/// </summary>
public int BalancesEarned { get; set; }
/// <summary>
/// ارزش هر امتیاز (ریال)
/// </summary>
public long ValuePerBalance { get; set; }
/// <summary>
/// مبلغ کل: BalancesEarned × ValuePerBalance
/// </summary>
public long TotalAmount { get; set; }
/// <summary>
/// وضعیت پرداخت
/// </summary>
public CommissionPayoutStatus Status { get; set; }
/// <summary>
/// تاریخ واریز به کیف پول
/// </summary>
public DateTime? PaidAt { get; set; }
/// <summary>
/// روش برداشت (اگر کاربر درخواست برداشت داده)
/// </summary>
public WithdrawalMethod? WithdrawalMethod { get; set; }
/// <summary>
/// شماره شبای برداشت (اگر نقدی)
/// </summary>
public string? IbanNumber { get; set; }
/// <summary>
/// تاریخ برداشت نقدی/الماس
/// </summary>
public DateTime? WithdrawnAt { get; set; }
/// <summary>
/// CommissionPayoutHistory Collection Navigation Reference
/// </summary>
public virtual ICollection<CommissionPayoutHistory>? CommissionPayoutHistories { get; set; }
}

View File

@@ -0,0 +1,42 @@
namespace CMSMicroservice.Domain.Entities.Commission;
/// <summary>
/// استخر کارمزد هفتگی
/// </summary>
public class WeeklyCommissionPool : BaseAuditableEntity
{
/// <summary>
/// شماره هفته (مثال: "2025-W48")
/// </summary>
public string WeekNumber { get; set; }
/// <summary>
/// مجموع مبلغ جمع‌شده در استخر (ریال)
/// </summary>
public long TotalPoolAmount { get; set; }
/// <summary>
/// مجموع تعادل‌های کل سیستم در این هفته
/// </summary>
public int TotalBalances { get; set; }
/// <summary>
/// مبلغ ریالی هر امتیاز (TotalPoolAmount ÷ TotalBalances)
/// </summary>
public long ValuePerBalance { get; set; }
/// <summary>
/// آیا محاسبه و توزیع شده
/// </summary>
public bool IsCalculated { get; set; }
/// <summary>
/// تاریخ محاسبه و توزیع
/// </summary>
public DateTime? CalculatedAt { get; set; }
/// <summary>
/// UserCommissionPayout Collection Navigation Reference
/// </summary>
public virtual ICollection<UserCommissionPayout>? UserCommissionPayouts { get; set; }
}

View File

@@ -0,0 +1,42 @@
namespace CMSMicroservice.Domain.Entities.Configuration;
/// <summary>
/// تنظیمات پویای سیستم - قابل تغییر بدون Deployment
/// </summary>
public class SystemConfiguration : BaseAuditableEntity
{
/// <summary>
/// محدوده تنظیمات (System, Network, Club, Commission)
/// </summary>
public ConfigurationScope Scope { get; set; }
/// <summary>
/// کلید تنظیم (مثلاً "MaxWeeklyBalancesPerUser")
/// </summary>
public string Key { get; set; }
/// <summary>
/// مقدار به‌صورت رشته (تفسیر در Application Layer)
/// </summary>
public string Value { get; set; }
/// <summary>
/// نوع داده برای Validation و UI (Int/Decimal/Bool/String/Json)
/// </summary>
public string? DataType { get; set; }
/// <summary>
/// توضیحات برای ادمین
/// </summary>
public string? Description { get; set; }
/// <summary>
/// فعال یا غیرفعال
/// </summary>
public bool IsActive { get; set; }
/// <summary>
/// SystemConfigurationHistory Collection Navigation Reference
/// </summary>
public virtual ICollection<SystemConfigurationHistory>? SystemConfigurationHistories { get; set; }
}

View File

@@ -0,0 +1,57 @@
namespace CMSMicroservice.Domain.Entities.History;
/// <summary>
/// تاریخچه تغییرات عضویت باشگاه (برای Audit)
/// </summary>
public class ClubMembershipHistory : BaseAuditableEntity
{
/// <summary>
/// شناسه عضویت باشگاه
/// </summary>
public long ClubMembershipId { get; set; }
/// <summary>
/// ClubMembership Navigation Property
/// </summary>
public virtual ClubMembership? ClubMembership { get; set; }
/// <summary>
/// شناسه کاربر
/// </summary>
public long UserId { get; set; }
/// <summary>
/// وضعیت فعال قبل از تغییر
/// </summary>
public bool OldIsActive { get; set; }
/// <summary>
/// وضعیت فعال بعد از تغییر
/// </summary>
public bool NewIsActive { get; set; }
/// <summary>
/// مبلغ مشارکت قبل از تغییر
/// </summary>
public long? OldInitialContribution { get; set; }
/// <summary>
/// مبلغ مشارکت بعد از تغییر
/// </summary>
public long? NewInitialContribution { get; set; }
/// <summary>
/// نوع عملیات (Activated, Deactivated, Updated, ManualFix)
/// </summary>
public ClubMembershipAction Action { get; set; }
/// <summary>
/// دلیل تغییر (اختیاری)
/// </summary>
public string? Reason { get; set; }
/// <summary>
/// چه کسی انجام داده (UserId یا "System")
/// </summary>
public string? PerformedBy { get; set; }
}

View File

@@ -0,0 +1,62 @@
namespace CMSMicroservice.Domain.Entities.History;
/// <summary>
/// تاریخچه تغییرات پرداخت کمیسیون (برای Audit)
/// </summary>
public class CommissionPayoutHistory : BaseAuditableEntity
{
/// <summary>
/// شناسه پرداخت کمیسیون
/// </summary>
public long UserCommissionPayoutId { get; set; }
/// <summary>
/// UserCommissionPayout Navigation Property
/// </summary>
public virtual UserCommissionPayout? UserCommissionPayout { get; set; }
/// <summary>
/// شناسه کاربر
/// </summary>
public long UserId { get; set; }
/// <summary>
/// شماره هفته
/// </summary>
public string WeekNumber { get; set; }
/// <summary>
/// مبلغ قبل از تغییر
/// </summary>
public long AmountBefore { get; set; }
/// <summary>
/// مبلغ بعد از تغییر
/// </summary>
public long AmountAfter { get; set; }
/// <summary>
/// وضعیت قبل از تغییر
/// </summary>
public CommissionPayoutStatus OldStatus { get; set; }
/// <summary>
/// وضعیت بعد از تغییر
/// </summary>
public CommissionPayoutStatus NewStatus { get; set; }
/// <summary>
/// نوع عملیات (Created, Paid, WithdrawRequested, Withdrawn, Cancelled, ManualFix)
/// </summary>
public CommissionPayoutAction Action { get; set; }
/// <summary>
/// چه کسی انجام داده (UserId یا "System")
/// </summary>
public string? PerformedBy { get; set; }
/// <summary>
/// دلیل تغییر (اختیاری)
/// </summary>
public string? Reason { get; set; }
}

View File

@@ -0,0 +1,47 @@
namespace CMSMicroservice.Domain.Entities.History;
/// <summary>
/// تاریخچه جابجایی در شبکه باینری (برای Audit)
/// </summary>
public class NetworkMembershipHistory : BaseAuditableEntity
{
/// <summary>
/// شناسه کاربر
/// </summary>
public long UserId { get; set; }
/// <summary>
/// شناسه والد قبل از تغییر
/// </summary>
public long? OldParentId { get; set; }
/// <summary>
/// شناسه والد بعد از تغییر
/// </summary>
public long? NewParentId { get; set; }
/// <summary>
/// موقعیت شاخه قبل از تغییر
/// </summary>
public NetworkLeg? OldLegPosition { get; set; }
/// <summary>
/// موقعیت شاخه بعد از تغییر
/// </summary>
public NetworkLeg? NewLegPosition { get; set; }
/// <summary>
/// نوع عملیات (Join, Move, Remove)
/// </summary>
public NetworkMembershipAction Action { get; set; }
/// <summary>
/// دلیل تغییر (اختیاری)
/// </summary>
public string? Reason { get; set; }
/// <summary>
/// چه کسی انجام داده (UserId یا "System")
/// </summary>
public string? PerformedBy { get; set; }
}

View File

@@ -0,0 +1,47 @@
namespace CMSMicroservice.Domain.Entities.History;
/// <summary>
/// تاریخچه تغییرات تنظیمات سیستم (برای Audit)
/// </summary>
public class SystemConfigurationHistory : BaseAuditableEntity
{
/// <summary>
/// شناسه تنظیم
/// </summary>
public long ConfigurationId { get; set; }
/// <summary>
/// SystemConfiguration Navigation Property
/// </summary>
public virtual SystemConfiguration? Configuration { get; set; }
/// <summary>
/// محدوده تنظیمات
/// </summary>
public ConfigurationScope Scope { get; set; }
/// <summary>
/// کلید تنظیم
/// </summary>
public string Key { get; set; }
/// <summary>
/// مقدار قبل از تغییر
/// </summary>
public string OldValue { get; set; }
/// <summary>
/// مقدار بعد از تغییر
/// </summary>
public string NewValue { get; set; }
/// <summary>
/// دلیل تغییر (اختیاری)
/// </summary>
public string? Reason { get; set; }
/// <summary>
/// چه کسی انجام داده (UserId یا "System")
/// </summary>
public string? PerformedBy { get; set; }
}

View File

@@ -0,0 +1,52 @@
namespace CMSMicroservice.Domain.Entities.Network;
/// <summary>
/// تعادل‌های هفتگی شبکه باینری
/// </summary>
public class NetworkWeeklyBalance : BaseAuditableEntity
{
/// <summary>
/// شناسه کاربر
/// </summary>
public long UserId { get; set; }
/// <summary>
/// User Navigation Property
/// </summary>
public virtual User User { get; set; }
/// <summary>
/// شماره هفته (مثال: "2025-W48")
/// </summary>
public string WeekNumber { get; set; }
/// <summary>
/// تعداد تعادل شاخه چپ در این هفته
/// </summary>
public int LeftLegBalances { get; set; }
/// <summary>
/// تعداد تعادل شاخه راست در این هفته
/// </summary>
public int RightLegBalances { get; set; }
/// <summary>
/// امتیاز کاربر: MIN(LeftLegBalances, RightLegBalances)
/// </summary>
public int TotalBalances { get; set; }
/// <summary>
/// مبلغی که از این کاربر به استخر هفتگی اضافه شد (ریال)
/// </summary>
public long WeeklyPoolContribution { get; set; }
/// <summary>
/// زمان محاسبه توسط Worker
/// </summary>
public DateTime? CalculatedAt { get; set; }
/// <summary>
/// آیا منقضی شده (بعد از توزیع کمیسیون)
/// </summary>
public bool IsExpired { get; set; }
}

View File

@@ -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 =============
/// <summary>
/// آیا این محصول فقط در فروشگاه باشگاه موجود است
/// </summary>
public bool IsClubExclusive { get; set; }
/// <summary>
/// درصد تخفیف باشگاه (0 تا 100)
/// </summary>
public int ClubDiscountPercent { get; set; }
// ============= Navigation Properties =============
//UserCarts Collection Navigation Reference
public virtual ICollection<UserCarts> UserCartss { get; set; }
//ProductGallerys Collection Navigation Reference

View File

@@ -36,6 +36,26 @@ public class User : BaseAuditableEntity
public DateTime? BirthDate { get; set; }
//پسوورد هش کاربر
public string? HashPassword { get; set; }
// ============= Network Club System Fields =============
/// <summary>
/// شناسه والد در شبکه باینری
/// </summary>
public long? NetworkParentId { get; set; }
/// <summary>
/// Network Parent Navigation Property
/// </summary>
public virtual User? NetworkParent { get; set; }
/// <summary>
/// موقعیت در شبکه (شاخه چپ یا راست)
/// </summary>
public NetworkLeg? LegPosition { get; set; }
// ============= Navigation Properties =============
//UserAddress Collection Navigation Reference
public virtual ICollection<UserAddress> UserAddresss { get; set; }
//UserRole Collection Navigation Reference
@@ -50,4 +70,14 @@ public class User : BaseAuditableEntity
public virtual ICollection<UserOrder> UserOrders { get; set; }
//UserWallet Collection Navigation Reference
public virtual ICollection<UserWallet> UserWallets { get; set; }
//NetworkChildren Collection Navigation Reference (فرزندان در شبکه باینری)
public virtual ICollection<User>? NetworkChildren { get; set; }
//ClubMembership Navigation Reference
public virtual ClubMembership? ClubMembership { get; set; }
//UserClubFeature Collection Navigation Reference
public virtual ICollection<UserClubFeature>? UserClubFeatures { get; set; }
//NetworkWeeklyBalance Collection Navigation Reference
public virtual ICollection<NetworkWeeklyBalance>? NetworkWeeklyBalances { get; set; }
//UserCommissionPayout Collection Navigation Reference
public virtual ICollection<UserCommissionPayout>? CommissionPayouts { get; set; }
}

View File

@@ -8,8 +8,17 @@ public class UserWallet : BaseAuditableEntity
public virtual User User { get; set; }
//موجودی
public long Balance { get; set; }
//موجودی شبکه
/// <summary>
/// موجودی شبکه/کارمزد (کیف پول طلایی) - قابل برداشت نقدی یا خرید الماس
/// </summary>
public long NetworkBalance { get; set; }
/// <summary>
/// موجودی تخفیف - فقط برای خرید از فروشگاه باشگاه مشتریان
/// </summary>
public long DiscountBalance { get; set; }
//UserWalletChangeLog Collection Navigation Reference
public virtual ICollection<UserWalletChangeLog> UserWalletChangeLogs { get; set; }
}

View File

@@ -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;