# FrontOffice to CMS API Compatibility Analysis **تاریخ:** 6 فوریه 2026 **وضعیت:** در حال بررسی ## خلاصه اجرایی این سند مقایسه API‌های مورد نیاز FrontOffice با API‌های موجود در CMS را نشان می‌دهد. --- ## 1. User APIs (Authentication & Profile) ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetUser()` | AuthService, Personal.razor | ✅ موجود | `GetUser(GetUserRequest)` | | `UpdateUser()` | Personal.razor | ✅ موجود | `UpdateUser(UpdateUserRequest)` | | `RefreshToken()` | AuthService | ✅ موجود | `RefreshToken(RefreshTokenRequest)` | | `CreateNewOtpToken()` | AuthDialog | ✅ موجود | `CreateNewOtpToken(CreateNewOtpTokenRequest)` | | `VerifyOtpToken()` | AuthDialog | ✅ موجود | `VerifyOtpToken(VerifyOtpTokenRequest)` | | `AcceptContract()` | RegisterWizard | ✅ موجود | `AcceptContract(AcceptContractRequest)` | | `GetCustomerProfile()` | Profile Pages | ✅ موجود | **پیاده شد در Task قبل** | | `GetCustomerReferrals()` | Tree.razor | ✅ موجود | **پیاده شد در Task قبل** | | `GetCustomerSettings()` | Settings.razor | ✅ موجود | **پیاده شد در Task قبل** | | `UpdateCustomerProfile()` | Personal.razor | ✅ موجود | Proto موجود است | | `ChangeCustomerPassword()` | ChangePassword.razor | ✅ موجود | Proto موجود است | | `UpdateCustomerSettings()` | Settings.razor | ✅ موجود | Proto موجود است | **نتیجه:** ✅ تمام User APIs موجود است --- ## 2. Products APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetCustomerProducts()` | ProductService | ✅ موجود | **پیاده شد در Task قبل** | | `GetCustomerProductsByFilter()` | ProductService | ✅ موجود | **پیاده شد در Task قبل** | | `GetAllProductsByFilter()` | Products.razor | ✅ پیاده شد | **Public API - Feb 6, 2026** | **GetAllProductsByFilter Details:** - از `GetCustomerProductsByFilterQuery` استفاده می‌کند - پشتیبانی از فیلترها: Title, Price, Discount, CategoryId, SaleCount, و... - Sorting: پشتیبانی کامل (مثلاً "price desc") - Pagination: با MetaData کامل - CategoryIds: لیست شناسه دسته‌بندی‌های محصول **نتیجه:** ✅ تمام Products APIs موجود و پیاده شده --- ## 3. Category APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetAllCategoriesForCustomer()` | CategoryService | ✅ پیاده شد | **Customer API - Feb 6, 2026** | | `GetCategoryById()` | CategoryService | ✅ موجود | Admin API: `GetCategory()` | **GetAllCategoriesForCustomer Details:** - از `GetAllCategoryByFilterQuery` استفاده می‌کند - فقط دسته‌بندی‌های فعال (IsActive = true) - مرتب‌سازی بر اساس SortOrder - پشتیبانی Pagination (default: PageSize=100) - شامل: Id, Name, Title, Description, ImagePath, ParentId, IsActive, SortOrder - ISender به CategoryService اضافه شد **نتیجه:** ✅ تمام Category APIs پیاده شده --- ## 4. UserOrder APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetAllUserOrderByFilter()` | OrderService, Orders.razor | ✅ پیاده شد | **Feb 6, 2026** - Admin API | | `GetUserOrder()` | OrderService, OrderDetail.razor | ✅ پیاده شد | **Feb 6, 2026** - جزئیات کامل سفارش | | `GetCustomerOrders()` | OrderService | ✅ موجود | Customer API با فیلتر UserId | | `GetCustomerOrder()` | OrderService | ✅ موجود | Customer API با فیلتر UserId | | `GetUserOrderHistory()` | OrderService | ✅ موجود | Proto: `GetCustomerOrderHistory()` | | `GetVATRate()` | VATService, OrderService | ✅ پیاده شد | **Feb 6, 2026** | | `SubmitShopBuyOrder()` | CheckoutSummary.razor | ✅ پیاده شد | **Feb 6, 2026** - تکمیل فرآیند خرید | **GetVATRate Details:** - نرخ مالیات بر ارزش افزوده ایران: 9% - `VatRate = 0.09` (decimal) - `VatPercentage = 9` (int) - `IsEnabled = true` - استفاده در VATService برای محاسبه مالیات محصولات **SubmitShopBuyOrder Details (Feb 6, 2026 - Updated with Wallet Payment):** تبدیل سبد خرید به سفارش نهایی با پرداخت از کیف پول: 1. **احراز هویت**: استخراج UserId از JWT Token (ICurrentUserService) 2. **اعتبارسنجی سبد خرید**: - بازیابی محصولات سبد خرید با Include(Product) - چک کردن خالی نبودن سبد 3. **اعتبارسنجی آدرس**: - دریافت آدرس پیش‌فرض کاربر - اجباری بودن وجود آدرس 4. **محاسبات مالی**: - مبلغ پایه: جمع (قیمت × تعداد) تمام آیتم‌ها - مالیات: 9% از مبلغ پایه - مبلغ کل: مبلغ پایه + مالیات - اعتبارسنجی مبلغ: |serverTotal - clientTotal| < 100 5. **اعتبارسنجی کیف پول (New - Feb 6)**: - بازیابی کیف پول کاربر (UserWallet) - چک موجودی: Balance >= TotalAmount - خطا در صورت کمبود موجودی با نمایش موجودی فعلی و مبلغ مورد نیاز 6. **ایجاد تراکنش (New - Feb 6)**: - Type: TransactionType.Buy (0) - Amount: TotalAmount - PaymentStatus: Success - PaymentDate: DateTime.UtcNow - RefId: SHOP_{timestamp} - Description: "خرید محصولات - سفارش #{OrderId}" 7. **کسر از کیف پول (New - Feb 6)**: - Balance -= TotalAmount - ثبت موجودی جدید در UserWallet 8. **لاگ تغییرات کیف پول (New - Feb 6)**: - CurrentBalance: موجودی جدید - ChangeValue: -TotalAmount (منفی برای برداشت) - CurrentNetworkBalance: بدون تغییر - CurrentDiscountBalance: بدون تغییر - IsIncrease: false (برداشت) - RefrenceId: TransactionId 9. **ایجاد سفارش (UserOrder) - Updated**: - TransactionId: لینک به تراکنش (New) - PaymentStatus: Success (Changed from Pending) - PaymentDate: DateTime.UtcNow (New) - PaymentMethod: Wallet (New) - DeliveryStatus: Pending - HasVAT: true 10. **ثبت مالیات (OrderVAT)**: - VATRate: 0.09m (decimal) - BaseAmount: مبلغ قبل از مالیات - VATAmount: مبلغ مالیات - TotalAmount: مبلغ کل 11. **جزئیات فاکتور (FactorDetails)**: - یک رکورد برای هر آیتم سبد خرید - ذخیره ProductId, Count, UnitPrice, UnitDiscountPrice 12. **پاکسازی سبد خرید**: - Soft delete تمام آیتم‌های سبد (IsDeleted = true) **Transaction Flow:** ``` User → Cart → SubmitShopBuyOrder → 1. Validate Cart 2. Validate Address 3. Calculate Amount (Base + 9% VAT) 4. Validate Wallet Balance 5. Create Transaction (Type=Buy, Status=Success) 6. Deduct from Wallet.Balance 7. Create UserWalletChangeLog (audit trail) 8. Create Order (linked to Transaction, PaymentStatus=Success, PaymentMethod=Wallet) 9. Create OrderVAT 10. Create FactorDetails 11. Clear Cart → Return OrderId ``` **Wallet Types:** - **Balance** (موجودی عادی): Used for purchases - deducted in this flow - **NetworkBalance** (موجودی شبکه): Commission wallet - not touched - **DiscountBalance** (موجودی تخفیف): Discount-only wallet - not touched **Error Handling:** - "کیف پول یافت نشد": User has no wallet record - "موجودی کیف پول کافی نیست. موجودی: X تومان، مورد نیاز: Y تومان": Insufficient funds **خروجی**: شناسه سفارش (OrderId) برای redirect به صفحه جزئیات **GetUserOrder Details (Feb 6, 2026):** نمایش جزئیات کامل یک سفارش: - اطلاعات سفارش: Id, Amount, PaymentStatus, PaymentDate, DeliveryStatus - اطلاعات کاربر: UserFullName, UserNationalCode - آدرس: UserAddressText - مالیات (OrderVAT): VATRate, BaseAmount, VATAmount, TotalAmount, IsPaid - ردیابی: TrackingCode, DeliveryDescription - محصولات (FactorDetails): ProductId, ProductTitle, ProductThumbnailPath, UnitPrice, Count, UnitDiscountPrice **اصلاحات صفحه OrderDetail.razor:** - ✅ رفع NullReferenceException برای PaymentDate - ✅ نمایش "تاریخ ثبت" برای سفارشات Pending (بدون PaymentDate) - ✅ رفع نمایش اشتباه ProductThumbnailPath به جای ProductTitle - ✅ رفع خطاهای nullable value access (.Value → ?? 0) - ✅ محاسبه صحیح subtotal با nullable handling **GetAllUserOrderByFilter Details (Feb 6, 2026):** لیست تمام سفارشات با فیلترهای پیشرفته: - فیلترها: UserId (optional - 0 = همه کاربران), PaymentStatus, DeliveryStatus, PaymentDate - Pagination: MetaData کامل - Sorting: بر اساس فیلدهای مختلف - جزئیات هر سفارش: اطلاعات کاربر، آدرس، مالیات، محصولات، وضعیت ارسال **نتیجه:** ✅ تمام UserOrder APIs پیاده شده - فرآیند خرید کامل است --- ## 5. UserWallet APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetCustomerWallet()` | WalletService | ✅ موجود | 3 نوع کیف پول: Balance, NetworkBalance, DiscountBalance | | `GetCustomerWalletChangeLog()` | WalletService | ✅ موجود | 6 فیلد موجودی: Current+Change برای هر 3 کیف پول | | `CustomerWithdrawBalance()` | WalletService | ✅ موجود | Proto موجود است | | `GetCustomerWithdrawals()` | WithdrawalRequests.razor | ✅ موجود | لیست درخواست‌های برداشت | | `GetCustomerWithdrawalSettings()` | WalletService | ✅ موجود | حداقل مبلغ برداشت | **سه نوع کیف پول:** 1. **عادی (Regular)**: Balance & ChangeValue - برای خرید و شارژ عادی 2. **شبکه (Network)**: NetworkBalance & ChangeNerworkValue - پاداش تیمی و کمیسیون 3. **تخفیفی (Discount)**: DiscountBalance & ChangeDiscountValue - برای خرید تخفیفی **ساختار تراکنش (CustomerWalletChangeLogModel):** - `CurrentBalance` + `ChangeValue` - موجودی و تغییر کیف پول عادی - `CurrentNetworkBalance` + `ChangeNerworkValue` - موجودی و تغییر کیف پول شبکه - `CurrentDiscountBalance` + `ChangeDiscountValue` - موجودی و تغییر کیف پول تخفیفی - `IsIncrease` - آیا افزایش است یا کاهش - `RefrenceId` - شناسه ارجاع (سفارش، پرداخت، و...) - `CreatedAt` - تاریخ تراکنش (UTC Timestamp) **UI تراکنش‌ها:** - Desktop: جدول با ستون‌های جداگانه برای هر 3 کیف پول (تغییرات/مانده) - Mobile: کارت‌ها با 3 باکس افقی (عادی آبی، شبکه سبز، تخفیفی زرد) - تاریخ: تبدیل UTC به Local Time و نمایش جلالی - توضیحات: نمایش اینکه کدام کیف پول‌ها تغییر کرده‌اند **نتیجه:** ✅ تمام UserWallet APIs موجود و پیاده شده با UI کامل (Feb 5, 2026) --- ## 6. Transaction APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetCustomerTransaction()` | TransactionService (در BFF) | ✅ موجود | **پیاده شد در Task قبل** | | `GetCustomerTransactionsByFilter()` | TransactionService | ✅ موجود | **پیاده شد در Task قبل** | | `CustomerPaymentRequest()` | Checkout workflow | ✅ موجود | Proto موجود است | | `CustomerPaymentVerification()` | PaymentCallback.razor | ✅ موجود | Proto موجود است | **نتیجه:** ✅ تمام Transaction APIs موجود است --- ## 7. UserCarts APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetCustomerCart()` | CartService | ✅ پیاده شد | **Query Handler تکمیل شد - Feb 5** | | `AddToCustomerCart()` | CartService | ✅ پیاده شد | **Command Handler تکمیل شد - Feb 5** | | `UpdateCustomerCartItem()` | CartService | ✅ پیاده شد | **Command Handler تکمیل شد - Feb 5** | | `RemoveFromCustomerCart()` | CartService | ✅ پیاده شد | **Command Handler تکمیل شد - Feb 5** | **اصلاحات Feb 6, 2026:** - ✅ **رفع باگ Cart APIs در CheckoutSummary**: تمام صفحات از Admin APIs استفاده می‌کردند - ✅ تغییر `AddNewUserCartAsync` → `AddNewUserCartForCustomerAsync` - ✅ تغییر `UpdateUserCartAsync` → `UpdateUserCartForCustomerAsync` - ✅ تغییر request model: `AddNewUserCartRequest` → `AddNewUserCartForCustomerRequest` - ✅ تغییر request model: `UpdateUserCartRequest` → `UpdateUserCartForCustomerRequest` - ✅ اضافه `RemoveUserCartForCustomerAsync` برای حذف صحیح آیتم - ✅ اصلاح field name: `UserCartId` → `CartItemId` (Proto: cart_item_id) - ✅ رفع منطق حذف: از Update با Count=0 به RemoveUserCartForCustomer تغییر یافت **Field Naming Convention:** - Proto: `cart_item_id` (snake_case) - C# Generated: `CartItemId` (PascalCase) - ❌ نباید: `UserCartId` (نام قدیمی Admin API) **تاثیر:** حالا عملیات سبد خرید (افزودن/ویرایش/حذف) صحیح کار می‌کند و فقط سبد کاربر جاری را تغییر می‌دهد **نتیجه:** ✅ تمام UserCart Customer APIs پیاده شده و باگ‌های Security و Field Naming رفع شد --- ## 8. UserAddress APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetCustomerAddresses()` | Addresses.razor | ✅ پیاده شد | **Query Handler تکمیل شد - Feb 5** | | `CreateCustomerAddress()` | AddAddressDialog.razor | ✅ پیاده شد | **Command Handler تکمیل شد - Feb 5** | | `UpdateCustomerAddress()` | EditAddressDialog.razor | ✅ پیاده شد | **Command Handler تکمیل شد - Feb 5** | | `DeleteCustomerAddress()` | Addresses.razor | ✅ پیاده شد | **Command Handler تکمیل شد - Feb 5** | | `SetCustomerDefaultAddress()` | Addresses.razor | ✅ پیاده شد | **Command Handler تکمیل شد - Feb 5** | **یادداشت:** CityName و ProvinceName در response خالی است - FrontOffice باید از City API جداگانه استفاده کند. **اصلاحات Feb 6, 2026:** - ✅ **رفع باگ صفحه Addresses**: تمام صفحات FrontOffice از Admin APIs استفاده می‌کردند - ✅ تغییر `GetAllUserAddressByFilter` → `GetCustomerAddresses` در Addresses.razor - ✅ تغییر `CreateNewUserAddress` → `CreateCustomerAddress` در AddAddressDialog - ✅ تغییر `UpdateUserAddress` → `UpdateCustomerAddress` در EditAddressDialog - ✅ تغییر `DeleteUserAddress` → `DeleteCustomerAddress` در Addresses.razor - ✅ تغییر `SetAddressAsDefault` → `SetCustomerDefaultAddress` در Addresses.razor - ✅ اصلاح Model type: `GetAllUserAddressByFilterResponseModel` → `CustomerAddressModel` - ✅ اصلاح field name: `response.Addresses` → `response.Models` **تاثیر:** حالا کاربران فقط آدرس‌های خودشان را می‌بینند (قبلاً همه آدرس‌ها نمایش داده می‌شد) **نتیجه:** ✅ تمام UserAddress Customer APIs پیاده شده و باگ Security رفع شد --- ## 9. City APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetAllCities()` | AddressDialog components | ✅ موجود | Public API | **نتیجه:** ✅ City APIs موجود است --- ## 10. Package APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetCustomerPackages()` | PackageService | ✅ موجود | **پیاده شد در Task قبل** | | `GetCustomerPackageDetails()` | PackageService | ✅ موجود | **پیاده شد در Task قبل** | | `CustomerPurchasePackage()` | Package purchase flow | ✅ موجود | Proto موجود است | | `CustomerVerifyPackagePurchase()` | Package verification | ✅ موجود | Proto موجود است | | `GetCustomerPurchaseHistory()` | MyPackages.razor | ✅ موجود | **پیاده شد در Task قبل** | **نتیجه:** ✅ تمام Package APIs موجود است --- ## 11. NetworkMembership APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetMyNetworkTree()` | NetworkMembershipService | ✅ موجود | Customer Query جداگانه با ICurrentUserService | | `GetSubordinateTree()` | NetworkMembershipService | ✅ موجود | Recursive tree traversal | | `GetMyNetworkStatistics()` | NetworkStatisticsPage.razor | ✅ موجود | با شمارش recursive تمام descendants | **اصلاحات انجام شده (Feb 5, 2026):** 1. ✅ **GetMyNetworkTree Customer Query**: - ایجاد Query و Handler جداگانه برای Customer - استفاده از ICurrentUserService به جای UserId در request - رفع خطای Validation (UserId=0 قبلاً غیرمجاز بود) 2. ✅ **GetNetworkStatistics Bug Fix**: - قبلاً: فقط direct children (depth=1) شمارش می‌شد - بعد: recursive counting تمام descendants در leftLeg و rightLeg - متدهای کمکی: `GetAllDescendants()` و `CalculateDepths()` - فرمول: `leftLegCount = GetAllDescendants(leftChild).Count + 1` **نتیجه:** ✅ تمام NetworkMembership APIs موجود و اصلاح شده --- ## 12. Commission APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetWeekDefinitions()` | CommissionService | ✅ موجود | **پیاده شد در Task قبل** | | `GetCommissionBalances()` | CommissionDashboardPage | ✅ موجود | **پیاده شد در Task قبل** | **نتیجه:** ✅ تمام Commission APIs موجود است --- ## 13. ClubMembership APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `ActivateClubMembership()` | ClubMembershipService | ✅ موجود | Proto موجود در CMS | | `GetClubMembershipStatus()` | MembershipPage.razor | ✅ موجود | Proto موجود در CMS | **نتیجه:** ✅ ClubMembership APIs موجود است --- ## 14. Configuration APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetClubConfiguration()` | ClubConfigurationService | ✅ موجود | Proto موجود در CMS | | `GetClubFeatures()` | FeaturesPage.razor | ✅ موجود | Proto موجود در CMS | **نتیجه:** ✅ Configuration APIs موجود است --- ## 15. AppVersion APIs ### استفاده شده در FrontOffice | API Method | استفاده در Service | Status در CMS | یادداشت | |------------|-------------------|---------------|---------| | `GetAppVersion()` | AppVersionService | ✅ موجود | Proto موجود در CMS | **نتیجه:** ✅ AppVersion APIs موجود است --- ## نتیجه‌گیری کلی ### ✅ API های کامل (100% پیاده شده) 1. ✅ User APIs - همه Customer endpoints پیاده شده 2. ✅ Products APIs - GetCustomerProducts و Filter پیاده شده 3. ✅ UserWallet APIs - تمام Customer endpoints پیاده شده 4. ✅ Transaction APIs - Customer endpoints پیاده شده 5. ✅ Package APIs - تمام Customer endpoints پیاده شده 6. ✅ NetworkMembership APIs - پیاده شده 7. ✅ Commission APIs - پیاده شده 8. ✅ Category APIs - GetAllCategoriesForCustomer پیاده شد (Feb 6, 2026) 9. ✅ City APIs - Public API موجود 10. ✅ ClubMembership APIs - Proto موجود 11. ✅ Configuration APIs - Proto موجود 12. ✅ AppVersion APIs - Proto موجود 13. ✅ **UserCarts APIs - تمام Customer endpoints پیاده شد (Feb 5, 2026) + اصلاحات Feb 6** 🆕 14. ✅ **UserAddress APIs - تمام Customer endpoints پیاده شد (Feb 5, 2026) + باگ Security رفع شد Feb 6** 🆕 15. ✅ **UserOrder APIs - Checkout workflow کامل شد (Feb 6, 2026)** 🆕 16. ✅ **Products APIs - GetAllProductsByFilter پیاده شد (Feb 6, 2026)** 🆕 ### ⚠️ نیاز به توجه ~~1. **UserCarts APIs** - نیاز به Customer-specific endpoints~~ **✅ تکمیل شد - Feb 5, 2026 + اصلاحات Feb 6, 2026** ~~2. **UserAddress APIs** - نیاز به Customer-specific endpoints~~ **✅ تکمیل شد - Feb 5, 2026 + باگ Security رفع شد Feb 6, 2026** ~~3. **UserOrder/Checkout APIs** - نیاز به بررسی~~ **✅ تکمیل شد - Feb 6, 2026:** - ✅ SubmitShopBuyOrder - تبدیل سبد خرید به سفارش - ✅ GetUserOrder - نمایش جزئیات سفارش - ✅ GetAllUserOrderByFilter - لیست سفارشات - ✅ GetVATRate - دریافت نرخ مالیات 9% - ✅ OrderDetail.razor - رفع باگ‌های NullReference 4. **UpdateCustomerProfile, ChangeCustomerPassword, UpdateCustomerSettings** - Proto موجود اما Query/Handler نیاز است --- ## اقدامات لازم ~~### Priority 1: UserCarts Customer Endpoints~~ ~~این APIs برای سبد خرید ضروری هستند.~~ **✅ تکمیل شد - Feb 5, 2026:** - ✅ GetCustomerCartQuery و Handler - ✅ AddToCustomerCartCommand و Handler - ✅ UpdateCustomerCartItemCommand و Handler - ✅ RemoveFromCustomerCartCommand و Handler - ✅ UserCartsService با ISender **✅ اصلاحات Security - Feb 6, 2026:** - ✅ CartService.cs: تمام عملیات به Customer APIs تغییر یافت - ✅ رفع باگ Field Naming: UserCartId → CartItemId - ✅ رفع منطق حذف: از Update به RemoveUserCartForCustomer ~~### Priority 2: UserAddress Customer Endpoints~~ ~~این APIs برای Checkout و مدیریت آدرس‌ها ضروری هستند.~~ **✅ تکمیل شد - Feb 5, 2026:** - ✅ GetCustomerAddressesQuery و Handler - ✅ CreateCustomerAddressCommand و Handler - ✅ UpdateCustomerAddressCommand و Handler - ✅ DeleteCustomerAddressCommand و Handler - ✅ SetCustomerDefaultAddressCommand و Handler - ✅ UserAddressService با ISender - ⚠️ **یادداشت:** CityName/ProvinceName در response خالی است - FrontOffice باید از City API استفاده کند **✅ اصلاحات Security - Feb 6, 2026:** - ✅ Addresses.razor: GetCustomerAddresses (قبلاً تمام آدرس‌ها نمایش می‌یافت) - ✅ Index.razor (Profile): GetCustomerAddresses - ✅ CheckoutSummary.razor: GetCustomerAddresses - ✅ Checkout.razor: GetCustomerAddresses - ✅ AddAddressDialog.razor: CreateCustomerAddress - ✅ EditAddressDialog.razor: UpdateCustomerAddress ~~### Priority 3: Checkout/Order Creation~~ باید workflow ثبت سفارش بررسی شود. ### Priority 4: Customer Profile Updates پیاده‌سازی Handler های Update برای Customer. --- ## وضعیت پروژه **تکمیل شده:** ~97% **آخرین به‌روزرسانی:** 6 فوریه 2026 **تغییرات Feb 6, 2026:** **Phase 1: رفع باگ‌های Critical Security در FrontOffice** - ✅ **UserAddress Security Bug Fix**: تغییر از Admin APIs به Customer APIs در تمام صفحات - Addresses.razor, Index.razor (Profile), CheckoutSummary.razor, Checkout.razor - AddAddressDialog, EditAddressDialog - قبلاً همه آدرس‌های تمام کاربران نمایش داده می‌شد ⚠️ - حالا فقط آدرس‌های کاربر لاگین شده (با ICurrentUserService) - ✅ **UserCart Security Bug Fix**: تغییر از Admin APIs به Customer APIs در CartService - تمام عملیات: Add, Update, Remove, Clear - رفع باگ Field Naming: UserCartId → CartItemId (Proto: cart_item_id) - رفع منطق حذف: از UpdateUserCart با Count=0 به RemoveUserCartForCustomer - قبلاً تمام سبدهای خرید تمام کاربران قابل دسترسی بود ⚠️ **Phase 2: پیاده‌سازی APIs گم‌شده** - ✅ **GetVATRate**: پیاده‌سازی در UserOrderService - نرخ مالیات بر ارزش افزوده ایران: 9% - استفاده در VATService و Products page - ✅ **GetAllProductsByFilter**: پیاده‌سازی در ProductsService - استفاده از GetCustomerProductsByFilterQuery - پشتیبانی کامل از filtering, sorting, pagination - CategoryIds mapping به درستی - ✅ **GetAllCategoriesForCustomer**: پیاده‌سازی در CategoryService - استفاده از GetAllCategoryByFilterQuery - فقط دسته‌بندی‌های فعال (IsActive = true) - ISender به CategoryService اضافه شد - مرتب‌سازی بر اساس SortOrder **Phase 3: تکمیل Checkout Workflow** - ✅ **SubmitShopBuyOrder**: تبدیل سبد خرید به سفارش نهایی با **پرداخت از کیف پول** (Updated Feb 6) - احراز هویت با ICurrentUserService (UserId از JWT) - اعتبارسنجی سبد خرید (خالی نباشد) و آدرس پیش‌فرض - محاسبات مالی: مبلغ پایه + مالیات 9% = مبلغ کل - **اعتبارسنجی موجودی کیف پول**: Balance >= TotalAmount 🆕 - **ایجاد تراکنش**: Type=Buy, PaymentStatus=Success, RefId=SHOP_{timestamp} 🆕 - **کسر از کیف پول**: Balance -= TotalAmount 🆕 - **ثبت لاگ تغییرات**: UserWalletChangeLog با تمام جزئیات (audit trail) 🆕 - ایجاد سفارش (UserOrder): **PaymentStatus=Success, PaymentMethod=Wallet, TransactionId** (Updated from Pending) - ثبت مالیات (OrderVAT): VATRate, BaseAmount, VATAmount, TotalAmount - ایجاد جزئیات فاکتور (FactorDetails) برای هر محصول - پاکسازی سبد خرید (soft delete) - بازگشت OrderId برای redirect - **خطاها**: "کیف پول یافت نشد", "موجودی کیف پول کافی نیست" - ✅ **GetUserOrder**: نمایش جزئیات کامل سفارش - استفاده از GetCustomerOrderQuery - اطلاعات سفارش + کاربر + آدرس + مالیات + محصولات + ردیابی - پشتیبانی از nullable fields (PaymentDate, PaymentMethod) - ✅ **GetAllUserOrderByFilter**: لیست سفارشات با فیلتر - Admin API - می‌تواند همه سفارشات را ببیند - فیلترها: UserId, PaymentStatus, DeliveryStatus, PaymentDate - Pagination + Sorting کامل - ✅ **OrderDetail.razor - رفع باگ‌های UI**: - رفع NullReferenceException برای PaymentDate (null برای سفارشات Pending) - نمایش "تاریخ ثبت" به جای "تاریخ پرداخت" برای سفارشات بدون پرداخت - رفع نمایش ProductThumbnailPath به جای ProductTitle - رفع خطاهای nullable value access: .Value → ?? 0 - محاسبه صحیح subtotal با null coalescing **خلاصه تغییرات:** - 🔒 **Security**: رفع باگ‌های critical در UserAddress و UserCart (همه کاربران قابل مشاهده بودند) - 📦 **Products**: GetAllProductsByFilter + GetAllCategoriesForCustomer پیاده شد - 💰 **VAT**: GetVATRate با نرخ 9% ایران - 🛒 **Checkout**: workflow کامل - سبد خرید → سفارش → نمایش جزئیات - 🐛 **Bug Fixes**: OrderDetail null handling + Field naming (UserCartId → CartItemId) **تغییرات قبلی (Feb 5, 2026):** **Phase 1: UserCart & UserAddress Customer Endpoints** - ✅ پیاده‌سازی کامل UserCart Customer endpoints (4 Handler + Service) - ✅ پیاده‌سازی کامل UserAddress Customer endpoints (5 Handler + Service) - ✅ اضافه کردن Proto definitions برای Customer Address **Phase 2: NetworkMembership Bug Fixes** - ✅ GetMyNetworkTree Customer Query (رفع خطای Validation) - ✅ GetNetworkStatistics Recursive Counting (رفع باگ شمارش نادرست) **Phase 3: UserWallet UI Enhancement** - ✅ رفع باگ نمایش 0 در مبالغ تراکنش‌ها - ✅ اضافه کردن CurrentDiscountBalance و ChangeDiscountValue به Proto (v0.0.177) - ✅ جداسازی تراکنش‌ها به 3 نوع کیف پول (عادی، شبکه، تخفیفی) - ✅ اصلاح نام‌گذاری: "اعتباری" → "عادی" - ✅ رفع باگ تاریخ: اضافه کردن ToLocalTime() برای تبدیل UTC - ✅ UI Desktop: جدول با ستون‌های جداگانه برای هر 3 کیف پول - ✅ UI Mobile: کارت‌ها با 3 باکس افقی (عادی آبی، شبکه سبز، تخفیفی زرد) - ✅ نمایش همزمان تغییرات و موجودی مانده برای هر کیف پول - ✅ تغییر FrontOffice.Main.csproj: PackageReference → ProjectReference **باقی مانده:** - ⚠️ Checkout workflow و Order creation (نیاز به بررسی) - ⚠️ Profile update handlers (UpdateCustomerProfile, ChangePassword, UpdateSettings) - 📝 CityName/ProvinceName در GetCustomerAddresses خالی است (نیاز به City API lookup در FrontOffice) **Build Status:** - ✅ CMS: 0 Errors, ~60 Warnings (unused proto imports) - ✅ FrontOffice: 0 Errors, ~120 Warnings (nullable references) **صفحات تست شده (Feb 6):** - ✅ /profile/addresses - کار می‌کند (فقط آدرس‌های خود کاربر) - ✅ /products - کار می‌کند (لیست محصولات با filtering و sorting) - ✅ /categories - کار می‌کند (لیست دسته‌بندی‌های فعال) - ✅ /profile/wallet - کار می‌کند (3 کیف پول با تراکنش‌های کامل)