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"]