# 🎯 اسپرینت جاری (Current Sprint) **تاریخ شروع**: ۱۴ آذر ۱۴۰۴ **آخرین بروزرسانی**: ۲۸ آذر ۱۴۰۴ **مدت**: 2 هفته **هدف**: تکمیل BackOffice UI و رفع Anti-Patterns معماری --- ## 🔧 تغییرات اخیر (۲۸ آذر) - Session 2 ### ✅ سیستم مدیریت موجودی محصولات **CMS Handler**: چک موجودی در `SubmitShopBuyOrderCommandHandler` - چک موجودی قبل از تأیید سفارش - کاهش `RemainingCount` و افزایش `SaleCount` بعد از پرداخت - پیام خطای فارسی با جزئیات محصول و تعداد **FrontOffice ProductDetail**: - `MaxQty` داینامیک بر اساس موجودی واقعی - نمایش Chip موجودی (سبز/قرمز) با تعداد - غیرفعال کردن دکمه افزودن وقتی ناموجود ### ✅ ویژگی‌های باشگاه (ClubFeatures) - اصلاح معماری **حذف فیلدها از UserClubFeature**: - `DetailedDescriptionHtml`, `Icon`, `Color` فقط در `ClubFeature` (جدول قالب) - `UserClubFeature` فقط: `IsActive`, `GrantedAt`, `Notes` **فایل‌های اصلاح‌شده**: - CMS: `UserClubFeatureDto`, `clubmembership.proto`, `ClubFeatureProfile` - BFF: `GetClubFeaturesQueryHandler`, `GetClubFeaturesResponseDto`, `configuration.proto`, `ConfigurationProfile` - FrontOffice: `ClubConfigurationService`, `FeaturesPage` **MembershipPage - مزایای عضویت**: 1. شارژ ۵۶ میلیون تومان کیف پول فروشگاه تخفیفی 2. عضویت در شبکه بازاریابی و دریافت پورسانت 3. امکان جذب زیرمجموعه ### ✅ رفع باگ مدال آدرس‌ها - **Snackbar تکراری**: حذف inject از code-behind (global در `_Imports.razor`) - **NullReferenceException**: null check برای `dialog.Result` ### ✅ VAT و Cart Services - **VATService**: نرخ پیش‌فرض 9.99% برای debug - **CartService**: `EnsureInitializedAsync` + `IsAuthenticatedAsync` برای لود فقط برای کاربران لاگین‌شده --- ## 🔧 تغییرات قبلی (۲۸ آذر) - Session 1 ### ✅ نمودار درختی شبکه در FrontOffice با d3-org-chart **کتابخانه‌ها**: d3-org-chart v3 + d3.js v7 + d3-flextree v2.1.2 **ویژگی‌ها**: - نمایش درختی باینری شبکه - کلیک روی نود → نمایش درخت زیرمجموعه - دکمه بازگشت به نود قبلی - دکمه "درخت من" برای بازگشت به درخت کاربر - انتخاب عمق درخت با MudSelect (2-10 سطح) - FitToScreen برای تناسب با صفحه - Responsive با MudBlazor components ### ✅ API جدید GetSubordinateTree **Proto**: `GetSubordinateTreeRequest` با `target_user_id` و `max_depth` **BFF Handler**: `GetSubordinateTreeQueryHandler.cs` **Frontend Service**: `GetSubordinateTreeAsync(targetUserId, maxDepth)` **امنیت**: JWT Authentication (بدون check سنگین subordinate) ### ✅ رفع مشکل Encoding فارسی در Geography **Entity های تغییر یافته**: Country, State, City **تغییرات Configuration**: `NVARCHAR` با `Persian_100_CI_AI` collation **Migration**: `FixPersianCollation_Geography` --- ## 🔧 تغییرات قبلی (۱۷ آذر) ### ✅ رفع Anti-Pattern معماری در BackOffice.BFF **مشکل**: BackOffice.BFF.WebApi از پکیج‌های Protobuf مربوط به CMS استفاده می‌کرد **راه‌حل**: - ساخت Protobuf های اختصاصی BackOffice.BFF (ClubMembership, Commission, Configuration, NetworkMembership) - تغییر namespace از `CMSMicroservice` به `Foursat.BackOffice.BFF.*` - تغییر GrpcServices از "Client" به "Both" (برای پشتیبانی هم از Server و هم Client) - نسخه‌های منتشر شده: 0.0.6 (ClubMembership, Commission, NetworkMembership), 1.0.6 (Configuration) ### ✅ اضافه شدن HTTP Annotations به Protobuf - افزودن `google/api/annotations.proto` به 4 پروژه Protobuf - پیاده‌سازی HTTP endpoints برای Swagger: 33 endpoint - ClubMembership: 7 endpoints - Commission: 14 endpoints - Configuration: 5 endpoints - NetworkMembership: 7 endpoints - نصب `Google.Api.CommonProtos v2.10.0` ### ✅ رفع مشکل Mapster با Immutable Types - ساخت `NetworkMembershipProfile.cs` با استفاده از `MapWith()` - مپینگ دستی برای `RepeatedField` و `Timestamp` - رفع خطای "Cannot convert immutable type" ### ✅ پشتیبانی از Multi-Role Authorization - تغییر `AuthorizationService` برای خواندن چندین رول از JWT - اضافه شدن متد `GetUserRolesAsync()` - استفاده از `user.FindAll(ClaimTypes.Role)` بجای `FindFirst` - پشتیبانی از رول‌های آرایه‌ای در `ApiAuthenticationStateProvider` ### ✅ نمایش درختی شبکه (Network Tree Visualization) - پیاده‌سازی درخت تعاملی با D3.js v7 - ویژگی‌های درخت: - Zoom & Pan با mouse/touch - دکمه Reset برای بازگشت به حالت اولیه - رنگ‌بندی: سبز (فعال), قرمز (غیرفعال), سبز (چپ), نارنجی (راست) - کلیک روی node برای بارگذاری درخت آن کاربر - Responsive با viewBox و preserveAspectRatio - اضافه شدن `UserAutoComplete` برای جستجوی کاربر - جستجوی همزمان در Mobile, FirstName, LastName, NationalCode - نمایش نام + موبایل در لیست ### ✅ رفع مشکلات UI - رفع NullReferenceException در `NetworkTreeViewer` (JoinedAt null check) - رفع timing issue در render درخت (StateHasChanged + Task.Delay) - رفع خطای JSInterop با استفاده از `setDotNetReference` --- ## ⚠️ یادآوری مهم: Proto Package Workflow **قبل از هر کاری این را بخوانید!** ### قانون اجباری برای تغییر Proto (ALL Services): ``` ┌─────────────────────────────────────────┐ │ تغییر Proto File │ │ ↓ │ │ افزایش Version در csproj │ │ ↓ │ │ dotnet pack -c Release │ │ ↓ │ │ Update Version در لایه بالاتر │ └─────────────────────────────────────────┘ ``` **این برای همه سرویس‌ها اجباری است:** - ✅ CMS Proto changes → Update BFF - ✅ BackOffice.BFF Proto changes → Update BackOffice UI - ✅ FrontOffice.BFF Proto changes → Update FrontOffice UI **عدم رعایت = ساعت‌ها Debug و سردرگمی بیهوده!** GitLab Registry: `https://git.afrino.co/api/packages/FourSat/nuget/index.json` --- ## 📋 وضعیت کلی پروژه ### Backend: - ✅ **CMS Microservice**: ~98% Complete - ✅ **Daya Loan Integration**: 100% Complete (Real API implemented - Dec 6, 2025) - ✅ **BackOffice.BFF**: 100% Complete (35+ Handlers) - ✅ **Architecture Fixed**: Anti-pattern با CMS Protobuf رفع شد - ✅ **HTTP Annotations**: 33 endpoint با Swagger support - ✅ **Mapster Profiles**: NetworkMembership, Products با MapWith() - ✅ **FrontOffice.BFF**: 98% Complete (همه سرویس‌های مورد نیاز مشتری پیاده‌سازی شده) ### Frontend: - ✅ **BackOffice UI**: ~97% Complete (65+ صفحه) - ✅ **Multi-Role Authorization**: پشتیبانی از چندین نقش همزمان - ✅ **Network Tree Visualization**: نمایش درختی تعاملی با D3.js - ✅ **User AutoComplete**: جستجوی پیشرفته کاربران - ✅ **FrontOffice UI**: **98% Complete** (تمام صفحات مورد نیاز مشتری پیاده‌سازی شده) --- ## 🎉 جمع‌بندی نهایی FrontOffice (سمت مشتری) ### ✅ صفحات پیاده‌سازی شده و متصل به API: #### 🔐 احراز هویت: | صفحه | Route | وضعیت | |------|-------|-------| | ثبت‌نام (OTP) | `/register` | ✅ متصل به gRPC | | ورود (OTP) | Dialog | ✅ متصل به gRPC | | تایید قرارداد | `/register` Step 3 | ✅ متصل به gRPC | #### 👤 پروفایل: | صفحه | Route | وضعیت | |------|-------|-------| | داشبورد پروفایل | `/profile` | ✅ متصل به gRPC | | ویرایش اطلاعات شخصی | `/profile/personal` | ✅ متصل به gRPC | | مدیریت آدرس‌ها | `/profile/addresses` | ✅ متصل به gRPC | | تنظیمات | `/profile/settings` | ✅ متصل به gRPC | | کیف پول | `/profile/wallet` | ✅ متصل به gRPC | | درخت شبکه | `/profile/tree` | ✅ متصل به gRPC | #### 🛒 فروشگاه: | صفحه | Route | وضعیت | |------|-------|-------| | لیست محصولات | `/products` | ✅ متصل به gRPC | | جزئیات محصول | `/products/{id}` | ✅ متصل به gRPC | | دسته‌بندی‌ها | `/categories` | ✅ متصل به gRPC | | سبد خرید | `/cart` | ✅ متصل به gRPC | | تایید خرید (VAT) | `/checkout` | ✅ متصل به gRPC | #### 📦 سفارشات: | صفحه | Route | وضعیت | |------|-------|-------| | لیست سفارشات | `/orders` | ✅ متصل به gRPC | | جزئیات سفارش (VAT) | `/orders/{id}` | ✅ متصل به gRPC | | پیگیری سفارش | `/order-tracking/{id}` | ✅ متصل به gRPC | #### 💰 کمیسیون: | صفحه | Route | وضعیت | |------|-------|-------| | داشبورد کمیسیون | `/commission` | ✅ متصل به gRPC | | تاریخچه پرداخت‌ها | `/commission/history` | ✅ متصل به gRPC | | تعادل هفتگی | `/commission/weekly-balance` | ✅ متصل به gRPC | #### 🌐 شبکه: | صفحه | Route | وضعیت | |------|-------|-------| | آمار شبکه | `/network/statistics` | ✅ متصل به gRPC | | درخت شبکه | `/profile/tree` | ✅ متصل به gRPC | #### 🏆 باشگاه: | صفحه | Route | وضعیت | |------|-------|-------| | عضویت باشگاه | `/club/membership` | ✅ متصل به gRPC | | امکانات باشگاه | `/club/features` | ✅ Static | #### 📦 پکیج‌ها: | صفحه | Route | وضعیت | |------|-------|-------| | لیست پکیج‌ها | `/packages` | ✅ متصل به gRPC | | پکیج‌های من | `/my-packages` | ✅ متصل به gRPC | | جزئیات پکیج | `/packages/{id}` | ✅ متصل به gRPC | #### 📄 سایر صفحات: | صفحه | Route | وضعیت | |------|-------|-------| | صفحه اصلی | `/` | ✅ Complete | | درباره ما | `/about` | ✅ Static | | سوالات متداول | `/faq` | ✅ Static | | تماس با ما | `/contact` | ⚠️ UI آماده، Mock | --- ### ⚠️ موارد Mock (نیاز به CMS): | قابلیت | وضعیت UI | نیاز CMS | |--------|----------|----------| | **فرم تماس با ما** | ✅ UI کامل | Entity `ContactMessage` | | **نظرات محصول** | ❌ | Entity `Review` | | **کد تخفیف** | ❌ | RPC `ValidateDiscountCode` | --- ### ❌ موارد حذف شده (نیاز نیست): | قابلیت | دلیل | |--------|------| | `ChangePassword` | سیستم فقط OTP دارد، رمز عبور نداریم | | `ForgotPassword` | سیستم فقط OTP دارد | > **نکته**: صفحه `ChangePassword.razor` ساخته شده ولی فعلاً کاربردی ندارد چون لاگین فقط با OTP است. --- ## 📊 مقایسه CMS vs FrontOffice.BFF ### سرویس‌های CMS که در FrontOffice.BFF پیاده‌سازی شده: | CMS Service | FrontOffice.BFF | وضعیت | |-------------|-----------------|-------| | UserService | ✅ UserService | کامل | | OtpTokenService | ✅ (در UserService) | کامل | | UserAddressService | ✅ UserAddressService | کامل | | ProductsService | ✅ ProductsService | کامل | | CategoryService | ✅ CategoriesService | کامل | | UserCartsService | ✅ ShopingCartService | کامل | | UserOrderService | ✅ UserOrderService | کامل | | UserWalletService | ✅ UserWalletService | کامل | | TransactionsService | ✅ TransactionService | کامل | | CommissionService | ✅ CommissionService | کامل | | ClubMembershipService | ✅ ClubMembershipService | کامل | | NetworkMembershipService | ✅ NetworkMembershipService | کامل | | PackageService | ✅ PackageService | کامل | | DiscountShopServices | ✅ DiscountShopService | کامل | | UserContractService | ✅ (در UserService - AcceptContract) | کامل | ### سرویس‌های CMS که فقط برای Admin هستند (نیاز مشتری نیست): | CMS Service | توضیح | |-------------|-------| | ConfigurationService | تنظیمات سیستم (Admin) | | ContractService | مدیریت قراردادها (Admin) | | ManualPaymentService | پرداخت دستی (Admin) | | RoleService | مدیریت نقش‌ها (Admin) | | UserRoleService | اختصاص نقش (Admin) | | TagService | مدیریت تگ‌ها (Admin) | | ProductTagService | اختصاص تگ به محصول (Admin) | | PublicMessageService | پیام‌های عمومی (Admin) | | ProductImagesService | مدیریت تصاویر (Admin) | | ProductGalleriesService | گالری محصول (Admin) | | ProductCategoryService | دسته‌بندی محصول (Admin) | | FactorDetailsService | جزئیات فاکتور (Admin) | | UserWalletChangeLogService | لاگ تغییرات کیف پول (Admin) | --- ### 2. ✅ Package Purchase System - UI Implementation **Status**: ✅ تکمیل شد **Owner**: FrontOffice Team **تاریخ تکمیل**: ۱۵ آذر ۱۴۰۴ #### CMS Status: - ✅ Entities (5) - `PackagePurchase`, `PackagePurchaseItem`, etc. - ✅ Commands (6) - `CreatePackagePurchaseCommand`, etc. - ✅ Queries (3) - `GetPackagePurchaseByIdQuery`, etc. - ✅ Protobuf (4 RPCs) - 264 lines #### تغییرات انجام شده: - ✅ **PackageService.cs**: سرویس gRPC برای دریافت پکیج‌ها - ✅ **RouteConstants.cs**: اضافه شدن مسیرهای `/packages` و `/my-packages` - ✅ **ConfigureServices.cs**: ثبت `PackageService` در DI - ✅ **Packages.razor**: صفحه لیست پکیج‌ها با Grid View، جستجو، و Loading States - ✅ **MyPackages.razor**: صفحه پکیج‌های کاربر با نمایش وضعیت خرید **Build Status**: ✅ FrontOffice Build Succeeded - 0 Errors **Reference**: `01-BUSINESS/package-purchase-system.md` --- ### 3. ✅ اصلاح محاسبه کمیسیون هفتگی (بحرانی) **Status**: ✅ تکمیل شد **Owner**: CMS Team **تاریخ شروع**: ۱۴ آذر ۱۴۰۴ **تاریخ تکمیل**: ۱۴ آذر ۱۴۰۴ #### شرح مشکلات رفع شده: | # | مشکل | وضعیت | |---|------|-------| | 1 | محدودیت لول (15) پیاده‌سازی نشده | ✅ Fixed | | 2 | فقط تعادل شخصی حساب می‌شود (نه زیرمجموعه) | ✅ Fixed | #### فرمول پیاده‌سازی شده: ``` کمیسیون = (تعادل_شخص + SUM(تعادل_زیرمجموعه تا 15 لول)) × ارزش_هر_تعادل ``` #### تسک‌های تکمیل شده: | فاز | شرح | وضعیت | |-----|------|-------| | 1 | اضافه کردن `Commission.MaxNetworkLevel` به Config | ✅ | | 2 | اصلاح `CalculateWeeklyBalancesCommandHandler` - محدودیت لول | ✅ | | 3 | اصلاح `ProcessUserPayoutsCommandHandler` - تعادل زیرمجموعه | ✅ | | 4 | تست و Build | ✅ (0 Errors) | #### تغییرات انجام شده: - **Config**: اضافه کردن `Commission.MaxNetworkLevel = 15` - **CalculateWeeklyBalances**: پارامتر `maxLevel` به متدهای بازگشتی اضافه شد - **ProcessUserPayouts**: متد `SumSubordinateBalancesAsync` برای جمع تعادل زیرمجموعه‌ها تا 15 لول **Reference**: `01-BUSINESS/commission-calculation-fix.md` --- ### 4. ✅ اصلاح سقف تعادل هفتگی (MaxWeeklyBalances) **Status**: ✅ تکمیل شد **Owner**: CMS Team **تاریخ تکمیل**: ۱۴ آذر ۱۴۰۴ #### شرح مشکل: سقف تعادل هفتگی در پیاده‌سازی فعلی **300 کل** بود، اما باید **300 برای هر دست** باشد. | توضیح | منطق قدیم | منطق جدید | |-------|-----------|-----------| | سقف | 300 کل | 300 هر دست | | Max Total | 300 | 300+300=600 | #### تغییرات انجام شده: **CMS Changes:** - ✅ **SystemConfiguration**: تغییر کلید از `MaxWeeklyBalancesPerUser` به `MaxWeeklyBalancesPerLeg` - ✅ **CalculateWeeklyBalancesCommandHandler**: اصلاح منطق محاسبه سقف - اعمال سقف روی هر دست جداگانه قبل از محاسبه MIN - باقیمانده = مازاد سقف هر دست (نه نصف تعادل کل) - ✅ **ApplicationDbContextInitialiser**: اصلاح Seed Data **منطق جدید:** ```csharp // ✅ سقف روی هر دست جداگانه var cappedLeftTotal = Math.Min(leftTotal, maxBalancesPerLeg); var cappedRightTotal = Math.Min(rightTotal, maxBalancesPerLeg); var totalBalances = Math.Min(cappedLeftTotal, cappedRightTotal); var leftRemainder = leftTotal - cappedLeftTotal; // مازاد سقف var rightRemainder = rightTotal - cappedRightTotal; ``` **Build Status**: ✅ CMS Build Succeeded - 0 Errors **مستندات:** - ✅ `01-BUSINESS/balance-calculation-rules.md` - آپدیت شد --- ## 🟢 Low Priority (هفته بعد) ### 5. ✅ VAT System Implementation **Status**: ✅ تکمیل شد **Owner**: CMS + BFF + FrontOffice UI **تاریخ تکمیل**: ۱۵ آذر ۱۴۰۴ #### تغییرات انجام شده: **CMS:** - ✅ **OrderVAT Entity**: قبلاً موجود بود - ✅ **GetUserOrderResponseDto**: اضافه شدن `VatInfo` با فیلدهای `VatRate`, `BaseAmount`, `VatAmount`, `TotalAmount`, `IsPaid` - ✅ **GetUserOrderQueryHandler**: اضافه شدن `.Include(i => i.OrderVAT)` و mapping VAT - ✅ **CMS Proto**: اضافه شدن `OrderVATInfo` message **FrontOffice.BFF:** - ✅ **Proto**: اضافه شدن `OrderVATInfo` و `vat_info` field - ✅ **GetUserOrderResponseDto**: اضافه شدن `OrderVATInfoDto` **FrontOffice UI:** - ✅ **CheckoutSummary.razor**: نمایش جزئیات مالی شامل: - جمع کالاها - مالیات بر ارزش افزوده (۹%) - مبلغ قابل پرداخت - ✅ **OrderDetail.razor**: نمایش جزئیات مالی مشابه **Build Status**: ✅ All Projects - 0 Errors --- ### 6. Manual Payment System **Status**: 🟡 In Progress (CMS + BackOffice.BFF) **Owner**: CMS + BackOffice.BFF **Estimate**: 2 روز (UI باقیمانده) #### وضعیت فعلی: - ✅ CMS Domain & Application: ManualPayment + CreateManualPayment/ApproveManualPayment/RejectManualPayment + GetAllManualPayments - ✅ CMS gRPC: ManualPaymentContract (Create/Approve/Reject/GetAllManualPayments) - ✅ BackOffice.BFF: 4 Handler (CreateManualPayment, ApproveManualPayment, RejectManualPayment, GetManualPayments) - ⏳ BackOffice UI: صفحه لیست Manual Payments + Dialog جزئیات/Approve/Reject - ⏳ FrontOffice Flow (CreateManualPaymentRequest از سمت کاربر) --- ### 7. RBAC System Implementation **Status**: 🟡 In Progress (BackOffice.BFF Permission Layer پیاده‌سازی شده؛ CMS + BackOffice UI باقی مانده) **Owner**: CMS + BFF Teams **Estimate**: 1.5 هفته #### Requirements: - تعریف Roles و Permissions (CMS Domain/Application) - Policy-based Authorization (CMS + BackOffice UI) - Admin Panel برای مدیریت دسترسی‌ها - ✅ BackOffice.BFF: IPermissionService + CheckUserPermissionHandler / GetUserRolesHandler + gRPC PermissionInterceptor --- ## ⚠️ Blockers & Dependencies ### 🟢 Resolved: 1. ~~**Protobuf Mismatch** (FrontOffice.BFF ↔ CMS)~~ ✅ Fixed 2. ~~**WalletService Mock Data**~~ ✅ Connected to gRPC 3. ~~**Tree Builder Missing** (NetworkMembership)~~ ✅ Implemented ### 🟡 Minor Issues: 1. **MudBlazor Warnings** - ~100 warnings (غیر critical) 2. **Missing CMS Entities** - Review, ContactMessage, DiscountValidation --- ## 📊 Progress Summary ### ✅ وضعیت نهایی FrontOffice (سمت مشتری): **FrontOffice UI: 98% Complete** 🎉 - ✅ **28+ صفحه** پیاده‌سازی شده - ✅ **همه سرویس‌ها** به gRPC متصل - ✅ **Build موفق** بدون Error - ⚠️ فقط **فرم تماس با ما** Mock است (نیاز به CMS entity) ### کارهای تمام شده این اسپرینت (۱۴-۱۵ آذر): **روز اول (۱۴ آذر):** - ✅ FrontOffice Proto Projects: 5 پروژه جدید - ✅ FrontOffice UI Services: 4 سرویس به gRPC وصل شدند - ✅ FrontOffice.BFF Handlers: 15+ handler - ✅ Commission Calculation Fix - ✅ Balance Cap Fix: 300 per leg **روز دوم (۱۵ آذر):** - ✅ Package Purchase UI: Packages.razor + MyPackages.razor - ✅ VAT System: CheckoutSummary + OrderDetail - ✅ OrderTracking: Timeline پیگیری سفارش - ✅ ChangePassword: UI آماده (برای آینده) - ✅ Documentation: جمع‌بندی نهایی --- ## 🗂️ Backlog (کارهای آینده) ### Low Priority - FrontOffice: | تسک | توضیحات | اولویت | |-----|---------|--------| | **Password Authentication** | اضافه کردن لاگین با رمز عبور علاوه بر OTP | 🟡 Low | | **ForgotPassword** | بازیابی رمز عبور (نیاز به CMS RPC) | 🟡 Low | | **Contact Form Backend** | اتصال فرم تماس به CMS | 🟡 Low | | **Product Reviews** | سیستم نظرات محصول | 🟡 Low | | **Discount Code** | اعتبارسنجی کد تخفیف | 🟡 Low | ### High Priority - BackOffice (Admin): | تسک | توضیحات | اولویت | |-----|---------|--------| | **Manual Payment UI** | صفحه مدیریت پرداخت‌های دستی | 🔴 High | | **RBAC System** | سیستم کنترل دسترسی | 🔴 High | --- ## 🎯 Definition of Done ### برای هر Task: - [x] Code Review Complete - [x] Build با 0 error - [x] Manual Testing انجام شده - [x] Documentation بروز شده --- ## 📝 نتیجه‌گیری نهایی ### سمت مشتری (FrontOffice): ✅ **آماده Production** - تمام قابلیت‌های اصلی پیاده‌سازی شده ### سمت ادمین (BackOffice): 🟡 **95% Complete** - Manual Payment و RBAC باقیمانده --- **آخرین بروزرسانی**: ۱۵ آذر ۱۴۰۴ 🚀