arc/docs/PROJECTS_INTEGRATION_GUIDE.md
2026-04-14 19:34:55 +03:30

242 lines
6.5 KiB
Markdown
Executable file
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

# 📘 راهنمای یکپارچه‌سازی قابلیت پروژه
## ✅ وضعیت پیاده‌سازی
### Backend (100% تکمیل)
- ✅ مدل و Migration
- ✅ Repository و Service
- ✅ API Endpoints (7 endpoint)
- ✅ یکپارچه‌سازی با سرویس‌های موجود
### Frontend (80% تکمیل)
- ✅ Models و Services
- ✅ Widget انتخاب پروژه
- ✅ صفحه لیست پروژه‌ها
- ⏳ یکپارچه‌سازی فیلترها (در حال انجام)
- ⏳ یکپارچه‌سازی فرم‌ها (در حال انجام)
---
## 🚀 نحوه یکپارچه‌سازی
### 1️⃣ افزودن فیلتر پروژه به صفحات لیست
#### مرحله 1: افزودن state
```dart
class _YourPageState extends State<YourPage> {
// ... سایر stateها
int? _selectedProjectId; // فیلتر پروژه
}
```
#### مرحله 2: import کردن widget
```dart
import 'package:hesabix_ui/widgets/project/project_filter_helper.dart';
```
#### مرحله 3: افزودن widget در بخش فیلترها
```dart
Widget _buildFilters() {
return Column(
children: [
// ... سایر فیلترها
ProjectFilterWidget(
businessId: widget.businessId,
apiClient: widget.apiClient,
selectedProjectId: _selectedProjectId,
onChanged: (projectId) {
setState(() {
_selectedProjectId = projectId;
});
_refreshData();
},
),
],
);
}
```
#### مرحله 4: افزودن به additionalFilters
```dart
DataTableConfig _buildTableConfig() {
final additionalFilters = <dynamic>[];
// ... سایر فیلترها
// فیلتر پروژه
if (_selectedProjectId != null) {
additionalFilters.add({
'property': 'project_id',
'operator': '=',
'value': _selectedProjectId,
});
}
return DataTableConfig(
// ...
additionalFilters: additionalFilters,
);
}
```
---
### 2️⃣ افزودن انتخاب پروژه به فرم‌های ثبت سند
#### مرحله 1: افزودن state
```dart
class _YourFormState extends State<YourForm> {
// ... سایر stateها
int? _selectedProjectId; // پروژه انتخابی
}
```
#### مرحله 2: import کردن widget
```dart
import 'package:hesabix_ui/widgets/project/project_selector_widget.dart';
```
#### مرحله 3: افزودن widget در فرم
```dart
Widget build(BuildContext context) {
return Form(
child: Column(
children: [
// ... سایر فیلدها
// انتخاب پروژه (اختیاری)
ProjectSelectorWidget(
businessId: widget.businessId,
apiClient: widget.apiClient,
selectedProjectId: _selectedProjectId,
onChanged: (projectId) {
setState(() {
_selectedProjectId = projectId;
});
},
allowNull: true,
labelText: 'پروژه (اختیاری)',
),
// ... ادامه فرم
],
),
);
}
```
#### مرحله 4: افزودن به payload
```dart
Future<void> _submitForm() async {
final payload = {
// ... سایر فیلدها
'project_id': _selectedProjectId, // اضافه کردن پروژه
// ... ادامه payload
};
// ارسال به API
await yourService.create(payload);
}
```
---
## 📄 صفحات نیازمند به‌روزرسانی
### لیست اسناد (فیلتر):
- [ ] `invoices_list_page.dart` - لیست فاکتورها
- [ ] `receipts_payments_list_page.dart` - لیست دریافت/پرداخت
- [ ] `expense_income_list_page.dart` - لیست درآمد/هزینه
- [ ] `documents_page.dart` - لیست کلی اسناد
### فرم‌های ثبت سند (selector):
- [ ] `new_invoice_page.dart` - ثبت فاکتور
- [ ] فرم‌های دریافت/پرداخت
- [ ] فرم‌های درآمد/هزینه
---
## 🔧 اجرای Migration
برای فعال‌سازی در دیتابیس:
```bash
cd hesabixAPI
alembic upgrade head
```
---
## 🧪 تست
### تست Backend:
```bash
# تست API endpoints
curl -X GET "http://localhost:8000/api/v1/businesses/1/projects" \
-H "Authorization: Bearer YOUR_TOKEN"
```
### تست Frontend:
1. ورود به سیستم
2. رفتن به صفحه "پروژه‌ها"
3. افزودن پروژه جدید
4. ثبت فاکتور با پروژه
5. فیلتر فاکتورها بر اساس پروژه
---
## 📚 API Endpoints
| Method | Endpoint | توضیحات |
|--------|----------|---------|
| POST | `/api/v1/businesses/{id}/projects` | ایجاد پروژه |
| GET | `/api/v1/businesses/{id}/projects` | لیست پروژه‌ها |
| GET | `/api/v1/businesses/{id}/projects/active` | پروژه‌های فعال (کمبوباکس) |
| GET | `/api/v1/projects/{id}` | جزئیات پروژه |
| PUT | `/api/v1/projects/{id}` | ویرایش پروژه |
| DELETE | `/api/v1/projects/{id}` | حذف پروژه |
| GET | `/api/v1/projects/{id}/documents` | اسناد پروژه |
---
## 💡 نکات مهم
1. **اختیاری بودن**: پروژه در همه جا اختیاری است و اجباری نیست
2. **فیلتر خودکار**: فیلتر پروژه به صورت خودکار با سایر فیلترها ترکیب می‌شود
3. **اعتبارسنجی**: پروژه باید به همان کسب‌وکار تعلق داشته باشد
4. **وضعیت**: فقط پروژه‌های فعال در کمبوباکس نمایش داده می‌شوند
5. **آمار**: آمار مالی هر پروژه قابل مشاهده است
---
## 🐛 عیب‌یابی
### خطای "PROJECT_NOT_FOUND":
- بررسی کنید پروژه به همان کسب‌وکار تعلق داشته باشد
- بررسی کنید پروژه فعال (is_active=true) باشد
### خطای "CURRENCY_NOT_FOUND":
- ارز پروژه باید معتبر باشد
- می‌توانید بدون ارز هم پروژه ایجاد کنید (null)
### فیلتر کار نمی‌کند:
- بررسی کنید `additionalFilters` به `DataTableConfig` اضافه شده باشد
- بررسی کنید `_refreshData()` بعد از تغییر فیلتر صدا زده شود
---
## 📞 پشتیبانی
در صورت بروز مشکل، موارد زیر را بررسی کنید:
1. Migration اجرا شده باشد
2. Import های لازم انجام شده باشد
3. Widget ها به درستی configure شده باشند
4. API Token معتبر باشد
---
✨ **پیاده‌سازی توسط AI Assistant - دسامبر 2025**