Files
docs/05-TASKS/BACKLOG.md
T
masoodafar-web 201915d8c5 update
2025-12-05 17:28:24 +03:30

55 KiB
Raw Blame History

📋 کارهای باقی‌مانده - تجمیع کامل پروژه FourSat

⚠️ نکته مهم: برای گزارش کامل آمادگی تحویل، مراجعه کنید به: DELIVERY-READINESS-REPORT.md


🔴 کارهای فوری BackOffice (Proto Projects Missing)

تاریخ ثبت: ۱۵ آذر ۱۴۰۴

BackOffice UI نیاز به Proto Projects زیر دارد که هنوز ساخته نشده‌اند:

Proto Project وضعیت اولویت
BackOffice.BFF.DiscountProduct.Protobuf Missing 🔴 High
BackOffice.BFF.DiscountCategory.Protobuf Missing 🔴 High
BackOffice.BFF.DiscountOrder.Protobuf Missing 🔴 High
BackOffice.BFF.Tag.Protobuf Missing 🔴 High
BackOffice.BFF.ProductTag.Protobuf Missing 🔴 High
BackOffice.BFF.PublicMessage.Protobuf Missing 🔴 High

صفحات تأثیرپذیر:

  • Pages/DiscountShop/* - تمام صفحات فروشگاه تخفیفی
  • Pages/Tag/* - مدیریت تگ‌ها
  • Pages/PublicMessages/* - پیام‌های عمومی
  • Pages/Payment/ManualPayments.razor - پرداخت دستی

راه‌حل موقت: صفحات مربوطه از Build exclude شده‌اند تا proto ها ساخته شوند.

TODO:

  1. ساخت BackOffice.BFF.DiscountProduct.Protobuf
  2. ساخت BackOffice.BFF.DiscountCategory.Protobuf
  3. ساخت BackOffice.BFF.DiscountOrder.Protobuf
  4. ساخت BackOffice.BFF.Tag.Protobuf
  5. ساخت BackOffice.BFF.ProductTag.Protobuf
  6. ساخت BackOffice.BFF.PublicMessage.Protobuf
  7. Re-include صفحات exclude شده

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

تاریخ به‌روزرسانی: ۱۵ آذر ۱۴۰۴ (2025-12-05)
وضعیت کلی: FrontOffice 98% | BackOffice 95%
مسیر توسعه: CMS → BackOffice.BFF → BackOffice (UI) → FrontOffice.BFF → FrontOffice


📊 خلاصه وضعیت کلی پروژه

تکمیل شده

  • CMS Microservice: 96% (تمام سرویس‌های مورد نیاز مشتری پیاده‌سازی شده)
  • BackOffice.BFF: 100% (35+ Handlers تکمیل)
  • BackOffice UI: 95% (60+ صفحه آماده Production)
  • FrontOffice.BFF: 98% (همه سرویس‌های مورد نیاز مشتری پیاده‌سازی شده)
  • FrontOffice UI: 98% (28+ صفحه متصل به gRPC - آماده Production)

🎉 سمت مشتری (FrontOffice) - آماده Production

تمام قابلیت‌های اصلی برای مشتری پیاده‌سازی شده:

  • احراز هویت (OTP)
  • پروفایل + آدرس‌ها
  • محصولات + دسته‌بندی
  • سبد خرید + سفارش + VAT
  • کیف پول + تراکنش‌ها
  • شبکه + کمیسیون
  • باشگاه + پکیج‌ها

🔴 کارهای باقیمانده

FrontOffice (اولویت پایین):

تسک توضیحات اولویت
Password Auth لاگین با رمز عبور (علاوه بر OTP) 🟡 Low
ForgotPassword بازیابی رمز عبور 🟡 Low
Contact Form اتصال فرم تماس به CMS 🟡 Low
Reviews نظرات محصول 🟡 Low
Discount Code کد تخفیف 🟡 Low

BackOffice (اولویت بالا):

تسک توضیحات اولویت
Manual Payment UI صفحه پرداخت دستی 🔴 High
RBAC System کنترل دسترسی 🔴 High

🎯 مسیر پیشنهادی توسعه

مرحله 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 ⭐ **بالا**
**وضعیت**: 50% (CMS + BackOffice.BFF)  
**زمان تخمینی**: 2 روز (UI و FrontOffice باقی‌مانده)

CMS Domain:

  • [] ManualPaymentStatus enum (Pending, Approved, Rejected, Cancelled)
  • [] ManualPaymentType enum (CashDeposit, DiscountWalletCharge, NetworkWalletCharge, Settlement, ErrorCorrection, Refund, Other)
  • [] ManualPayment entity (ManualPayment) با فیلدهای UserId, Amount, Type, Status, ReferenceNumber, RequestedBy, ApprovedBy, ApprovedAt, RejectionReason, TransactionId

CMS Application:

  • [] CreateManualPaymentCommand + Handler + Validator (ثبت پرداخت دستی توسط Admin)
  • [] ApproveManualPaymentCommand + Handler (تایید و اعمال روی کیف‌پول و لاگ‌ها)
  • [] RejectManualPaymentCommand + Handler (رد درخواست با دلیل)
  • [] GetAllManualPaymentsQuery + Handler (فهرست با فیلتر UserId/Status/Type/RequestedBy)
  • VerifyManualPaymentCommand / ProcessManualPaymentCommand / GetUserManualPaymentHistoryQuery (برای سناریوی FrontOffice - در این نسخه پیاده‌سازی نشده‌اند)

CMS Infrastructure:

  • [] ManualPaymentConfiguration + DbSet + Migration AddManualPaymentSystem
  • [] gRPC Service: ManualPaymentContract (Create/Approve/Reject/GetAllManualPayments)

BackOffice.BFF:

  • [] CreateManualPaymentCommandHandler (Admin → CMS.CreateManualPayment)
  • [] ApproveManualPaymentCommandHandler (SuperAdmin → CMS.ApproveManualPayment)
  • [] RejectManualPaymentCommandHandler (SuperAdmin → CMS.RejectManualPayment)
  • [] GetManualPaymentsQueryHandler (لیست/فیلتر ManualPayments از CMS)

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 (مالیات بر ارزش افزوده) ⭐ **متوسط**
**وضعیت**: ✅ تکمیل شد (CMS + BackOffice.BFF + BackOffice UI)  
**زمان تخمینی**: 2 روز

CMS Domain:

  • [] OrderVAT Entity با VatRate, BaseAmount, VatAmount, TotalAmount, IsPaid
  • [] UserOrder.HasVAT و Navigation به OrderVAT

CMS Application:

  • [] SeedVATConfigurationCommand (VAT.Rate, VAT.IsEnabled)
  • [] محاسبه VatAmount در SubmitShopBuyOrder و ذخیره در OrderVAT
  • [] اضافه شدن VatInfo به GetUserOrderResponseDto و QueryHandler

CMS Configuration:

  • [] ConfigurationScope.VAT و کلیدهای VAT.Rate, VAT.IsEnabled

BackOffice.BFF:

  • [] Handler: GetCurrentVatPercentageQuery
  • [] Handler: SetDefaultVatPercentageCommand
  • [] اضافه شدن VatAmount/VatPercentage به DTOهای UserOrder برای OrdersMainPage

BackOffice UI:

  • [] نمایش VatAmount/VatPercentage در UserOrder/OrdersMainPage.razor
  • [] نمایش BaseAmount/VatAmount/TotalAmount در UserOrderDetailsDialog
  • [] تنظیمات VAT در SystemManagement/Configuration.razor (DefaultVatPercentage)

FrontOffice UI:

  • نمایش VAT در سبد خرید
  • نمایش VAT در صفحه Checkout * "شامل 10% مالیات بر ارزش افزوده" * جزئیات: مبلغ کالا + مالیات = مبلغ نهایی

---

### 1.8 RBAC (Role-Based Access Control) ⭐⭐ **حیاتی**
**وضعیت**: 20% (لایه BackOffice.BFF آماده، CMS/WebApi/UI باقی مانده)  
**زمان تخمینی**: 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 (CQRS Query + Handler روی IPermissionService)
  • [] AuthorizationHandler: GetUserRolesHandler (CQRS Query برای برگرداندن Roles کاربر جاری)
  • [] Middleware: Permission Check قبل از فراخوانی CMS (gRPC Interceptor با Attribute: [RequiresPermission]، فعلاً روی UserOrderService, ManualPaymentService, ConfigurationService اعمال شده)

**ه. 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/UserOrder/OrdersMainPage.razor
      * اضافه کردن ستون‌های VatAmount و VatPercentage بر اساس داده‌های BackOffice.BFF.UserOrder
- [✅] آپدیت Components/UserOrderDetailsDialog.razor
      * نمایش: "مبلغ کالا: X" (BaseAmount از VAT)
      * نمایش: "مالیات (Vat%): Y"
      * نمایش: "مبلغ نهایی: X + Y" (TotalAmount از VAT)
- [✅] Pages/SystemManagement/Configuration.razor (بخش تنظیمات VAT)
      * فیلد عددی DefaultVatPercentage
      * دکمه Save با استفاده از ConfigurationContract (کلید DefaultVatPercentage)

ج. Menu Filtering (RBAC) (1 روز)

- [✅] آپدیت Shared/NavMenu.razor
      * استفاده از AuthorizationService.HasPermissionAsync برای نمایش/عدم نمایش آیتم‌های منو (Orders, Products, Roles, DiscountShop, System)
- [✅] Services/AuthorizationService.cs
      * HasPermission(string permission) (فعلاً مبتنی بر Role SuperAdmin/Admin/Inspector تا زمان پیاده‌سازی کامل Permission API در BFF)
      * GetUserRole()
      * کش در LocalStorage برای توسعه‌های بعدی

د. 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
      (پیاده‌سازی بر اساس BackOffice/Pages/Role/RoleMainPage.razor با دکمه «ویرایش دسترسی‌ها» و RolePermissionsDialog)
- [✅] Components/RolePermissionsDialog.razor
      * Tree View: Permission Categories
      * Checkbox: Select/Deselect Permissions
      * دکمه Save (فعلاً فقط UI؛ اتصال به RBAC Backend در مرحله بعد)
- [✅] Pages/System/Users.razor
      * ستون Role
      * دکمه Assign Role
      (پیاده‌سازی بر اساس BackOffice/Pages/User/UserMainPage.razor و Components/UserRoleDialog.razor)

ط. 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)

جمع‌بندی نهایی FrontOffice (سمت مشتری):

وضعیت: 98% Complete - آماده Production 🎉

تمام صفحات پیاده‌سازی شده:

✅ Authentication: Register (OTP), Login (OTP), Contract Accept
✅ Profile: Index, Personal, Addresses, Settings, Wallet, Tree
✅ Store: Products, ProductDetail, Categories, Cart, CheckoutSummary
✅ Orders: Orders, OrderDetail (VAT), OrderTracking
✅ Commission: Dashboard, History, WeeklyBalance
✅ Network: Statistics
✅ Club: Membership, Features
✅ Packages: Packages, MyPackages, PackageDetail
✅ Static: About, FAQ, Contact (Mock)

موارد Mock (Backlog - اولویت پایین):

⏳ Contact Form → نیاز به CMS entity ContactMessage
⏳ ForgotPassword → فعلاً OTP داریم، نیاز نیست
⏳ ChangePassword → فعلاً OTP داریم، UI آماده برای آینده
⏳ DiscountCode → نیاز به CMS RPC ValidateDiscountCode
⏳ Reviews → نیاز به CMS entity Review

تسک‌های حذف شده (دیگر نیاز نیست):

ج. Order Pages (3 روز)

- [✅] Pages/Orders/MyOrders.razor
- [✅] Pages/Orders/OrderDetails.razor
- [✅] Pages/Orders/OrderTracking.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:
    "Email": {
      "SmtpUsername": "foursat@gmail.com",
      "SmtpPassword": "xxxx xxxx xxxx xxxx"
    }
    

ب. SMS (کاوه‌نگار) - 15 دقیقه

  1. ثبت‌نام در Kavenegar.com
  2. کپی API Key
  3. دریافت شماره Sender
  4. آپدیت appsettings.Production.json:
    "Sms": {
      "KavenegarApiKey": "YOUR_API_KEY",
      "Sender": "10008663"
    }
    

ج. Connection String - 5 دقیقه

"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 خواهد بود.