hesabixArc/CALENDAR_FEATURE_README.md

116 lines
5.1 KiB
Markdown
Raw Normal View History

2025-09-18 10:44:23 +03:30
# قابلیت انتخاب نوع تقویم - Calendar Type Selection Feature
## خلاصه
این قابلیت امکان انتخاب نوع تقویم (میلادی یا شمسی) را در کل برنامه فراهم می‌کند. کاربران می‌توانند از طریق ویجت مخصوص، نوع تقویم مورد نظر خود را انتخاب کنند و تمام تاریخ‌ها در برنامه بر اساس انتخاب آن‌ها نمایش داده می‌شود.
## ویژگی‌های پیاده‌سازی شده
### Backend (FastAPI)
-**Middleware تقویم**: پردازش هدر `X-Calendar-Type` در درخواست‌ها
-**تبدیل تاریخ**: تبدیل خودکار تاریخ‌ها بین میلادی و شمسی
-**Response Formatting**: فرمت‌بندی پاسخ‌ها بر اساس نوع تقویم انتخابی
-**کتابخانه jdatetime**: استفاده از کتابخانه jdatetime برای تبدیل تاریخ‌ها
### Frontend (Flutter)
-**CalendarController**: مدیریت نوع تقویم انتخابی کاربر
-**CalendarSwitcher Widget**: ویجت تغییر نوع تقویم در AppBar
-**ApiClient Integration**: ارسال هدر `X-Calendar-Type` در درخواست‌ها
-**ترجمه‌ها**: ترجمه‌های فارسی و انگلیسی برای قابلیت تقویم
## نحوه استفاده
### برای کاربران
1. در صفحه اصلی برنامه، کنار دکمه تغییر زبان، دکمه انتخاب نوع تقویم را مشاهده کنید
2. روی دکمه کلیک کنید و نوع تقویم مورد نظر (میلادی یا شمسی) را انتخاب کنید
3. تمام تاریخ‌ها در برنامه بر اساس انتخاب شما نمایش داده می‌شوند
### برای توسعه‌دهندگان
#### Backend
```python
# استفاده از CalendarConverter
from app.core.calendar import CalendarConverter
# تبدیل تاریخ میلادی به شمسی
jalali_date = CalendarConverter.to_jalali(datetime.now())
# تبدیل تاریخ میلادی به فرمت استاندارد
gregorian_date = CalendarConverter.to_gregorian(datetime.now())
# فرمت‌بندی بر اساس نوع تقویم
formatted_date = CalendarConverter.format_datetime(datetime.now(), "jalali")
```
#### Frontend
```dart
// استفاده از CalendarController
final calendarController = CalendarController.load();
// تغییر نوع تقویم
await calendarController.setCalendarType(CalendarType.jalali);
// بررسی نوع تقویم فعلی
if (calendarController.isJalali) {
// منطق برای تقویم شمسی
}
```
## فایل‌های تغییر یافته
### Backend
- `app/core/calendar.py` - ابزارهای تبدیل تاریخ
- `app/core/calendar_middleware.py` - middleware پردازش هدر تقویم
- `app/core/responses.py` - فرمت‌بندی پاسخ‌ها
- `app/main.py` - اضافه کردن middleware
- `adapters/api/v1/auth.py` - استفاده از فرمت‌بندی تقویم
- `pyproject.toml` - اضافه کردن jdatetime
### Frontend
- `lib/core/calendar_controller.dart` - مدیریت نوع تقویم
- `lib/widgets/calendar_switcher.dart` - ویجت تغییر تقویم
- `lib/core/api_client.dart` - ارسال هدر تقویم
- `lib/main.dart` - یکپارچه‌سازی CalendarController
- `lib/pages/home_page.dart` - اضافه کردن CalendarSwitcher
- `lib/l10n/app_*.arb` - ترجمه‌های مربوط به تقویم
## تست کردن
### Backend
```bash
cd hesabixAPI
pip install jdatetime
python3 -c "import jdatetime; print('jdatetime imported successfully')"
```
### Frontend
```bash
cd hesabixUI/hesabix_ui
flutter analyze
flutter run
```
## نکات مهم
1. **پیش‌فرض**: تقویم شمسی به عنوان پیش‌فرض برای کاربران فارسی تنظیم شده است
2. **ذخیره‌سازی**: انتخاب کاربر در SharedPreferences ذخیره می‌شود
3. **هماهنگی**: تغییر نوع تقویم به صورت سراسری در کل برنامه اعمال می‌شود
4. **سازگاری**: تمام تاریخ‌ها همچنان به صورت UTC میلادی در دیتابیس ذخیره می‌شوند
## مراحل بعدی (اختیاری)
برای تکمیل کامل قابلیت، می‌توانید موارد زیر را اضافه کنید:
1. **CalendarDelegate**: پیاده‌سازی CalendarDelegate برای تقویم شمسی
2. **Date Picker**: استفاده از Date Picker شمسی در فرم‌ها
3. **Time Picker**: پیاده‌سازی Time Picker شمسی
4. **Localization**: اضافه کردن نام ماه‌ها و روزهای هفته شمسی
## پشتیبانی
در صورت بروز مشکل، لطفاً موارد زیر را بررسی کنید:
1. نصب صحیح کتابخانه jdatetime در Backend
2. اجرای `flutter pub get` در Frontend
3. بررسی تنظیمات SharedPreferences
4. بررسی هدرهای ارسالی در درخواست‌های API