Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/docs/INVENTORY_TRANSFER_BACKEND_ONLY_SCENARIO.md
2026-04-14 19:34:55 +03:30

114 lines
5.5 KiB
Markdown
Executable file

# سناریوی حفظ `inventory_transfer` در Backend و حذف از Frontend
## سوال اصلی
آیا می‌توانیم `inventory_transfer` را در Backend حفظ کنیم (برای محاسبات) اما از Frontend حذف کنیم (عدم نمایش به کاربر)؟
## پاسخ: ✅ بله، کاملاً امکان‌پذیر است
## وضعیت فعلی
### Backend (باید حفظ شود):
1. ✅ `warehouse_service.py`: ایجاد سند حسابداری با `document_type='inventory_transfer'`
2. ✅ `kardex_service.py`: mapping برای نمایش نام در کاردکس
3. ✅ `document_repository.py`: mapping برای نمایش نام
4. ✅ `invoice_service.py`: استفاده در `_iter_product_movements` برای محاسبات موجودی
### Frontend (باید حذف شود):
1. ✅ `inventory_transfers_page.dart` - **حذف شده**
2. ✅ `inventory_transfer_form_dialog.dart` - **حذف شده**
3. ✅ `inventory_transfer_service.dart` - **حذف شده**
4. ✅ منوی "حواله‌ها" (shipments) - **حذف شده**
5. ✅ route `/business/:business_id/inventory-transfers` - **حذف شده**
6. ⚠️ `kardex_page.dart`: فیلتر `inventory_transfer` - **باید حذف شود**
7. ⚠️ `document_model.dart`: case برای `inventory_transfer` - **باید حذف شود**
## آیا کاربر نیاز به بخش inventory_transfers دارد؟
### ❌ خیر، کاربر نیازی به ایجاد مستقیم inventory_transfer ندارد:
1. **کاربر می‌تواند از طریق Warehouse Documents انتقال ایجاد کند:**
- ایجاد Warehouse Document با `doc_type='transfer'`
- پست کردن آن
- خودکار یک سند حسابداری با `document_type='inventory_transfer'` ایجاد می‌شود
2. **کاربر نیازی به مشاهده لیست inventory_transfers ندارد:**
- انتقال‌ها از طریق Warehouse Documents مدیریت می‌شوند
- سند حسابداری در کاردکس نمایش داده می‌شود (که کافی است)
3. **کاربر نیازی به ویرایش/حذف مستقیم inventory_transfer ندارد:**
- ویرایش/حذف از طریق Warehouse Documents انجام می‌شود
- سند حسابداری به صورت خودکار به‌روزرسانی می‌شود
## مزایای این رویکرد
1. ✅ **حفظ محاسبات**: `inventory_transfer` در Backend حفظ می‌شود و در محاسبات استفاده می‌شود
2. ✅ **ساده‌سازی UI**: کاربر فقط با Warehouse Documents کار می‌کند
3. ✅ **تفکیک واضح**: انتقال موجودی = Warehouse Document، سند حسابداری = فقط برای محاسبات
4. ✅ **عدم نیاز به migration**: داده‌های موجود حفظ می‌شوند
## تغییرات لازم
### Frontend - حذف از UI (اما حفظ در کاردکس):
#### 1. `kardex_page.dart` - حذف فیلتر `inventory_transfer`:
**فعلی:**
```dart
FilterOption(value: 'inventory_transfer', label: t.warehouseTransfers),
```
**باید حذف شود** - چون کاربر نیازی به فیلتر کردن انتقال‌های موجودی ندارد. اما همچنان در کاردکس نمایش داده می‌شود (به عنوان یک سند حسابداری).
**یا می‌توانیم نگه داریم** - اگر کاربر بخواهد فقط انتقال‌های موجودی را در کاردکس ببیند.
#### 2. `document_model.dart` - حذف case برای `inventory_transfer`:
**فعلی:**
```dart
case 'inventory_transfer':
return 'انتقال موجودی';
```
**باید حذف شود** - چون کاربر نباید مستقیماً با `inventory_transfer` کار کند. اما می‌توانیم از mapping در Backend استفاده کنیم.
**یا می‌توانیم نگه داریم** - برای نمایش نام در کاردکس.
## توصیه
### گزینه 1: حذف کامل از Frontend (پیشنهادی)
**حذف:**
- فیلتر `inventory_transfer` از `kardex_page.dart`
- case `inventory_transfer` از `document_model.dart`
**نتیجه:**
- کاربر نمی‌تواند فیلتر کند
- اما همچنان در کاردکس نمایش داده می‌شود (با نام از Backend)
- کاربر فقط با Warehouse Documents کار می‌کند
### گزینه 2: حفظ در کاردکس (برای گزارش‌گیری)
**نگه داشتن:**
- فیلتر `inventory_transfer` در `kardex_page.dart`
- case `inventory_transfer` در `document_model.dart`
**نتیجه:**
- کاربر می‌تواند فیلتر کند
- برای گزارش‌گیری مفید است
- اما همچنان نمی‌تواند مستقیماً ایجاد/ویرایش کند
## نتیجه‌گیری
**✅ بله، می‌توانیم `inventory_transfer` را در Backend حفظ کنیم و از Frontend حذف کنیم:**
1. **Backend**: حفظ `inventory_transfer` برای محاسبات و کاردکس
2. **Frontend**: حذف فیلتر و case (یا نگه داشتن برای گزارش‌گیری)
3. **کاربر**: فقط با Warehouse Documents کار می‌کند
4. **محاسبات**: همچنان از `inventory_transfer` استفاده می‌شود
این بهترین رویکرد است چون:
- ✅ محاسبات حفظ می‌شود
- ✅ UI ساده می‌شود
- ✅ کاربر فقط با یک سیستم کار می‌کند (Warehouse Documents)