عالی! حالا که نمونه واقعی از تنظیمات adjustment را دیدم، می‌توانم توضیح کاملی ارائه دهم: ## 📅 **توضیح کامل تنظیمات تقویم قمری (Lunar Calendar Adjustments)** ### 🎯 **هدف کلی** این تنظیمات برای **تطبیق تقویم قمری** با تقویم میلادی و مدیریت اختلافات محاسباتی بین تقویم‌های مختلف طراحی شده است. ### 📊 **ساختار داده‌ها** #### **1. آرایه اصلی** ```json [ { "adjust": 0, "current": 0, "map": {...} }, // تنظیمات پیش‌فرض { "adjust": -1, "current": 0, "map": {...} }, // تنظیمات منفی { "adjust": 1, "current": 0, "map": {...} } // تنظیمات مثبت ] ``` #### **2. فیلدهای هر تنظیم** - **`adjust`**: مقدار تطبیق (0, -1, +1) - **`current`**: وضعیت فعلی (همیشه 0) - **`map`**: نقشه سال‌های قمری ### 🗓️ **نقشه سال‌های قمری** ```json "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:** ```json "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 # در کد 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. تبدیل تاریخ** ```javascript // تبدیل تاریخ میلادی به قمری function convertToLunar(georgianDate, adjustment = 0) { const config = adjustmentConfigs.find(c => c.adjust === adjustment); const lunarMap = config.map; // محاسبات تبدیل با استفاده از نقشه قمری } ``` #### **2. محاسبه مناسبت‌ها** ```javascript // محاسبه تاریخ عید فطر function calculateEidFitr(year) { const config = getAdjustmentConfig(); const lunarYear = config.map[year]; // محاسبه بر اساس روزهای ماه رمضان } ``` ### 📱 **مثال استفاده در فرانت‌اند** ```javascript // دریافت تنظیمات از 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. چالش‌های محاسباتی** ```javascript // مشکل: محاسبه دقیق تقویم قمری const lunarMonth = 29.53059; // روز const lunarYear = lunarMonth * 12; // 354.36708 روز // اما سال قمری باید عدد صحیح باشد! ``` #### **3. روش‌های مختلف محاسبه** - **روش نجومی**: بر اساس رصد ماه - **روش محاسباتی**: الگوریتم‌های ریاضی - **روش تقریبی**: فرمول‌های ساده‌شده ### 🎯 **کاربردهای عملی** #### **1. مدیریت مناسبت‌های مذهبی** ```javascript // محاسبه تاریخ عید فطر 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. تبدیل تاریخ‌ها** ```javascript // تبدیل تاریخ میلادی به قمری function convertToLunar(georgianDate, adjustment = 0) { const config = getAdjustmentConfig(adjustment); const lunarMap = config.map; // محاسبه روزهای گذشته از ابتدای سال let totalDays = calculateDaysFromStart(georgianDate); // تطبیق با تقویم قمری totalDays += adjustment; // اعمال تنظیمات // پیدا کردن ماه و روز قمری return findLunarMonthAndDay(totalDays, lunarMap); } ``` #### **3. نمایش تقویم ترکیبی** ```javascript // نمایش همزمان تقویم میلادی و قمری 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`)** ```javascript // استفاده برای: // - نمایش عمومی تقویم // - محاسبات استاندارد // - اکثر کاربران const standardConfig = { adjust: 0, current: 0, map: { "1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29] } }; ``` #### **2. حالت تطبیق منفی (`adjust: -1`)** ```javascript // استفاده برای: // - تصحیح اختلافات محاسباتی // - تطبیق با رصدهای نجومی // - مناطق جغرافیایی خاص 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`)** ```javascript // استفاده برای: // - تصحیح اختلافات محاسباتی // - تطبیق با تقویم‌های رسمی // - مناطق جغرافیایی خاص const positiveAdjustConfig = { adjust: 1, current: 0, map: { "1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29] } }; // مثال: اگر تقویم رسمی کشور رمضان 31 روز نشان دهد // اما محاسبات 30 روز نشان می‌دهد ``` ### 🌍 **کاربردهای جغرافیایی** #### **1. مناطق مختلف جهان** ```javascript // تنظیمات بر اساس منطقه جغرافیایی const regionalConfigs = { "iran": { adjust: 0, name: "تقویم رسمی ایران" }, "saudi": { adjust: -1, name: "تقویم عربستان" }, "turkey": { adjust: 1, name: "تقویم ترکیه" }, "malaysia": { adjust: 0, name: "تقویم مالزی" } }; ``` #### **2. تطبیق با تقویم‌های رسمی** ```javascript // تطبیق با تقویم رسمی کشورها 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. اپلیکیشن‌های مذهبی** ```javascript // محاسبه زمان نماز 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. اپلیکیشن‌های تقویم** ```javascript // نمایش تقویم ترکیبی 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. تغییر تنظیمات در زمان اجرا** ```javascript // تغییر تنظیمات بدون restart function updateAdjustmentConfig(newConfig) { // ذخیره در دیتابیس saveConfigToDatabase(newConfig); // بروزرسانی کش updateCache('calendar__Adjustment', newConfig); // اطلاع‌رسانی به کلاینت‌ها broadcastConfigUpdate(newConfig); } ``` #### **2. A/B Testing تنظیمات** ```javascript // تست تنظیمات مختلف 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 ] } } ]