docs: fix Regular Store payment — wallet-only, no IPG/ZarinPal

- Regular Store: Balance deduction only (SubmitShopBuyOrderCommandHandler)
  NO ZarinPal redirect, NO payment gateway
- Discount Store: DiscountBalance + ZarinPal IPG for remainder
  Added gatewayAmount=0 edge case (discount covers 100%)
- VAT: Both stores use 9% (ShopVAT=0.1 is stale/unused constant)
- Added ZarinPal usage scope note (only: Discount Store, Wallet Top-up, Package Purchase)
- Fixed BUSINESS-02: sections 2, 5.2, 5.3, 7
- Fixed BUSINESS-03: store comparison chart
- Fixed OVERVIEW-01: user journey + both store flowcharts
- Fixed OVERVIEW-03: timeline entry
This commit is contained in:
masoodafar-web
2026-02-18 23:52:35 +03:30
parent 1b04ba5326
commit b861b66cda
4 changed files with 39 additions and 25 deletions
+21 -10
View File
@@ -34,6 +34,13 @@ flowchart TD
## ۲. درگاه ZarinPal (IPG)
> **⚠️ محل استفاده:** ZarinPal فقط در سه جا استفاده می‌شود:
> 1. **فروشگاه تخفیفی** — باقیمانده بعد از کسر DiscountBalance (اگر > 0)
> 2. **شارژ کیف‌پول** — واریز مستقیم از پروفایل کاربر
> 3. **خرید پکیج** — (فعلاً غیرفعال: "درگاه پرداخت متصل نیست")
>
> ❌ **فروشگاه عادی (Regular Store) از ZarinPal استفاده نمی‌کند** — فقط کسر از Balance کیف‌پول
### ۲.۱ فلوی پرداخت
```mermaid
@@ -125,7 +132,7 @@ flowchart TD
MaxDiscountPercent محصول = 40% (هر محصول درصد تخفیف مخصوص خود را دارد)
سهم تخفیف = MIN(1,000,000 × 40%, DiscountBalanceکاربر) = 400,000
پرداخت نقدی (IPG) = 1,000,000 - 400,000 = 600,000
باقیمانده → ZarinPal IPG = 1,000,000 - 400,000 = 600,000
─────────
مجموع = 1,000,000
@@ -137,10 +144,12 @@ MaxDiscountPercent محصول = 40% (هر محصول درصد تخفیف مخص
```mermaid
flowchart TD
A["کاربر عضو باشگاه\nمشاهده محصول"] --> B["قیمت تخفیف‌خورده نمایش داده می‌شود"]
B --> C["افزودن به سبد\nبررسی DiscountBalance"]
C --> D{"موجودی کافی؟"}
D -->|کافی| E["سهم تخفیف از DiscountBalance\nباقیمانده → IPG ZarinPal"]
D -->|ناکافی| F["فقط به اندازه موجودی\nباقیمانده بیشتر → IPG"]
B --> C["افزودن به سبد\nمحاسبه MaxDiscount% هر محصول"]
C --> D["سهم تخفیف = MIN(قیمت×MaxDiscount%, DiscountBalance)"]
D --> E["باقیمانده = مجموع - سهم تخفیف"]
E --> F{"باقیمانده > 0?"}
F -->|بله| G["کسر DiscountBalance\n+ Redirect → ZarinPal IPG\nباقیمانده + 9% VAT"]
F -->|خیر| H["فقط کسر از DiscountBalance\nبدون درگاه → ثبت مستقیم"]
```
### ۵.۳ دسترسی فروشگاه تخفیفی
@@ -150,7 +159,7 @@ flowchart TD
| `IsClubMember = true` | دسترسی به Discount Store |
| `IsClubMember = false` | فقط Regular Store |
| `DiscountBalance > 0` | می‌تواند از تخفیف استفاده کند |
| `DiscountBalance = 0` | پرداخت ۱۰۰% نقدی |
| `DiscountBalance = 0` | پرداخت ۱۰۰% از طریق ZarinPal IPG |
---
@@ -184,12 +193,14 @@ service PaymentService {
## ۷. مالیات و VAT
```
دو نرخ VAT در کد:
هر دو فروشگاه از نرخ 9% استفاده می‌کنند:
SystemConstants.ShopVAT = 0.1 (10%) — تنظیم سیستمی
VAT_RATE = 0.09 (9%) — در فروشگاه تخفیفی (DiscountShop PlaceOrder)
Regular Store → const vatRate = 0.09m (hardcoded در SubmitShopBuyOrderCommandHandler)
Discount Store → VatCalculator.VAT_RATE = 0.09m
قیمت نمایشی = قیمت پایه × (1 + VAT)
⚠️ SystemConstants.ShopVAT = 0.1 (10%) — تعریف‌شده ولی استفاده نمی‌شود (stale constant)
قیمت نمایشی = قیمت پایه × (1 + 0.09)
در صورتحساب: قیمت پایه + مالیات جداگانه نمایش داده می‌شود
```
+2 -2
View File
@@ -11,9 +11,9 @@
flowchart LR
subgraph RS["Regular Store — /store"]
R1["همه کاربران"]
R2["پرداخت 100% نقدی"]
R2["پرداخت از Balance کیف‌پول"]
R3["قیمت عادی"]
R4["VAT = 10%"]
R4["VAT = 9%"]
end
subgraph DS["Discount Store — /discount-store"]
+15 -12
View File
@@ -17,7 +17,7 @@ flowchart TD
B -->|بله| G["Login + JWT"]
G --> H{"عضو باشگاه؟"}
H -->|خیر| F["🛒 Regular Store\nخرید عادی — IPG پرداخت"]
H -->|خیر| F["🛒 Regular Store\nخرید عادی — پرداخت از کیف‌پول"]
H -->|بله| I["🏆 Club Member Dashboard"]
I --> J["فروشگاه تخفیفی\nper-product MaxDiscount%"]
@@ -126,11 +126,12 @@ flowchart TD
A1["مشاهده محصولات"] --> B1["Lazy Load — 12 per page"]
B1 --> C1["افزودن به سبد"]
C1 --> D1["بررسی موجودی"]
D1 --> E1["Checkout"]
E1 --> F1["ZarinPal IPG\n100% نقدی"]
F1 --> G1["ثبت سفارش"]
G1 --> H1["کسر موجودی"]
H1 --> I1["SMS تأیید"]
D1 --> E1["Checkout Summary\nانتخاب آدرس"]
E1 --> F1{"Balance کافی؟"}
F1 -->|بله| G1["کسر از Balance کیف‌پول\n+ VAT"]
G1 --> H1["ثبت سفارش"]
H1 --> I1["کسر موجودی"]
F1 -->|خیر| J1["❌ خطا: موجودی کیف‌پول کافی نیست"]
```
### ۵.۲ Discount Store
@@ -141,12 +142,14 @@ flowchart TD
B2 --> C2["افزودن به سبد"]
C2 --> D2["بررسی موجودی + DiscountBalance"]
D2 --> E2["محاسبه سهم تخفیف\nMaxDiscount% هر محصول"]
E2 --> F2["محاسبه سهم نقدی\nباقیمانده"]
F2 --> G2["کسر از DiscountBalance"]
G2 --> H2["ZarinPal IPG\nبرای باقیمانده نقدی"]
H2 --> I2["ثبت سفارش ترکیبی"]
I2 --> J2["کسر موجودی"]
J2 --> K2["SMS تأیید"]
E2 --> F2["محاسبه باقیمانده\ngatewayAmount = total - discountUsed"]
F2 --> G2{"gatewayAmount > 0?"}
G2 -->|بله| H2["کسر DiscountBalance\n+ ZarinPal IPG برای باقیمانده + 9% VAT"]
H2 --> I2["Redirect → ZarinPal\nCallback → ثبت سفارش"]
G2 -->|خیر| J2["فقط کسر از DiscountBalance\nبدون درگاه"]
J2 --> K2["ثبت سفارش"]
I2 --> L2["کسر موجودی + SMS تأیید"]
K2 --> L2
```
---
+1 -1
View File
@@ -188,7 +188,7 @@
| مهر ۱۴۰۳ | شروع پروژه، معماری CMS | 10% |
| آبان ۱۴۰۳ | CQRS + gRPC + EF Core | 20% |
| آذر ۱۴۰۳ | باشگاه + درخت باینری + کمیسیون | 35% |
| دی ۱۴۰۳ | فروشگاه عادی + پرداخت ZarinPal | 45% |
| دی ۱۴۰۳ | فروشگاه عادی + پرداخت از کیف‌پول | 45% |
| بهمن ۱۴۰۳ | فروشگاه تخفیفی + وام دایا | 55% |
| اسفند ۱۴۰۳ (هفته ۱) | UI Modernization Phase 1-3 | 65% |
| اسفند ۱۴۰۳ (هفته ۲) | Site Pages + BackOffice audit | 75% |