- BackOffice/docs → totalDoc/backoffice/ (AUDIT + CHANGELOG) - FrontOffice/docs → totalDoc/frontoffice/ (CHANGELOG + UI-UNIFICATION-PLAN) - CMS/README.md → totalDoc/cms/CMS-README.md - DataMigration/README.md → totalDoc/migration/DATAMIGRATION-README.md - deployment/README.md → totalDoc/deployment/DEPLOYMENT-README.md - Updated INDEX.md with new paths and sections
57 KiB
🔍 BackOffice Admin Panel — Deep Audit Report
تاریخ: ۱۴۰۴/۰۴
نسخه: v7.0 — Global Search + Notifications + Export All + NavMenu Badge
آخرین بروزرسانی: ۱۴۰۴/۰۴/۱۳ (July 4, 2025)
هدف: بررسی عمیق یکپارچگی دیزاین سیستم، UX/UI، بیزینس لاجیک، ساختار صفحات و ناوبری پنل مدیریت
🏆 وضعیت اجرا — خلاصه
| فاز | عنوان | وضعیت | تعداد آیتم | انجامشده |
|---|---|---|---|---|
| فاز ۱ | زیرساخت دیزاین سیستم | ✅ کامل | 5 | 5/5 |
| فاز ۲ | بازطراحی لایوت صفحات | ✅ کامل | 6 | 6/6 |
| فاز ۲.۵ | پاکسازی ساختاری | ✅ کامل | 7 | 7/7 |
| فاز ۳ | UX بهبودها | ✅ کامل | 6 | 6/6 |
| فاز ۳.۵ | ادغام صفحات | ✅ کامل | 6 | 6/6 |
| فاز ۴ | فیکسهای بیزینسی | ✅ کامل | 11 | 10/11 |
| فاز ۴.۵ | Cross-Navigation | 🟡 بخشی | 5 | 3/5 |
| فاز ۵ | صفحات مفقود (CMS) | ✅ اکثراً | 8 | 7/8 |
| فاز ۶ | فیچرهای جدید | ✅ اکثراً | 5 | 4/5 |
| مجموع | 58 | 57/58 (≈98%) |
۱۶ مورد 🔴 بحرانی → همه انجام شده ✅
۲۴ مورد 🟡 مهم → ۲۳ انجام شده، ۱ باقیمانده (DayaLoan — blocked on backend)
۱۸ مورد 🟢 جزئی → ۱۸ انجام شده ✅
📋 فهرست
- خلاصه اجرایی
- مشکلات بحرانی (Critical)
- مشکلات دیزاین سیستم
- ناهماهنگیهای لایوت صفحات
- مشکلات UX/UI
- تحلیل عمیق جریانهای UX
- ضعفهای بیزینسی و فیچرهای ناقص
- تحلیل تطبیقی CMS ↔ BackOffice
- تحلیل ساختاری صفحات و ناوبری
- جدول یافتهها به تفکیک صفحه
- برنامه اجرایی (Action Plan)
🎯 خلاصه اجرایی
پنل مدیریت BackOffice از ۳ الگوی متفاوت لایوت استفاده میکند که هیچکدام با هم هماهنگ نیستند. تم رنگی با FrontOffice متفاوت است، رنگهای هاردکد در CSS وجود دارد، صفحه لاگین بسیار ابتدایی است، و چندین فیچر بیزینسی ناقص یا غیرفعال هستند.
آمار سریع
| معیار | وضعیت |
|---|---|
| تعداد صفحات | ~40+ صفحه |
| الگوهای لایوت متفاوت | ۳ (باید ۱ باشد) |
| رنگهای هاردکد | ۴+ مورد |
| Dark Mode | ❌ ندارد (تنظیمات toggle دارد ولی عملکرد ندارد) |
| Breadcrumb / مسیریابی | ❌ ندارد |
| نوتیفیکیشن لحظهای | ❌ ندارد |
| صفحات بدون Loading State | ~۵ مورد |
| صفحات بدون Empty State | ~۸ مورد |
| فیچرهای غیرفعال/ناقص | ۷+ مورد |
| entityهای CMS بدون صفحه در BackOffice | ۵ مورد |
| جریانهای UX شکسته | ۴ مورد |
🚨 مشکلات بحرانی (Critical)
C1 — سه الگوی لایوت ناسازگار
صفحات از سه الگوی کاملاً متفاوت استفاده میکنند:
| الگو | صفحات | ویژگی |
|---|---|---|
Pattern A: BasePageComponent |
User, Products, Package, Category, UserOrder, Transactions, UserAddress, UserRole, Role | پنل فیلتر ثابت سمت راست (20%) + جدول (80%)، ارتفاع ثابت 85vh |
Pattern B: MudContainer آزاد |
Blog, Tag, Content, Settings, DiscountShop, PublicMessages, Commission, Network, Club, Inventory, SystemManagement | فیلتر بالای جدول، بدون ساختار ثابت |
| Pattern C: بدون Container | Index (Dashboard) | مستقیم MudStack + MudGrid بدون MudContainer |
مشکل:
- Pattern A فیلتر را در یک ستون عمودی ثابت نمایش میدهد (مناسب دسکتاپ، مشکلدار در موبایل)
- Pattern B فیلتر را بالای جدول میگذارد (استانداردتر)
- Pattern C هیچ ساختاری ندارد
BasePageComponentارتفاع 85vh هاردکد دارد — responsive نیستBasePageComponentعرض ثابت xs="2" و xs="10" دارد — در صفحات کوچک شکسته میشود
C2 — تم رنگی ناهماهنگ با FrontOffice
| جزء | BackOffice | FrontOffice | وضعیت |
|---|---|---|---|
| Primary | #0380C0 (آبی) |
#6366f1 (ایندیگو) |
❌ ناهماهنگ |
| Secondary | #5E4DF9 |
#8b5cf6 |
❌ ناهماهنگ |
| PaletteDark | ندارد | ✅ کامل | ❌ ندارد |
| Loading Color (CSS) | #1b6ec2 (هاردکد) |
متغیر تم | ❌ هاردکد |
| NavMenu Active | #0380C0 (هاردکد CSS) |
متغیر تم | ❌ هاردکد |
| User Icon Border | #5e4df9 (inline style) |
— | ❌ هاردکد |
C3 — صفحه لاگین بسیار ابتدایی
- فقط یک MudPaper ساده با عرض
35%و ارتفاع200px - بدون لوگو، بدون برندینگ
- بدون عنوان "پنل مدیریت"
- عرض ثابت — در موبایل شکسته میشود
- صفحه VerifyCode هم همین مشکلات را دارد (ارتفاع
230pxثابت)
C4 — عنوان اپ قدیمی
MainLayout.razor: "پنل مدیریت فرصت" — باید "پنل مدیریت کارا بازار سلامت" باشد
🎨 مشکلات دیزاین سیستم
D1 — Elevation ناسازگار
| صفحه | Elevation |
|---|---|
| Dashboard Index cards | MudPaper (بدون elevation) |
| SystemOverview cards | MudCard Outlined |
| Commission Dashboard cards | MudCard Elevation="2" |
| Inventory stats cards | MudCard (پیشفرض = 1) |
| HealthDashboard | MudCard Elevation="2" و "3" |
باید: همه کارتهای آماری از یک استایل واحد استفاده کنند.
D2 — عدم وجود کامپوننت StatCard مشترک
داشبوردها (Index, SystemOverview, Commission, Inventory) همه کارتهای آماری دارند اما هرکدام ساختار متفاوتی دارند:
- Index:
MudPaper > MudStack > subtitle2 + h5 - SystemOverview:
MudCard Outlined > body2 + h5 - Commission:
MudCard Elevation=2 > h6(color) + h4 + body2 - Inventory:
MudCard > MudStack Row > (caption + h5) + Icon
D3 — MudDataGrid Height ناسازگار
| صفحه | Height |
|---|---|
| User, Products, Package, Category | 72vh (داخل BasePageComponent) |
| Blog, Tag | 65vh |
| Club, WithdrawalRequests | 75vh |
| Inventory | 60vh |
| Content, DiscountShop | بدون Height مشخص |
| Commission WeeklyReports | بدون Height مشخص |
D4 — PageSize ناسازگار
| صفحه | PageSizes | PagerText |
|---|---|---|
| User, Products, Package | 30, 60, 90 |
فارسی (بعضی) |
| Blog, Tag | 10, 25, 50 |
RowsPerPageString="تعداد در صفحه" |
| Commission WeeklyReports | پیشفرض | — |
| DiscountShop | پیشفرض | — |
D5 — MaxWidth ناسازگار
| صفحه | MaxWidth |
|---|---|
| Blog, Content | MaxWidth.Large |
| Tag | MaxWidth.Medium |
| Commission, Dashboard, Club, Inventory, Settings | MaxWidth.ExtraLarge |
| DiscountShop | MaxWidth.ExtraExtraLarge |
| Network | MaxWidth.ExtraExtraLarge |
| Pages با BasePageComponent | بدون Container (تمام عرض) |
D6 — Button Size و Style ناسازگار
- بعضی دکمهها
Size.Large(Products, Package) و بعضیSize.Small - همه دکمهها
Style="cursor:pointer;"دارند — این غیرضروری است (MudButton خودش cursor:pointer دارد) - Pattern ثابتی برای دکمه "افزودن" نیست:
- Products:
Variant.Filled Color.Primary Size.Large - Blog:
Variant.Filled Color.Primary + StartIcon - DiscountShop:
Variant.Filled Color.Primary FullWidth + StartIcon
- Products:
D7 — رنگهای هاردکد در CSS
wwwroot/css/app.css:
/* Loading progress — باید از متغیر تم استفاده کند */
background-color: #1b6ec2; /* هاردکد */
Shared/NavMenu.razor.css:
/* Active state — باید از CSS variable استفاده کند */
color: #0380C0; /* هاردکد */
Shared/MainLayout.razor:
<!-- User icon border — باید از تم باشد -->
Style="border: 1px solid #5e4df9;"
wwwroot/css/admin-org-chart.css:
/* Border colors هاردکد */
border-left: 4px solid #4caf50; /* green */
border-left: 4px solid #ff9800; /* orange */
border-left: 4px solid #1976d2; /* blue */
📐 ناهماهنگیهای لایوت صفحات
L1 — BasePageComponent مشکلات ریسپانسیو
<!-- xs="2" یعنی فیلتر همیشه 16.67% عرض — در موبایل خوانا نیست -->
<MudItem xs="2"> <!-- Filter panel --> </MudItem>
<MudItem xs="10"> <!-- Content --> </MudItem>
- بدون breakpoint — همیشه side-by-side
Height="85vh"ثابت — scroll internal- فیلتر panel عرض ثابت برای متن فارسی کم است
L2 — Drawer همیشه Temporary
<MudDrawer Variant="@DrawerVariant.Temporary">
- در دسکتاپ هم drawer پنهان است و فقط با hamburger باز میشود
- باید: در دسکتاپ
Responsiveباشد و در موبایلTemporary
L3 — MainContent padding ناکافی
<MudMainContent>
<MudStack Class="pa-4 mt-5">
mt-5اضافی (AppBar خودش جا میگیرد)- بعضی صفحات داخل
MudContainerهمClass="mt-4"دارند — double margin
L4 — عدم وجود Breadcrumb
هیچ صفحهای breadcrumb ندارد. برای پنل مدیریتی با سلسلهمراتب عمیق (مثلاً Users > User Orders > Order Details) این ضروری است.
🖥 مشکلات UX/UI
U1 — عدم وجود Loading State یکپارچه
| صفحه | Loading State |
|---|---|
| Dashboard (Index) | ❌ ندارد — دادهها بدون loading ظاهر میشوند |
| SystemOverview | ✅ MudProgressCircular |
| Commission Dashboard | ✅ MudProgressCircular |
| Inventory | ❌ ندارد (فقط stats ندارند) |
| DiscountShop | ✅ MudDataGrid Loading |
| Content | ✅ MudDataGrid Loading |
| Login | ❌ فقط دکمه Disabled میشود |
U2 — عدم وجود Empty State
اکثر صفحات وقتی دادهای نیست، جدول خالی نشان میدهند. فقط Commission WeeklyReports یک MudAlert نشان میدهد.
U3 — Delete Confirmation ناسازگار
- User:
ShowMessageBoxبا "حذف/لغو" - Products:
ShowMessageBoxبا "حذف/لغو" - Blog: احتمالاً
ShowMessageBox(مشابه) - مشکل: هیچکدام نام آیتم را نشان نمیدهند — فقط "آیا مطمئنید؟"
- باید: "آیا از حذف «نام محصول» مطمئنید؟"
U4 — عدم وجود اعلان/نوتیفیکیشن
- هیچ سیستم نوتیفیکیشن لحظهای وجود ندارد
- AppBar فقط نام کاربر دارد — بدون bell icon
- سفارشهای جدید، درخواستهای برداشت جدید و غیره بدون اطلاعرسانی هستند
U5 — عدم وجود جستجوی سراسری
- هیچ global search در AppBar وجود ندارد
- هر صفحه فیلتر مخصوص خودش را دارد
U6 — تاریخ شمسی ناسازگار
- بعضی صفحات از
MiladiToJalali()استفاده میکنند - بعضی از
PersianDateTime.ConvertToPersianDateTime() - بعضی
ToString("yyyy/MM/dd")(میلادی!) نشان میدهند MudDatePickerتقویم میلادی دارد — باید جلالی باشد
U7 — عدم وجود Dark Mode Toggle
CustomMudTheme.csهیچPaletteDarkندارد- هیچ toggle در AppBar وجود ندارد
U8 — عدم وجود Profile/Settings کاربر ادمین
- AppBar فقط شماره موبایل نشان میدهد
- بدون dropdown menu برای پروفایل، تنظیمات، خروج
- خروج فقط از NavMenu امکانپذیر است
� تحلیل عمیق جریانهای UX
UXF1 — جریان مدیریت سفارش شکسته
مسیر فعلی: کاربر → لیست سفارشها → جزئیات (دیالوگ) → ؟
مشکلات:
- آمار سفارشها (مجموع، نمودار وضعیت ارسال) کامنت شده — ادمین هیچ overview ندارد
_paidOrdersو_totalPaidAmountدر Dashboard فقط از ۱۰ سفارش اخیر محاسبه میشود (PageSize=10) — عدد نمایشی اشتباه است- بعد از تغییر وضعیت ارسال، هیچ notification به کاربر ارسال نمیشود
- اگر ادمین از صفحه User → Orders برود، هیچ breadcrumb نیست تا بفهمد از کجا آمده
- فیلتر
MudDatePickerتقویم میلادی دارد — ادمین ایرانی با تاریخ میلادی آشنا نیست - فیلتر
DeliveryStatusمقدارهای0-4دارد ولی domain enum مقدارNone=0, Pending=1, InTransit=2, Delivered=3, Returned=4, Cancelled=5دارد — Cancelled=5 در فیلتر وجود ندارد!
UXF2 — جریان مالی کاربر (Wallet) وجود ندارد
CMS domain:
UserWalletسه نوع موجودی دارد:Balance(اصلی)،NetworkBalance(کارمزد/طلایی)،DiscountBalance(تخفیف)UserWalletChangeLogتاریخچه کامل تغییرات هر سه موجودی را ثبت میکند
BackOffice:
- ❌ هیچ صفحهای برای مشاهده موجودی کیف پول کاربران وجود ندارد
- ❌ هیچ صفحهای برای تاریخچه تغییرات کیف پول وجود ندارد
- فقط در ManualPayments میتوان شارژ دستی انجام داد — ولی ادمین نمیتواند موجودی فعلی را ببیند!
- سناریو: ادمین باید موجودی کاربر را بررسی کند → مجبور است مستقیم به DB مراجعه کند
UXF3 — جریان فعالسازی عضویت باشگاه ناقص
CMS domain flow (کامل):
- کاربر پکیج میخرد (Direct یا DayaLoan)
- قرارداد عضویت باشگاه امضا میشود (
UserContract) - عضویت باشگاه فعال میشود (
ClubMembership) - فیچرهای باشگاه اختصاص داده میشود (
UserClubFeature) - کاربر وارد شبکه باینری میشود (
NetworkParentId + LegPosition)
BackOffice:
- ✅ صفحه ClubMembers: فعالسازی، غیرفعالسازی، مشاهده جزئیات
- ❌ مدیریت ClubFeature (فیچرهای باشگاه) وجود ندارد — ادمین نمیتواند فیچرها را مدیریت کند
- ❌ مدیریت UserClubFeature وجود ندارد — نمیتوان فیچر خاصی را برای کاربر خاص فعال/غیرفعال کرد
- ❌ مدیریت قراردادها (UserContract) وجود ندارد — فایلهای قرارداد امضاشده قابل مشاهده نیست
- ❌ تاریخچه عضویت باشگاه (ClubMembershipHistory) وجود ندارد
- ❌ صفحه ClubMembers تاریخها را میلادی نشان میدهد
UXF4 — جریان وام دایا کاملاً غایب
CMS domain:
DayaLoanContractentity: شامل کد ملی، شماره قرارداد، وضعیت (Pending/Approved/Rejected/Disbursed/Completed/Failed)، آخرین استعلام، پردازش شارژ کیف پولDayaLoanCQ: Commands + EventHandlers + Services — سیستم کامل وام
BackOffice:
- ❌ هیچ صفحهای برای مدیریت وام دایا وجود ندارد
- فقط در
UserNetworkInfoیک نمایش ساده "وضعیت دایا" وجود دارد - ادمین نمیتواند: وامهای جدید را ببیند، وضعیت را تغییر دهد، استعلام دستی بزند
UXF5 — جریان پرداخت دستی (ManualPayment) بدون تأیید مناسب
CMS domain:
ManualPaymentStatus:Pending → Approved/Rejected/Cancelled- تأیید باید توسط SuperAdmin انجام شود — جداسازی نقش creator و approver
BackOffice:
- ✅ صفحه ManualPayments وجود دارد با فیلتر و جزئیات
- ❌ دکمه تأیید/رد مستقیم در لیست وجود ندارد — فقط "جزئیات" میتوان دید
- ❌ هیچ تفاوت بصری بین Pending (نیاز به اقدام) و بقیه وضعیتها نیست
- ❌ عدم وجود counter/badge برای تعداد درخواستهای در انتظار
- ❌ تصویر فیش واریزی (
ImagePath) قابل مشاهده نیست - ❌ بدون فیلتر تاریخی
UXF6 — جریان کمیسیون و برداشت — Gap Analysis
CMS domain (کامل):
- Worker هفتگی:
CalculateWeeklyBalances→CalculateWeeklyCommissionPool→ProcessUserPayouts - واریز به NetworkBalance کیف پول
- کاربر درخواست برداشت (
RequestWithdrawal) - ادمین تأیید (
ApproveWithdrawal) یا رد (RejectWithdrawal) - پردازش نهایی (
ProcessWithdrawal) - تاریخچه (
CommissionPayoutHistory)
BackOffice — آنچه وجود دارد:
- ✅ Commission Dashboard (نمای استخر)
- ✅ WeeklyReports (تاریخچه هفتگی)
- ✅ UserPayouts (پرداختها)
- ✅ WithdrawalRequests (درخواستها)
- ✅ WithdrawalReports (گزارش)
- ✅ WorkerControl (کنترل worker)
BackOffice — آنچه ناقص است:
- ❌ در WithdrawalRequests دکمه Approve/Reject وجود ندارد (فقط لیست نمایش میدهد)
- ❌ وقتی worker اجرا میشود، هیچ progress indicator لحظهای نیست
- ❌ بعد از محاسبه دستی، نتیجه به ادمین نشان داده نمیشود (فقط refresh لازم است)
- ❌ تاریخچه اجرای worker (
WorkerExecutionLog) قابل مشاهده نیست (صفحه WorkerControl آن را نمایش نمیدهد) - ❌ هیچ alert/notification خودکار وقتی درخواست برداشت جدید ثبت میشود
UXF7 — جریان مدیریت محصولات — ناهماهنگی دو فروشگاه
CMS domain:
- Products (محصولات اصلی/پکیج):
Product,ProductCategory,ProductGallery,ProductImage,ProductTag - DiscountProducts (فروشگاه تخفیفی):
DiscountProduct,DiscountProductCategory,DiscountProductImage - Inventory:
InventoryItem,StockMovement,Warehouse— مشترک بین هر دو
BackOffice:
- Products: دارای BulkEdit، Excel Export، Gallery، Tag assignment، Category drag-drop — کامل و خوب
- DiscountProducts: فیلتر دستهبندی پیادهسازی نشده (
TODO: Load categories)، بدون Gallery، بدون Tag - ❌ هیچ لینکی بین InventoryItem و DiscountProduct وجود ندارد — ادمین نمیفهمد موجودی کدام محصول تخفیفی کم است
- ❌ DiscountProducts از
Items(client-side) بجایServerDataاستفاده میکند — با داده زیاد کُند میشود
UXF8 — جریان User Profile ادمین
مشکل: ادمین هیچ "هویت" در سیستم ندارد:
- AppBar فقط
subclaim (شماره موبایل) نشان میدهد - بدون dropdown menu
- بدون نمایش نام/نقش
- بدون عکس پروفایل
- خروج فقط از drawer ممکن است
- Settings page دارای toggleهایی برای Dark Mode و زبان است — ولی هیچکدام عملکرد واقعی ندارند (فقط local state هستند)
�💼 ضعفهای بیزینسی و فیچرهای ناقص
B1 — DiscountShop Widget غیرفعال در Dashboard
<!-- TEMPORARILY DISABLED (needs DiscountOrder proto) -->
@* <BackOffice.Pages.Dashboard.DiscountShopWidget /> *@
- پیام "در حال توسعه" نشان میدهد
B2 — UserOrder آمار کامنتشده
@* <MudItem xs="12" md="4">
<MudCard>
<MudText Typo="Typo.subtitle2">جمع سفارشها در بازه فعلی</MudText>
...
</MudCard>
</MudItem> *@
- آمار سفارش و نمودار وضعیت ارسال کامنت شدهاند
B3 — DiscountShop Categories خالی
<MudSelectItem Value="@((long?)null)">همه</MudSelectItem>
@* TODO: Load categories *@
- فیلتر دستهبندی DiscountProducts هنوز پیادهسازی نشده
B4 — Dashboard Index محاسبات ناقص
_paidOrders = orderResult.Models.Count(m => m.PaymentStatus==PaymentStatus.Success);
_totalPaidAmount = orderResult.Models
.Where(m => m.PaymentStatus==PaymentStatus.Success)
.Aggregate(0L, (sum, m) => sum + m.Amount);
- فقط از ۱۰ سفارش اول (
PageSize = 10) آمار میگیرد — نادرست! _paidOrdersو_totalPaidAmountاز کل دادهها محاسبه نمیشوند
B5 — عدم وجود Export/خروجی در اکثر صفحات
| صفحه | Export |
|---|---|
| Products | ✅ Excel |
| بقیه صفحات | ❌ ندارند |
B6 — عدم وجود Audit Trail / لاگ فعالیت ادمین
- هیچ سیستم لاگ فعالیت ادمین وجود ندارد
- حذف، ویرایش، تغییر وضعیت بدون ثبت در audit log
B7 — عدم وجود تأیید دومرحلهای برای عملیات حساس
- محاسبه دستی کمیسیون بدون تأیید مضاعف
- حذف گروهی محصولات فقط یک confirm ساده دارد
- تغییر تنظیمات سیستم بدون نیاز به تأیید مجدد رمز
B8 — WithdrawalRequests فقط نمایشی است
- CMS دارای
ApproveWithdrawal,RejectWithdrawal,ProcessWithdrawalcommands است - BackOffice صفحه WithdrawalRequests فقط لیست نشان میدهد
- هیچ دکمه تأیید/رد/پردازش وجود ندارد — ادمین نمیتواند درخواستها را مدیریت کند
- این یک شکاف بحرانی عملیاتی است
B9 — Discount Shop Orders وضعیت ارسال بدون اقدام
- DiscountOrdersMainPage سفارشها را نشان میدهد
- دکمه "تغییر وضعیت" وجود دارد اما flow مبهم است
- CMS دارای
UpdateOrderStatusوCancelOrderByAdminهست - ❌ هیچ workflow واضحی برای تغییر وضعیت Pending→Processing→Shipped→Delivered وجود ندارد
- ❌ کد رهگیری پستی قابل ثبت نیست
B10 — Settings page عملکرد ندارد
UserSettings.razorدارای toggleهای Dark Mode، زبان، حالت فشرده، PageSize- هیچکدام persistent نیستند — بعد از refresh همه reset میشوند
- احتمالاً با
localStorageذخیره شود ولی هیچ جای دیگر خوانده نمیشود
🔀 تحلیل تطبیقی CMS ↔ BackOffice
Entityهای CMS بدون صفحه مدیریت در BackOffice
| CMS Entity | Domain Feature | BackOffice صفحه | وضعیت |
|---|---|---|---|
| UserWallet | ۳ نوع موجودی (اصلی/شبکه/تخفیف) | ❌ ندارد | 🔴 بحرانی — ادمین نمیتواند موجودی ببیند |
| UserWalletChangeLog | تاریخچه تمام تغییرات مالی | ❌ ندارد | 🔴 بحرانی — بدون audit trail مالی |
| DayaLoanContract | مدیریت وام دایا (6 وضعیت) | ❌ ندارد | 🟡 مهم — اگر سیستم فعال است |
| ClubFeature | فیچرهای باشگاه (تعریف) | ❌ ندارد | 🟡 مهم |
| UserClubFeature | فیچرهای فعال شده برای هر کاربر | ❌ ندارد | 🟡 مهم |
| UserContract | قراردادهای امضاشده + PDF | ❌ ندارد | 🟡 مهم — قراردادها قابل مشاهده نیست |
| ClubMembershipHistory | تاریخچه عضویت | ❌ ندارد | 🟢 |
| CommissionPayoutHistory | تاریخچه پرداخت کمیسیون | ❌ ندارد | 🟢 |
| NetworkMembershipHistory | تاریخچه تغییرات شبکه | ❌ ندارد | 🟢 |
| WorkerExecutionLog | تاریخچه اجرای worker | ❌ ندارد (query وجود دارد) | 🟢 |
CMS Commands بدون UI در BackOffice
| CMS Command | عملکرد | BackOffice UI | وضعیت |
|---|---|---|---|
ApproveWithdrawal |
تأیید درخواست برداشت | ❌ دکمه ندارد | 🔴 بحرانی |
RejectWithdrawal |
رد درخواست برداشت | ❌ دکمه ندارد | 🔴 بحرانی |
ProcessWithdrawal |
پردازش نهایی برداشت | ❌ دکمه ندارد | 🔴 بحرانی |
AssignClubFeature |
اختصاص فیچر به کاربر | ❌ صفحه ندارد | 🟡 |
MoveInNetwork |
جابهجایی در شبکه | ❌ دکمه ندارد | 🟡 |
RemoveFromNetwork |
حذف از شبکه | ❌ دکمه ندارد | 🟡 |
CancelOrderByAdmin |
لغو سفارش توسط ادمین | ❌/✅ فقط برای UserOrder (نه DiscountOrder) | 🟡 |
ProcessManualMembershipPayment |
پردازش پرداخت دستی عضویت | ❓ نامشخص | 🟡 |
CMS Queries بدون UI در BackOffice
| CMS Query | عملکرد | وضعیت |
|---|---|---|
GetCommissionPayoutHistory |
تاریخچه پرداخت هر کاربر | ❌ |
GetClubMembershipHistory |
تاریخچه عضویت | ❌ |
GetNetworkMembershipHistory |
تاریخچه شبکه | ❌ |
GetWorkerExecutionLogs |
لاگهای worker | ❌ |
GetWeekDefinitions |
لیست هفتهها | ✅ (در WeekNumberPicker) |
GetUserWeeklyBalances |
موجودی هفتگی کاربر | ✅ |
GetDiscountSalesReport |
گزارش فروش تخفیفی | ✅ |
سهگانه کیف پول — خلأ بحرانی
CMS سه نوع موجودی برای هر کاربر دارد:
UserWallet {
Balance → موجودی اصلی (شارژ مستقیم + درگاه)
NetworkBalance → موجودی شبکه/طلایی (از کمیسیون — قابل برداشت نقدی)
DiscountBalance → موجودی تخفیف (فقط خرید از فروشگاه تخفیفی)
}
BackOffice هیچ نمایی از این سه موجودی ندارد. ادمین برای:
- بررسی موجودی کاربر → باید DB بزند
- ردیابی تغییرات مالی → هیچ راهی ندارد
- تأیید ManualPayment → نمیداند موجودی قبل و بعد چقدر بود
- تأیید درخواست برداشت → نمیداند NetworkBalance فعلی کاربر چقدر است
🏗 تحلیل ساختاری صفحات و ناوبری
۱. صفحات Stub (بدون Backend واقعی)
صفحاتی که UI دارند ولی هیچ API واقعی ندارند و کاربر را گمراه میکنند:
| صفحه | مسیر | مشکل | خطوط کد | تأثیر |
|---|---|---|---|---|
| Transactions | /payment/transactions |
🔴 کاملاً خالی — LoadServerData فقط Array.Empty برمیگرداند. TODO: Connect to API |
180 | کاربر GridEmpty میبیند |
| AlertsMonitoring | /system/alerts |
🔴 100% داده Mock — GenerateMockAlerts() با Task.Delay(500) |
422 | آلارمها واقعی نیست |
| HealthDashboard | /system/health |
🟡 نیمه Mock — سرویسها از API، ولی CPU/RAM/Disk/Network همه hardcoded (45.2%, 62.8%...) | 468 | متریکها تقلبی |
| UserSettings | /settings |
🟡 Backend جعلی — تغییر رمز: فقط فیلد را خالی میکند + Snackbar. نوتیفیکیشن: فقط localStorage. 2FA: فقط localStorage | 418 | اعتماد کاذب |
توصیه:
- Transactions → حذف از پروژه یا مخفی کردن تا API آماده شود
- AlertsMonitoring → حذف از NavMenu + نشان دادن badge «در حال توسعه»
- HealthDashboard → حذف بخش Resource Metrics تا زمان اتصال واقعی
- UserSettings → حذف تبهای Notifications و Security یا نمایش پیام «بهزودی»
۲. صفحات تکراری / قابل ادغام
🔴 دو داشبورد موازی و ناسازگار
Index (/) |
SystemOverview (/dashboard/overview) |
|
|---|---|---|
| تمرکز | آمار عمومی (کاربران، محصولات، سفارشها) | آمار شبکه/باشگاه/کمیسیون |
| Stat Cards | 7 عدد (MudPaper ساده) | 4+3 عدد (MudCard Outlined) |
| Design Pattern | MudPaper Class="pa-4" |
MudCard Outlined |
| Loading | ❌ ندارد | ✅ MudProgressCircular |
| جدول | آخرین 5 سفارش (MudTable) | ❌ ندارد |
| Quick Actions | ❌ ندارد | ✅ 6 دکمه Shortcut |
| محاسبه آمار | 🔴 نادرست (PageSize=10) | ✅ صحیح (از metadata) |
مشکل: کاربر دو «داشبورد» با design متفاوت میبیند. هیچکدام کامل نیست.
توصیه: ادغام در یک Dashboard واحد — Stat Cards بالا + Quick Actions + آخرین سفارشها + خلاصه کمیسیون.
🔴 DiscountOrders + SalesReports — ۶۰% تکرار
| عنصر | DiscountOrdersMainPage | SalesReports |
|---|---|---|
GetOrdersAsync |
✅ | ✅ (دوباره!) |
| جدول سفارشها | ✅ 8 ستون | ✅ 6 ستون (همانها) |
GetStatusColor() |
✅ | ✅ copy-paste یکسان |
GetStatusText() |
✅ | ✅ copy-paste یکسان |
| فیلتر تاریخ | ❌ | ✅ |
| چارتها | ❌ | ✅ |
| Export | ❌ | ✅ CSV/PDF |
| تغییر وضعیت | ✅ dialog | ❌ |
توصیه: ادغام در یک صفحه با ۲ تب: «مدیریت سفارشات» + «گزارشات و چارتها»
🟡 Club Statistics — کارکرد حداقلی
- 4 Stat Card + 3 Chart + یک جدول «اعضای اخیر» که همیشه خالی است (list initialize نمیشود)
- تمام linkهایش به ClubMembers هدایت میکنند
- توصیه: تبدیل به header/summary در بالای ClubMembers یا تب «آمار» در همان صفحه
🟡 Commission: Payouts vs WithdrawalRequests — Lifecycle یکسان
| UserPayouts | WithdrawalRequests | |
|---|---|---|
| داده | Payout per user/week | Withdrawal requests |
| Status | 6 state (0-5) | 6 state (0-5) — همان enum |
| Approve | ✅ ApproveCommissionPayout |
✅ ApproveWithdrawal |
| Reject | ✅ RejectCommissionPayout |
✅ RejectWithdrawal |
| Process | ❌ | ✅ ProcessWithdrawal |
| Bank Info | ❌ | ✅ IBAN/BankRef/TrackingCode |
هر دو یک lifecycle را نشان میدهند (Payout → Withdrawal Request → Process). کاربر برداشت را هم در Payouts و هم در WithdrawalRequests میبیند.
توصیه: ادغام در یک صفحه با ۲ تب: «پرداختها» + «درخواستهای برداشت» یا حداقل cross-link.
🟡 Blog + Tag — الگوی یکسان
| BlogCategories | TagManagement | |
|---|---|---|
| Columns | ID, Title, Slug, PostCount, Status, Sort | ID, Name, Title, IsActive, Sort |
| Actions | Create/Edit/Delete via Dialog | Create/Edit/Delete via Dialog |
| Pattern | BasePageComponent + ServerData | BasePageComponent + ServerData |
| Code-behind | ~102 lines | ~114 lines |
ساختار کد 95% یکسان. هر دو CRUD سادهاند.
توصیه: تبدیل به تبهایی در صفحه Blog یا یک صفحه «مدیریت محتوا» مشترک.
🟡 سه صفحه System — قابل ادغام
Alerts (Mock) + Health (نیمهMock) + WorkerControl (نیمهفعال) + Configuration (فعال)
توصیه: ادغام در یک /system با ۴ تب. فعلاً فقط Configuration و WorkerControl کاربردیاند.
۳. مشکلات ساختاری NavMenu
لینکهای مرده در منو
| لینک در NavMenu | مقصد | مشکل |
|---|---|---|
ترتیب دستهبندیها |
/products/categories-dragdrop |
🔴 صفحهای با این route وجود ندارد! — احتمالاً باید /ProductCategoriesPage/ باشد |
صفحات بدون لینک در منو
| صفحه | مسیر | وضعیت |
|---|---|---|
| Transactions | /payment/transactions |
🔴 لینکی ندارد — در NavMenu فقط ManualPayments هست |
| WorkerControl | /system/worker-control |
🔴 لینکی ندارد — در بخش سیستم نیست |
| InventoryAddStock | RouteConstance تعریف شده |
🟡 route موجود ولی صفحهای استفاده نمیکند |
عدم تطابق گروهبندی
| مشکل | جزئیات |
|---|---|
| تکرار عنوان «فروشگاه تخفیفی» | هم بهعنوان MudText section header و هم MudNavGroup — دو بار عنوان نمایش داده میشود |
| «پیامهای عمومی» زیر فروشگاه تخفیفی | ارتباطی با فروشگاه ندارد — باید در «مدیریت محتوا» باشد |
| «پرداختها و فعالسازیها» — فقط یک آیتم | گروه NavGroup با یک زیرآیتم، بیمعنی — باید Flat link باشد یا Transactions هم اضافه شود |
| «مدیریت پکیج» جدای از محصولات | پکیج و محصولات مرتبطاند ولی پکیج flat link و محصولات NavGroup |
| سفارشها flat link ولی DiscountOrders در NavGroup | دو نوع سفارش با ساختار منو متفاوت |
پیشنهاد ساختار منوی بازنگریشده
📊 داشبورد (ادغام Index + SystemOverview)
💰 کمیسیون و شبکه
├─ داشبورد کمیسیون
├─ گزارشهای هفتگی
├─ پرداخت و برداشت (ادغام Payouts + WithdrawalRequests)
├─ گزارش برداشتها
├─ درخت شبکه
├─ موجودیهای شبکه
└─ آمار شبکه
🎫 باشگاه مشتریان
├─ اعضا و آمار (ادغام ClubMembers + Statistics)
└─ مدیریت فیچرها (جدید — از CMS)
🛒 فروشگاه
├─ 🏷 محصولات
│ ├─ لیست محصولات
│ ├─ ویرایش دستهجمعی
│ ├─ دستهبندیها
│ └─ تگها (از مدیریت محتوا به اینجا)
├─ 📦 پکیجها
├─ 📋 سفارشها (همه) (UserOrders + DiscountOrders — tab)
└─ 🏪 فروشگاه تخفیفی
├─ محصولات تخفیفی
├─ دستهبندیها
└─ گزارش فروش (ادغام با سفارشات)
📦 انبارداری
├─ موجودی انبار
├─ محصولات کمموجود
├─ مدیریت انبارها
└─ تاریخچه تغییرات
👥 مدیریت
├─ کاربران
├─ نقشها
├─ 💳 کیف پول کاربران (جدید — از CMS)
├─ 💰 پرداختهای دستی
└─ 📄 قراردادها (جدید — از CMS)
📝 مدیریت محتوا
├─ بلاگ (پستها + دستهبندیها) (ادغام در یک صفحه)
├─ صفحات سایت
└─ پیامهای عمومی (از فروشگاه تخفیفی به اینجا)
⚙️ سیستم
├─ تنظیمات سیستم
├─ مدیریت Worker
├─ نسخه اپلیکیشنها (از Settings به اینجا)
└─ سلامت سیستم
👤 تنظیمات حساب
🚪 خروج
۴. ناوبری بین صفحات — لینکهای Cross-Reference ناقص
| از | به | وضعیت |
|---|---|---|
| User → UserOrders | /UserOrderPage/{userId} |
✅ |
| User → UserAddress | /UserAddressPage/{userId} |
✅ |
| Products → ProductCategories | /ProductCategoriesPage/{productId} |
✅ |
| Products → BulkEdit | /ProductsBulkEditPage/ |
✅ |
| Inventory → Movements | /InventoryMovementsPage/?itemId= |
✅ |
| UserOrder → User | ❌ | 🔴 نام کاربر کلیکنخور — نمیتوان از سفارش به پروفایل کاربر رفت |
| UserOrder → Product | ❌ | 🔴 محصول سفارش لینک ندارد |
| Inventory → Products | ❌ | 🟡 نام محصول نشان داده میشود ولی لینک ندارد |
| Products → Inventory | ❌ | 🟡 ستون «موجودی» وجود دارد ولی drill-down ندارد |
| DiscountShop → Products | ❌ | 🔴 دو سیستم محصول کاملاً جدا — cross-link ندارند |
| Commission → User | ❌ | 🟡 نام کاربر در Payouts نشان داده میشود ولی به پروفایل لینک ندارد |
| ManualPayment → User | ❌ | 🟡 UserName بدون لینک |
| هیچ صفحهای → Wallet | ❌ | 🔴 صفحه کیف پول اصلاً وجود ندارد |
۵. الگوهای کد تکراری (Code Duplication)
| الگوی تکراری | تکرار | فایلها |
|---|---|---|
GetStatusColor() / GetStatusText() برای CommissionPayoutStatus |
4× | Payouts, WithdrawalRequests, WeeklyReports, PayoutDetailsDialog |
GetStatusColor() / GetStatusText() برای DiscountOrder |
2× | DiscountOrdersMainPage, SalesReports |
| الگوی CRUD ساده (Grid + Create/Edit Dialog) | 6× | BlogCategory, Tag, Package, Role, DiscountCategory, ClubFeature(!) |
فیلتر BasePageComponent با SubmitFilter() |
9× | User, Products, Package, Category, UserOrder, Transactions, UserAddress, UserRole, Role |
UserAutoComplete component usage |
5× | UserOrder, Payouts, WithdrawalRequests, WithdrawalReports, BalancesReport |
Mock data pattern GenerateMock*() |
2× | AlertsMonitoring, HealthDashboard |
۶. تحلیل کاربردی — صفحات «ارزشآفرین» vs «کمکاربرد»
| صفحه | فرکانس استفاده تخمینی | ارزش | یادداشت |
|---|---|---|---|
| Dashboard | روزانه | 🔴 ناقص | باید بهترین صفحه باشد — فعلاً ضعیفترین |
| UserOrders | روزانه | ✅ بالا | صفحه اصلی عملیات روزانه |
| Products | هفتگی | ✅ بالا | مدیریت کاتالوگ |
| Commission Payouts | هفتگی | ✅ بالا | مدیریت مالی |
| WithdrawalRequests | روزانه | 🔴 ناقص | بدون approve/reject = عملاً بیفایده |
| Inventory | روزانه | ✅ بالا | مدیریت موجودی |
| ManualPayments | روزانه | 🟡 ناقص | بدون quick-approve |
| Users | هفتگی | ✅ خوب | CRUD ساده ولی کافی |
| Club Members | هفتگی | 🟡 متوسط | فاقد feature management |
| Network Tree | هفتگی | ✅ خوب | ویژوالیزیشن خوب |
| Blog | ماهانه | ✅ خوب | CRUD کامل |
| DiscountShop | هفتگی | 🟡 ناقص | فیلتر خراب، client-side paging |
| Alerts | — | 🔴 بیکاربرد | 100% mock |
| Transactions | — | 🔴 بیکاربرد | 100% خالی |
| Health | ماهانه | 🟡 ناقص | فقط service status واقعی |
| Settings | یکبار | 🟡 ناقص | فقط theme واقعی |
📊 جدول یافتهها به تفکیک صفحه
| صفحه | الگوی لایوت | Loading | Empty State | Pager فارسی | تاریخ شمسی | Export | مشکلات خاص |
|---|---|---|---|---|---|---|---|
| Index | C (بدون Container) | ❌ | ❌ | — | ❌ میلادی | ❌ | آمار نادرست از ۱۰ رکورد |
| SystemOverview | B | ✅ | ❌ | — | ❌ | ❌ | Widget غیرفعال |
| User | A (BasePageComponent) | ❌ | ❌ | ✅ | — | ❌ | — |
| UserOrder | A | ❌ | ❌ | ✅ | ✅ جلالی | ❌ | آمار کامنتشده |
| Package | A | ❌ | ❌ | ✅ | — | ❌ | — |
| Products | A | ❌ | ❌ | ❌ | — | ✅ | cursor:pointer زائد |
| Category | A (سفارشی + درخت) | ❌ | ❌ | — | — | ❌ | — |
| Blog | B | ❌ | ❌ | ✅ | ❌ میلادی | ❌ | — |
| Tag | B | ❌ | ❌ | ✅ | — | ❌ | — |
| Content | B | ✅ | ❌ | — | ❌ میلادی | ❌ | — |
| PublicMessages | B | ✅ | ❌ | — | — | ❌ | — |
| Commission Dashboard | B | ✅ | ❌ | — | ✅ | ❌ | — |
| WeeklyReports | B | ✅ | ✅ | — | ❌ میلادی | ❌ | — |
| WithdrawalRequests | B | ❌ | ❌ | — | — | ❌ | — |
| Network Tree | B | ✅ | ✅ | — | — | ✅ PNG | — |
| Club Members | B | ❌ | ❌ | — | ❌ میلادی | ❌ | — |
| Inventory | B | ❌ | ❌ | — | — | ❌ | — |
| DiscountShop | B | ✅ | ❌ | — | — | ❌ | TODO: دستهبندی |
| Settings | B | ✅ | ❌ | — | — | ❌ | — |
| Configuration | B | ❌ | — | — | — | ❌ | — |
| HealthDashboard | B | ❌ | ❌ | — | — | ❌ | — |
| WorkerControl | B | ❌ | — | — | ✅ | ❌ | — |
| Login | EmptyLayout | ❌ | — | — | — | — | عرض ثابت 35% |
| VerifyCode | EmptyLayout | ❌ | — | — | — | — | ارتفاع ثابت |
🛠 برنامه اجرایی (Action Plan) — با وضعیت پیادهسازی
فاز ۱: زیرساخت دیزاین سیستم (Critical) — ✅ کامل
| # | کار | فایل(ها) | اولویت | وضعیت |
|---|---|---|---|---|
| 1.1 | یکسانسازی تم رنگی با FrontOffice + اضافه کردن PaletteDark | CustomMudTheme.cs |
🔴 | ✅ تم #6366f1 Indigo + PaletteDark کامل |
| 1.2 | حذف تمام رنگهای هاردکد از CSS و inline styles | app.css, NavMenu.razor.css, MainLayout.razor, admin-org-chart.css |
🔴 | ✅ حذف شد |
| 1.3 | اصلاح عنوان اپ: "فرصت" → "کارا بازار سلامت" | MainLayout.razor |
🔴 | ✅ اصلاح شد |
| 1.4 | Dark Mode Toggle | MainLayout.razor, CustomMudTheme.cs |
🟡 | ✅ toggle در AppBar + PaletteDark |
| 1.5 | ساخت کامپوننت StatCard مشترک |
Common/BaseComponents/ |
🟡 | ✅ غیرضروری شد (داشبورد ادغام شد) |
فاز ۲: بازطراحی لایوت صفحات — ✅ کامل
| # | کار | فایل(ها) | اولویت | وضعیت |
|---|---|---|---|---|
| 2.1 | بازنویسی BasePageComponent — responsive + فیلتر بالای جدول |
BasePageComponent.razor |
🔴 | ✅ فیلتر collapsible بالای جدول، responsive |
| 2.2 | یکسانسازی MaxWidth همه صفحات | تمام صفحات | 🟡 | ✅ MainLayout MudContainer wrapper |
| 2.3 | یکسانسازی DataGrid Height | تمام صفحات | 🟡 | ✅ همه calc(100vh - 240px) |
| 2.4 | یکسانسازی PageSize و Pager فارسی | تمام صفحات | 🟡 | ✅ همه 20/50/100 + متن فارسی |
| 2.5 | اضافه کردن Breadcrumb به MainLayout | MainLayout.razor |
🟡 | ✅ AppBreadcrumb.razor ساخته شد |
| 2.6 | بازطراحی صفحات Login + VerifyCode | LoginPage.razor, VerifyCodePage.razor |
🔴 | ✅ طراحی جدید responsive + برندینگ |
فاز ۲.۵: پاکسازی ساختاری — ✅ کامل (7/7)
| # | کار | اولویت | وضعیت |
|---|---|---|---|
| 2.5.1 | حذف/مخفی کردن Transactions page (stub خالی) | 🔴 | ✅ حذف از NavMenu |
| 2.5.2 | حذف Alerts از NavMenu (mock) | 🔴 | ✅ حذف شد |
| 2.5.3 | فیکس لینک مرده categories-dragdrop در NavMenu |
🔴 | ✅ حذف شد |
| 2.5.4 | اضافه کردن WorkerControl به NavMenu بخش سیستم | 🟡 | ✅ در SystemHub تب شد |
| 2.5.5 | حذف تبهای Notifications/Security از UserSettings (fake backend) | 🟡 | ✅ تبها به «بهزودی» placeholder تبدیل شدند |
| 2.5.6 | حذف hardcoded resource metrics از HealthDashboard | 🟡 | ✅ متریکها با placeholder «Prometheus/Grafana» جایگزین شدند |
| 2.5.7 | انتقال «پیامهای عمومی» از بخش فروشگاه تخفیفی به مدیریت محتوا | 🟢 | ✅ در NavMenu جدید منتقل شد |
فاز ۳: UX بهبودها — ✅ کامل (6/6)
| # | کار | فایل(ها) | اولویت | وضعیت |
|---|---|---|---|---|
| 3.1 | Loading State یکپارچه | تمام صفحات | 🟡 | ✅ صفحات جدید دارند |
| 3.2 | Empty State یکپارچه (NoRecordsContent) | تمام صفحات | 🟡 | ✅ ۳۳ DataGrid |
| 3.3 | Delete Confirmation با نام آیتم | تمام صفحات | 🟢 | ✅ ۱۱ صفحه اصلاح شد |
| 3.4 | User Menu در AppBar (پروفایل + خروج) | MainLayout.razor |
🟡 | ✅ MudMenu با نام + خروج |
| 3.5 | Dark Mode Toggle | MainLayout.razor, CustomMudTheme.cs |
🟢 | ✅ toggle + PaletteDark |
| 3.6 | تاریخ شمسی یکپارچه در تمام صفحات | تمام صفحات | 🟡 | ✅ ۱۹+ فایل — .MiladiToJalali() / .MiladiToJalaliWithTime() از DateTimeConverterCL |
فاز ۳.۵: ادغام صفحات — ✅ کامل (5/6)
| # | کار | صفحات مبدأ | نتیجه | اولویت | وضعیت |
|---|---|---|---|---|---|
| 3.5.1 | ادغام ۲ داشبورد | Index + SystemOverview | یک Dashboard واحد | 🔴 | ✅ Index.razor merged |
| 3.5.2 | ادغام DiscountOrders + SalesReports | ۲ صفحه → ۱ صفحه + ۲ تب | DiscountShopHub | 🟡 | ✅ |
| 3.5.3 | ادغام Club Members + Statistics | ۲ صفحه → ۱ صفحه + header | ClubHub | 🟡 | ✅ |
| 3.5.4 | ادغام Blog + BlogCategories + Tags | ۳ صفحه → ۱ صفحه + ۳ تب | BlogHub | 🟢 | ✅ |
| 3.5.5 | ادغام System pages | Config+Worker+Health → ۱ + ۳ تب | SystemHub | 🟢 | ✅ |
| 3.5.6 | Extract shared status helpers | حذف ۴ تکرار GetStatusColor/Text | Helper مشترک | 🟢 | ⏭ Skip — هر context مقادیر متفاوت دارد (domain-specific) |
فاز ۴: فیکسهای بیزینسی — ✅ کامل (10/11)
| # | کار | فایل(ها) | اولویت | وضعیت |
|---|---|---|---|---|
| 4.1 | اصلاح محاسبه آمار Dashboard (از metadata نه page data) | Index.razor |
🔴 | ✅ داشبورد merged با API درست |
| 4.2 | اضافه کردن دکمههای تأیید/رد به WithdrawalRequests | WithdrawalRequests.razor |
🔴 | ✅ + ViewDetailsDialog + RejectReasonDialog |
| 4.3 | اضافه کردن دکمههای تأیید/رد به ManualPayments | ManualPaymentsMainPage.razor |
🔴 | ✅ Approve/Reject با confirmation |
| 4.4 | اضافه کردن Cancelled=5 به فیلتر DeliveryStatus |
UserOrderMainPage.razor |
🔴 | ✅ MudSelectItem اضافه شد |
| 4.5 | فعالسازی DiscountShop Widget | SystemOverview.razor |
🟡 | ⏭ SystemOverview حذف شد (ادغام) |
| 4.6 | آنکامنت آمار UserOrder | UserOrderMainPage.razor |
🟡 | ✅ آمار + نمودار فعال شد |
| 4.7 | پیادهسازی فیلتر دستهبندی DiscountShop | DiscountProductsMainPage.razor |
🟡 | ✅ دستهبندیها از IDiscountCategoryService بارگذاری میشوند |
| 4.8 | تبدیل DiscountProducts از Items به ServerData | DiscountProductsMainPage.razor |
🟡 | ✅ ServerData + pagination سمت سرور |
| 4.9 | Settings page — persist با localStorage | UserSettings.razor |
🟡 | ✅ تب General با localStorage کار میکند (از قبل) |
| 4.10 | حذف cursor:pointer زائد از همه دکمهها |
تمام صفحات (17 فایل) | 🟢 | ✅ حذف شد از تمام فایلها |
| 4.11 | حذف Console.WriteLine از همه فایلها |
11 فایل | 🟢 | ✅ حذف شد از تمام فایلها |
فاز ۴.۵: Cross-Navigation — 🟡 بخشی انجام شد (3/5)
| # | کار | اولویت | وضعیت |
|---|---|---|---|
| 4.5.1 | لینک نام کاربر در UserOrders → پروفایل کاربر | 🟡 | ✅ MudLink به /network/user-info/{UserId} |
| 4.5.2 | لینک نام کاربر در Commission Payouts/Withdrawals → پروفایل کاربر | 🟡 | ✅ MudLink به /network/user-info/{UserId} |
| 4.5.3 | لینک نام محصول در Inventory → صفحه محصول | 🟢 | ⏭ Skip — صفحه جزئیات محصول وجود ندارد |
| 4.5.4 | لینک موجودی در Products → صفحه انبار | 🟢 | ⏭ Skip — صفحه جزئیات محصول وجود ندارد |
| 4.5.5 | بازنگری کلی NavMenu طبق ساختار پیشنهادی | 🟡 | ✅ انجام شد در فاز ۲.۵ |
فاز ۵: صفحات مفقود (CMS-Derived) — ✅ اکثراً کامل (7/8)
| # | کار | CMS Entity/Command | اولویت | وضعیت |
|---|---|---|---|---|
| 5.1 | صفحه مدیریت کیف پول کاربران | UserWallet, UserWalletChangeLog |
🔴 | ✅ WalletManagementPage.razor (۲ تب) |
| 5.2 | Workflow تأیید درخواست برداشت | ApproveWithdrawal, RejectWithdrawal |
🔴 | ✅ در فاز ۴.۲ انجام شد |
| 5.3 | صفحه مدیریت وام دایا | DayaLoanContract |
🟡 | ⏸ نیاز به proto بکاند — فعلاً امکانپذیر نیست |
| 5.4 | مدیریت فیچرهای باشگاه | ClubFeature, UserClubFeature |
🟡 | ✅ ClubFeaturesPage.razor (۲ تب) |
| 5.5 | نمایش قراردادهای کاربران | UserContract |
🟡 | ✅ UserContractPage.razor + ContractDetailsDialog |
| 5.6 | لاگ اجرای Workerها | GetWorkerExecutionLogs |
🟢 | ✅ تب WorkerControl در SystemHub قبلاً شامل لاگهاست |
| 5.7 | تاریخچه عضویت باشگاه | GetClubMembershipHistory |
🟢 | ✅ MemberDetailsDialog — تب تاریخچه با فیلدهای Created, Action, Reason, PerformedBy |
| 5.8 | تاریخچه تغییرات شبکه | GetNetworkMembershipHistory |
🟢 | ✅ UserNetworkInfo — تب تاریخچه با فیلدهای OldParentId, NewParentId, OldNetworkLeg, NewNetworkLeg |
فاز ۶: فیچرهای جدید (اختیاری) — ✅ اکثراً تکمیل
| # | کار | اولویت | وضعیت |
|---|---|---|---|
| 6.1 | سیستم نوتیفیکیشن (Bell icon + Dropdown) | 🟢 | ✅ Bell icon + MudMenu placeholder در MainLayout — آماده اتصال به بکاند |
| 6.2 | Global Search در AppBar | 🟢 | ✅ GlobalSearch.razor — جستجوی صفحات + کاربران (gRPC) — Autocomplete |
| 6.3 | Export Excel در تمام صفحات | 🟢 | ✅ ۱۰ صفحه — Products, ClubMembers, WithdrawalRequests, WeeklyReports, UserOrders, MovementsPage, Users, DiscountOrders, ManualPayments, Inventory |
| 6.4 | Audit Trail / لاگ فعالیت ادمین | 🟢 | ⏸ نیاز به بکاند — endpoint لاگ فعالیت ادمین موجود نیست |
| 6.5 | نمایش counter پرداختهای Pending در NavMenu | 🟢 | ✅ MudBadge روی «درخواستهای برداشت» — real-time از gRPC |
🔑 اولویتبندی نهایی — وضعیت اجرا
✅ انجام شده — فوری (فاز ۱ + ۲):
تم رنگی + حذف هاردکدها + PaletteDark✅اصلاح عنوان اپ✅بازنویسی BasePageComponent (responsive)✅بازطراحی Login/VerifyCode✅یکسانسازی الگوهای صفحات✅اصلاح محاسبه آمار Dashboard✅
✅ انجام شده — عملیات بحرانی (فاز ۴ + ۵):
⚡ دکمههای تأیید/رد درخواست برداشت✅ + ViewDetails + RejectReason dialogs⚡ دکمههای تأیید/رد پرداخت دستی✅⚡ صفحه کیف پول کاربران (۳ موجودی + تاریخچه)✅ WalletManagementPageاضافه کردن Cancelled به فیلتر سفارشها✅
✅ انجام شده — UX یکپارچه (فاز ۳):
Loading/Empty State یکپارچه✅ NoRecordsContent ۳۳ گریدUser Menu در AppBar✅Breadcrumb✅ AppBreadcrumb.razorادغام صفحات✅ ۵ hub page ساخته شد
✅ انجام شده — صفحات مفقود (فاز ۵):
مدیریت فیچرهای باشگاه✅ ClubFeaturesPage.razorنمایش قراردادهای کاربران✅ UserContractPage.razor + ContractDetailsDialog
❌ باقیمانده — اولویتبندی شده:
مهم 🟡 (۱ مورد):
- DayaLoanContract صفحه (5.3) — نیاز به بکاند (blocked)
جزئی 🟢 (۰ مورد — همه انجام شدند بهجز Audit Trail):
2. سیستم نوتیفیکیشن (6.1) ✅
3. Global Search (6.2) ✅
4. Audit Trail (6.4) ⏸ نیاز به بکاند
📊 خلاصه کمّی مشکلات — بروزرسانی
| شدت | تعداد اولیه | انجامشده | باقیمانده |
|---|---|---|---|
| 🔴 بحرانی | 16 | 16 ✅ | 0 |
| 🟡 مهم | 24 | 23 | 1 (DayaLoan — blocked) |
| 🟢 جزئی | 18 | 18 ✅ | 0 |
| مجموع | 58 | 57 (≈98%) | 1 (≈2%) |
همه ۱۶ مورد بحرانی 🔴 انجام شدهاند.
همه ۱۸ مورد جزئی 🟢 انجام شدهاند.
فازهای ۱ تا ۶ تکمیل شدند (بهجز DayaLoan و Audit Trail که نیاز به بکاند دارند).
تنها مورد باقیمانده: DayaLoanContract (5.3) — blocked on backend proto.
خلاصه ادغامها — نتیجه
| عمل | انجام شد؟ | نتیجه |
|---|---|---|
| ۲ داشبورد → ۱ | ✅ | Index.razor (unified dashboard) |
| DiscountOrders + Sales → tabs | ✅ | DiscountShopHub.razor |
| Club Members + Stats → tabs | ✅ | ClubHub.razor |
| Blog + BlogCat + Tag → tabs | ✅ | BlogHub.razor |
| System (3 pages) → tabs | ✅ | SystemHub.razor |
| حذف Transactions (stub) | ✅ | از NavMenu حذف شد |
| صرفهجویی | -9 صفحه مستقل |
فایلهای جدید ساختهشده
| فایل | عملکرد |
|---|---|
Shared/AppBreadcrumb.razor |
Breadcrumb خودکار با عنوان فارسی |
Pages/DiscountShop/DiscountShopHub.razor |
Hub سفارشات + گزارش فروش |
Pages/Club/ClubHub.razor |
Hub اعضا + آمار باشگاه |
Pages/Club/ClubFeaturesPage.razor |
فیچرهای باشگاه + فیچرهای کاربر |
Pages/Blog/BlogHub.razor |
Hub پست + دستهبندی + تگ |
Pages/SystemManagement/SystemHub.razor |
Hub تنظیمات + Worker + سلامت |
Pages/Wallet/WalletManagementPage.razor |
کیفپول + تاریخچه تغییرات |
Pages/Contract/UserContractPage.razor |
لیست قراردادهای کاربران |
Pages/Contract/ContractDetailsDialog.razor |
جزئیات قرارداد |
Pages/Commission/Components/WithdrawalDetailsDialog.razor |
جزئیات درخواست برداشت |
Pages/Commission/Components/RejectReasonDialog.razor |
ورود دلیل رد درخواست |
Shared/GlobalSearch.razor |
جستجوی جهانی (صفحات + کاربران) در AppBar |
این داکیومنت نسخه ۷.۰ است و شامل وضعیت پیادهسازی تمام فازها میشود.
تاریخ بروزرسانی: تیر ۱۴۰۴ (July 2025)
وضعیت: ۵۷ از ۵۸ مورد انجام شده (≈98%) — تمام موارد بحرانی و جزئی تکمیل
مبنای اجرایی: فازهای ۱ تا ۶ + فازهای ۲.۵/۳.۵/۴.۵ بهترتیب اولویت