# فروشگاه تخفیفی — وضعیت پیاده‌سازی و تسک‌ها > **تاریخ:** ۱۴۰۴/۱۱/۲۲ (2026-02-11) > **آخرین بروزرسانی:** ۱۴۰۴/۱۱/۲۸ (2026-02-17) > **وضعیت کلی:** بکند کامل ✅ | بک‌آفیس کامل ✅ | فرانت‌آفیس کامل ✅ | Production Deploy ✅ --- ## ۱. خلاصه بیزینس فروشگاه تخفیفی یک فروشگاه **مجزا** از فروشگاه معمولی است که: - محصولات خاص خود را دارد (`DiscountProduct` — نه `Product`) - پرداخت **ترکیبی** (Hybrid) دارد: - بخشی از **موجودی کیف پول تخفیفی** (`DiscountBalance`) کسر می‌شود - مابقی از **درگاه پرداخت** (IPG) پرداخت می‌شود - هر محصول یک `MaxDiscountPercent` دارد (مثلاً ۳۰٪) — حداکثر درصدی که از کیف تخفیفی قابل پرداخت است - مالیات فقط روی مبلغ درگاه محاسبه می‌شود --- ## ۲. وضعیت لایه‌ها ### ✅ Domain Entities — کامل (۷ entity) | Entity | مسیر | توضیح | |--------|------|-------| | `DiscountProduct` | `CMS/.../Entities/DiscountStore/` | محصول (Title, Price, MaxDiscountPercent, RemainingCount, ...) | | `DiscountProductCategory` | ↑ | دسته‌بندی درختی | | `DiscountProductCategoryMapping` | ↑ | M:N محصول ↔ دسته‌بندی | | `DiscountProductImage` | ↑ | گالری تصاویر | | `DiscountShoppingCart` | ↑ | سبد خرید (UserId, ProductId, Count) | | `DiscountOrder` | ↑ | سفارش (TotalAmount, DiscountBalanceUsed, GatewayAmountPaid, VAT) | | `DiscountOrderDetail` | ↑ | جزئیات سفارش (UnitPrice, DiscountPercent, DiscountAmount, FinalPrice) | ### ✅ EF Configurations — کامل (۷ فایل + ۶ migration) ### ✅ Application (CQRS) — کامل (~۵۰ فایل) - DiscountProductCQ: Create, Update, Delete, GetById, GetProducts + Image CRUD - DiscountCategoryCQ: Create, Update, Delete, GetCategories - DiscountOrderCQ: PlaceOrder, CompleteOrderPayment, UpdateOrderStatus, GetById, GetUserOrders, GetAll, SalesReport - DiscountShoppingCartCQ: AddToCart, RemoveFromCart, UpdateCount, GetUserCart, ClearCart - WalletCQ: ChargeDiscountWallet, VerifyDiscountWalletCharge ### ✅ Proto Definitions — کامل (۴ فایل) | Proto | Namespace | RPCs | |-------|-----------|------| | `discountproduct.proto` | `CMSMicroservice.Protobuf.Protos.DiscountProduct` | DiscountProductContract (10 RPCs) | | `discountcategory.proto` | `CMSMicroservice.Protobuf.Protos.DiscountCategory` | DiscountCategoryContract (4 RPCs) | | `discountshoppingcart.proto` | `CMSMicroservice.Protobuf.Protos.DiscountShoppingCart` | DiscountShoppingCartContract (5 RPCs) | | `discountorder.proto` | `CMSMicroservice.Protobuf.Protos.DiscountOrder` | DiscountOrderContract (7 RPCs) | ### ✅ gRPC Services (CMS WebApi) — کامل (۴ سرویس + mapping) ### ✅ BackOffice (Admin Panel) — کامل - ۴ صفحه: محصولات، دسته‌بندی‌ها، سفارشات، گزارش فروش - ۵ کامپوننت: فرم محصول، فرم دسته‌بندی، گالری، جزئیات سفارش، تغییر وضعیت - ۶ سرویس: DiscountProduct, DiscountCategory, DiscountOrder (+ interfaces) - NavMenu: بخش "فروشگاه تخفیفی" با ۳ لینک (محصولات، دسته‌بندی‌ها، سفارشات و گزارش) - **یکسان‌سازی UI (بهمن ۱۴۰۴):** تمام صفحات فروشگاه تخفیفی بازنویسی شدند تا از `BasePageComponent` استفاده کنند و ظاهری یکسان با فروشگاه عادی داشته باشند → [جزئیات](../ui-modernization/BACKOFFICE-STORE-UNIFICATION.md) ### ✅ FrontOffice (مشتری) — پیاده‌سازی شده! **فایل‌های اضافه/ویرایش شده:** | فایل | نوع | توضیح | |------|------|-------| | `Utilities/RouteConstants.cs` | ویرایش | اضافه شدن بخش `DiscountStore` (6 مسیر) | | `ConfigureServices.cs` | ویرایش | ثبت 3 سرویس + 4 gRPC client | | `Utilities/DiscountProductService.cs` | جدید | سرویس محصولات تخفیفی (GetProducts, GetById, GetCategories) | | `Utilities/DiscountCartService.cs` | جدید | سرویس سبد خرید تخفیفی (Add, Remove, Update, Clear) | | `Utilities/DiscountOrderService.cs` | جدید | سرویس سفارش تخفیفی (PlaceOrder, CompletePayment, GetOrders) | | `Pages/DiscountStore/Products.razor(.cs)` | جدید | لیست محصولات (جستجو + فیلتر دسته‌بندی + صفحه‌بندی) | | `Pages/DiscountStore/ProductDetail.razor(.cs)` | جدید | جزئیات محصول + گالری + افزودن به سبد | | `Pages/DiscountStore/Cart.razor(.cs)` | جدید | سبد خرید (Desktop: Table / Mobile: Cards) | | `Pages/DiscountStore/Checkout.razor(.cs)` | جدید | پرداخت ترکیبی (آدرس + اسلایدر تخفیف + درگاه) | | `Pages/DiscountStore/Orders.razor(.cs)` | جدید | لیست سفارشات (پرداخت/ارسال) | | `Pages/DiscountStore/OrderDetail.razor(.cs)` | جدید | جزئیات سفارش + خلاصه مالی | | `Pages/Profile/Index.razor.cs` | ویرایش | تایل "فروشگاه تخفیفی" در داشبورد | | `Shared/MainLayout.razor` | ویرایش | لینک ناوبری دسکتاپ + drawer موبایل | | `wwwroot/css/site.css` | ویرایش | ریجن CSS اختصاصی Discount Store | --- ## ۳. تسک‌های FrontOffice (ترتیب اجرا) ### تسک ۱: Routes — اضافه کردن مسیرها ``` فایل: RouteConstants.cs اضافه: public static class DiscountStore { Products = "/discount-store" ProductDetail = "/discount-store/product/" Cart = "/discount-store/cart" Checkout = "/discount-store/checkout" Orders = "/discount-store/orders" OrderDetail = "/discount-store/order/" } ``` ### تسک ۲: gRPC Clients — ثبت DI ``` فایل: ConfigureServices.cs اضافه: using CMSMicroservice.Protobuf.Protos.DiscountProduct; using CMSMicroservice.Protobuf.Protos.DiscountCategory; using CMSMicroservice.Protobuf.Protos.DiscountShoppingCart; using CMSMicroservice.Protobuf.Protos.DiscountOrder; services.AddScoped(CreateAuthenticatedClient); services.AddScoped(CreateAuthenticatedClient); services.AddScoped(CreateAuthenticatedClient); services.AddScoped(CreateAuthenticatedClient); ``` ### تسک ۳: Services — سرویس‌های FrontOffice ``` فایل‌های جدید در Utilities/: DiscountProductService.cs — GetProducts (فیلتر + صفحه‌بندی), GetById, GetCategories DiscountCartService.cs — Add, Remove, Update, GetCart, Clear + event OnChange DiscountOrderService.cs — PlaceOrder, CompletePayment, GetUserOrders, GetOrderById ``` ### تسک ۴: صفحات Blazor ``` فایل‌های جدید در Pages/DiscountStore/: Products.razor + .cs — لیست محصولات (فیلتر دسته‌بندی + جستجو + صفحه‌بندی) ProductDetail.razor + .cs — جزئیات محصول + گالری + افزودن به سبد Cart.razor + .cs — سبد خرید (نمایش تخفیف هر آیتم) Checkout.razor + .cs — پرداخت (انتخاب آدرس + تعیین مبلغ از تخفیفی + درگاه) Orders.razor + .cs — لیست سفارشات OrderDetail.razor + .cs — جزئیات سفارش + وضعیت ارسال ``` ### تسک ۵: Dashboard Tile ``` فایل: Profile/Index.razor.cs اضافه: تایل "فروشگاه تخفیفی" بعد از تایل "فروشگاه" موجود ``` ### تسک ۶: Navigation ``` فایل: MainLayout.razor اضافه: لینک "فروشگاه تخفیفی" در drawer موبایل + bottom nav (اختیاری) ``` ### تسک ۷: CSS ``` فایل: site.css اضافه: استایل‌های اختصاصی (checkout progress, discount badge, ...) ``` --- ## ۴. فلوی پرداخت (مهم!) ``` کاربر سبد خرید دارد ↓ صفحه Checkout: ├─ انتخاب آدرس تحویل ├─ نمایش خلاصه سبد: │ هر محصول: قیمت × تعداد │ تخفیف هر محصول: price × count × maxDiscountPercent / 100 │ جمع کل / جمع تخفیف / مبلغ درگاه ├─ مالیات ۹٪ روی مبلغ درگاه ├─ مبلغ قابل پرداخت = مبلغ درگاه + مالیات ├─ ⚠️ تخفیف اجباری: همیشه حداکثر (MaxDiscountPercent) اعمال می‌شود └─ [پرداخت] ↓ PlaceOrder RPC: ├─ بررسی موجودی + محاسبه (MaxDiscountPercent اجباری) ├─ ساخت سفارش (PaymentStatus=Pending) ├─ رزرو موجودی انبار ├─ اگر gateway_amount > 0 → ZarinPal payment_url └─ اگر gateway_amount = 0 → سفارش مستقیم تکمیل ↓ ریدایرکت به ZarinPal ↓ Callback → CompleteOrderPayment RPC: ├─ success → کسر DiscountBalance + تأیید + PaymentTransaction + DeliveryStatus=Pending └─ failure → آزادسازی رزرو انبار + PaymentStatus=Reject + DeliveryStatus=Cancelled ↓ ExpirePendingOrdersService (Background): ├─ هر ۵ دقیقه چک می‌کند ├─ سفارشات Pending بالای ۳۰ دقیقه → Reject + Cancelled └─ آزادسازی رزرو انبار ``` --- ## ۵. تخمین زمان | تسک | تخمین | |-----|-------| | Routes + DI + Services | ۱ ساعت | | Products + ProductDetail | ۲ ساعت | | Cart | ۱ ساعت | | Checkout (پیچیده‌ترین بخش) | ۲ ساعت | | Orders + OrderDetail | ۱ ساعت | | Dashboard tile + Nav | ۰.۵ ساعت | | CSS + Polish | ۰.۵ ساعت | | **مجموع** | **~۸ ساعت** |