Files
docs/05-TASKS/BACKLOG.md
T
masoodafar-web 73e1971cc3 feat: Implement Discount Shop Completion Plan with Product Image Gallery, Admin APIs, VAT Calculation, and Sales Reports
- Added DiscountProductImage entity and related configurations for product image gallery.
- Created commands and queries for managing product images.
- Developed GetAllDiscountOrders API for admin order management with various filters.
- Implemented VAT calculation service and integrated it into order processing.
- Created Sales Reports API with support for daily, weekly, and monthly reports.
- Completed gRPC services for BackOffice.BFF to expose new APIs.
- Updated Proto files and project references accordingly.
2026-01-02 00:46:08 +03:30

57 KiB
Raw Blame History

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

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


🟢 BackOffice UI - فعال‌سازی فرانت‌اند فروشگاه تخفیفی (تکمیل شده )

تاریخ تکمیل: ۱۲ دی ۱۴۰۴ (1 January 2026)

تمام سرویس‌ها و صفحات فروشگاه تخفیفی در BackOffice UI فعال شدند:

صفحه Route وضعیت
مدیریت محصولات تخفیفی /discount-products فعال
مدیریت دسته‌بندی‌ها /discount-categories فعال
مدیریت سفارشات /discount-orders فعال
گزارش فروش /sales-reports فعال
مدیریت تگ‌ها /tags فعال
پیام‌های عمومی /public-messages فعال

تغییرات در ConfigureService.cs (1 January 2026):

  1. فعال‌سازی Using statements برای proto clients
  2. ثبت gRPC Clients در DI container
  3. ثبت Application Services (DiscountProduct, DiscountCategory, DiscountOrder, Tag, PublicMessage)

🟢 Proto Projects - BackOffice (تکمیل شده )

تاریخ تکمیل: ۲۳ دی ۱۴۰۴ (13 January 2025)

تمام Proto Projects مورد نیاز BackOffice UI ساخته و فعال شدند:

Proto Project وضعیت توضیحات
BackOffice.BFF.DiscountProduct.Protobuf Done WebApi Service ساخته شد
BackOffice.BFF.DiscountCategory.Protobuf Done WebApi Service ساخته شد
BackOffice.BFF.DiscountOrder.Protobuf Done WebApi Service قبلاً موجود بود
BackOffice.BFF.DiscountShoppingCart.Protobuf Done WebApi Service + Handlers اصلاح شد
BackOffice.BFF.Tag.Protobuf Done WebApi Service ساخته شد
BackOffice.BFF.ProductTag.Protobuf Done WebApi Service + Handlers ساخته شد
BackOffice.BFF.PublicMessage.Protobuf Done WebApi Service قبلاً موجود بود
BackOffice.BFF.ManualPayment.Protobuf Done WebApi Service قبلاً موجود بود

تغییرات اصلی (13 January 2025):

  1. ساخت DiscountCategoryService.cs (4 RPCs)
  2. ساخت DiscountShoppingCartService.cs (5 RPCs)
  3. ساخت TagService.cs (6 RPCs)
  4. ساخت ProductTagService.cs (5 RPCs)
  5. ساخت Handlers برای ProductTag (Update, Delete, Get, GetAll)
  6. اصلاح Handlers برای DiscountShoppingCart (مطابقت با CMS proto)
  7. فعال‌سازی DiscountShoppingCartCQ از exclude شده در csproj

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

تاریخ به‌روزرسانی: ۱۲ دی ۱۴۰۴ (2026-01-01)
وضعیت کلی: FrontOffice 98% | BackOffice 100%
مسیر توسعه: CMS → BackOffice.BFF → BackOffice (UI) → FrontOffice.BFF → FrontOffice


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

تکمیل شده

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

🎉 سمت ادمین (BackOffice) - آماده Production

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

  • مدیریت محصولات + دسته‌بندی
  • فروشگاه تخفیفی (محصولات، دسته‌بندی، سفارشات)
  • مدیریت تگ‌ها
  • پیام‌های عمومی
  • کمیسیون + برداشت
  • شبکه + باشگاه
  • پکیج‌ها
  • کاربران + نقش‌ها

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

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

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

🟡 کارهای باقیمانده (اولویت پایین)

FrontOffice:

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

BackOffice:

تسک توضیحات اولویت
Transactions API صفحه تراکنش‌ها (UI آماده، API نیاز) 🟡 Low

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

مرحله 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 خواهد بود.