Files
docs/05-TASKS/BACKLOG.md
T
masoodafar-web 996a6e885b feat: Update CURRENT-SPRINT.md with progress and task completion details
- Added last updated date and refined project status for Backend and Frontend.
- Updated completion percentages for FrontOffice UI and BFF.
- Documented completed tasks for BackOffice in the current sprint.
- Added new high-priority tasks related to commission calculation fixes.
- Resolved blockers and minor issues, providing a clearer progress summary.

docs: Create commission-calculation-fix.md for weekly commission calculation analysis

- Documented critical issues affecting commission calculations.
- Provided a detailed plan for fixing the commission calculation logic.
- Included code analysis, affected files, and step-by-step tasks for implementation.
- Outlined the expected timeline and important notes regarding changes.
2025-12-04 19:54:08 +03:30

1489 lines
53 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📋 کارهای باقی‌مانده - تجمیع کامل پروژه FourSat
> **⚠️ نکته مهم**: برای گزارش کامل آمادگی تحویل، مراجعه کنید به: [DELIVERY-READINESS-REPORT.md](DELIVERY-READINESS-REPORT.md)
> **⚠️ نکته مهم توسعه**: برای تسریع روند توسعه، handlers جدید BackOffice.BFF با TODO کامنت‌های دقیق پیاده‌سازی می‌شوند به جای implementation کامل. هر TODO شامل:
> - مراحل دقیق پیاده‌سازی (گام به گام)
> - نام دقیق type‌ها و namespace‌ها
> - نکات مهم درباره nullable types، casting، و proto mappings
> - این رویکرد سرعت توسعه را حفظ می‌کند بدون کاهش دقت
<style>
:root {
--bg: #f8fafc;
--fg: #0f172a;
--muted: #475569;
--accent: #2563eb;
--border: #e2e8f0;
--card: #ffffff;
}
body {
font-family: "Vazirmatn", "Inter", "Segoe UI", "SF Pro Display", system-ui, -apple-system, sans-serif;
background: var(--bg);
color: var(--fg);
line-height: 1.7;
}
h1, h2, h3, h4 {
letter-spacing: -0.01em;
margin-top: 1.8em;
margin-bottom: 0.5em;
}
blockquote {
background: #eef2ff;
color: #312e81;
border-left: 4px solid #6366f1;
padding: 12px 14px;
margin: 1.2em 0;
}
code {
background: #0f172a;
color: #e2e8f0;
border-radius: 6px;
padding: 3px 6px;
}
pre {
background: #0f172a;
color: #e2e8f0;
border-radius: 10px;
padding: 16px;
border: 1px solid #1e293b;
overflow-x: auto;
}
pre code {
background: transparent;
padding: 0;
}
hr {
border: none;
border-top: 1px solid var(--border);
margin: 1.8em 0;
}
ul {
margin: 0.4em 0 0.8em;
padding-left: 1.4em;
}
strong {
color: #0f172a;
}
</style>
> **تاریخ به‌روزرسانی**: 1403/10/06 (2024-12-26)
> **وضعیت کلی**: 99% تکمیل شده
> **مسیر توسعه**: CMS → BackOffice.BFF → BackOffice (UI) → FrontOffice.BFF → FrontOffice
---
## 📊 خلاصه وضعیت کلی پروژه
### ✅ تکمیل شده
- **CMS Microservice**: 95% (12 از 12 Phase کامل، 9 TODO handlers باقیمانده)
- **BackOffice.BFF**: 85% (47 Handler تکمیل، 8 TODO handlers، 19 Discount Shop handlers باقیمانده)
- **BackOffice UI**: 95% (60 صفحه آماده Production - قابل تحویل به Admin)
- **FrontOffice.BFF**: 80% ✅ (Proto Projects + Handlers متصل به CMS)
- **FrontOffice UI**: 60% ✅ (Mock Services → gRPC تبدیل شده)
### 🔴 اولویت‌های اصلی (باید انجام شوند)
1. ~~تکمیل Payment Gateway Integration (CMS Phase 10)~~ ✅ Backend Complete (90%)
- ✅ DayaPaymentService پیاده‌سازی کامل
- ✅ GetWithdrawalReports Query (CMS + BackOffice.BFF + gRPC Service)
- ⏸️ BackOffice UI (Withdrawal Management + Reports تقریباً کامل؛ تست‌های Daya و خروجی PDF باقیمانده)
2. ~~Club Discount Shop System (CMS Phase 9)~~ ✅ Complete
3. ~~Product Bulk Operations~~ ✅ Backend Complete (100%)
4. ~~Order Management~~ ✅ Backend + BackOffice.BFF Complete (UI improvements باقیمانده)
5. ~~Public Messages System~~ ✅ CMS + BackOffice.BFF + BackOffice UI Complete
6. **Package Purchase System** ✅ Proto/gRPC Complete (4 TODO handlers باقیمانده)
7. **Discount Shop - BackOffice Integration** ✅ تکمیل شده (19 handlers + BackOffice UI متصل)
### 📦 **قابل تحویل به Admin**:
-**BackOffice با 56 صفحه کاملاً کاربردی**
- Dashboard, Users, Products, Orders, Categories
- Commission, Network, Packages, Roles, Settings
-**CMS Backend کامل برای**:
- Discount Shop, Tags, Product Bulk Ops, Withdrawal Reports
- ⚠️ **نیاز به تکمیل**:
- 9 TODO handlers در CMS
- ~~27 TODO handlers در BackOffice.BFF~~ ✅ handlers BackOffice.BFF تکمیل شده‌اند
- UI برای گزارش‌های پیشرفته (Reports) و برخی بهبودهای FrontOffice
---
## 🎯 مسیر پیشنهادی توسعه
```
مرحله 1: تکمیل CMS Core APIs ✅ COMPLETE
├── ✅ Payment Gateway (100%)
├── ✅ Club Discount Shop System (100%)
├── ✅ CRUD های پایه
├── ✅ Commission & Worker System
└── ✅ Withdrawal & Settlement
مرحله 2: تکمیل Payment Gateway + CRUD اضافی (در حال انجام)
├── ✅ Payment Gateway Backend (100%)
│ ├── ✅ DayaPaymentService Implementation
│ ├── ✅ GetWithdrawalReports (CMS + BFF + gRPC)
│ ├── [✅] CMS gRPC Service (GetWithdrawalReports)
│ └── [🟡] BackOffice UI (Reports و Withdrawal Management انجام شده، PDF و تست‌های Daya باقیمانده)
├── [✅] Product Bulk Operations - نیم روز
├── [✅] Order Management - نیم روز (بهبود UI: Timeline، نمودارها، Cancel/Status/Discount در BackOffice UI)
└── [ ] Public Messages System - نیم روز (تنها بهبودهای UX/UI)
مرحله 3: BackOffice UI تکمیلی
├── [🟡] Financial Reports Page - 1.5 روز (WithdrawalReports + SalesReports پیاده‌سازی شده؛ خروجی PDF باقیمانده)
├── [🟡] Withdrawal Management Page - 2 روز (صفحه عملیاتی شده؛ جستجو بر اساس UserId/IbanNumber باقیمانده)
└── [🟡] Product Bulk Operations UI - نیم روز (Bulk actions در ProductsMainPage.razor انجام شده؛ صفحه BulkEdit مجزا باقیمانده)
مرحله 4: FrontOffice (اولویت اصلی بعدی) ✅ 70% Complete
├── FrontOffice.BFF APIs - ✅ 80% Complete
│ ├── ✅ Browse Discount Shop Products (Proto ready)
│ ├── ✅ Club Membership APIs
│ ├── ✅ Network APIs
│ ├── ✅ Commission APIs
│ ├── ✅ Wallet APIs (6 handlers)
│ ├── [ ] Shopping Cart Management
│ └── [ ] Order Placement
└── FrontOffice UI Pages - ✅ 60% Complete
├── ✅ Product Catalog (متصل به gRPC)
├── ✅ Shopping Cart
├── ✅ Checkout Flow
├── ✅ Order History
├── ✅ Club & Commission Pages (متصل به gRPC)
├── ✅ Network Pages (متصل به gRPC)
├── ✅ Wallet Pages (متصل به gRPC)
└── [ ] Package Purchase (4 صفحه)
```
---
## 🔴 بخش 1: CMS Microservice - کارهای باقی‌مانده
### 1.0 تصحیحات و بهبودهای فوری ⚠️ **بحرانی**
**وضعیت**: ✅ کامل شده
**زمان انجام**: 2 روز (4 دسامبر 2024)
#### ✅ تکمیل شده:
- UserWalletChangeLog: اضافه شدن فیلدهای CurrentDiscountBalance و ChangeDiscountValue ✅
- حذف ParentId از User (فقط NetworkParentId باقی ماند) ✅
- Migration های مربوطه ✅
- **اصلاح حق عضویت باشگاه** ✅
- فیلد GiftValue به ClubMembership اضافه شد
- حق عضویت (25,200,000) از کیف پول کم نمی‌شود
- مقدار از SystemConfiguration خوانده می‌شود
- **اصلاح Flash Out Logic** ✅
- فرمول صحیح پیاده‌سازی شد: balancesConsumedPerSide = balancesToPay / 2
- هر طرف نصف تعادل را مصرف می‌کند
- محاسبه باقیمانده‌ها درست شد
- **UserPackagePurchase Entity** ✅
- جدول جهت پشتیبانی از خرید چندین پکیج ایجاد شد
- Configuration و Migration آماده
- DbSet به ApplicationDbContext اضافه شد
---
### 1.1 Payment Gateway Integration (Phase 10) ⭐ **فوری**
**وضعیت**: 90% تکمیل (Backend + گزارش‌های مالی + صفحات اصلی UI)
**زمان تخمینی**: 4-5 روز کاری باقیمانده
#### ✅ تکمیل شده:
- Commands: RequestWithdrawal, ProcessWithdrawal, ApproveWithdrawal, RejectWithdrawal
- Database: UserCommissionPayout, CommissionPayoutHistory
- IPaymentGatewayService Interface
- MockPaymentGatewayService (برای Development)
- DayaPaymentService: پیاده‌سازی کامل (InitiatePaymentAsync, VerifyPaymentAsync, ProcessPayoutAsync) ✅
- ProcessWithdrawalCommandHandler یکپارچه با Gateway ✅
- Entity Updates: BankReferenceId, BankTrackingCode, PaymentFailureReason ✅
- Enum: PaymentFailed status ✅
- Configuration: appsettings.json DayaPayment section ✅
- **گزارش‌های مالی Backend** ✅ (4 دسامبر 2024):
- CMS: GetWithdrawalReportsQuery + Handler + DTOs
- BackOffice.BFF: GetWithdrawalReportsQuery + Handler
- Proto: GetWithdrawalReports RPC با message definitions
- دسته‌بندی روزانه/هفتگی/ماهانه با پشتیبانی تقویم شمسی
- خلاصه آماری (تعداد، مبلغ، نرخ موفقیت)
#### 🟡 بخش‌های باقیمانده:
**الف. CMS gRPC Service (1 روز) - ✅ انجام شده**
```
- [✅] ایجاد CommissionService یا به‌روزرسانی موجود
- [✅] پیاده‌سازی GetWithdrawalReports RPC handler
- [✅] Mapping از Domain به Proto
- [✅] تست gRPC endpoint
```
**ب. BackOffice UI - Withdrawal Management (2 روز)**
```
- ✅ صفحه لیست درخواست‌های برداشت
- ✅ دکمه‌های تأیید/رد با Confirmation Dialog (متصل به ApproveWithdrawal / RejectWithdrawal / ProcessWithdrawal)
- ✅ نمایش BankReferenceId و TrackingCode
- ✅ نمایش وضعیت PaymentFailed و دلیل خطا
- ✅ فیلترینگ بر اساس Status (CommissionPayoutStatus)
- ✅ جستجو بر اساس UserId/IbanNumber
```
**ج. BackOffice UI - Financial Reports (1.5 روز)**
```
- [✅] صفحه گزارش‌های مالی با فیلترها (تاریخ، نوع دوره، وضعیت، کاربر)
- [✅] نمایش گزارش‌های دوره‌ای (روزانه/هفتگی/ماهانه)
- [✅] نمودارها (MudBlazor Charts به‌جای Chart.js)
- [✅] نمایش خلاصه آماری (کارت‌های اطلاعاتی در WithdrawalReports/SalesReports)
- [✅] خروجی Excel/CSV (Export به فایل از طریق UI)
- [🟡] خروجی PDF (در حال حاضر خروجی متنی ساختارمند از طریق jsSaveAsFile؛ ادغام QuestPDF در نسخه بعدی)
```
**د. تست یکپارچه (نیم روز)**
```
- [ ] تست تراکنش‌های واقعی با Daya API
- [ ] تست Callback/Webhook مدیریت
- [ ] تست retry logic در شرایط خطا
```
---
### 1.2 CRUD های اضافی ⭐ **بالا**
**وضعیت**: 80% (Tag Management و Product Bulk Operations کامل شده، Order Management در BFF تکمیل)
**زمان تخمینی**: 1 روز باقیمانده
#### الف. Tag Management ✅ **کامل شده** (4 دسامبر 2024)
```
CMS Application Layer: ✅
- [✅] CreateTagCommand + Handler + Validator
- [✅] UpdateTagCommand + Handler + Validator
- [✅] DeleteTagCommand + Handler
- [✅] AssignTagToProductCommand + Handler (ProductTag entity)
- [✅] GetAllTagsQuery + Handler
- [✅] GetProductsByTagQuery + Handler
- [✅] Proto: tag.proto, producttag.proto موجود
- [✅] gRPC Services: TagService, ProductTagService
- [✅] Mapping: TagProfile با Mapster
BackOffice.BFF: ✅
- [✅] CreateTagCommand + Handler
- [✅] UpdateTagCommand + Handler
- [✅] DeleteTagCommand + Handler
- [✅] AssignTagToProductCommand + Handler
- [✅] GetAllTagsQuery + Handler
- [✅] GetTagQuery + Handler
- [✅] GetProductsByTagQuery + Handler
- [✅] gRPC Clients: Tags, ProductTags registered
- [✅] Typo Fixes: ProductGallerys→ProductGalleries, PruductCategory→ProductCategory
BackOffice UI: ✅
- [✅] صفحه مدیریت Tags (لیست + جستجو بر اساس نام/عنوان، فیلتر وضعیت، pagination)
- [✅] Dialog ایجاد/ویرایش Tag (Name, Title, Description, IsActive, SortOrder)
- [✅] صفحه/دیالوگ Assign Tags به محصولات (از طریق ProductsMainPage → AssignTagsDialog، شامل نمایش تگ‌های فعلی هر محصول و امکان حذف آن‌ها)
```
**مستندات**: Backend + BackOffice.BFF + UI کامل برای Tag Management
#### ب. Product Bulk Operations ✅ **کامل شده** (4 دسامبر 2024)
```
CMS Application Layer: ✅
- [✅] BulkUpdateProductPricesCommand + Handler + Validator
- [✅] BulkUpdateProductStockCommand + Handler + Validator
- [✅] GetLowStockProductsQuery + Handler + Validator
- [✅] ToggleProductStatusCommand + Handler + Validator
- [✅] Response DTOs با error tracking
- [✅] Logging برای همه عملیات
CMS Protobuf + gRPC: ✅
- [✅] products.proto: 4 RPC جدید (BulkUpdateProductPrices, BulkUpdateProductStock, GetLowStockProducts, ToggleProductStatus)
- [✅] Message definitions: ProductPriceUpdate, ProductStockUpdate, LowStockProduct, BulkOperationError
- [✅] StockUpdateType enum (Set/Add/Subtract)
- [✅] ProductsService: 4 handler افزوده شد
- [✅] Mapster mappings در ProductsProfile
BackOffice.BFF: ✅
- [✅] BulkUpdateProductPricesCommand + Handler
- [✅] BulkUpdateProductStockCommand + Handler
- [✅] GetLowStockProductsQuery + Handler
- [✅] ToggleProductStatusCommand + Handler
- [✅] DTOs با rename برای جلوگیری از conflict با proto
- [✅] gRPC client integration
BackOffice UI: ✅
- [✅] DataGrid با انتخاب چندتایی و Bulk Actions (ToggleStatus/Delete) در ProductsMainPage.razor
- [✅] صفحه Bulk Edit Products (Pages/Products/BulkEdit.razor) با DataGrid و Multiple Selection
- [✅] فرم Bulk Update برای ویرایش هم‌زمان قیمت، تخفیف، موجودی (StockUpdateType: Set/Add/Subtract) و وضعیت (Toggle Status) چند محصول، متصل به BulkUpdateProductPrices / BulkUpdateProductStock / ToggleProductStatus
```
#### ج. Order Management ✅ **کامل شده** (4 دسامبر 2024)
```
CMS Application Layer: ✅
- [✅] CancelOrderCommand + Handler + Validator (از قبل موجود)
- [✅] UpdateOrderStatusCommand + Handler + Validator (TODO با راهنمای State Machine)
- [✅] GetOrdersByDateRangeQuery + Handler + Validator (TODO با فیلترهای پیشرفته و Pagination)
- [✅] ApplyDiscountToOrderCommand + Handler + Validator (TODO با validation تخفیف دستی)
- [✅] CalculateOrderPVQuery + Handler + Validator (TODO با محاسبه PV برای MLM)
- [✅] Response DTOs با error handling
BackOffice.BFF: ✅
- [✅] 5 Handlers (CancelOrder, UpdateOrderStatus, GetOrdersByDateRange, ApplyDiscountToOrder, CalculateOrderPV)
BackOffice UI: ✅
- [✅] دکمه Cancel Order با Dialog دلیل لغو و انتخاب بازگشت وجه (CancelOrderDialog → CancelOrder)
- [✅] Dialog تغییر Status ارسال (ChangeOrderStatusDialog → UpdateOrderStatus) در UserOrderMainPage.razor
- [✅] فیلترهای پیشرفته (شناسه سفارش/کاربر/تراکنش، فیلترهای ترکیبی)
- [✅] Dialog اعمال تخفیف (ApplyDiscountDialog → ApplyDiscountToOrder)
```
**سطوح دسترسی**:
- SuperAdmin: همه عملیات ✅
- Admin: همه عملیات محصولات/سفارشات ✅
- Inspector: فقط مشاهده ✅
---
### 1.3 Public Messages System ⭐ **متوسط**
**وضعیت**: ✅ 100% تکمیل CMS Backend (4 دسامبر 2024)
**زمان صرف شده**: 1 روز
#### ✅ تکمیل شده:
```
CMS:
- [✅] Proto: public_messages.proto موجود
- [✅] Entity: PublicMessage (merged با فیلدهای کامل)
- Title, Content, Type (MessageType enum)
- Priority (MessagePriority enum)
- IsActive, IsArchived
- StartDate, EndDate, PublishedAt, ArchivedAt
- CreatedByUserId, ViewCount, LinkUrl, LinkText
- StartsAt/ExpiresAt (backward compatibility properties)
- [✅] Enum: MessageType (Announcement, News, Warning, Promotion, SystemUpdate, Event)
- [✅] CreatePublicMessageCommand + Handler + Validator (موجود)
- [✅] UpdatePublicMessageCommand + Handler + Validator (موجود)
- [✅] DeletePublicMessageCommand + Handler (موجود)
- [✅] PublishMessageCommand + Handler + Validator (TODO)
- [✅] ArchiveMessageCommand + Handler + Validator (TODO)
- [✅] GetAllMessagesQuery + Handler + Validator (موجود - AdminPublicMessageDto)
- [✅] GetActiveMessagesQuery + Handler + Validator (موجود - PublicMessageDto)
- [✅] GetPublicMessageQuery + Handler + Validator (TODO - single message)
```
**نکته مهم**:
- Entity از قبل دو نسخه موجود بود (Entities/PublicMessage.cs و Entities/Message/PublicMessage.cs)
- نسخه قدیمی حذف و نسخه جدید merge شد
- Commands/Queries قبلی موجود بودند: Create, Update, Delete, GetAll, GetActive
- 3 operation جدید اضافه شد: PublishMessage, ArchiveMessage, GetPublicMessage
- DTOs آپدیت شدند برای nullable dates (StartsAt, ExpiresAt, CreatedByUserId)
#### ❌ باقی‌مانده:
```
CMS:
- [✅] Proto: public_messages.proto موجود
- [✅] Entity: PublicMessage (Title, Content, Type, StartDate, EndDate, IsActive)
- [✅] Enum: MessageType (Info, Warning, Error, Success)
#### ❌ باقی‌مانده:
```
BackOffice.BFF:
- [✅] 8 Handlers (Create/Update/Delete/Publish/Archive/GetAll/GetActive/GetById)
BackOffice UI:
- [✅] صفحه لیست اعلانات (DataGrid)
- [✅] Dialog ایجاد/ویرایش اعلان
- [✅] دکمه Publish/Archive
- [✅] پیش‌نمایش اعلان
```
**سطوح دسترسی**:
- SuperAdmin: همه عملیات ✅
- Admin: Create, Update, Publish ✅
- Inspector: فقط مشاهده ✅
**مستندات**: `CMS/public-messages-system.md` موجود است
---
### 1.4 Package Purchase System 🔴 **بسیار بالا** (جدید)
**وضعیت**: ✅ 85% تکمیل Backend (4 دسامبر 2024)
**زمان صرف شده**: 1.5 روز
**زمان باقیمانده**: 0.5 روز Backend + UI
**مستندات**: `totalDoc/CMS/package-purchase-system.md` ✅
#### ✅ الف. Entity Changes (1 روز) - تکمیل شده
```
- [✅] ایجاد Enum: PackagePurchaseMethod (None, DayaLoan, DirectPurchase)
محل: CMSMicroservice.Domain/Enums/PackagePurchaseMethod.cs
- [✅] اضافه کردن فیلد به User:
public PackagePurchaseMethod PackagePurchaseMethod { get; set; } = PackagePurchaseMethod.None;
- [✅] اضافه کردن فیلد به ClubMembership:
public PackagePurchaseMethod PurchaseMethod { get; set; }
- [ ] ایجاد Migration: AddPackagePurchaseMethod (نیاز به migration دستی)
- [ ] Update-Database
```
#### ✅ ب. Commands & Handlers (1 روز) - تکمیل شده
```
CMS Application Layer:
- [✅] PurchaseGoldenPackageCommand + Handler + Validator (TODO)
- بررسی User.PackagePurchaseMethod != None
- ثبت UserOrder با PackageId
- Redirect به درگاه IPG
- InitiatePaymentAsync از IPaymentGatewayService
- [✅] VerifyGoldenPackagePurchaseCommand + Handler + Validator (TODO)
- Verify پرداخت با بانک
- شارژ UserWallet.Balance (56M)
- ثبت Transaction (Type: DepositIpg)
- ثبت UserWalletChangeLog
- Set User.PackagePurchaseMethod = DirectPurchase
- به‌روزرسانی UserOrder
- [✅] ActivateClubMembershipCommand + Handler (موجود - آپدیت شده)
- بررسی User.PackagePurchaseMethod != None
- بررسی UserWallet.Balance >= 56M
- پیدا کردن UserOrder با PackageId
- بررسی Transaction.Type (DepositIpg یا DepositExternal1)
- ثبت/به‌روزرسانی ClubMembership
- Set ClubMembership.PurchaseMethod
- [ ] ChargeDiscountWalletCommand + Handler
- Redirect به درگاه برای شارژ DiscountBalance
- [ ] VerifyDiscountWalletChargeCommand + Handler
- Verify پرداخت
- شارژ UserWallet.DiscountBalance
- ثبت Transaction (Type: DiscountWalletCharge)
```
#### ج. به‌روزرسانی DayaLoan Flow (0.5 روز)
```
- [ ] تغییر ProcessDayaLoanCommandHandler:
user.PackagePurchaseMethod = PackagePurchaseMethod.DayaLoan;
- [✅] GetUserPackageStatusQuery + Handler + Validator (TODO)
- دریافت وضعیت خرید پکیج کاربر
- PackagePurchaseMethod, HasPurchased, IsClubMemberActive
- WalletBalance, CanActivateClubMembership
```
#### ✅ ج. gRPC & Proto (0.5 روز) - تکمیل شده
```
CMS:
- [✅] package.proto:
- PurchaseGoldenPackage RPC
- VerifyGoldenPackagePurchase RPC
- GetUserPackageStatus RPC
- Request/Response messages
- [✅] PackageService.cs: پیاده‌سازی 3 RPC جدید
- [✅] PackageProfile.cs: Mapster mappings (Command/Query ↔ Proto)
BackOffice.BFF:
- [✅] package.proto: GetUserPackageStatus RPC (Admin view)
- [✅] PackageService.cs: پیاده‌سازی RPC
- [✅] GetUserPackageStatusQuery + Handler + Validator (TODO)
- [✅] PackageProfile.cs: Mapster mapping
- [✅] Project Reference: BackOffice.BFF.Package.Protobuf added
```
#### ❌ د. BackOffice UI (نیم روز) - باقیمانده
```
- [ ] تست PurchaseGoldenPackageCommand:
- کاربر با PackagePurchaseMethod != None → خطا
- کاربر جدید → موفق
- [ ] تست ActivateClubMembershipCommand:
- کاربر بدون پکیج → خطا
- کاربر با موجودی < 56M → خطا
- کاربر معتبر → موفق
- [ ] تست VerifyDiscountWalletChargeCommand:
- پرداخت موفق → DiscountBalance افزایش یابد
```
#### ه. Documentation (0.5 روز)
```
- [✅] package-purchase-system.md ایجاد شد
- [ ] به‌روزرسانی implementation-progress.md
```
**نکات کلیدی**:
- کاربر فقط **یک بار** می‌تواند پکیج طلایی بخرد (سناریو 1 یا 2)
- فعالسازی باشگاه **توسط خود کاربر** از FrontOffice UI
- فعالسازی باشگاه **بدون نیاز به تایید Admin**
- سناریو 3 (شارژ DiscountBalance) **هیچ ارتباطی** با Package ندارد
- کمیسیون‌ها **فقط بعد** از فعالسازی ClubMembership محاسبه می‌شوند
---
### 1.5 Discount Shop System 🟡 **متوسط** (جدید)
**وضعیت**: 0%
**زمان تخمینی**: 15.5 روز (~3 هفته)
**مستندات**: `totalDoc/CMS/discount-shop-system.md` ✅
#### الف. Entity Creation (2 روز)
```
CMS Domain (namespace: DiscountShop):
- [ ] DiscountProduct
- Title, Description, Price, DiscountPercent
- ImagePath, ThumbnailPath
- SaleCount, ViewCount, RemainingCount
- IsActive
- [ ] DiscountCategory
- Name, Title, Description, ImagePath
- ParentId (self-referencing)
- IsActive, SortOrder
- [ ] DiscountProductCategory (Many-to-Many)
- [ ] DiscountShoppingCart
- UserId, DiscountProductId, Count, UnitPrice
- [ ] DiscountOrder
- UserId, TotalAmount, DiscountAmount, PayableAmount
- PaymentStatus, PaymentDate, TransactionId
- UserAddressId, DeliveryStatus, TrackingCode
- [ ] DiscountOrderDetail
- DiscountOrderId, DiscountProductId
- Quantity, UnitPrice, DiscountPercent, TotalPrice
CMS Infrastructure:
- [ ] Configuration classes برای هر Entity
- [ ] به‌روزرسانی DbContext
- [ ] Migration: AddDiscountShopTables
- [ ] Update-Database
```
#### ب. CMS Commands & Queries (3 روز)
```
DiscountProduct CRUD:
- [ ] CreateDiscountProductCommand + Handler + Validator
- [ ] UpdateDiscountProductCommand + Handler + Validator
- [ ] DeleteDiscountProductCommand + Handler
- [ ] GetDiscountProductByIdQuery + Handler + DTO
- [ ] GetDiscountProductsListQuery + Handler + DTO
DiscountCategory CRUD:
- [ ] CreateDiscountCategoryCommand + Handler + Validator
- [ ] UpdateDiscountCategoryCommand + Handler + Validator
- [ ] DeleteDiscountCategoryCommand + Handler
- [ ] GetDiscountCategoriesTreeQuery + Handler + DTO
Shopping Cart:
- [ ] AddToDiscountCartCommand + Handler
- [ ] RemoveFromDiscountCartCommand + Handler
- [ ] GetDiscountCartQuery + Handler + DTO
Order:
- [ ] CreateDiscountOrderCommand (Checkout) + Handler
- بررسی UserWallet.DiscountBalance
- کم کردن موجودی
- ثبت Transaction (Type: Buy)
- ثبت DiscountOrder + DiscountOrderDetail
- خالی کردن Cart
- [ ] GetDiscountOrderByIdQuery + Handler + DTO
- [ ] GetMyDiscountOrdersQuery + Handler + DTO
- [ ] UpdateDiscountOrderDeliveryCommand + Handler (Admin)
```
#### ج. BackOffice.BFF APIs (1 روز)
```
Proto: DiscountShopContract.proto
- [ ] CreateDiscountProduct
- [ ] UpdateDiscountProduct
- [ ] GetDiscountProducts
- [ ] CreateDiscountCategory
- [ ] GetDiscountCategoriesTree
- [ ] GetDiscountOrders
- [ ] UpdateDiscountOrderDelivery
Handlers: 7 عدد
```
#### د. FrontOffice.BFF APIs (1 روز)
```
Proto: DiscountShopContract.proto
- [ ] GetDiscountProducts (Browse)
- [ ] GetDiscountProductById
- [ ] AddToDiscountCart
- [ ] GetMyDiscountCart
- [ ] RemoveFromDiscountCart
- [ ] CheckoutDiscountCart
- [ ] GetMyDiscountOrders
Handlers: 7 عدد
```
#### ه. BackOffice UI (3 روز)
```
- [ ] صفحه لیست محصولات تخفیفی + CRUD
- [ ] صفحه مدیریت دسته‌بندی‌ها (Tree View) + CRUD
- [ ] صفحه لیست سفارشات تخفیفی
- [ ] تغییر وضعیت ارسال سفارشات
- [ ] گزارش فروش Discount Shop
```
#### و. FrontOffice UI (3 روز)
```
- [ ] صفحه لیست محصولات تخفیفی (با فیلتر)
- [ ] صفحه جزئیات محصول تخفیفی
- [ ] سبد خرید تخفیفی
- [ ] Checkout (نمایش DiscountBalance)
- [ ] لیست سفارشات تخفیفی کاربر
```
#### ز. Unit Tests (2 روز)
```
- [ ] تست CRUD محصولات تخفیفی
- [ ] تست AddToDiscountCart
- [ ] تست CheckoutDiscountCart:
- موجودی کافی → موفق
- موجودی ناکافی → خطا
```
#### ح. Documentation (0.5 روز)
```
- [✅] discount-shop-system.md ایجاد شد
- [ ] به‌روزرسانی implementation-progress.md
```
**نکات کلیدی**:
- خرید از Discount Shop **فقط** با `DiscountBalance`
- خرید از Regular Shop **فقط** با `Balance`
- هیچ ارتباطی بین محصولات Discount و Regular نیست
- Admin مدیریت جداگانه برای هر فروشگاه
- پرداخت از **یک درگاه** مشترک ولی Transaction Types متفاوت
---
### 1.6 Manual Payment System ⭐ **بالا**
**وضعیت**: 0%
**زمان تخمینی**: 2 روز
```
CMS Domain:
- [ ] ManualPaymentStatus enum:
- PendingAdminApproval = 0
- PendingPayment = 1
- PaymentCompleted = 2
- Rejected = 3
- Expired = 4
- [ ] ManualPaymentMethod enum:
- CardToCard = 0 (کارت‌به‌کارت)
- OnlineGateway = 1 (درگاه آنلاین)
- [ ] ManualPaymentRequest entity:
- UserId, Amount, Method, Status
- ReceiptImagePath, AdminNotes
- RequestedAt, ProcessedAt, ExpiresAt
CMS Application:
- [ ] CreateManualPaymentRequestCommand + Handler + Validator
* Check: کاربر فقط یک درخواست Pending داشته باشد
* CardToCard → Status=PendingAdminApproval
* OnlineGateway → Status=PendingPayment, ایجاد URL درگاه
- [ ] VerifyManualPaymentCommand + Handler (بعد از بازگشت از درگاه)
- [ ] ApproveManualPaymentCommand + Handler (Admin)
* شارژ کیف پول کاربر
* Status → PaymentCompleted
- [ ] RejectManualPaymentCommand + Handler (Admin)
* AdminNotes
* Status → Rejected
- [ ] ProcessManualPaymentCommand + Handler (Internal worker)
* شارژ خودکار بعد از تأیید پرداخت
- [ ] GetUserManualPaymentHistoryQuery + Handler
- [ ] GetPendingManualPaymentsQuery + Handler (Admin)
CMS Infrastructure:
- [✅] IPaymentGatewayService (از قبل موجود)
- [ ] IFileStorageService (آپلود تصویر رسید)
* LocalFileStorageService
* AzureBlobStorageService (optional)
BackOffice.BFF:
- [ ] 7 Handlers
BackOffice UI:
- [ ] صفحه لیست درخواست‌های Manual Payment (Admin)
- [ ] Dialog نمایش رسید (تصویر)
- [ ] دکمه‌های Approve/Reject
- [ ] فیلتر Status
```
**Flow**:
```
User → CreateManualPaymentRequest
├── CardToCard → آپلود رسید → Status=PendingAdminApproval
└── OnlineGateway → Redirect به درگاه → VerifyManualPayment → Status=PaymentCompleted
Admin → GetPendingManualPayments → Approve/Reject
```
**مستندات**: `CMS/manual-payment-system.md` موجود است (537 خط)
---
### 1.7 VAT System (مالیات بر ارزش افزوده) ⭐ **متوسط**
**وضعیت**: 0%
**زمان تخمینی**: 2 روز
```
CMS Domain:
- [ ] اضافه کردن VatPercentage به UserOrder entity
- [ ] اضافه کردن VatAmount (محاسبه شده) به UserOrder
CMS Application:
- [ ] Command: SetDefaultVatPercentageCommand (Admin)
- [ ] Query: GetCurrentVatPercentageQuery
- [ ] محاسبه VatAmount در CreateOrderCommand:
VatAmount = (TotalAmount × VatPercentage) / 100
CMS Configuration:
- [ ] اضافه کردن به ConfigurationKeys:
DefaultVatPercentage = 10 (پیش‌فرض 10%)
BackOffice.BFF:
- [ ] Handler: GetCurrentVatPercentageQuery
- [ ] Handler: SetDefaultVatPercentageCommand
BackOffice UI:
- [ ] نمایش VatAmount در لیست سفارشات
- [ ] نمایش VatPercentage در جزئیات سفارش
- [ ] صفحه تنظیمات VAT (Settings/General)
* فیلد عددی برای VatPercentage
* دکمه ذخیره
* نمایش: "شامل 10% مالیات بر ارزش افزوده"
FrontOffice UI:
- [ ] نمایش VAT در سبد خرید
- [ ] نمایش VAT در صفحه Checkout
* "شامل 10% مالیات بر ارزش افزوده"
* جزئیات: مبلغ کالا + مالیات = مبلغ نهایی
```
---
### 1.8 RBAC (Role-Based Access Control) ⭐⭐ **حیاتی**
**وضعیت**: 0%
**زمان تخمینی**: 1.5 هفته (10 روز کاری)
#### 3 نقش اصلی:
**1. SuperAdmin (سوپر ادمین)**
```
دسترسی کامل به:
- ✅ تمام بخش‌ها
- ✅ مدیریت کاربران
- ✅ مدیریت نقش‌ها
- ✅ تنظیمات سیستم
- ✅ Configuration Keys
- ✅ تغییر VAT
- ✅ حذف هر چیزی
```
**2. Admin (ادمین)**
```
دسترسی به:
- ✅ Dashboard
- ✅ سفارشات (Create, Update, Cancel)
- ✅ محصولات (CRUD)
- ✅ کاربران (View, Update - بدون Delete)
- ✅ کمیسیون‌ها (View, Approve Withdrawal)
- ✅ Public Messages (Create, Update, Publish)
- ❌ تنظیمات حساس (Configuration Keys, VAT)
- ❌ حذف کاربران
- ❌ مدیریت نقش‌ها
```
**3. Inspector (بازرس - فقط مشاهده)**
```
دسترسی به:
- ✅ Dashboard (Read-Only)
- ✅ گزارش‌ها (View)
- ✅ سفارشات (View)
- ✅ کاربران (View)
- ✅ کمیسیون‌ها (View)
- ❌ هیچ عملیات ویرایش/حذف/ایجاد
- ❌ Approve/Reject
- ❌ تنظیمات
```
#### پیاده‌سازی:
**الف. CMS Domain (1 روز)**
```
- [✅] Role entity و UserRole موجود است
- [ ] Permission entity:
- Id, Name, DisplayName, Category
- مثال: "orders.create", "orders.update", "orders.delete", "orders.view"
- [ ] RolePermission entity (Many-to-Many)
- [ ] Seed Data: 3 نقش + Permissions مربوطه
```
**ب. CMS Application (2 روز)**
```
- [ ] IAuthorizationService interface
- [ ] AuthorizationService implementation
- [ ] CheckPermissionQuery + Handler
- [ ] GetUserPermissionsQuery + Handler
- [ ] AssignRoleToUserCommand + Handler
- [ ] CreateRoleCommand + Handler (SuperAdmin only)
- [ ] UpdateRolePermissionsCommand + Handler (SuperAdmin only)
```
**ج. CMS WebApi/Protobuf (1 روز)**
```
- [ ] اضافه کردن [Authorize(Policy = "Permission:orders.create")]
- [ ] Registration Policies در Program.cs:
builder.Services.AddAuthorization(options => {
options.AddPolicy("Permission:orders.create",
policy => policy.RequireAssertion(...));
});
```
**د. BackOffice.BFF (2 روز)**
```
- [ ] AuthorizationHandler: CheckUserPermissionHandler
- [ ] AuthorizationHandler: GetUserRolesHandler
- [ ] Middleware: Permission Check قبل از فراخوانی CMS
```
**ه. BackOffice UI (4 روز)**
```
- [ ] NavMenu.razor: فیلتر کردن Menu Items بر اساس Permission
* مثال: اگر "orders.create" نداشت، دکمه "ایجاد سفارش" نمایش نده
- [ ] AuthorizationService.cs (Client-side)
* کش کردن Permissions کاربر در LocalStorage
* Refresh هر ساعت
- [ ] صفحه مدیریت نقش‌ها (SuperAdmin only):
* لیست Roles
* Dialog: Assign Permissions به Role
* Tree View: دسته‌بندی Permissions
- [ ] صفحه مدیریت کاربران:
* Dialog: Assign Role به User
* Dropdown: SuperAdmin/Admin/Inspector
- [ ] Disable دکمه‌ها برای Inspector:
* Edit/Delete buttons → Disabled=true
* فقط View Details active
```
**مثال Permission Tree**:
```
Orders
├── orders.view
├── orders.create
├── orders.update
├── orders.delete
└── orders.approve
Commission
├── commission.view
├── commission.approve_withdrawal
└── commission.reject_withdrawal
Users
├── users.view
├── users.create
├── users.update
├── users.delete
└── users.assign_role
Settings
├── settings.view
└── settings.update
```
---
### 1.9 Club Discount Shop System (Phase 9) ✅ **تکمیل شده**
**وضعیت**: 100%
**تاریخ تکمیل**: 2024-12-04
**مدت زمان**: 1 روز
#### ✅ پیاده‌سازی کامل:
- ✅ **6 Entities**: DiscountCategory, DiscountProduct, DiscountProductCategory, DiscountShoppingCart, DiscountOrder, DiscountOrderItem
- ✅ **6 EF Configurations** + Migration (AddDiscountShopSystem)
- ✅ **13 Commands** with Handlers:
- Product: Create, Update, Delete
- Category: Create, Update, Delete
- Cart: AddToCart, RemoveFromCart, UpdateItemCount, ClearCart
- Order: PlaceOrder, CompletePayment, UpdateOrderStatus
- ✅ **6 Queries** with Handlers:
- GetDiscountProducts (with filters)
- GetDiscountProductById
- GetDiscountCategories (tree structure)
- GetUserCart (with totals)
- GetOrderById
- GetUserOrders (with pagination)
- ✅ **9 Validators**: Complete validation for all critical operations
- ✅ **4 Proto files** (529 lines, 19 gRPC RPCs)
- ✅ **4 gRPC Services**: DiscountProductService, DiscountCategoryService, DiscountShoppingCartService, DiscountOrderService
- ✅ **Hybrid Payment Logic**: MaxDiscountPercent calculation
- ✅ **Stock Management**: Automatic inventory updates
- ✅ **Build Status**: 0 errors, 287 warnings
**Business Logic**:
- کاربر می‌تواند تا سقف MaxDiscountPercent از کیف پول تخفیف استفاده کند
- مبلغ باقی‌مانده باید از طریق درگاه پرداخت شود
- Order lifecycle: Pending → Processing → Shipped → Delivered/Cancelled
**مستندات**: [implementation-progress.md](CMS/implementation-progress.md) - Phase 9 Section
---
### 1.10 Daya Loan - Real API Integration
**وضعیت**: Mock آماده، Real API منتظر
**زمان**: بستگی به آماده بودن API دایا دارد
```
- [✅] همه چیز پیاده‌سازی شده (Mock)
- [ ] جایگزینی MockDayaLoanApiService با DayaLoanApiService
- [ ] تنظیم API Key در appsettings.json
- [ ] تست Production
```
---
## 🟡 بخش 2: BackOffice.BFF - کارهای باقی‌مانده
**وضعیت کلی**: 100% برای APIهای فعلی CMS
**کارهای جدید**: 19 Handler جدید برای Discount Shop System
### 2.1 Discount Shop Integration ⭐ **فوری**
**وضعیت**: 0%
**زمان تخمینی**: 4 روز
**مستندات**: 📋 [discount-shop-integration-plan.md](BackOffice.BFF/discount-shop-integration-plan.md)
#### الف. آپدیت Interface & Context (30 دقیقه)
```csharp
IApplicationContractContext:
- [ ] DiscountProducts (DiscountProductContractClient)
- [ ] DiscountCategories (DiscountCategoryContractClient)
- [ ] DiscountShoppingCarts (DiscountShoppingCartContractClient)
- [ ] DiscountOrders (DiscountOrderContractClient)
ApplicationContractContext:
- [ ] پیاده‌سازی 4 Client جدید
- [ ] Initialize در Constructor
```
#### ب. Product Management Handlers (1 روز)
```
- [ ] CreateDiscountProductHandler
Input: Title, Description, Price, MaxDiscountPercent, Images, Categories
Output: ProductId
- [ ] UpdateDiscountProductHandler
Input: ProductId + همان فیلدهای بالا
- [ ] DeleteDiscountProductHandler
Input: ProductId
- [ ] GetDiscountProductByIdHandler
Input: ProductId
Output: تمام اطلاعات + Categories + RemainingCount
- [ ] GetDiscountProductsHandler ⭐
Input: Filters (Category, Search, Price Range, IsActive, InStock) + Pagination
Output: MetaData + List<Product>
```
#### ج. Category Management Handlers (1 روز)
```
- [ ] CreateDiscountCategoryHandler
Input: Name, Title, Description, ImagePath, ParentCategoryId
- [ ] UpdateDiscountCategoryHandler
- [ ] DeleteDiscountCategoryHandler
Logic: چک می‌کند آیا زیرمجموعه یا محصول دارد
- [ ] GetDiscountCategoriesHandler ⭐
Input: ParentCategoryId (nullable), IsActive
Output: Tree structure با recursive children
```
#### د. Shopping Cart Handlers (1 روز)
```
- [ ] AddToCartHandler (برای Support)
- [ ] RemoveFromCartHandler
- [ ] UpdateCartItemCountHandler
- [ ] GetUserCartHandler ⭐
Output: Cart Items + محاسبات (TotalPrice, DiscountAmount, FinalPrice)
- [ ] ClearCartHandler
```
#### ه. Order Management Handlers (1 روز)
```
- [ ] PlaceOrderHandler (کمتر استفاده می‌شود)
- [ ] CompleteOrderPaymentHandler (کمتر استفاده می‌شود)
- [ ] UpdateOrderStatusHandler ⭐⭐⭐
Input: OrderId, NewStatus, TrackingCode, AdminNotes
مهم‌ترین Handler برای Admin
- [ ] GetOrderByIdHandler ⭐⭐⭐
Output: Order Details + Items + Address + Payment Info
- [ ] GetUserOrdersHandler ⭐⭐
Input: UserId + Pagination
Output: List<OrderSummary>
```
**اولویت پیاده‌سازی**:
1. 🔴 **فاز 1 (MVP - 2.5 روز)**: Product (5) + Category (4) + GetOrderById (1) + UpdateOrderStatus (1)
2. 🟡 **فاز 2 (Support - 1.5 روز)**: Cart (5) + GetUserOrders (1)
---
### منتظر تکمیل CMS (قدیمی - حذف شد):
```
- [ ] PaymentHandler (بعد از Payment Gateway Integration)
* InitiatePaymentHandler
* VerifyPaymentHandler
* ProcessPayoutHandler
- [ ] OrderVatHandler (بعد از VAT System)
* GetCurrentVatPercentageHandler
* SetDefaultVatPercentageHandler
- [ ] AuthorizationHandler (بعد از RBAC)
* CheckUserPermissionHandler
* GetUserRolesHandler
* AssignRoleToUserHandler
- [ ] ManualPaymentHandlers (بعد از Manual Payment System)
* CreateManualPaymentRequestHandler
* ApproveManualPaymentHandler
* RejectManualPaymentHandler
* GetPendingManualPaymentsHandler
- [ ] PublicMessageHandlers (بعد از Public Messages)
* CreatePublicMessageHandler
* UpdatePublicMessageHandler
* DeletePublicMessageHandler
* PublishMessageHandler
* GetAllPublicMessagesHandler
* GetActiveMessagesHandler
- [ ] TagManagementHandlers
* CreateTagHandler
* UpdateTagHandler
* DeleteTagHandler
* GetAllTagsHandler
- [ ] ProductBulkHandlers
* BulkUpdateProductPricesHandler
* BulkUpdateProductStockHandler
* GetLowStockProductsHandler
```
**تخمین زمان**: 5 روز (1 روز هر Feature)
**مستندات**: `BackOffice.BFF/cms-integration.md`
---
## 🟢 بخش 3: BackOffice UI - کارهای باقی‌مانده
**وضعیت کلی**: 100% برای صفحات فعلی
**کارهای جدید**: 10 صفحه جدید
### منتظر تکمیل BFF:
**الف. صفحه مدیریت تراکنش‌ها** (2 روز)
```
- [ ] Pages/Payment/Transactions.razor
* MudDataGrid با فیلتر
* Columns: RefId, Amount, Status, Date, Gateway
* دکمه View Details
* فیلتر: Date Range, Status, Gateway Type
- [ ] Components/TransactionDetailsDialog.razor
* نمایش جزئیات تراکنش
* BankReferenceId, TrackingCode
* وضعیت PaymentFailed و دلیل
```
**ب. نمایش VAT در سفارشات** (1 روز)
```
- [ ] آپدیت Pages/Orders/OrdersList.razor
* اضافه کردن ستون VatAmount
* اضافه کردن ستون VatPercentage
- [ ] آپدیت Components/OrderDetailsDialog.razor
* نمایش: "مبلغ کالا: X"
* نمایش: "مالیات (10%): Y"
* نمایش: "مبلغ نهایی: X + Y"
- [ ] Pages/Settings/VatSettings.razor
* فیلد عددی VatPercentage
* دکمه Save
```
**ج. Menu Filtering (RBAC)** (1 روز)
```
- [ ] آپدیت Shared/NavMenu.razor
* if (await AuthService.HasPermission("orders.view"))
{
<MudNavLink ... />
}
- [ ] Services/AuthorizationService.cs
* HasPermission(string permission)
* GetUserRole()
* RefreshPermissions()
```
**د. Public Messages Management** (1 روز) ✅ (پیاده‌سازی شده با ساختار نهایی)
```
- [✅] Pages/PublicMessages/PublicMessagesMainPage.razor
* DataGrid: Title, Type, Status, StartDate, EndDate, IsActive
* دکمه‌های Create, Edit, Delete, Publish/Archive
* فیلترها بر اساس نوع پیام، وضعیت و بازه زمانی
- [✅] Components/MessageFormDialog.razor
* فرم: Title, Content (Rich Text)، Type، تاریخ‌های Start/End، وضعیت، گزینه انتشار
* پیش‌نمایش و Validation کامل
- [✅] Components/MessageViewDialog.razor
* نمایش پیام به‌صورت Alert/کارت با رنگ بر اساس Type
* نمایش تصویر، لینک، آمار بازدید و تاریخ‌ها
- [✅] Components/MessageTemplatesDialog.razor
* مدیریت قالب‌های آماده پیام (ایجاد/حذف/استفاده) با ذخیره‌سازی در LocalStorage
```
**ه. Manual Payment Management** (1 روز)
```
- [ ] Pages/Payment/ManualPayments.razor
* DataGrid: User, Amount, Method, Status, RequestedAt
* فیلتر: Status (PendingAdminApproval)
* دکمه View Receipt
- [ ] Components/ManualPaymentDialog.razor
* نمایش تصویر رسید
* TextArea: AdminNotes
* دکمه‌های Approve/Reject
```
**و. Tag Management** (1 روز) ✅ (با نام‌گذاری و ساختار جدید)
```
- [✅] Pages/Tag/TagManagementPage.razor
* DataGrid: Name, Title, IsActive, ProductCount
* دکمه‌های Create, Edit, Delete
* فیلتر بر اساس نام/عنوان و وضعیت
- [✅] Components/TagEditDialog.razor
* فرم ایجاد/ویرایش Tag: Name, Title, Description, IsActive, SortOrder
- [✅] Components/AssignTagsDialog.razor
* اختصاص تگ به محصولات از طریق ProductsMainPage
* نمایش تگ‌های فعلی هر محصول و امکان حذف آن‌ها
```
**ز. Product Bulk Edit** (1 روز) ✅
```
- [✅] Pages/Products/BulkEdit.razor
* DataGrid با Multiple Selection برای لیست محصولات (با فیلترهای مشابه ProductsMainPage)
* فرم: Update Price (اجباری برای BulkUpdateProductPrices) + فیلدهای اختیاری تخفیف و تخفیف باشگاه
* فرم: Update Stock با انتخاب StockUpdateType (Set/Add/Subtract) و مقدار Quantity
* فرم: Toggle Status (فعال/غیرفعال) برای محصولات انتخاب‌شده
* دکمه Apply با Dialog تأیید و خلاصه تغییرات، اتصال مستقیم به gRPC (BulkUpdateProductPrices, BulkUpdateProductStock, ToggleProductStatus) در BackOffice.BFF
```
**ح. Role Management** (2 روز) - **SuperAdmin only**
```
- [ ] Pages/System/Roles.razor
* DataGrid: RoleName, UserCount
* دکمه Edit Permissions
- [ ] Components/RolePermissionsDialog.razor
* Tree View: Permission Categories
* Checkbox: Select/Deselect Permissions
* دکمه Save
- [ ] Pages/System/Users.razor
* ستون Role
* دکمه Assign Role
```
**ط. Withdrawal Reports** (2 روز)
```
- [ ] Pages/Commission/WithdrawalReports.razor
* Chart.js: تعداد و مبلغ برداشت‌ها
* فیلتر Date Range
* دکمه Export Excel/PDF
```
**تخمین زمان کل**: 12 روز
---
## 🔵 بخش 4: FrontOffice.BFF - کارهای باقی‌مانده
**وضعیت**: 80% ✅ (Proto Projects + Handlers متصل به CMS)
**زمان تخمینی**: 3 روز باقیمانده
### ✅ تکمیل شده (2024-12-26):
**Proto Projects (7 پروژه جدید):**
```
✅ FrontOffice.BFF.Commission.Protobuf
✅ FrontOffice.BFF.ClubMembership.Protobuf
✅ FrontOffice.BFF.NetworkMembership.Protobuf
✅ FrontOffice.BFF.DiscountShop.Protobuf
✅ FrontOffice.BFF.Package.Protobuf (جدید)
✅ FrontOffice.BFF.User.Protobuf (موجود)
✅ FrontOffice.BFF.UserWallet.Protobuf (موجود)
```
**Handlers تکمیل شده:**
```
✅ GetMyClubMembershipQuery + Handler
✅ ActivateMyClubMembershipCommand + Handler
✅ GetMyCommissionPayoutsQuery + Handler
✅ GetMyWeeklyBalancesQuery + Handler
✅ GetMyNetworkTreeQuery + Handler
✅ GetMyNetworkStatisticsQuery + Handler
✅ GetMyNetworkPositionQuery + Handler (جدید با ResponseDto)
✅ Wallet Handlers (6 عدد - متصل به CMS)
```
### تسک‌های باقیمانده:
**الف. Authentication APIs** (1 روز) - موجود نیاز به بررسی
```
- [✅] RegisterCommand + Handler
- [✅] LoginQuery + Handler
- [ ] VerifyOtpCommand + Handler (بررسی)
- [✅] RefreshTokenCommand + Handler
- [ ] LogoutCommand + Handler (بررسی)
- [✅] GetMyProfileQuery + Handler
- [✅] UpdateMyProfileCommand + Handler
```
**ب. Order APIs** (1 روز)
```
- [✅] GetMyOrdersQuery + Handler
- [✅] GetMyOrderQuery + Handler
- [ ] CreateOrderCommand + Handler
- [ ] CancelMyOrderCommand + Handler
- [ ] GetOrderTrackingQuery + Handler
```
**ج. Profile APIs** (0.5 روز)
```
- [✅] GetMyAddressesQuery + Handler
- [✅] CreateMyAddressCommand + Handler
- [✅] UpdateMyAddressCommand + Handler
- [✅] DeleteMyAddressCommand + Handler
- [ ] SetDefaultAddressCommand + Handler
```
**د. Club & Commission (Customer)** ✅ تکمیل شده
```
- [✅] GetMyClubMembershipQuery + Handler
- [✅] ActivateMyClubMembershipCommand + Handler
- [✅] GetMyCommissionPayoutsQuery + Handler
- [✅] RequestMyWithdrawalCommand + Handler
```
**ه. Network (Customer)** ✅ تکمیل شده
```
- [✅] GetMyNetworkTreeQuery + Handler
- [✅] GetMyNetworkPositionQuery + Handler
- [✅] GetMyNetworkStatisticsQuery + Handler
```
**و. Wallet (Customer)** ✅ تکمیل شده
```
- [✅] GetMyWalletQuery + Handler (با DiscountBalance)
- [✅] GetMyTransactionsQuery + Handler
- [✅] RequestWithdrawalCommand + Handler
- [✅] GetMyWithdrawalsQuery + Handler
- [✅] GetWithdrawalSettingsQuery + Handler
```
**ز. Cart (Customer)** (0.5 روز)
```
- [ ] GetMyCartQuery + Handler
- [ ] AddToMyCartCommand + Handler
- [ ] UpdateMyCartItemCommand + Handler
- [ ] DeleteMyCartItemCommand + Handler
- [ ] ClearMyCartCommand + Handler
- [ ] MergeGuestCartCommand + Handler
```
**مستندات**: `FrontOffice.BFF/README.md`
---
## 🟣 بخش 5: FrontOffice UI - کارهای باقی‌مانده
**وضعیت**: 60% ✅ (Mock Services → gRPC تبدیل شده)
**زمان تخمینی**: 2 هفته
### ✅ تکمیل شده (2024-12-26):
**Services متصل به BFF gRPC:**
```
✅ ClubMembershipService → ClubMembershipContract.ClubMembershipContractClient
✅ NetworkMembershipService → NetworkMembershipContract.NetworkMembershipContractClient
✅ CommissionService → CommissionContract.CommissionContractClient
✅ WalletService → UserWalletContract.UserWalletContractClient (6 متد)
```
**Proto References اضافه شده:**
```
✅ FrontOffice.BFF.ClubMembership.Protobuf
✅ FrontOffice.BFF.Commission.Protobuf
✅ FrontOffice.BFF.NetworkMembership.Protobuf
✅ FrontOffice.BFF.DiscountShop.Protobuf
✅ FrontOffice.BFF.UserWallet.Protobuf (ProjectReference)
```
### تسک‌های باقیمانده:
**الف. Authentication Pages** (2 روز) - موجود نیاز به بررسی
```
- [✅] Pages/Auth/Register.razor
- [✅] Pages/Auth/Login.razor
- [ ] Pages/Auth/VerifyOtp.razor (بررسی)
- [ ] Pages/Auth/ForgotPassword.razor
```
**ب. Profile Pages** (2 روز)
```
- [✅] Pages/Profile/Index.razor
- [✅] Pages/Profile/EditProfile.razor
- [✅] Pages/Profile/Addresses.razor
- [ ] Pages/Profile/ChangePassword.razor
```
**ج. Order Pages** (3 روز)
```
- [✅] Pages/Orders/MyOrders.razor
- [✅] Pages/Orders/OrderDetails.razor
- [ ] Pages/Orders/Tracking.razor
```
**د. Cart & Checkout** (3 روز)
```
- [✅] Pages/Cart/Index.razor (با نمایش VAT)
- [✅] Pages/Checkout/Shipping.razor
- [✅] Pages/Checkout/Payment.razor
- [✅] Pages/Checkout/Confirmation.razor
- [⏳] DiscountCode validation (نیاز به ValidateDiscountCode RPC در CMS)
```
**ه. Club & Commission** ✅ تکمیل شده (متصل به gRPC)
```
- [✅] Pages/Club/Membership.razor
- [✅] Pages/Commission/MyCommissions.razor
- [✅] Pages/Commission/Withdrawal.razor
```
**و. Network Pages** ✅ تکمیل شده (متصل به gRPC)
```
- [✅] Pages/Network/Tree.razor
- [✅] Pages/Network/Position.razor
```
**ز. Wallet Pages** ✅ تکمیل شده (متصل به gRPC)
```
- [✅] Pages/Wallet/Index.razor
- [✅] Pages/Wallet/Transactions.razor
- [✅] Pages/Wallet/Withdrawal.razor
```
**ح. Package Purchase** (2 روز)
```
- [ ] Pages/Packages/Index.razor
- [ ] Pages/Packages/PurchasePackage.razor
- [ ] Pages/Packages/MyPackages.razor
- [ ] Pages/Packages/PackageDetails.razor
```
### ⏳ نیاز به توسعه CMS:
```
- PackageDetail Reviews → نیاز به Review/Comment entity در CMS
- Checkout Discount Validation → نیاز به ValidateDiscountCode RPC در CMS
- Contact Form → نیاز به ContactMessage entity در CMS
```
**مستندات**: `FrontOffice/README.md`
---
## ⚙️ تنظیمات Production
### الف. Email (Gmail) - 15 دقیقه
1. ورود به Google Account Security
2. فعال‌سازی 2-Step Verification
3. ایجاد App Password
4. کپی پسورد 16 رقمی
5. آپدیت appsettings.Production.json:
```json
"Email": {
"SmtpUsername": "foursat@gmail.com",
"SmtpPassword": "xxxx xxxx xxxx xxxx"
}
```
### ب. SMS (کاوه‌نگار) - 15 دقیقه
1. ثبت‌نام در Kavenegar.com
2. کپی API Key
3. دریافت شماره Sender
4. آپدیت appsettings.Production.json:
```json
"Sms": {
"KavenegarApiKey": "YOUR_API_KEY",
"Sender": "10008663"
}
```
### ج. Connection String - 5 دقیقه
```json
"ConnectionStrings": {
"DefaultConnection": "Server=PRODUCTION_SERVER;Database=Foursat_CMS;..."
}
```
---
## 📚 مراجع و مستندات
### مستندات اصلی:
- totalDoc/CMS/implementation-progress.md (1812 خط)
- totalDoc/CMS/network-club-commission-system-v1.1.md (بیزینس)
- totalDoc/CMS/daya-loan-integration.md (361 خط)
- totalDoc/CMS/manual-payment-system.md (537 خط)
- totalDoc/BackOffice/development-plan.md (1462 خط)
- totalDoc/BackOffice.BFF/cms-integration.md
### داکیومنت هر تغییر:
- ✅ بعد از هر Feature: آپدیت implementation-progress.md
- ✅ بعد از هر API: آپدیت README.md مربوطه
- ✅ قبل از Commit: مقایسه داکیومنت با کد
- ✅ هر Business Logic: مستند کردن در مد مربوطه
---
## 🎯 اولویت‌بندی نهایی (برای شروع)
### هفته 1: Payment Gateway + CRUD
- روز 1-3: Payment Gateway Integration (Real API)
- روز 4: Tag Management
- روز 5: Product Bulk Operations
### هفته 2: Manual Payment + VAT
- روز 1-2: Manual Payment System
- روز 3-4: VAT System
- روز 5: Public Messages
### هفته 3-4: RBAC + BackOffice UI
- روز 1-5: RBAC پیاده‌سازی کامل
- روز 6-10: BackOffice UI صفحات جدید
### هفته 5-6: FrontOffice.BFF
- روز 1-10: FrontOffice.BFF APIs (همه)
### هفته 7-9: FrontOffice UI
- روز 1-15: FrontOffice UI Pages (همه)
---
**📅 زمان کل تخمینی**: 9 هفته (45 روز کاری)
**✅ بعد از تکمیل این موارد، پروژه 100% آماده Production خواهد بود.**