Files
docs/business/DISCOUNT-STORE-STATUS.md
T
masoodafar-web 4ef4bfbeef docs: بروزرسانی کامل مستندات — باگ‌ها، فیکس‌ها، دیپلوی Production، CI/CD cross-deploy
- payment-gateway.md: سکشن ۸-۱۳ (ZarinPal callback, تخفیف ۱۰۰٪, VAT, ExpirePendingOrders, DeliveryStatus mapping, Production deploy)
- CICD-PIPELINE-GUIDE.md: باگ cross-deploy, قالب workflow Production, جدول مقایسه دو محیط
- INFRASTRUCTURE-GUIDE.md: سرور Production (45.149.79.127), DB KBS, Proto v0.0.179
- DISCOUNT-STORE-STATUS.md: وضعیت Production Deploy, فلوی پرداخت جدید
- SERVER-MIRRORS-CONFIG.md: registries.yaml سرور Production
- INDEX.md: تاریخ, توضیحات بروز, لینک‌های سریع جدید
2026-02-17 01:44:05 +03:30

203 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# فروشگاه تخفیفی — وضعیت پیاده‌سازی و تسک‌ها
> **تاریخ:** ۱۴۰۴/۱۱/۲۲ (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<DiscountProductContract.DiscountProductContractClient>);
services.AddScoped(CreateAuthenticatedClient<DiscountCategoryContract.DiscountCategoryContractClient>);
services.AddScoped(CreateAuthenticatedClient<DiscountShoppingCartContract.DiscountShoppingCartContractClient>);
services.AddScoped(CreateAuthenticatedClient<DiscountOrderContract.DiscountOrderContractClient>);
```
### تسک ۳: 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 | ۰.۵ ساعت |
| **مجموع** | **~۸ ساعت** |