# 🔧 SystemConstants - مقادیر ثابت سیستم

> **فایل**: `CMSMicroservice.Domain/Common/SystemConstants.cs`  
> **آخرین بروزرسانی**: ۷ دی ۱۴۰۴

---

## 📋 هدف

این کلاس شامل تمام مقادیر ثابت سیستم است که در چندین جای مختلف استفاده می‌شوند.
به جای hardcode کردن اعداد در کد، از این ثابت‌ها استفاده کنید.

---

## 📊 مقادیر موجود

### Club Configuration

| ثابت | مقدار | توضیح |
|------|-------|-------|
| `ClubJoiningPercentage` | 0.35 (35%) | درصد کمیسیون پیوستن به باشگاه |
| `ClubActivationThreshold` | 0.5 (50%) | آستانه فعال‌سازی باشگاه |

### Commission Configuration

| ثابت | مقدار | توضیح |
|------|-------|-------|
| `MaxCalculationAttempts` | 3 | حداکثر تلاش برای محاسبه کمیسیون |
| `DefaultCommissionPoolDays` | 7 | تعداد روزهای استخر کمیسیون |

### Package Amounts

| ثابت | مقدار | توضیح |
|------|-------|-------|
| `GoldenPackageAmount` | 56,000,000 | مبلغ پکیج طلایی (56 میلیون ریال) |
| `DayaLoanAmount` | 56,000,000 | مبلغ وام دایا (56 میلیون ریال) |

---

## 💻 کد

```csharp
namespace CMSMicroservice.Domain.Common;

/// <summary>
/// مقادیر ثابت سیستم که در چند جای مختلف استفاده می‌شوند
/// </summary>
public static class SystemConstants
{
    // Club Configuration
    public const decimal ClubJoiningPercentage = 0.35m;    // 35% کمیسیون پیوستن به باشگاه
    public const decimal ClubActivationThreshold = 0.5m;   // 50% آستانه فعال‌سازی
    
    // Commission Configuration
    public const int MaxCalculationAttempts = 3;           // حداکثر تلاش محاسبه
    public const int DefaultCommissionPoolDays = 7;        // روزهای استخر کمیسیون
    
    // Package Amounts
    public const long GoldenPackageAmount = 56_000_000;    // 56 میلیون - پکیج طلایی
    public const long DayaLoanAmount = 56_000_000;         // 56 میلیون - وام دایا
}
```

---

## 🔍 نحوه استفاده

### در Handler ها:

```csharp
using CMSMicroservice.Domain.Common;

public class ProcessDayaLoanApprovalCommandHandler
{
    public async Task<Unit> Handle(...)
    {
        // به جای: var amount = 56_000_000;
        var amount = SystemConstants.DayaLoanAmount;
        
        await DepositToWallet(userId, amount);
    }
}
```

### در Validation ها:

```csharp
public class ValidateGoldenPackagePurchaseQueryHandler
{
    public async Task<bool> Handle(...)
    {
        var requiredAmount = SystemConstants.GoldenPackageAmount;
        return user.WalletBalance >= requiredAmount;
    }
}
```

---

## ⚠️ قوانین

1. **همیشه از ثابت‌ها استفاده کنید** - هرگز مقادیر magic number در کد ننویسید
2. **تغییر مقادیر** - برای تغییر یک مقدار، فقط این فایل را تغییر دهید
3. **ثابت‌های جدید** - اگر مقداری در بیش از یک جا استفاده می‌شود، به این فایل اضافه کنید
4. **نام‌گذاری** - از نام‌های توصیفی استفاده کنید (مثلاً `GoldenPackageAmount` نه `Amount1`)

---

## 📁 فایل‌های مرتبط

- `SmsTemplates.cs` - قالب‌های پیامک
- `ProcessDayaLoanApprovalCommandHandler.cs` - استفاده از DayaLoanAmount
- `ValidateGoldenPackagePurchaseQueryHandler.cs` - استفاده از GoldenPackageAmount

---

## 🔗 Related Docs

- [email-sms-configuration.md](email-sms-configuration.md) - تنظیمات SMS و قالب‌ها
- [CHANGELOG-2025-12-27.md](../../CHANGELOG-2025-12-27.md) - تاریخچه تغییرات
