From 51c5edc0ae2db7f1046aba3895d547cedb97a309 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Wed, 24 Dec 2025 01:06:55 +0330 Subject: [PATCH] feat: Fix multiple pages in BackOffice and enable product features --- docs/BUILD-FIX-STATUS.md | 4 +- docs/CHANGELOG.md | 118 ++++++++++++++ docs/CONTINUE-GUIDE.md | 156 ------------------- docs/EXCLUDED-FILES.md | 170 -------------------- docs/MOVED.md | 28 ++++ docs/PROTO-DEPENDENCIES.md | 177 --------------------- docs/README.md | 34 ++++ docs/REMAINING-TASKS.md | 77 ++++++++- docs/SESSION-2025-12-20.md | 311 +++++++++++++++++++++++++++++++++++++ docs/STATUS.md | 135 ++++++++++++++++ docs/TECHNICAL-NOTES.md | 230 +++++++++++++++++++++++++++ 11 files changed, 933 insertions(+), 507 deletions(-) create mode 100644 docs/CHANGELOG.md delete mode 100644 docs/CONTINUE-GUIDE.md delete mode 100644 docs/EXCLUDED-FILES.md create mode 100644 docs/MOVED.md delete mode 100644 docs/PROTO-DEPENDENCIES.md create mode 100644 docs/README.md create mode 100644 docs/SESSION-2025-12-20.md create mode 100644 docs/STATUS.md create mode 100644 docs/TECHNICAL-NOTES.md diff --git a/docs/BUILD-FIX-STATUS.md b/docs/BUILD-FIX-STATUS.md index c34b9e1..fa8fbda 100644 --- a/docs/BUILD-FIX-STATUS.md +++ b/docs/BUILD-FIX-STATUS.md @@ -1,6 +1,6 @@ # BackOffice Build Fix Status -> آخرین بروزرسانی: December 6, 2025 +> آخرین بروزرسانی: December 20, 2025 ## وضعیت فعلی @@ -17,6 +17,8 @@ - ✅ BackOffice.BFF.DiscountShoppingCart.Protobuf - ✅ BackOffice.BFF.PublicMessage.Protobuf - ✅ BackOffice.BFF.ManualPayment.Protobuf + - ✅ BackOffice.BFF.ClubMembership.Protobuf + - ✅ BackOffice.BFF.Commission.Protobuf ### BackOffice UI: - **Build**: ✅ موفق - 0 Error diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..dcbd157 --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,118 @@ +# BackOffice Changelog + +> تاریخچه تغییرات پروژه BackOffice + +--- + +## December 20, 2025 + +### 🐛 Bug Fixes + +#### 1. صفحه `/network/balances` - ValidationException +**مشکل**: خطای ValidationException هنگام لود صفحه + +**راه‌حل**: اضافه کردن Mapster mapping در `CommissionProfile.cs`: +```csharp +config.NewConfig() + .Map(dest => dest.PaginationState, src => src.PaginationState); +``` + +--- + +#### 2. صفحه `/club/members` - داده‌ها لود نمی‌شدند +**مشکل**: صفحه خالی بود و داده‌ای نمایش نمی‌داد + +**راه‌حل**: ایجاد `ClubMembershipProfile.cs` در CMS و BFF با mappings کامل: +- `GetAllClubMembershipsRequest` ↔ `GetAllClubMembershipsQuery` +- `GetAllClubMembershipsResponseDto` ↔ `GetAllClubMembershipsResponse` + +**فایل‌های جدید**: +- `CMS/WebApi/Common/Mappings/ClubMembershipProfile.cs` +- `BackOffice.BFF/WebApi/Common/Mappings/ClubMembershipProfile.cs` (بازنویسی) + +--- + +#### 3. صفحه `/club/statistics` - Unimplemented Error +**مشکل**: خطای `Status(StatusCode="Unimplemented")` + +**راه‌حل**: +1. اضافه کردن override `GetClubStatistics` در `ClubMembershipService.cs` +2. اضافه کردن mappings برای Statistics در هر دو Profile + +--- + +### ✨ New Features + +#### 4. فعال‌سازی قابلیت‌های Products +**قبل**: همه دکمه‌ها "در حال توسعه" نشان می‌دادند + +**بعد**: همه قابلیت‌ها فعال شدند: +- ✅ ایجاد محصول جدید (CreateDialog) +- ✅ ویرایش محصول (UpdateDialog) +- ✅ گالری تصاویر (GalleryDialog) +- ✅ مدیریت تگ‌ها (AssignTagsDialog) + +**فایل**: `ProductsMainPage.razor.cs` + +--- + +#### 5. فیلد "تعداد موجودی" در Products +**اضافات**: +- فیلد موجودی در فرم ایجاد محصول +- فیلد موجودی در فرم ویرایش محصول +- ستون موجودی در لیست با رنگ‌بندی: + - 🔴 ناموجود (0 یا کمتر) + - 🟡 کم موجود (کمتر از 10) + - 🟢 موجود (10 یا بیشتر) + +**فایل‌های تغییر یافته**: +- `CreateDialog.razor` +- `UpdateDialog.razor` +- `ProductsMainPage.razor` +- `CreateNewProductsCommand.cs` (BFF) +- `UpdateProductsCommand.cs` (BFF) + +--- + +## December 6, 2025 + +### ✅ Major Milestones + +- Build Errors: 60+ → 0 +- MudBlazor 8 Migration Complete +- All Product Image Management APIs Implemented +- BulkEdit Module Enabled +- All Files Unexcluded + +### 🔧 Technical Changes + +- `IMudDialogInstance` جایگزین `MudDialogInstance` +- `MudSwitch T="bool"` اضافه شد +- `MudChip T="string"` اضافه شد +- Products از NuGet به ProjectReference تغییر کرد + +--- + +## December 1, 2025 + +### ✅ Network & Commission System + +- Commission Dashboard Complete +- Network Members Page Complete +- Club Members Page Complete +- Weekly Pool Management +- Withdrawal System +- Payout System + +--- + +## November 29, 2025 + +### ✅ Initial Setup + +- SystemConfigurations Table Created +- Base Configuration Values Added: + - `Network.MaxDepth`: 10 + - `Club.DefaultMembershipDurationMonths`: 12 + - `Commission.MinimumPayoutAmount`: 100000 + - `System.MaintenanceMode`: false diff --git a/docs/CONTINUE-GUIDE.md b/docs/CONTINUE-GUIDE.md deleted file mode 100644 index ec074cd..0000000 --- a/docs/CONTINUE-GUIDE.md +++ /dev/null @@ -1,156 +0,0 @@ -# راهنمای ادامه کار - BackOffice Build Fix - -> این فایل برای شروع چت جدید طراحی شده است - -## وضعیت فعلی - -**تاریخ**: December 6, 2025 -**Build Status**: ✅ SUCCESS (0 خطا) -**پیشرفت**: 100% COMPLETE - آماده Production - ---- - -## 🎉 پروژه کامل شد! - -**همه چیز آماده است**: -- ✅ 0 Build Errors -- ✅ 9 Modules فعال -- ✅ 38+ صفحه و کامپوننت -- ✅ BulkEdit کامل -- ✅ Product Image Management کامل (Backend implemented) -- ✅ Proto Projects: 14 پروژه فعال -- ✅ MudBlazor 8.14.0 Migration کامل - ---- - -## دستور بررسی وضعیت - -```bash -# بررسی Build -cd /home/masoud/Apps/project/FourSat/BackOffice/src -dotnet build BackOffice.sln --no-incremental - -# بررسی BackOffice.BFF -cd /home/masoud/Apps/project/FourSat/BackOffice.BFF/src -dotnet build BackOffice.BFF.sln --no-incremental - -# مشاهده داکیومنت‌ها -cat /home/masoud/Apps/project/FourSat/BackOffice/docs/BUILD-FIX-STATUS.md -cat /home/masoud/Apps/project/FourSat/BackOffice/docs/REMAINING-TASKS.md -cat /home/masoud/Apps/project/FourSat/BackOffice/docs/EXCLUDED-FILES.md -``` - ---- - -## ✅ همه مشکلات حل شد! - -### تکمیل شده: -- ✅ PaginationState namespace - حل شد -- ✅ BulkEdit Module - فعال و کار می‌کند -- ✅ Product Image Management - کامل (Proto + UI + Backend) -- ✅ GalleryDialog - فعال -- ✅ CreateDialog/UpdateDialog - فعال با Image Upload -- ✅ ProductsService methods - uncommented و فعال -- ✅ CQRS Handlers - پیاده‌سازی شده -- ✅ CMS Integration - متصل به ProductGalleries -- ✅ Image Optimization - 1200x1200 + 300x300 - ---- - -## خطاهای قدیمی (همه حل شدند) - -### 1. PaginationState Namespace -**فایل**: `ProductsAutoComplete.razor.cs` -**خطا**: `PaginationState` پیدا نمیشه -**فیکس**: تغییر using به `BackOffice.BFF.Products.Protobuf.Protos.Products` - -### 2. Int32Value/Int64Value Binding -**فایل**: `WithdrawalReports.razor` -**خطا**: `@bind-Value` روی `Int32Value` کار نمی‌کنه -**فیکس**: استفاده از conversion یا wrapper - -### 3. GalleryDialog Reference -**فایل**: `ProductsMainPage.razor.cs` -**خطا**: `GalleryDialog` exclude شده ولی متد `OpenGalleryDialog` هنوز هست -**فیکس**: comment کردن متد - -### 4. DiscountShopWidget Reference -**فایل**: `SystemOverview.razor` -**خطا**: component exclude شده ولی استفاده میشه -**فیکس**: حذف یا comment کردن component از صفحه - -### 5. ClubMembers Bool Binding -**فایل**: `ClubMembers.razor` -**خطا**: `bool?` به `MudSwitch T="bool"` bind نمیشه -**فیکس**: تغییر نوع متغیر یا استفاده از converter - ---- - -## فایل‌های کلیدی - -| فایل | هدف | -|------|-----| -| `BackOffice.csproj` | لیست exclude ها و references | -| `ConfigureService.cs` | DI registrations | -| `_Imports.razor` | global using و inject ها | -| `BackOffice/docs/BUILD-FIX-STATUS.md` | وضعیت کامل خطاها | -| `BackOffice/docs/EXCLUDED-FILES.md` | فایل‌های exclude شده | -| `BackOffice/docs/PROTO-DEPENDENCIES.md` | وابستگی‌های proto | - ---- - -## نکات مهم - -1. **هیچ فایلی حذف نشده** - فقط از build exclude شدند -2. **Products.Protobuf** از ProjectReference استفاده می‌کند (نه NuGet) -3. **MudBlazor 8.14.0** نیاز به `T` parameter دارد -4. **Snackbar** در `_Imports.razor` inject شده -5. **.NET 9** target framework هست - ---- - -## چک‌لیست تکمیل شده - -- [x] فیکس PaginationState namespace -- [x] فعال‌سازی BulkEdit Module -- [x] اضافه کردن Proto Messages برای Image Upload -- [x] فعال‌سازی GalleryDialog -- [x] فعال‌سازی CreateDialog/UpdateDialog -- [x] Uncomment کردن ProductsService methods -- [x] بررسی CQRS Handlers -- [x] اتصال به CMS ProductGalleries -- [x] ✅ Build موفق - BackOffice UI -- [x] ✅ Build موفق - BackOffice.BFF -- [x] تست و تایید نهایی - ---- - -## ⚠️ قبل از شروع کار - بخوان! - -### Proto Package Management (خیلی مهم!) - -**هر تغییر در Proto = این 3 مرحله اجباری:** - -1. ✏️ Version++ در `.csproj` -2. 📦 `dotnet pack -c Release` -3. 🔄 Update version در پروژه‌های وابسته - -**این قانون برای همه سرویس‌ها است:** -- CMS Proto → BFF Protos → UI -- هر لایه → لایه بالاتر - -**فراموش کردن = Bug های عجیب و غریب!** - ---- - -## 🎯 System Status: PRODUCTION READY ✅ - -**BackOffice System**: -- UI: 100% Complete -- Backend: 100% Complete -- Build: 0 Errors -- Modules: 9 Active -- Pages: 38+ -- Proto Projects: 14 - -**آماده برای استفاده در Production** 🚀 diff --git a/docs/EXCLUDED-FILES.md b/docs/EXCLUDED-FILES.md deleted file mode 100644 index cb1cd51..0000000 --- a/docs/EXCLUDED-FILES.md +++ /dev/null @@ -1,170 +0,0 @@ -# فایل‌های Exclude شده از Build - -> آخرین بروزرسانی: December 6, 2025 -> -> این فایل‌ها از build خارج شدند ولی **حذف نشدند** - -## ✅ فایل‌های برگردانده شده (Enabled) - -این فایل‌ها قبلاً exclude بودند و حالا **فعال** شدند: - -### DiscountShop Module -- ✅ `Pages/DiscountShop/**` - تمام صفحات فروشگاه تخفیفی -- ✅ `Services/DiscountProduct/**` - سرویس محصولات تخفیفی -- ✅ `Services/DiscountCategory/**` - سرویس دسته‌بندی‌ها -- ✅ `Services/DiscountOrder/**` - سرویس سفارشات - -### Tag Module -- ✅ `Pages/Tag/**` - صفحات مدیریت تگ -- ✅ `Services/Tag/**` - سرویس تگ - -### PublicMessages Module -- ✅ `Pages/PublicMessages/**` - مدیریت پیام‌های عمومی -- ✅ `Services/PublicMessage/**` - سرویس پیام‌ها - -### Payment Module -- ✅ `Pages/Payment/ManualPayments.razor*` - پرداخت‌های دستی -- ✅ `Pages/Payment/Components/ManualPaymentDialog.razor*` - دیالوگ پرداخت -- ✅ `Pages/Payment/Transactions.razor*` - صفحه تراکنش‌ها - -### Dashboard -- ✅ `Pages/Dashboard/DiscountShopWidget.razor*` - ویجت آمار فروشگاه - -### DragDrop Pages -- ✅ `Pages/Category/CategoryProductsDragDropPage.razor*` - مدیریت محصولات دسته -- ✅ `Pages/Products/ProductCategoriesDragDropPage.razor*` - مدیریت دسته‌های محصول - -### BulkEdit Module -- ✅ `Pages/Products/BulkEdit.razor*` - ویرایش گروهی محصولات (ENABLED) - -### BulkEdit Module -- ✅ `Pages/Products/BulkEdit.razor*` - ویرایش گروهی محصولات (ENABLED) - -### Product Image Management -- ✅ `Pages/Products/Components/GalleryDialog.razor*` - گالری تصاویر (ENABLED) -- ✅ `Pages/Products/Components/CreateDialog.razor*` - ایجاد محصول با تصویر (ENABLED) -- ✅ `Pages/Products/Components/UpdateDialog.razor*` - ویرایش محصول با تصویر (ENABLED) - ---- - -## ❌ فایل‌های هنوز Exclude - -**هیچ فایلی Exclude نیست!** ✨ - -تمامی فایل‌ها فعال شدند. Proto Messages و RPCهای لازم برای Image Upload اضافه شدند. - -### ✅ وضعیت نهایی: -همه چیز کامل و آماده است: -- ✅ `GetProductGalleryAsync` - دریافت لیست تصاویر محصول (READY) -- ✅ `AddProductImageAsync` - آپلود تصویر جدید (READY) -- ✅ `RemoveProductImageAsync` - حذف تصویر (READY) - -**Backend Implementation**: ✅ COMPLETED -- ProductsService.cs: Methods uncommented -- CQRS Handlers: Fully implemented -- CMS Integration: Connected -- Image Processing: Optimized with SixLabors.ImageSharp - ---- - -## آمار - -- **✅ فایل‌های Enabled**: ~38+ صفحه و ~15 سرویس -- **❌ فایل‌های Excluded**: 0 فایل ✅ - ---- - -## آمار - -- **✅ فایل‌های Enabled**: ~30+ صفحه و ~15 سرویس -- **❌ فایل‌های Excluded**: 4 فایل -- **Proto Projects ساخته شده**: 14 -- **Build Errors**: 0 - ---- - -## Exclude های فعلی در csproj - -```xml - - - - - - - - - - - - - - - - - - - -``` - ---- - -## نکات مهم - -### برای فعال‌سازی فایل‌های Exclude: - -1. **GalleryDialog, CreateDialog, UpdateDialog**: - - نیاز به پیاده‌سازی Image Upload API در Backend - - افزودن `ImageFileModel` message به proto - - افزودن RPC methods برای upload/remove - -2. **BulkEdit**: - - حذف dependency به `CMSMicroservice.Protobuf` - - استفاده از `BackOffice.BFF.Products.Protobuf` - - افزودن `BulkUpdateProducts` RPC به backend - -### فایل‌های کامل شده که دیگر exclude نیستند: - -- ✅ تمام ماژول DiscountShop -- ✅ تمام ماژول Tag -- ✅ تمام ماژول PublicMessages -- ✅ تمام ماژول ManualPayments -- ✅ DiscountShopWidget -- ✅ Transactions -- ✅ DragDrop Pages - ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` diff --git a/docs/MOVED.md b/docs/MOVED.md new file mode 100644 index 0000000..42a7421 --- /dev/null +++ b/docs/MOVED.md @@ -0,0 +1,28 @@ +# ⚠️ توجه: مستندات اصلی منتقل شده + +مستندات اصلی پروژه در فولدر زیر قرار دارند: + +``` +/home/masoud/Apps/project/FourSat/totalDoc/ +``` + +## 🗂️ ساختار اصلی مستندات: + +- **00-INDEX.md** - فهرست جامع مستندات +- **QUICK-REFERENCE.md** - مرجع سریع +- **FINAL-STATUS.md** - وضعیت نهایی پروژه +- **CHANGELOG-2025-12-XX.md** - لاگ تغییرات روزانه +- **01-BUSINESS/** - منطق تجاری +- **02-ARCHITECTURE/** - معماری سیستم +- **03-BACKEND/** - مستندات Backend (CMS, BFF) +- **04-FRONTEND/** - مستندات Frontend (BackOffice, FrontOffice) +- **05-TASKS/** - کارهای جاری +- **06-DEPLOYMENT/** - راهنمای استقرار + +## 📝 این پوشه: + +فایل‌های این پوشه (`BackOffice/docs/`) برای مرجع محلی نگه داشته شده‌اند ولی **مستندات اصلی و به‌روز** در `totalDoc` قرار دارند. + +--- + +**تاریخ**: ۳۰ آذر ۱۴۰۴ (20 December 2025) diff --git a/docs/PROTO-DEPENDENCIES.md b/docs/PROTO-DEPENDENCIES.md deleted file mode 100644 index c7a5e11..0000000 --- a/docs/PROTO-DEPENDENCIES.md +++ /dev/null @@ -1,177 +0,0 @@ -# BackOffice Proto Dependencies - -> این فایل وابستگی‌های proto بین BackOffice UI و BackOffice.BFF را مستند می‌کند - -## Proto های موجود در BackOffice.BFF - -| Proto Project | وضعیت | نوع Reference در UI | -|---------------|-------|---------------------| -| Category.Protobuf | ✅ موجود | NuGet | -| ClubMembership.Protobuf | ✅ موجود | ProjectReference | -| Commission.Protobuf | ✅ موجود | ProjectReference | -| Common.Protobuf | ✅ موجود | ProjectReference | -| Configuration.Protobuf | ✅ موجود | ProjectReference | -| Health.Protobuf | ✅ موجود | ProjectReference | -| ManualPayment.Protobuf | ✅ موجود | ProjectReference | -| NetworkMembership.Protobuf | ✅ موجود | ProjectReference | -| Otp.Protobuf | ✅ موجود | NuGet | -| Package.Protobuf | ✅ موجود | NuGet | -| Products.Protobuf | ✅ موجود | **ProjectReference** (تغییر داده شد) | -| PublicMessage.Protobuf | ✅ موجود | ProjectReference | -| Role.Protobuf | ✅ موجود | NuGet | -| User.Protobuf | ✅ موجود | NuGet | -| UserAddress.Protobuf | ✅ موجود | NuGet | -| UserOrder.Protobuf | ✅ موجود | NuGet | -| UserRole.Protobuf | ✅ موجود | NuGet | - -## Proto های مورد نیاز (وجود ندارند) - -| Proto Project | صفحات وابسته | سرویس‌های وابسته | -|---------------|-------------|------------------| -| DiscountProduct.Protobuf | `Pages/DiscountShop/*` | `Services/DiscountProduct/*` | -| DiscountCategory.Protobuf | `Pages/DiscountShop/*` | `Services/DiscountCategory/*` | -| DiscountOrder.Protobuf | `Pages/DiscountShop/*` | `Services/DiscountOrder/*` | -| Tag.Protobuf | `Pages/Tag/*` | `Services/Tag/*` | -| ProductTag.Protobuf | `Pages/Products/BulkEdit` | - | - -## متدهای Proto مورد نیاز (وجود ندارند) - -### UserOrder.Protobuf - -```protobuf -// متدهای جدید مورد نیاز -rpc CancelOrder(CancelOrderRequest) returns (CancelOrderResponse); -rpc ApplyDiscountToOrder(ApplyDiscountToOrderRequest) returns (ApplyDiscountToOrderResponse); -rpc UpdateOrderStatus(UpdateOrderStatusRequest) returns (UpdateOrderStatusResponse); - -// فیلدهای جدید در GetUserOrderResponse -message GetUserOrderResponse { - // ... existing fields ... - int64 vat_amount = X; - int32 vat_percentage = X; - int64 vat_base_amount = X; - int64 vat_total_amount = X; -} - -// PaymentStatus enum needs None value -enum PaymentStatus { - None = 0; - Success = 1; - Reject = 2; - Pending = 3; -} -``` - -### Products.Protobuf - -```protobuf -// متدهای جدید مورد نیاز -rpc AddProductImage(AddProductImageRequest) returns (AddProductImageResponse); -rpc RemoveProductImage(RemoveProductImageRequest) returns (google.protobuf.Empty); - -// فیلدهای جدید در CreateNewProductsRequest -message CreateNewProductsRequest { - // ... existing fields ... - bytes image_file = X; - bytes thumbnail_file = X; -} - -// یا بهتر: -message ImageFileModel { - bytes content = 1; - string file_name = 2; - string content_type = 3; -} -``` - -### ManualPayment.Protobuf - -نیاز به بررسی - ممکن است متدهایی کم باشد - -### PublicMessage.Protobuf - -نیاز به بررسی - ممکن است متدهایی کم باشد - ---- - -## نحوه ساخت Proto Project جدید - -```bash -# 1. ساخت پوشه -mkdir -p BackOffice.BFF/src/Protobufs/BackOffice.BFF.Tag.Protobuf/Protos - -# 2. ساخت csproj -cat > BackOffice.BFF/src/Protobufs/BackOffice.BFF.Tag.Protobuf/BackOffice.BFF.Tag.Protobuf.csproj << 'EOF' - - - net9.0 - enable - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers - - - -EOF - -# 3. ساخت proto file -cat > BackOffice.BFF/src/Protobufs/BackOffice.BFF.Tag.Protobuf/Protos/tag.proto << 'EOF' -syntax = "proto3"; - -package tag; - -option csharp_namespace = "BackOffice.BFF.Tag.Protobuf.Protos.Tag"; - -// ... define services and messages -EOF - -# 4. اضافه کردن به solution -dotnet sln BackOffice.BFF/src/BackOffice.BFF.sln add BackOffice.BFF/src/Protobufs/BackOffice.BFF.Tag.Protobuf/BackOffice.BFF.Tag.Protobuf.csproj -``` - ---- - -## تغییرات اعمال شده در Products.Protobuf - -### Namespace Change -```protobuf -// FROM: -option csharp_namespace = "CMSMicroservice.Protobuf.Protos.Products"; - -// TO: -option csharp_namespace = "BackOffice.BFF.Products.Protobuf.Protos.Products"; -``` - -### اضافه شدن public_messages.proto -فایل از `ClubMembership.Protobuf` کپی شد با namespace: -```protobuf -option csharp_namespace = "BackOffice.BFF.Products.Protobuf.Protos"; -``` - -### RPC های جدید -```protobuf -rpc GetProductGallery(GetProductGalleryRequest) returns (GetProductGalleryResponse); -rpc GetCategories(GetCategoriesRequest) returns (GetCategoriesResponse); -rpc UpdateProductCategories(UpdateProductCategoriesRequest) returns (google.protobuf.Empty); -rpc GetProductsForCategory(GetProductsForCategoryRequest) returns (GetProductsForCategoryResponse); -rpc UpdateCategoryProducts(UpdateCategoryProductsRequest) returns (google.protobuf.Empty); -``` - -### Message های جدید -- CategoryItem -- CategoryProductItem -- GetProductGalleryRequest/Response -- ProductGalleryImage -- GetCategoriesRequest/Response -- UpdateProductCategoriesRequest -- GetProductsForCategoryRequest/Response -- UpdateCategoryProductsRequest diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..6fdad22 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,34 @@ +# BackOffice Documentation - README + +> آخرین بروزرسانی: **December 20, 2025** + +## فایل‌های این پوشه + +| فایل | شرح | +|------|-----| +| `STATUS.md` | وضعیت کلی پروژه و Build Status | +| `CHANGELOG.md` | تاریخچه تغییرات به ترتیب تاریخ | +| `TECHNICAL-NOTES.md` | نکات فنی، Mapster، MudBlazor، Proto | +| `development-plan.md` | برنامه توسعه (قدیمی - برای مرجع) | + +--- + +## وضعیت فعلی + +``` +✅ Build Status: SUCCESS (0 Errors) +✅ Proto Projects: 24 فعال +✅ صفحات فعال: 40+ +✅ Excluded Files: 0 +``` + +## دستورات سریع + +```bash +# Build همه +cd /home/masoud/Apps/project/FourSat/BackOffice/src +dotnet build BackOffice.sln + +# فقط UI +dotnet build BackOffice/BackOffice.csproj +``` diff --git a/docs/REMAINING-TASKS.md b/docs/REMAINING-TASKS.md index ff969a7..c694c51 100644 --- a/docs/REMAINING-TASKS.md +++ b/docs/REMAINING-TASKS.md @@ -1,16 +1,87 @@ # کارهای باقیمانده - BackOffice -> آخرین بروزرسانی: December 6, 2025 +> آخرین بروزرسانی: December 20, 2025 ## وضعیت کلی **Build Status**: ✅ SUCCESS (0 Errors) -**Enabled Modules**: 9 ماژول کامل +**Enabled Modules**: 10+ ماژول کامل **Remaining Tasks**: فقط Backend Implementation --- -## ✅ کارهای انجام شده امروز +## ✅ کارهای انجام شده - Session December 20, 2025 + +### 1. صفحه `/network/balances` - ✅ FIXED +**مشکل**: ValidationException هنگام لود صفحه +**راه‌حل**: اضافه کردن Mapster mapping برای `GetUserWeeklyBalancesRequest` → `GetUserWeeklyBalancesQuery` + +**فایل تغییر یافته**: +- `BackOffice.BFF/WebApi/Common/Mappings/CommissionProfile.cs` + +```csharp +config.NewConfig() + .Map(dest => dest.PaginationState, src => src.PaginationState); +``` + +### 2. صفحه `/club/members` - ✅ FIXED +**مشکل**: داده‌ها لود نمی‌شدند (Mapster mapping نداشت) +**راه‌حل**: ایجاد ClubMembershipProfile در CMS و BFF + +**فایل‌های جدید**: +- `CMS/WebApi/Common/Mappings/ClubMembershipProfile.cs` (NEW) +- `BackOffice.BFF/WebApi/Common/Mappings/ClubMembershipProfile.cs` (REWRITTEN) + +**Mappings اضافه شده**: +- `GetAllClubMembershipsRequest` ↔ `GetAllClubMembershipsQuery` +- `GetAllClubMembershipsResponseDto` ↔ `GetAllClubMembershipsResponse` + +### 3. صفحه `/club/statistics` - ✅ FIXED +**مشکل**: خطای `Status(StatusCode="Unimplemented")` +**راه‌حل**: پیاده‌سازی متد gRPC در BFF و اضافه کردن mappings + +**فایل‌های تغییر یافته**: +- `BackOffice.BFF/WebApi/Services/ClubMembershipService.cs` - اضافه شدن `GetClubStatistics` override +- `CMS/WebApi/Common/Mappings/ClubMembershipProfile.cs` - اضافه شدن mappings +- `BackOffice.BFF/WebApi/Common/Mappings/ClubMembershipProfile.cs` - اضافه شدن mappings + +**Mappings اضافه شده**: +- `GetClubStatisticsRequest` ↔ `GetClubStatisticsQuery` +- `GetClubStatisticsResponseDto` ↔ `GetClubStatisticsResponse` +- PackageDistribution و MonthlyTrend mappings + +### 4. صفحه Products - ✅ ALL FEATURES ENABLED +**مشکل**: همه قابلیت‌ها disabled بودند و "در حال توسعه" نشان می‌دادند +**راه‌حل**: Uncomment کردن کدهای دیالوگ‌ها + +**فایل تغییر یافته**: +- `BackOffice/Pages/Products/ProductsMainPage.razor.cs` + +**قابلیت‌های فعال شده**: +- ✅ `CreateNew()` - ایجاد محصول جدید +- ✅ `Update()` - ویرایش محصول +- ✅ `OpenGallery()` - گالری تصاویر +- ✅ `OpenTagAssignment()` - اختصاص تگ + +### 5. فیلد "تعداد موجودی" در Products - ✅ ADDED +**مشکل**: فیلد RemainingCount در فرم‌ها و لیست نبود +**راه‌حل**: اضافه کردن فیلد به همه لایه‌ها + +**فایل‌های تغییر یافته**: +- `BackOffice/Pages/Products/Components/CreateDialog.razor` - اضافه شدن فیلد موجودی +- `BackOffice/Pages/Products/Components/UpdateDialog.razor` - اضافه شدن فیلد موجودی +- `BackOffice/Pages/Products/ProductsMainPage.razor` - اضافه شدن ستون موجودی با رنگ‌بندی +- `BackOffice.BFF.Application/ProductsCQ/Commands/CreateNewProducts/CreateNewProductsCommand.cs` - اضافه شدن `RemainingCount` +- `BackOffice.BFF.Application/ProductsCQ/Commands/UpdateProducts/UpdateProductsCommand.cs` - اضافه شدن `RemainingCount` + +**نمایش موجودی در لیست**: +- 🔴 **ناموجود** - اگر موجودی `0` یا کمتر (Chip قرمز) +- 🟡 **عدد** - اگر موجودی کمتر از `10` (Chip زرد - هشدار) +- 🟢 **عدد** - اگر موجودی `10` یا بیشتر (Chip سبز) + +--- + +## ✅ کارهای انجام شده قبلی ### 1. BulkEdit Module - COMPLETED ✅ - ✅ حذف dependency به CMSMicroservice diff --git a/docs/SESSION-2025-12-20.md b/docs/SESSION-2025-12-20.md new file mode 100644 index 0000000..fbfe2fb --- /dev/null +++ b/docs/SESSION-2025-12-20.md @@ -0,0 +1,311 @@ +# Session Log - December 20, 2025 + +## خلاصه Session + +این session شامل رفع چندین باگ در صفحات BackOffice و فعال‌سازی قابلیت‌های Products بود. + +--- + +## 1. فیکس صفحه `/network/balances` + +### مشکل +``` +ValidationException هنگام لود صفحه بالانس‌های هفتگی +``` + +### علت +Mapster mapping برای تبدیل `GetUserWeeklyBalancesRequest` به `GetUserWeeklyBalancesQuery` وجود نداشت. + +### راه‌حل +اضافه کردن mapping در `CommissionProfile.cs`: + +```csharp +// File: BackOffice.BFF/src/BackOffice.BFF.WebApi/Common/Mappings/CommissionProfile.cs + +config.NewConfig() + .Map(dest => dest.PaginationState, src => src.PaginationState); +``` + +--- + +## 2. فیکس صفحه `/club/members` + +### مشکل +``` +صفحه لود می‌شد ولی هیچ داده‌ای نمایش نمی‌داد +``` + +### علت +Mapster mappings در CMS و BFF برای `GetAllClubMemberships` وجود نداشتند. + +### راه‌حل +ایجاد `ClubMembershipProfile.cs` در هر دو لایه: + +**CMS/src/CMSMicroservice.WebApi/Common/Mappings/ClubMembershipProfile.cs** (NEW): +```csharp +public class ClubMembershipProfile : IRegister +{ + void IRegister.Register(TypeAdapterConfig config) + { + // GetAllClubMemberships mappings + config.NewConfig() + .Map(dest => dest.PaginationState, src => src.PaginationState) + .Map(dest => dest.Filter, src => src.Filter); + + config.NewConfig() + .MapWith(src => new GetAllClubMembershipsResponse + { + MetaData = src.MetaData != null ? new CMSMicroservice.Protobuf.Common.MetaData + { + PageIndex = src.MetaData.PageIndex, + TotalPages = src.MetaData.TotalPages, + TotalCount = src.MetaData.TotalCount + } : null, + Models = { src.Models?.Select(...) ?? Enumerable.Empty<...>() } + }); + } +} +``` + +**BackOffice.BFF/src/BackOffice.BFF.WebApi/Common/Mappings/ClubMembershipProfile.cs** (REWRITTEN): +- Mapping از BFF Proto به Query +- Mapping از CMS Response به BFF Proto Response +- استفاده از alias imports برای disambiguation + +--- + +## 3. فیکس صفحه `/club/statistics` + +### مشکل +``` +Status(StatusCode="Unimplemented", Detail="Method cms.ClubMembershipContract/GetClubStatistics is unimplemented") +``` + +### علت +متد `GetClubStatistics` در BFF Service override نشده بود. + +### راه‌حل + +**1. اضافه کردن override در ClubMembershipService.cs:** +```csharp +public override async Task GetClubStatistics( + GetClubStatisticsRequest request, ServerCallContext context) +{ + return await _dispatchRequestToCQRS.Handle(request, context); +} +``` + +**2. اضافه کردن mappings در CMS ClubMembershipProfile:** +```csharp +config.NewConfig(); + +config.NewConfig() + .MapWith(src => new GetClubStatisticsResponse + { + TotalMembers = src.TotalMembers, + ActiveMembers = src.ActiveMembers, + // ... سایر فیلدها + PackageDistribution = { src.PackageDistribution?.Select(...) }, + MonthlyTrend = { src.MonthlyTrend?.Select(...) } + }); +``` + +**3. اضافه کردن mappings در BFF ClubMembershipProfile:** +- Mapping از BFF Proto به Query +- Mapping از CMS Response DTO به BFF Proto Response + +--- + +## 4. فعال‌سازی قابلیت‌های Products + +### مشکل +``` +همه دکمه‌های صفحه محصولات "در حال توسعه" نشان می‌دادند +``` + +### علت +کدهای دیالوگ‌ها comment شده بودند با TODO markers. + +### راه‌حل +Uncomment کردن کدها در `ProductsMainPage.razor.cs`: + +**فایل: BackOffice/src/BackOffice/Pages/Products/ProductsMainPage.razor.cs** + +```csharp +// ✅ CreateNew() - فعال شد +public async Task CreateNew() +{ + var dialog = await DialogService.ShowAsync("افزودن محصول", + new DialogParameters { { x => x.Model, new CreateNewProductsRequest() } }, + new DialogOptions { CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Small }); + // ... +} + +// ✅ Update() - فعال شد +public async Task Update(DataModel model) +{ + var parameters = new DialogParameters { { x => x.Model, model.Adapt() } }; + var dialog = await DialogService.ShowAsync("ویرایش محصول", parameters, ...); + // ... +} + +// ✅ OpenGallery() - فعال شد +public async Task OpenGallery(DataModel model) +{ + var parameters = new DialogParameters + { + { x => x.ProductId, model.Id }, + { x => x.ProductTitle, model.Title } + }; + await DialogService.ShowAsync("گالری تصاویر", parameters, ...); +} + +// ✅ OpenTagAssignment() - فعال شد +public async Task OpenTagAssignment(DataModel model) +{ + var parameters = new DialogParameters + { + { x => x.ProductId, model.Id }, + { x => x.ProductTitle, model.Title } + }; + await DialogService.ShowAsync("مدیریت تگ‌های محصول", parameters, ...); +} +``` + +**Using statement uncomment شد:** +```csharp +using BackOffice.Pages.Tag.Components; // برای AssignTagsDialog +``` + +--- + +## 5. اضافه کردن فیلد "تعداد موجودی" به Products + +### نیاز +نمایش و ویرایش تعداد موجودی محصول در فرم‌ها و لیست + +### تغییرات + +**1. فرم‌های دیالوگ (CreateDialog.razor & UpdateDialog.razor):** +```razor + + + + + + + + +``` + +**2. ستون جدید در لیست (ProductsMainPage.razor):** +```razor + + + @if (context.Item.RemainingCount <= 0) + { + ناموجود + } + else if (context.Item.RemainingCount < 10) + { + @context.Item.RemainingCount + } + else + { + @context.Item.RemainingCount + } + + +``` + +**3. اضافه کردن فیلد به BFF Commands (فیکس مهم!):** + +مشکل: فیلد `RemainingCount` در BFF Application Commands نبود و باعث می‌شد مقدار ارسال/دریافت نشه. + +**CreateNewProductsCommand.cs:** +```csharp +public int Discount { get; init; } +public int Rate { get; init; } +public int RemainingCount { get; init; } // ← اضافه شد +public ImageFileModel ImageFile { get; init; } +``` + +**UpdateProductsCommand.cs:** +```csharp +public int Discount { get; init; } +public int Rate { get; init; } +public int RemainingCount { get; init; } // ← اضافه شد +public string ImagePath { get; init; } +``` + +--- + +## لیست کامل فایل‌های تغییر یافته + +### BackOffice.BFF +| فایل | نوع تغییر | توضیح | +|------|----------|-------| +| `WebApi/Common/Mappings/CommissionProfile.cs` | MODIFIED | اضافه شدن mapping برای GetUserWeeklyBalances | +| `WebApi/Common/Mappings/ClubMembershipProfile.cs` | REWRITTEN | Mappings کامل برای ClubMembership | +| `WebApi/Services/ClubMembershipService.cs` | MODIFIED | اضافه شدن GetClubStatistics override | +| `Application/ProductsCQ/Commands/CreateNewProducts/CreateNewProductsCommand.cs` | MODIFIED | اضافه شدن RemainingCount | +| `Application/ProductsCQ/Commands/UpdateProducts/UpdateProductsCommand.cs` | MODIFIED | اضافه شدن RemainingCount | + +### CMS +| فایل | نوع تغییر | توضیح | +|------|----------|-------| +| `WebApi/Common/Mappings/ClubMembershipProfile.cs` | NEW | Mappings برای ClubMembership | + +### BackOffice UI +| فایل | نوع تغییر | توضیح | +|------|----------|-------| +| `Pages/Products/ProductsMainPage.razor.cs` | MODIFIED | فعال‌سازی CreateNew, Update, OpenGallery, OpenTagAssignment | +| `Pages/Products/ProductsMainPage.razor` | MODIFIED | اضافه شدن ستون موجودی | +| `Pages/Products/Components/CreateDialog.razor` | MODIFIED | اضافه شدن فیلد موجودی | +| `Pages/Products/Components/UpdateDialog.razor` | MODIFIED | اضافه شدن فیلد موجودی | + +--- + +## نکات فنی مهم + +### 1. Mapster با Proto Types +برای proto types که immutable هستند، باید از `MapWith` استفاده کرد: + +```csharp +config.NewConfig() + .MapWith(src => new ProtoResponse + { + Field1 = src.Field1, + RepeatedField = { src.List?.Select(...) ?? Enumerable.Empty<...>() } + }); +``` + +### 2. Alias Imports برای Proto Disambiguation +وقتی دو proto با اسم یکسان داریم: + +```csharp +using BffProtos = BackOffice.BFF.ClubMembership.Protobuf.Protos.ClubMembership; +using CmsProtos = CMSMicroservice.Protobuf.Protos.ClubMembership; +``` + +### 3. Null-Safe MetaData Mapping +```csharp +MetaData = src.MetaData != null ? new MetaData +{ + PageIndex = src.MetaData.PageIndex, + TotalPages = src.MetaData.TotalPages, + TotalCount = src.MetaData.TotalCount +} : null +``` + +--- + +## Build Status پایان Session + +``` +BackOffice.BFF: ✅ Build succeeded (0 errors) +CMS: ✅ Build succeeded (0 errors) +BackOffice UI: ✅ Build succeeded (0 errors) +``` diff --git a/docs/STATUS.md b/docs/STATUS.md new file mode 100644 index 0000000..be87fed --- /dev/null +++ b/docs/STATUS.md @@ -0,0 +1,135 @@ +# BackOffice Project Status + +> آخرین بروزرسانی: **December 20, 2025** + +--- + +## 🎯 وضعیت کلی + +| Component | Build Status | Errors | +|-----------|--------------|--------| +| BackOffice UI | ✅ SUCCESS | 0 | +| BackOffice.BFF | ✅ SUCCESS | 0 | +| CMS Microservice | ✅ SUCCESS | 0 | + +**System Status**: 🟢 **PRODUCTION READY** + +--- + +## 📦 Proto Projects (24 پروژه فعال) + +### Core Protos: +- ✅ Common.Protobuf +- ✅ Health.Protobuf +- ✅ Configuration.Protobuf + +### User Management: +- ✅ User.Protobuf +- ✅ UserRole.Protobuf +- ✅ Role.Protobuf +- ✅ UserAddress.Protobuf +- ✅ UserWallet.Protobuf +- ✅ Otp.Protobuf + +### Products & Shop: +- ✅ Products.Protobuf +- ✅ Category.Protobuf +- ✅ Tag.Protobuf +- ✅ ProductTag.Protobuf +- ✅ Package.Protobuf + +### Discount Shop: +- ✅ DiscountProduct.Protobuf +- ✅ DiscountCategory.Protobuf +- ✅ DiscountOrder.Protobuf +- ✅ DiscountShoppingCart.Protobuf + +### Network & Commission: +- ✅ NetworkMembership.Protobuf +- ✅ ClubMembership.Protobuf +- ✅ Commission.Protobuf + +### Orders & Payments: +- ✅ UserOrder.Protobuf +- ✅ ManualPayment.Protobuf + +### Messaging: +- ✅ PublicMessage.Protobuf + +--- + +## 🗂️ ماژول‌های فعال + +### 1. Products Module ✅ +- صفحه اصلی محصولات با فیلتر و صفحه‌بندی +- ایجاد محصول جدید با آپلود تصویر +- ویرایش محصول +- گالری تصاویر محصول +- مدیریت تگ‌های محصول +- ویرایش گروهی (قیمت، موجودی، وضعیت) +- **ستون موجودی** با رنگ‌بندی هوشمند (🔴🟡🟢) +- DragDrop دسته‌بندی محصولات + +### 2. Discount Shop Module ✅ +- مدیریت محصولات تخفیفی +- مدیریت دسته‌بندی‌ها +- مدیریت سفارشات +- گزارش فروش + +### 3. Commission Module ✅ +- داشبورد استخر هفتگی +- لیست پرداخت‌ها +- لیست برداشت‌ها +- بالانس‌های هفتگی کاربران + +### 4. Network Module ✅ +- لیست اعضای شبکه +- نمای درختی شبکه +- آمار شبکه + +### 5. Club Module ✅ +- لیست اعضای باشگاه +- آمار باشگاه +- مدیریت ویژگی‌های باشگاه + +### 6. Tag Module ✅ +- مدیریت تگ‌ها (CRUD) +- اختصاص تگ به محصولات + +### 7. Public Messages Module ✅ +- مدیریت پیام‌های عمومی +- قالب‌های پیام + +### 8. Manual Payments Module ✅ +- ثبت پرداخت دستی +- تایید/رد پرداخت + +### 9. System Management ✅ +- تنظیمات سیستم +- لاگ تغییرات +- Health Check + +### 10. Dashboard ✅ +- ویجت آمار فروشگاه تخفیفی (7 روز اخیر) + +--- + +## 📊 آمار + +| Metric | Value | +|--------|-------| +| Build Errors | 0 | +| Proto Projects | 24 | +| Active Pages | 40+ | +| Active Components | 60+ | +| Excluded Files | 0 | +| Test Coverage | N/A | + +--- + +## 🔧 Environment + +- **Framework**: Blazor WebAssembly .NET 9.0 +- **UI Library**: MudBlazor 8.14.0 +- **gRPC**: Grpc.Net.Client 2.70.0 +- **Mapping**: Mapster 7.4.0+ diff --git a/docs/TECHNICAL-NOTES.md b/docs/TECHNICAL-NOTES.md new file mode 100644 index 0000000..83ac5f7 --- /dev/null +++ b/docs/TECHNICAL-NOTES.md @@ -0,0 +1,230 @@ +# BackOffice Technical Notes + +> نکات فنی برای توسعه‌دهندگان + +--- + +## 1. Mapster Mapping Patterns + +### 1.1 Proto Types (Immutable) +برای proto types که immutable هستند، باید از `MapWith` استفاده کرد: + +```csharp +config.NewConfig() + .MapWith(src => new ProtoResponse + { + Field1 = src.Field1, + Field2 = src.Field2 ?? string.Empty, + RepeatedField = { src.List?.Select(x => new Item { ... }) ?? Enumerable.Empty() } + }); +``` + +### 1.2 Null-Safe MetaData +```csharp +MetaData = src.MetaData != null ? new MetaData +{ + PageIndex = src.MetaData.PageIndex, + TotalPages = src.MetaData.TotalPages, + TotalCount = src.MetaData.TotalCount +} : null +``` + +### 1.3 Alias Imports برای Disambiguation +وقتی دو proto با نام یکسان داریم: + +```csharp +using BffProtos = BackOffice.BFF.ClubMembership.Protobuf.Protos.ClubMembership; +using CmsProtos = CMSMicroservice.Protobuf.Protos.ClubMembership; + +// استفاده: +config.NewConfig(); +``` + +### 1.4 PaginationState Mapping +```csharp +config.NewConfig() + .Map(dest => dest.PaginationState, src => src.PaginationState); +``` + +--- + +## 2. MudBlazor 8 Breaking Changes + +### 2.1 Dialog Instance +```csharp +// ❌ قبلی +[CascadingParameter] MudDialogInstance MudDialog { get; set; } + +// ✅ جدید +[CascadingParameter] IMudDialogInstance MudDialog { get; set; } +``` + +### 2.2 Generic Components +```razor + + +Text + + + +Text +``` + +### 2.3 Drag Events +```razor + +@ondragover="e => e.PreventDefault()" + + +@ondragover:preventDefault +``` + +### 2.4 File Upload +```csharp +// FilesChanged حالا IBrowserFile می‌گیرد + +``` + +--- + +## 3. gRPC Patterns + +### 3.1 Service Override in BFF +```csharp +public override async Task GetData(GetRequest request, ServerCallContext context) +{ + return await _dispatchRequestToCQRS.Handle(request, context); +} +``` + +### 3.2 CQRS Handler +```csharp +public class GetQueryHandler : IRequestHandler +{ + private readonly IApplicationContractContext _context; + + public async Task Handle(GetQuery request, CancellationToken ct) + { + var cmsRequest = request.Adapt(); + var response = await _context.Service.GetAsync(cmsRequest, cancellationToken: ct); + return response.Adapt(); + } +} +``` + +--- + +## 4. Proto Update Checklist + +هر تغییری در Proto نیاز به این مراحل دارد: + +### Step 1: Update Version +```xml + +0.0.1420.0.143 +``` + +### Step 2: Pack +```bash +cd path/to/proto/project +dotnet pack -c Release +# Push به GitLab Registry خودکار انجام می‌شود +``` + +### Step 3: Update References +```xml + +``` + +### Step 4: Build & Test +```bash +dotnet build +dotnet test +``` + +--- + +## 5. Common Fixes + +### 5.1 Snackbar Duplicate Injection +اگر در `_Imports.razor` inject شده، در component نیاز نیست: +```csharp +// ❌ حذف کن +[Inject] ISnackbar Snackbar { get; set; } +``` + +### 5.2 BasePageComponent Reload +```csharp +private MudDataGrid? _gridData; + +private async Task OnFilterSubmit() +{ + if (_gridData != null) + await _gridData.ReloadServerData(); +} +``` + +### 5.3 Nullable Wrapper Types +```csharp +// Proto nullable types: +// google.protobuf.Int64Value → long? +// google.protobuf.BoolValue → bool? + +// Set value: +request.UserId = userId; // نه new Int64Value { Value = userId } +``` + +--- + +## 6. Build Commands + +```bash +# Full Solution Build +cd /home/masoud/Apps/project/FourSat/BackOffice/src +dotnet build BackOffice.sln + +# Single Project +dotnet build BackOffice/BackOffice.csproj + +# With Restore +dotnet build --restore + +# Clean Build +dotnet clean && dotnet build + +# Check Errors Only +dotnet build 2>&1 | grep -E "error CS" +``` + +--- + +## 7. Project References + +### ProjectReference (Local Development): +```xml + +``` + +### PackageReference (Production): +```xml + +``` + +--- + +## 8. File Organization + +``` +BackOffice/ +├── docs/ +│ ├── README.md # Index +│ ├── STATUS.md # Current Status +│ ├── CHANGELOG.md # History +│ ├── TECHNICAL-NOTES.md # This file +│ └── SESSION-*.md # Session logs +├── src/ +│ └── BackOffice/ +│ ├── Pages/ # Blazor pages +│ ├── Services/ # gRPC clients +│ └── Common/ # Shared components +```