# فیچر فعالسازی (پرداخت) دستی باشگاه مشتریان

## خلاصه
این فیچر امکان فعالسازی دستی عضویت باشگاه مشتریان را برای ادمین فراهم می‌کند. ادمین می‌تواند کاربر را انتخاب کرده، تصویر فیش پرداخت را آپلود کند و عضویت را فعال کند.

## تاریخ: 2 ژانویه 2026

---

## تغییرات انجام شده

### 1. CMS (Backend)

#### Entity - `ManualPayment.cs`
- اضافه شدن فیلد `ImageDocumentId` برای ذخیره شناسه سند در FMS

```csharp
public long? ImageDocumentId { get; set; }
```

#### Proto - `manualpayment.proto`
- اضافه شدن `image_document_id` به `CreateManualPaymentRequest` (فیلد 7)
- اضافه شدن `image_document_id` به `ManualPaymentModel` (فیلد 21)

#### Command - `CreateManualPaymentCommand.cs`
- اضافه شدن پراپرتی `ImageDocumentId`

#### Handler - `CreateManualPaymentCommandHandler.cs`
- ذخیره `ImageDocumentId` از request در entity

---

### 2. BFF (Backend For Frontend)

#### Proto - `manualpayment.proto`
- اضافه شدن `image_document_id` به `ManualPaymentModel` (فیلد 21)
- اضافه شدن `FileUploadModel` برای آپلود فایل
- اضافه شدن `image_file` به `CreateManualPaymentRequest`

#### Command - `CreateManualPaymentCommand.cs`
- اضافه شدن `FileUploadDto` برای دریافت فایل از فرانت

#### Handler - `CreateManualPaymentCommandHandler.cs`
- اتصال به FMS برای آپلود فایل
- استخراج `ImagePath` و `ImageDocumentId` از پاسخ FMS
- ارسال هر دو به CMS

```csharp
var fileInfo = await _context.FileInfos.CreateNewFileInfoAsync(new()
{
    Directory = "Images/ManualPayments",
    IsBase64 = false,
    MIME = request.ImageFile.Mime,
    FileName = request.ImageFile.FileName,
    File = ByteString.CopyFrom(request.ImageFile.File)
}, cancellationToken: cancellationToken);

if (fileInfo != null)
{
    if (!string.IsNullOrWhiteSpace(fileInfo.File))
        grpcRequest.ImagePath = fileInfo.File;
    if (fileInfo.Id > 0)
        grpcRequest.ImageDocumentId = fileInfo.Id;
}
```

#### Query Handler - `GetManualPaymentsQueryHandler.cs`
- اضافه شدن mapping برای `ImagePath` و `ImageDocumentId`

#### DTO - `GetManualPaymentsResponseDto.cs`
- اضافه شدن فیلدهای:
```csharp
public string? ImagePath { get; set; }
public long? ImageDocumentId { get; set; }
```

#### Mapping - `ManualPaymentProfile.cs`
- اضافه شدن mapping برای `FileUploadModel -> FileUploadDto`

---

### 3. Frontend (Blazor)

#### `ManualPaymentDialog.razor`
- استفاده از `UserAutoComplete` برای انتخاب کاربر
- استفاده از `MudFileUpload` برای آپلود تصویر فیش
- استفاده از `MudSelect` برای انتخاب نوع پرداخت
- پیش‌نمایش تصویر قبل از ارسال
- تغییر عنوان‌ها از "پرداخت دستی" به "فعالسازی دستی"

#### `ManualPaymentDialog.razor.cs`
- هندل کردن انتخاب فایل با `IBrowserFile`
- تبدیل فایل به Base64 برای پیش‌نمایش
- ایجاد `FileUploadModel` برای ارسال به BFF
- مقادیر پیش‌فرض:
  - `Type = 1` (واریز نقدی)
  - `Description = "عضویت دستی باشگاه مشتریان"`

#### `ManualPayments.razor`
- تغییر عنوان صفحه به "فعالسازی (پرداخت) دستی"
- تغییر دکمه به "ثبت فعالسازی دستی جدید"

#### `NavMenu.razor`
- حذف آیتم منوی "پرداخت دستی عضویت"
- تغییر نام "پرداخت‌های دستی" به "فعالسازی (پرداخت) دستی"

#### حذف شده
- `ManualMembershipPayment.razor` و `ManualMembershipPayment.razor.cs`

---

## مقادیر ثابت

```csharp
// مبلغ پایه پکیج: 56 میلیون ریال
SystemConstants.BasePackageAmount = 56_000_000;

// شارژ کیف پول:
// - مجموع شارژ: 56M ریال
```

---

## فلو کامل

1. ادمین کاربر را با `UserAutoComplete` انتخاب می‌کند
2. نوع پرداخت را انتخاب می‌کند (پیش‌فرض: واریز نقدی)
3. توضیحات را وارد می‌کند (پیش‌فرض: عضویت دستی باشگاه مشتریان)
4. تصویر فیش را آپلود می‌کند (اختیاری)
5. دکمه ثبت را می‌زند
6. Frontend فایل را به BFF ارسال می‌کند
7. BFF فایل را به FMS آپلود می‌کند
8. FMS مسیر فایل (`File`) و شناسه سند (`Id`) را برمی‌گرداند
9. BFF هر دو را به CMS ارسال می‌کند
10. CMS تراکنش، پرداخت دستی و لاگ کیف پول را ثبت می‌کند
11. کیف پول کاربر شارژ می‌شود

---

## فایل‌های تغییر یافته

### CMS
- `CMSMicroservice.Domain/Entities/Payment/ManualPayment.cs`
- `CMSMicroservice.Application/ManualPaymentCQ/Commands/CreateManualPayment/CreateManualPaymentCommand.cs`
- `CMSMicroservice.Application/ManualPaymentCQ/Commands/CreateManualPayment/CreateManualPaymentCommandHandler.cs`
- `Protos/manualpayment.proto`

### BFF
- `BackOffice.BFF.Application/ManualPaymentCQ/Commands/CreateManualPayment/CreateManualPaymentCommand.cs`
- `BackOffice.BFF.Application/ManualPaymentCQ/Commands/CreateManualPayment/CreateManualPaymentCommandHandler.cs`
- `BackOffice.BFF.Application/ManualPaymentCQ/Queries/GetManualPayments/GetManualPaymentsQueryHandler.cs`
- `BackOffice.BFF.Application/ManualPaymentCQ/Queries/GetManualPayments/GetManualPaymentsResponseDto.cs`
- `BackOffice.BFF.Application/ManualPaymentCQ/ManualPaymentProfile.cs`
- `Protobufs/BackOffice.BFF.ManualPayment.Protobuf/Protos/manualpayment.proto`

### Frontend
- `BackOffice/Pages/Payment/Components/ManualPaymentDialog.razor`
- `BackOffice/Pages/Payment/Components/ManualPaymentDialog.razor.cs`
- `BackOffice/Pages/Payment/ManualPayments.razor`
- `BackOffice/Shared/NavMenu.razor`

### حذف شده
- `BackOffice.Main/Pages/Payment/ManualMembershipPayment.razor`
- `BackOffice.Main/Pages/Payment/ManualMembershipPayment.razor.cs`
