You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

16 KiB

عالی! حالا که نمونه واقعی از تنظیمات adjustment را دیدم، می‌توانم توضیح کاملی ارائه دهم:

📅 توضیح کامل تنظیمات تقویم قمری (Lunar Calendar Adjustments)

🎯 هدف کلی

این تنظیمات برای تطبیق تقویم قمری با تقویم میلادی و مدیریت اختلافات محاسباتی بین تقویم‌های مختلف طراحی شده است.

📊 ساختار داده‌ها

1. آرایه اصلی

[
  { "adjust": 0, "current": 0, "map": {...} },    // تنظیمات پیش‌فرض
  { "adjust": -1, "current": 0, "map": {...} },   // تنظیمات منفی
  { "adjust": 1, "current": 0, "map": {...} }     // تنظیمات مثبت
]

2. فیلدهای هر تنظیم

  • adjust: مقدار تطبیق (0, -1, +1)
  • current: وضعیت فعلی (همیشه 0)
  • map: نقشه سال‌های قمری

🗓️ نقشه سال‌های قمری

"map": {
  "1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29],
  "1445": [354, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 29],
  "1446": [355, 30, 30, 30, 29, 30, 30, 29, 30, 29, 29, 29, 30],
  "1447": [355, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29]
}

🔢 تفسیر اعداد

ساختار هر سال:

  • عدد اول: تعداد کل روزهای سال (354 یا 355)
  • 12 عدد بعدی: تعداد روزهای هر ماه (29 یا 30)

مثال سال 1444:

"1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29]
  • 354 روز کل سال
  • محرم: 30 روز
  • صفر: 30 روز
  • ربیع‌الاول: 29 روز
  • ربیع‌الثانی: 30 روز
  • جمادی‌الاول: 29 روز
  • جمادی‌الثانی: 29 روز
  • رجب: 30 روز
  • شعبان: 29 روز
  • رمضان: 30 روز
  • شوال: 29 روز
  • ذی‌القعده: 30 روز
  • ذی‌الحجه: 29 روز

⚙️ سه حالت تطبیق

1. حالت پیش‌فرض (adjust: 0)

  • بدون تطبیق اضافی
  • محاسبات استاندارد تقویم قمری

2. حالت تطبیق منفی (adjust: -1)

  • یک روز از محاسبات کم می‌شود
  • برای تصحیح اختلافات محاسباتی

3. حالت تطبیق مثبت (adjust: 1)

  • یک روز به محاسبات اضافه می‌شود
  • برای تصحیح اختلافات محاسباتی

🔄 نحوه استفاده در API

# در کد Python
adjustment_config = get_config('calendar__Adjustment')
config_data = json.loads(adjustment_config)

# انتخاب تنظیمات بر اساس نیاز
for config in config_data:
    if config['adjust'] == 0:  # حالت پیش‌فرض
        lunar_calendar_map = config['map']
        break

🎯 کاربرد عملی

1. تبدیل تاریخ

// تبدیل تاریخ میلادی به قمری
function convertToLunar(georgianDate, adjustment = 0) {
    const config = adjustmentConfigs.find(c => c.adjust === adjustment);
    const lunarMap = config.map;
    // محاسبات تبدیل با استفاده از نقشه قمری
}

2. محاسبه مناسبت‌ها

// محاسبه تاریخ عید فطر
function calculateEidFitr(year) {
    const config = getAdjustmentConfig();
    const lunarYear = config.map[year];
    // محاسبه بر اساس روزهای ماه رمضان
}

📱 مثال استفاده در فرانت‌اند

// دریافت تنظیمات از API
fetch('/calendar/adjustemnts/')
  .then(response => response.json())
  .then(configs => {
    // انتخاب تنظیمات مناسب
    const defaultConfig = configs.find(c => c.adjust === 0);
    const lunarCalendar = defaultConfig.map;
    
    // استفاده برای نمایش تقویم
    displayLunarCalendar(lunarCalendar);
  });

🔧 مدیریت تنظیمات

  • تغییر تنظیمات: از طریق پنل ادمین Django
  • بروزرسانی: تنظیمات فوراً در API اعمال می‌شود
  • پشتیبان‌گیری: تنظیمات در دیتابیس ذخیره می‌شوند

🎨 مزایای این سیستم

  1. انعطاف‌پذیری: امکان تطبیق با روش‌های مختلف محاسبه
  2. دقت: تصحیح اختلافات محاسباتی
  3. سازگاری: پشتیبانی از تقویم‌های مختلف
  4. مدیریت آسان: تغییر تنظیمات بدون تغییر کد

این سیستم به شما امکان مدیریت دقیق تقویم قمری و تطبیق آن با نیازهای مختلف را می‌دهد.

🔍 توضیح عمیق و جامع سیستم تطبیق تقویم قمری

🌙 چرا این سیستم وجود دارد؟

1. مشکل اصلی: اختلاف در محاسبه تقویم قمری

تقویم قمری بر اساس چرخه ماه (29.5 روز) محاسبه می‌شود، اما:

  • سال قمری: 354 یا 355 روز
  • سال میلادی: 365 یا 366 روز
  • اختلاف سالانه: حدود 11 روز

2. چالش‌های محاسباتی

// مشکل: محاسبه دقیق تقویم قمری
const lunarMonth = 29.53059; // روز
const lunarYear = lunarMonth * 12; // 354.36708 روز
// اما سال قمری باید عدد صحیح باشد!

3. روش‌های مختلف محاسبه

  • روش نجومی: بر اساس رصد ماه
  • روش محاسباتی: الگوریتم‌های ریاضی
  • روش تقریبی: فرمول‌های ساده‌شده

🎯 کاربردهای عملی

1. مدیریت مناسبت‌های مذهبی

// محاسبه تاریخ عید فطر
function calculateEidFitr(year) {
    const config = getAdjustmentConfig();
    const lunarMap = config.map[year];
    
    // رمضان همیشه 29 یا 30 روز است
    const ramadanDays = lunarMap[9]; // ماه نهم (رمضان)
    
    if (ramadanDays === 29) {
        return "عید فطر در روز 29 رمضان";
    } else {
        return "عید فطر در روز 30 رمضان";
    }
}

2. تبدیل تاریخ‌ها

// تبدیل تاریخ میلادی به قمری
function convertToLunar(georgianDate, adjustment = 0) {
    const config = getAdjustmentConfig(adjustment);
    const lunarMap = config.map;
    
    // محاسبه روزهای گذشته از ابتدای سال
    let totalDays = calculateDaysFromStart(georgianDate);
    
    // تطبیق با تقویم قمری
    totalDays += adjustment; // اعمال تنظیمات
    
    // پیدا کردن ماه و روز قمری
    return findLunarMonthAndDay(totalDays, lunarMap);
}

3. نمایش تقویم ترکیبی

// نمایش همزمان تقویم میلادی و قمری
function displayHybridCalendar(year) {
    const config = getAdjustmentConfig();
    const lunarMap = config.map[year];
    
    // ایجاد تقویم میلادی
    const georgianCalendar = createGeorgianCalendar(year);
    
    // اضافه کردن تاریخ‌های قمری
    georgianCalendar.forEach(day => {
        day.lunarDate = convertToLunar(day.date, config.adjust);
    });
    
    return georgianCalendar;
}

🔧 سه حالت تطبیق و کاربرد آنها

1. حالت پیش‌فرض (adjust: 0)

// استفاده برای:
// - نمایش عمومی تقویم
// - محاسبات استاندارد
// - اکثر کاربران

const standardConfig = {
    adjust: 0,
    current: 0,
    map: {
        "1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29]
    }
};

2. حالت تطبیق منفی (adjust: -1)

// استفاده برای:
// - تصحیح اختلافات محاسباتی
// - تطبیق با رصدهای نجومی
// - مناطق جغرافیایی خاص

const negativeAdjustConfig = {
    adjust: -1,
    current: 0,
    map: {
        "1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29]
    }
};

// مثال: اگر رصد ماه نشان دهد که رمضان 28 روز است
// اما محاسبات 29 روز نشان می‌دهد

3. حالت تطبیق مثبت (adjust: 1)

// استفاده برای:
// - تصحیح اختلافات محاسباتی
// - تطبیق با تقویم‌های رسمی
// - مناطق جغرافیایی خاص

const positiveAdjustConfig = {
    adjust: 1,
    current: 0,
    map: {
        "1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29]
    }
};

// مثال: اگر تقویم رسمی کشور رمضان 31 روز نشان دهد
// اما محاسبات 30 روز نشان می‌دهد

🌍 کاربردهای جغرافیایی

1. مناطق مختلف جهان

// تنظیمات بر اساس منطقه جغرافیایی
const regionalConfigs = {
    "iran": { adjust: 0, name: "تقویم رسمی ایران" },
    "saudi": { adjust: -1, name: "تقویم عربستان" },
    "turkey": { adjust: 1, name: "تقویم ترکیه" },
    "malaysia": { adjust: 0, name: "تقویم مالزی" }
};

2. تطبیق با تقویم‌های رسمی

// تطبیق با تقویم رسمی کشورها
function getOfficialCalendar(country, year) {
    const regionalConfig = regionalConfigs[country];
    const baseConfig = getAdjustmentConfig(regionalConfig.adjust);
    
    return {
        country: country,
        year: year,
        calendar: baseConfig.map[year],
        adjustment: regionalConfig.adjust
    };
}

📱 کاربرد در اپلیکیشن‌ها

1. اپلیکیشن‌های مذهبی

// محاسبه زمان نماز
function calculatePrayerTimes(date, location) {
    const lunarDate = convertToLunar(date, getAdjustmentForLocation(location));
    
    // محاسبه زمان نماز بر اساس تاریخ قمری
    return {
        fajr: calculateFajrTime(lunarDate),
        dhuhr: calculateDhuhrTime(lunarDate),
        asr: calculateAsrTime(lunarDate),
        maghrib: calculateMaghribTime(lunarDate),
        isha: calculateIshaTime(lunarDate)
    };
}

2. اپلیکیشن‌های تقویم

// نمایش تقویم ترکیبی
function displayCalendar(year, month) {
    const config = getAdjustmentConfig();
    const lunarMap = config.map[year];
    
    // ایجاد تقویم میلادی
    const georgianDays = getGeorgianDays(year, month);
    
    // اضافه کردن تاریخ‌های قمری
    const hybridDays = georgianDays.map(day => ({
        ...day,
        lunar: convertToLunar(day.date, config.adjust),
        isHoliday: isLunarHoliday(day.date, lunarMap)
    }));
    
    return hybridDays;
}

🔄 مدیریت پویای تنظیمات

1. تغییر تنظیمات در زمان اجرا

// تغییر تنظیمات بدون restart
function updateAdjustmentConfig(newConfig) {
    // ذخیره در دیتابیس
    saveConfigToDatabase(newConfig);
    
    // بروزرسانی کش
    updateCache('calendar__Adjustment', newConfig);
    
    // اطلاع‌رسانی به کلاینت‌ها
    broadcastConfigUpdate(newConfig);
}

2. A/B Testing تنظیمات

// تست تنظیمات مختلف
function testAdjustmentConfigs(userGroup) {
    const configs = {
        'group_a': { adjust: 0, name: 'پیش‌فرض' },
        'group_b': { adjust: -1, name: 'تطبیق منفی' },
        'group_c': { adjust: 1, name: 'تطبیق مثبت' }
    };
    
    return configs[userGroup] || configs['group_a'];
}

🎨 مزایای این سیستم

1. انعطاف‌پذیری

  • امکان تطبیق با روش‌های مختلف محاسبه
  • پشتیبانی از مناطق جغرافیایی مختلف
  • قابلیت تغییر بدون تغییر کد

2. دقت

  • تصحیح اختلافات محاسباتی
  • تطبیق با رصدهای نجومی
  • پشتیبانی از تقویم‌های رسمی

3. مقیاس‌پذیری

  • پشتیبانی از سال‌های متعدد
  • امکان اضافه کردن تنظیمات جدید
  • مدیریت آسان از طریق پنل ادمین

4. سازگاری

  • کار با تقویم‌های مختلف
  • پشتیبانی از زبان‌های مختلف
  • تطبیق با استانداردهای بین‌المللی

🚀 نتیجه‌گیری

این سیستم یک راه‌حل جامع برای مدیریت تقویم قمری است که:

  • مشکلات محاسباتی را حل می‌کند
  • انعطاف‌پذیری لازم را فراهم می‌کند
  • دقت مورد نیاز را تضمین می‌کند
  • مدیریت آسان تنظیمات را امکان‌پذیر می‌سازد

این سیستم به شما امکان مدیریت دقیق و انعطاف‌پذیر تقویم قمری را می‌دهد و می‌تواند با نیازهای مختلف کاربران و مناطق جغرافیایی تطبیق یابد. نمونه پاسخ: [ { "adjust": 0, "current": 0, "map": { "1444": [ 354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29 ], "1445": [ 354, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 29 ], "1446": [ 355, 30, 30, 30, 29, 30, 30, 29, 30, 29, 29, 29, 30 ], "1447": [ 355, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29 ] } }, { "adjust": -1, "current": 0, "map": { "1444": [ 354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29 ], "1445": [ 354, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30 ], "1446": [ 355, 30, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29 ], "1447": [ 355, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29 ] } }, { "adjust": 1, "current": 0, "map": { "1444": [ 354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29 ], "1445": [ 354, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 29 ], "1446": [ 355, 30, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29 ], "1447": [ 355, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29 ] } } ]