180 lines
5.8 KiB
Markdown
180 lines
5.8 KiB
Markdown
# راهنمای پیادهسازی تقویم شمسی در Hesabix
|
||
|
||
## ✅ پیادهسازی کامل شده
|
||
|
||
### 🔧 Backend (FastAPI)
|
||
|
||
#### 1. **Jalali Date Converter** (`/hesabixAPI/app/core/calendar.py`)
|
||
- تبدیل تاریخ میلادی به شمسی و بالعکس
|
||
- پشتیبانی از سالهای کبیسه
|
||
- نام ماهها و روزهای هفته به فارسی
|
||
- فرمتهای مختلف تاریخ
|
||
|
||
#### 2. **Calendar Middleware** (`/hesabixAPI/app/core/calendar_middleware.py`)
|
||
- تشخیص نوع تقویم از هدر `X-Calendar-Type`
|
||
- تنظیم پیشفرض بر اساس locale
|
||
|
||
#### 3. **Response Formatting** (`/hesabixAPI/app/core/responses.py`)
|
||
- فرمتبندی خودکار تاریخها در پاسخها
|
||
- اضافه کردن فیلدهای `_raw` برای تاریخ اصلی
|
||
|
||
### 🎨 Frontend (Flutter)
|
||
|
||
#### 1. **Jalali Converter** (`/hesabixUI/hesabix_ui/lib/core/jalali_converter.dart`)
|
||
- الگوریتمهای دقیق تبدیل تاریخ
|
||
- پشتیبانی کامل از تقویم شمسی
|
||
- نام ماهها و روزهای هفته فارسی
|
||
|
||
#### 2. **Jalali DatePicker** (`/hesabixUI/hesabix_ui/lib/widgets/jalali_date_picker.dart`)
|
||
- DatePicker سفارشی برای تقویم شمسی
|
||
- UI کامل با نام ماهها و روزهای فارسی
|
||
- ناوبری ماه و سال
|
||
|
||
#### 3. **Calendar Controller** (`/hesabixUI/hesabix_ui/lib/core/calendar_controller.dart`)
|
||
- مدیریت حالت تقویم (شمسی/میلادی)
|
||
- ذخیره تنظیمات کاربر
|
||
- همگامسازی با API
|
||
|
||
#### 4. **Calendar Switcher** (`/hesabixUI/hesabix_ui/lib/widgets/calendar_switcher.dart`)
|
||
- ویجت تعویض تقویم
|
||
- طراحی مشابه Language Switcher
|
||
- پشتیبانی چندزبانه
|
||
|
||
## 🚀 نحوه استفاده
|
||
|
||
### در Frontend:
|
||
|
||
```dart
|
||
// نمایش Jalali DatePicker
|
||
final picked = await showJalaliDatePicker(
|
||
context: context,
|
||
initialDate: DateTime.now(),
|
||
firstDate: DateTime(2020),
|
||
lastDate: DateTime(2030),
|
||
helpText: 'تاریخ را انتخاب کنید',
|
||
);
|
||
|
||
// تبدیل تاریخ
|
||
final jalali = JalaliConverter.gregorianToJalali(DateTime.now());
|
||
print(jalali.formatFull()); // "شنبه ۱ فروردین ۱۴۰۳"
|
||
|
||
// استفاده از CalendarController
|
||
final controller = CalendarController();
|
||
await controller.load();
|
||
controller.setCalendarType(CalendarType.jalali);
|
||
```
|
||
|
||
### در Backend:
|
||
|
||
```python
|
||
# تبدیل تاریخ
|
||
jalali_data = CalendarConverter.to_jalali(datetime.now())
|
||
# {
|
||
# "year": 1403,
|
||
# "month": 1,
|
||
# "day": 1,
|
||
# "month_name": "فروردین",
|
||
# "weekday_name": "شنبه",
|
||
# "formatted": "1403/01/01 12:00:00"
|
||
# }
|
||
|
||
# فرمتبندی بر اساس تقویم
|
||
formatted_date = CalendarConverter.format_datetime(
|
||
datetime.now(),
|
||
CalendarType.jalali
|
||
)
|
||
```
|
||
|
||
## 📱 صفحات پیادهسازی شده
|
||
|
||
### 1. **صفحه ورود (LoginPage)**
|
||
- Calendar Switcher در AuthFooter
|
||
- هماهنگ با Language Switcher
|
||
|
||
### 2. **داشبورد (HomePage)**
|
||
- Calendar Switcher در AppBar
|
||
- دسترسی سریع به تعویض تقویم
|
||
|
||
### 3. **صفحه بازاریابی (MarketingPage)**
|
||
- DatePicker های شمسی و میلادی
|
||
- فیلتر تاریخ بر اساس تقویم انتخابی
|
||
|
||
### 4. **پروفایل (ProfileShell)**
|
||
- Calendar Switcher در AppBar
|
||
- دسترسی در تمام صفحات پروفایل
|
||
|
||
## 🔄 جریان کار
|
||
|
||
1. **کاربر تقویم را انتخاب میکند**
|
||
2. **تنظیمات در SharedPreferences ذخیره میشود**
|
||
3. **API Client هدر X-Calendar-Type را ارسال میکند**
|
||
4. **Backend تاریخها را بر اساس تقویم انتخابی فرمت میکند**
|
||
5. **Frontend DatePicker مناسب را نمایش میدهد**
|
||
|
||
## 🎯 ویژگیهای کلیدی
|
||
|
||
### ✅ **بدون وابستگی خارجی**
|
||
- پیادهسازی کامل با Flutter native
|
||
- الگوریتمهای دقیق تبدیل تاریخ
|
||
- UI سفارشی برای تقویم شمسی
|
||
|
||
### ✅ **پشتیبانی کامل**
|
||
- سالهای کبیسه شمسی
|
||
- نام ماهها و روزهای فارسی
|
||
- فرمتهای مختلف تاریخ
|
||
|
||
### ✅ **یکپارچگی کامل**
|
||
- هماهنگ با سیستم i18n موجود
|
||
- ذخیره تنظیمات کاربر
|
||
- همگامسازی Frontend و Backend
|
||
|
||
### ✅ **UI/UX بهینه**
|
||
- طراحی مشابه Language Switcher
|
||
- DatePicker های کاربرپسند
|
||
- پشتیبانی چندزبانه
|
||
|
||
## 🧪 تست
|
||
|
||
```bash
|
||
# تست Frontend
|
||
cd hesabixUI/hesabix_ui
|
||
flutter analyze
|
||
flutter build web
|
||
|
||
# تست Backend
|
||
cd hesabixAPI
|
||
python -m pytest tests/
|
||
```
|
||
|
||
## 📚 منابع
|
||
|
||
- [مستندات Flutter CalendarDelegate](https://docs.flutter.dev/cupertino/showDatePicker)
|
||
- [الگوریتمهای تقویم شمسی](https://fa.wikipedia.org/wiki/تقویم_جلالی)
|
||
- [مستندات jdatetime](https://pypi.org/project/jdatetime/)
|
||
|
||
## 🔧 تنظیمات پیشرفته
|
||
|
||
### تغییر نام ماهها:
|
||
```dart
|
||
// در jalali_converter.dart
|
||
static const List<String> jalaliMonthNames = [
|
||
'فروردین', 'اردیبهشت', 'خرداد', // ...
|
||
];
|
||
```
|
||
|
||
### تغییر فرمت تاریخ:
|
||
```dart
|
||
// فرمت سفارشی
|
||
String customFormat = jalali.format(separator: '-'); // 1403-01-01
|
||
```
|
||
|
||
### اضافه کردن تقویم جدید:
|
||
```dart
|
||
// در calendar_controller.dart
|
||
enum CalendarType { gregorian, jalali, hijri } // اضافه کردن تقویم هجری
|
||
```
|
||
|
||
## 🎉 نتیجه
|
||
|
||
تقویم شمسی به صورت کامل و دقیق در پروژه Hesabix پیادهسازی شده است. کاربران میتوانند بین تقویم میلادی و شمسی جابجا شوند و تمام تاریخها بر اساس تقویم انتخابی نمایش داده میشوند.
|