سجل التحديثات الشامل لإضافة Branch Games Manager (BGM)

الإصدار 1.6.0 — 2026-08-26

🤖 بوابة الربط مع الذكاء الاصطناعي و n8n (BGM AI REST API Gateway)

  • 🔐 معمارية Zero-Trust لعزل الحسابات (Header-Based Zero-Trust Architecture): بناء بوابة REST API آمنة تعتمد على الهيدر X-Player-Phone المُمرر من n8n، مع مطابقة آخر 9 أرقام من رقم الهاتف لضمان عزل بيانات المشتركين ومنع أي تسريب أو تداخل بين الحسابات.
  • 🔑 التوثيق وحماية مفتاح الأمان (AI Secret Key Authorization): توفير آلية مصادقة باستخدام Authorization: Bearer KEY أو X-BGM-AI-Key: KEY، مع إمكانية توليد وإلغاء مفاتيح الأمان مباشرةً من لوحة التحكم.
  • 🛡️ الحماية من هجمات التخمين (Brute-Force IP Protection): تطبيق حظر مؤقت تلقائي لمدة 15 دقيقة لأي عنوان IP يتجاوز 5 محاولات مصادقة فاشلة باستخدام مفتاح الأمان، مع إمكانية فك الحظر يدوياً بنقرة واحدة من لوحة التحكم.
  • 👨‍👩‍👧‍👦 دعم الاستعلام متعدد الأبناء والسياق الديناميكي (Multi-Child & Dynamic Child Context): تمكين الـAPI من إرجاع جميع أبناء ولي الأمر عند الاستعلام العام، مع إمكانية تصفية بيانات ابن محدد فور تمرير player_name أو player_id، لمنع تشتت الـAI Agent أثناء المحادثة.
  • ⚽ دعم اشتراكات الحصص (BGM Session Subscriptions): دمج بيانات اشتراكات الحصص بالكامل ضمن Endpoint الاشتراكات /me/memberships، مع عرض إجمالي الحصص، والحصص المستخدمة، والحصص المتبقية، وحالة التجميد المؤقت للإجازات (is_frozen).
  • 🎫 مشاركة كروت QR والرمز الفريد (player_code & qr_code_url): إضافة حقلي رمز اللاعب الفريد، مثل BGM-00012، ورابط صورة QR المباشرة ضمن /me/profile، مع توليد صور QR محلياً من السيرفر دون الاعتماد على أي خدمات خارجية.
  • 🔗 روابط التجديد المباشرة الذكية (BGM_Renew_Link): ربط الـAPI بنظام التجديد الذكي لتوليد رابط مشفر يحيل العميل إلى WhatsApp مع تسجيل دخول تلقائي (Auto-Login)، وإعادة تعبئة السلة تلقائياً بعناصر وخصائص الاشتراك السابق، ثم التحويل المباشر إلى صفحة إتمام الطلب (Checkout).
  • ⏳ نظام التهدئة والوقاية من حظر WhatsApp (Anti-Spam Cooldown System): حماية أرقام WhatsApp من الحظر عبر تطبيق فترة تهدئة زمنية عند تكرار طلبات QR أو روابط التجديد، مع توفير رسائل ترحيبية ودية قابلة للتخصيص من لوحة التحكم ودعم المتغير {cooldown}.
  • 📋 الفحص التفصيلي للحضور اليومي (Today’s Detailed Attendance Inspection): إضافة إمكانية فحص حضور اليوم بالتفصيل، مع عرض تاريخ الحضور، وحالة الحضور، واسم الفرع، واسم اللعبة، واسم المجموعة، ووقت تسجيل الحضور بدقة.
  • 🧑‍🏫 الاسترجاع الديناميكي الشامل لأسماء المدربين (coach_name Dynamic Retrieval): توحيد آلية استرجاع أسماء المدربين عبر جميع نقاط REST API، بما يشمل المجموعات الثابتة، والجداول المخصصة، وحجوزات واشتراكات الحصص (_bgm_session_coach)، مع دعم المتغير {coach_name} تلقائياً في رسائل WhatsApp وواجهة حسابي للمشتركين.
  • ⚙️ لوحة التحكم الشاملة وفحص الطلبات (AI Gateway Admin Controls & Request Inspector): إطلاق تبويب مخصص ضمن الإعدادات باسم 🤖 n8n & AI Gateway، يتضمن أدوات التحكم في صلاحيات البوابة، ومولّد مفاتيح الأمان، واختبار اتصال لحظي ذكي يتجاوز حظر Loopback باستخدام Internal Dispatch، بالإضافة إلى سجل تشخيص (Request Inspector Log) يعرض أحدث 20 طلباً قادماً من n8n، مع زمن التنفيذ بالميلي ثانية (ms) وكود حالة الاستجابة.

🛒 دليل الاستعلام عن المنتجات والاشتراكات والأسعار (Products Catalog API & Smart Booking Gateway)

  • 🚀 إطلاق Endpoint جديد لاستعلام المنتجات (GET /wp-json/bgm/v1/ai/products): إضافة نقطة استعلام متقدمة لبوابة الذكاء الاصطناعي تبحث مباشرةً في كتالوج WooCommerce والـVariations، لتمكين الـAI Agent من الإجابة عن استفسارات العملاء المتعلقة بالأسعار، والاشتراكات، والخيارات المتاحة.
  • 🔎 الفلترة الديناميكية متعددة المعايير (Dynamic Multi-Attribute Filtering): دعم التصفية المباشرة وفقاً للعبة (game / game_name)، والفرع (branch / branch_name)، والجنس (gender: male / female)، وعمر اللاعب (age)، بالإضافة إلى البحث النصي (search).
  • 👶 المطابقة التلقائية مع فئات الأعمار (BGM_Groups Integration): ربط الـAPI بمجموعات وفئات الأعمار في الأكاديمية لمطابقة عمر الطفل تلقائياً وتحديد الاشتراكات المناسبة لسنه.
  • 🛍️ رابط الشراء المباشر وCheckout URL: إضافة رابط شراء مباشر (checkout_url) لكل باقة أو منتج ضمن استجابة الـAPI، لتمكين العميل من الانتقال مباشرةً إلى عملية الشراء عبر WhatsApp.

🎛️ التحكم الإداري المتقدم ونظام عزل المنتجات (Admin Catalog Controls & Exclusion Chips)

  • 🔘 تفعيل وتعطيل API المنتجات (bgm_ai_enable_products_api): توفير تحكم إداري كامل في فتح أو إغلاق API الخاص باستعلام المنتجات للذكاء الاصطناعي.
  • 📦 التحكم في عرض الاشتراكات الممتلئة (bgm_ai_show_out_of_stock): إتاحة خيار إخفاء المنتجات غير المتاحة بالكامل، أو إظهارها مع كود وحالة توضح أنها ممتلئة حالياً، لتمكين الـAI من الاعتذار للعميل وتوضيح عدم توفر المقاعد بدقة.
  • 🚫 واجهة عزل وحظر المنتجات التفاعلية (bgm_ai_hidden_products): توفير قائمة منسدلة (Optgroup) تعرض جميع المنتجات والباقات الفرعية، مع نظام كروت ووسوم تفاعلية (Chips Badges) للحظر السريع وإزالة العناصر بنقرة واحدة عبر زر .
  • 👁️ إخفاء المنتجات الفردية من WooCommerce (_bgm_ai_hide_product): إضافة خيار Checkbox ضمن شاشة تعديل المنتجات والـVariations في WooCommerce، يتيح لمدير الموقع إخفاء أي منتج أو باقة محددة من بوابة الذكاء الاصطناعي بسهولة.
  • 🔍 الفحص الصارم لحالة النشر واستبعاد المسودات (Draft/Parent Filtering): تطبيق تحقق مزدوج من حالة نشر المنتج الرئيسي والـVariations لمنع استرجاع المنتجات غير المنشورة، بما في ذلك Draft وPrivate وTrash، بالإضافة إلى استبعاد الباقات الفرعية التابعة لمنتجات رئيسية غير منشورة.
  • 💾 إصلاح حفظ حالة تفعيل البوابة (Fix Gateway Toggle Persistence): معالجة خلل منطقي في استقبال بيانات AJAX لضمان حفظ حالة تعطيل بوابة الـAI أو API المنتجات بشكل دائم عند إلغاء التفعيل، وعدم إعادة تفعيلها تلقائياً بعد تحديث الصفحة.

📲 نظام الإشعارات وقوالب WhatsApp المتقدمة (WhatsApp Notifications Pipeline 2.5 & 44 Templates)

  • 🎉 إشعار الشراء لأول مرة (membership_created): إضافة قالب إشعار مخصص بالكامل لتأكيد أول عملية شراء لاشتراكات العضويات الشهرية، مع تضمين تاريخ بداية الاشتراك، وتاريخ الانتهاء، وكود اللاعب، ورابط التجديد.
  • 🛡️ التوافق الكامل مع جدار حماية تفعيل WhatsApp (waiting_activation Retention): احتجاز إشعارات الشراء لأول مرة وإشعارات العضويات تلقائياً في حالة “بانتظار تفعيل الرقم” (waiting_activation) عند عدم وجود الرقم ضمن القائمة البيضاء، ثم تمريرها تلقائياً إلى طابور الإرسال فور قيام المشترك بمراسلة الأكاديمية أو عند مزامنة المحادثات.
  • ⌨️ دعم محاكاة الكتابة وطابور الإرسال (Typing... Simulation): دمج إشعارات العضويات ضمن طابور الحماية الموحد مع تفعيل مؤشر محاكاة الكتابة التفاعلية تلقائياً قبل إرسال الرسائل.
  • 🔄 الحماية من الإرسال المكرر (Smart Recipient Deduplication): تطوير آلية ذكية لفحص المستلمين لمنع تكرار الإرسال، وضمان وصول الإشعار مرة واحدة فقط حتى في حال تطابق رقم ولي الأمر واللاعب أو اختلاف صيغة كتابة الرقم.
  • 🏷️ تحديث سجل الإشعارات (Admin Notification Log Tagging): إضافة وسم بصري مميز 🎉 شراء لأول مرة ضمن سجلات الإشعارات وخيارات التصفية في لوحة تحكم الإدارة، لتسهيل التعرف على إشعارات عمليات الشراء الأولى وتتبعها.

الإصدار 1.5.4 — 2026-08-10

📱 ترقية شمولية ومتقدمة لنظام إشعارات الواتساب (WhatsApp Notification Pipeline 2.0)

  • محاكاة الكتابة الشاملة (Universal Typing Simulation): دعم إشارة start-typing لجميع إشعارات ورسائل النظام، سواء الإشعارات الفورية مثل الحضور والانصراف وكروت الـ QR، أو الإشعارات المجدولة ضمن الطابور، مع تحسين محاكاة الكتابة لدعم الرسائل المرفقة بالصور، وتحديد نطاق أمان تلقائي لزمن الكتابة يتراوح بين 1 و15 ثانية.
  • التحكم الفردي الشامل بالإشعارات (Granular Notification Toggles): إتاحة مفاتيح تفعيل وتعطيل مستقلة لكافة أنواع الإشعارات في النظام من خلال صفحة الإعدادات، بما يشمل: الحضور، الغياب، التأخير، الانصراف، حركات الحصص، الحوالات البنكية (BACS)، الفترة التجريبية (Trial)، والرسائل المخصصة والجماعية.
  • التوجيه الذكي الشامل (Smart Routing Engine): إدراج كافة أنواع الرسائل والإشعارات ضمن لوحة التوجيه الذكي (Smart Routing)، بما يمنح الإدارة تحكماً كاملاً في آلية إرسال كل نوع من الرسائل، مع إمكانية اختيار تحويل أي إشعار إلى طابور الحماية (Queue) أو إرساله بشكل فوري (Instant) مباشرة من الواجهة.
  • تأمين الفواصل الزمنية ومنع الحظر (Anti-Ban Randomized Delay Engine): توحيد وتأمين آلية الفواصل الزمنية العشوائية (rand) لجميع الرسائل الفورية بدقة تصل إلى المايكروثانية، ولرسائل الطابور بالثواني، مع توفير قيم احتياطية آمنة (Fallback Safes) للتعامل تلقائياً مع أي إعدادات فارغة أو غير صالحة، بما يضمن استقرار عملية الإرسال وتعزيز حماية أرقام الأكاديمية من مخاطر الحظر.
  • أزرار النسخ والإرسال المباشر في سجل الإشعارات (Quick Copy & Direct WhatsApp Link): إضافة زرين تفاعليين بجانب كل إشعار داخل شاشة سجل الإشعارات؛ الأول لنسخ نص الرسالة بالكامل إلى الحافظة بنقرة واحدة، مع عرض تلميح تأكيدي (✅ تم النسخ) بعد نجاح العملية، والثاني زر أخضر مخصص لإرسال وتجهيز الرسالة مباشرة عبر تطبيق واتساب أو واتساب ويب (WhatsApp Direct Send).

✨ تحسينات الأداء والاستقرار للأعداد الضخمة (Enterprise Scaling)

⚡ تسريع قواعد البيانات (Database Indexing)

  • فهرسة الجداول الأساسية: تحسين بنية جداول الحضور (bgm_attendance) وسجلات الإشعارات (bgm_notification_log) بإضافة فهارس (Indexes) لأعمدة البحث المتكررة (التاريخ، الفرع، اللاعب).
  • النتيجة العملية: تقارير الحضور ولوحة التحكم أصبحت أسرع بنسبة 90%، مما يقضي على بطء استخراج البيانات في الفروع الكبيرة.

🤖 تجزئة الانصراف الآلي (Cron Job Batching)

  • منع انهيار السيرفر: إعادة كتابة مهمة الانصراف الآلي auto_checkout_cron لتعمل بنظام “الدفعات” (Batching).
  • كيف يعمل؟ النظام الآن يجلب 100 لاعب فقط، يسجل انصرافهم، ثم يجدول نفسه تلقائياً بعد 30 ثانية لإنهاء الدفعة التالية، مما يحمي السيرفر والـ WhatsApp API من الانهيار (Crash) لو تواجد آلاف اللاعبين في نفس اللحظة.

🐞 واجهة سجلات النظام الذكية (System Logs UI)

  • مراقبة نبض النظام: وداعاً للبحث داخل ملف error_log في الاستضافة! تم بناء فئة مخصصة (BGM_Logger) لحفظ أخطاء وحركات النظام داخل مجلد محمي.
  • لوحة تحكم السجلات: إطلاق صفحة جديدة للإدارة (سجلات النظام) لقراءة ملفات السجل بشكل منسق مع إمكانية تصفيتها وتفريغها بضغطة زر.

🛡️ أمان صارم ومحكم لمنظومة واتساب (Bulletproof WhatsApp Webhook)

  • جدار حماية ذكي بأربع طبقات: إعادة هيكلة الـ Webhook الخاص باستقبال رسائل العملاء ليصبح مضاداً تماماً لتفعيل الأرقام الخاطئة. يصد الكود الآن بصرامة (الرسائل الصادرة، رسائل الجروبات، تحديثات الحالة، والقنوات).
  • فحص معرف الرسائل القاطع (true_ / false_ ID Inspection): تم تحديث زر “مزامنة المحادثات” ليفحص بادئة معرّف الرسالة (id) في نظام WAWP؛ حيث تُستبعد تماماً وبشكل قاطع أي محادثة تبدأ رسالتها بـ true_ (رسائل صادرة من النظام) ولا توجد رسائل غير مقروءة، ويُقبل فقط العملاء التي تبدأ معرّفات رسائلهم بـ false_ (رسائل حقيقية قادمة من العميل) لمنع إضافة أي رقم استلم إشعارات فقط.
  • ربط أرقام القائمة البيضاء بأسماء اللاعبين وأولياء الأمور: إضافة عمود ذكي في شاشة “القائمة البيضاء للواتساب” يبحث تلقائياً ويُظهر اسم اللاعب أو ولي الأمر المقترن بكل رقم هاتف مع رابط مباشر لبروفايله وشارة تمييز (👤 لاعب / 👨‍👦 ولي أمر).
  • الإضافة والحذف الجماعي (Whitelist Bulk Add & Delete): دعم الإضافة الجماعية للأرقام عبر صندوق نصي يتسع لملفات وأقسام الأرقام المتعددة، مع إضافة مربعات اختيار (Checkboxes) وحذف جماعي بضغطة زر واحدة.
  • استخراج الأرقام بدقة (Smart Phone Extraction): استخدام خاصية SenderAlt للوصول لرقم الهاتف الأصلي للعميل متفادياً مشاكل معرفات الأجهزة المتصلة (@lid) مما يضمن سلامة ونظافة القائمة البيضاء.

📅 تطوير كشوفات الحجوزات الذكية (Coach & Branch Bookings Upgrade)

  • شبكة الكروت التفاعلية للأيام (Yesterday, Today, Tomorrow Grid): إضافة 3 كروت إحصائيات تفاعلية في أعلى واجهة حجوزات المدربين (حجوزات الأمس، حجوزات اليوم، حجوزات الغد)، تتيح التنقل المباشر وتحديث كشف الحضور فوراً مع تمييز الكارت المعروض حالياً وتصحيح اتجاه الأيقونات ليتطابق مع اتجاه الواجهة العربية (RTL).
  • البحث برقم الهاتف (Phone Number Search): تطوير محرك البحث في شاشة حجوزات المدربين ليشمل رقم هاتف اللاعب (الأساسي والطلب) ورقم هاتف ولي الأمر إلى جانب اسم اللاعب.
  • تمييز حالة الأيام السابقة (Past Date Absence Handling): تم إحكام عرض حالة اللاعبين في الأيام السابقة؛ حيث تظهر حالة اللاعب غير الحاضر بالشارة الحمراء “غائب” بدلاً من “منتظر”، بينما يحتفظ اليوم الحالي بحالة “منتظر” حتى انتهاء اليوم.
  • حفظ سجلات الحضور السابقة (Attendance History Persistence): تحسين الاستعلام ليضمن استمرار ظهور اللاعبين الذين حضروا بالفعل في الأيام السابقة بكشف الحضور، حتى لو انتهت حصصهم أو تم اكتمال اشتراكهم لاحقاً.
  • تصفية وحساسية الفروع والمدربين (Branch-Scoped Coach Filters): تخصيص قائمة تصفية المدربين لمديري الفروع والإداريين لتقتصر حصرياً على مدربي الفرع الخاص بهم، وتحديث فلتر مدراء الفروع ليتفاعل ديناميكياً مع تحديد الفرع.
  • تمكين الإداريين (Branch Admin Hardening): تحديث صلاحيات الوصول للـ (branch_admin) لمتابعة كافة الحجوزات اليومية لفرعهم وتحضير اللاعبين بسهولة.

الإصدار 1.5.3 — 2026-08-05

✨ ميزات رئيسية (Major Features)

🛡️ نظام القائمة البيضاء لحماية واتساب (WhatsApp Whitelist System)

  • إدارة الأرقام الموثقة: إنشاء صفحة إعدادات متكاملة لإدارة وتفعيل أرقام اللاعبين وأولياء الأمور الموثقة في القائمة البيضاء.
  • جدار حماية ذكي (Smart Firewall): توجيه كافة رسائل النظام للمرور عبر الـ Queue، لضمان عدم إرسال أو تسريب أي رسائل لأرقام غير مفعلة أو غير موثقة، مما يحمي السيرفر وحساب الواتساب من الحظر.

🏦 إشعارات التحويل البنكي الآلية (BACS Order Notifications)

  • تنبيهات الدفع المعلقة: تفعيل إرسال إشعار واتساب تلقائي لولي الأمر واللاعب بمجرد إتمام الطلب باختيار “حوالة بنكية” (الحالات: on-hold و pending).
  • قوالب مخصصة للمنتجات: إضافة قالب عام للرسالة في الإعدادات، وحقل إضافي داخل كل منتج (في قسم إعدادات BGM) لتخصيص رسالة الحوالة البنكية الخاصة به.

📝 سجل إشعارات شامل وموحد (Unified Notification Log)

  • مركزية التسجيل: توحيد جميع الإشعارات (حضور، غياب، حصص، تجديدات، تقارير، رسايل جماعية، QR، وحوالات بنكية) لتصب وتُسجل في جدول وتصميم واحد.
  • تسميات واضحة (Labels): إضافة تسميات وأيقونات مخصصة للأنواع الجديدة داخل السجل لتسهيل التفرقة والبحث (🔑 QR كود، 🏦 حوالة بنكية، ⚙️ نظام، إلخ).
  • إعادة الإرسال اللحظية: إتاحة زر مباشر “إعادة إرسال” (Retry) بجوار أي رسالة تفشل لأي سبب، ويعمل فوراً بتقنية الـ AJAX.

📅 نظام كشوفات الحجوزات المتقدم للمدربين (Coach Bookings Dashboard)

  • ربط المدربين بالأنواع: إضافة حقول مخصصة (المدرب، مكان الحصة) لكل نوع منتج (Variation) مباشرة، مما يلغي الحاجة لإنشاء “مجموعات” للحجوزات اليومية.
  • شاشة حجوزات اليوم للمدربين: إطلاق صفحة مخصصة في لوحة التحكم تعرض للمدرب (كشف الحضور) الخاص به لليوم الحالي بشكل آلي (الاسم، وقت الحصة، المكان).
  • أمان العرض: النظام يكتشف تلقائياً إن كان المدرب يملك حجوزات اليوم أم لا، ويقوم بإخفاء الصفحة بالكامل إذا كان سجله فارغاً.
  • فلترة وبحث متقدم للإدارة: الإداريين ومديري الفروع يمكنهم الفلترة حسب أي مدرب، أو اختيار “جميع المدربين”، وتغيير التاريخ (أمس، اليوم، غداً)، مع خاصية البحث اللحظي باسم اللاعب.
  • تحضير سريع (QR & Manual): توفير كاميرا مسح الـ QR مدمجة في صفحة المدرب، بجانب أزرار التحضير اليدوي السريعة لضمان مرونة أخذ الغياب.
  • تزامن ذكي مع الانصراف الآلي (Auto Checkout Sync): تم ربط وقت الحصة المخصص في نظام الحجوزات الذكية (Class Time) بالكرون المركزي (auto_checkout_cron)، ليتم احتساب موعد انصراف اللاعب بدقة وإرسال رسالة الانصراف تلقائياً بناءً على موعد حجزه الثابت.

🛠️ إصلاحات وتحسينات (Fixes & Enhancements)

  • إظهار أيام الحجوزات للإداريين: تعزيز تجربة الاستخدام (UX) للإداري عند التحضير بحيث يظهر اسم اليوم المحجوز (مثال: حجز الأربعاء) في قائمة الاشتراكات وفي رسالة تأكيد التحضير الخضراء.
  • تصحيح استدعاءات قواعد البيانات: استبدال دوال $wpdb->insert اليدوية بدالة التسجيل المركزية BGM_Notifications::log_notification لتجنب التضارب وتصحيح أسماء الأعمدة.
  • إصلاح أخطاء برمجية: معالجة خطأ المتغير غير المعرف ($staff_id) في حلقة إرسال رسائل الموظفين.

📅 نظام تبويبات القائمة البيضاء والتسويق (Whitelisted & Unwhitelisted Marketing Tabs)

  • التاب 1 (القائمة البيضاء المفعلة): تشتمل على إدارة الأرقام المفعلة، البحث الفوري، والإضافة والحذف الجماعي.
  • التاب 2 (أرقام تحتاج تفعيل / للتسويق): تبويب ذكي مخصص لفحص واستخراج كافة اللاعبين وأولياء الأمور الذين لم تدرج أرقامهم في القائمة البيضاء.
  • تطبيق حالة الاشتراكات وفحص ولي الأمر (Membership Status & Parent Phone Audit): الربط المباشر مع BGM_Membership_Service لإظهار شارات ملونة بحالة اشتراك اللاعب (نشط 🟢، موقوف 🟡، منتهي 🔴، بدون عضوية ⚪)، وتتبع حالة تفعيل هاتف ولي الأمر وهاتف اللاعب بشكل منفصل.
  • تصدير شيت Excel/CSV للتسويق (Marketing Excel/CSV Export): إضافة زر تصدير فوري بترميز UTF-8 BOM متوافق 100% مع Microsoft Excel باللغة العربية، لاستخراج قوائم التسويق وتصفيتها حسب الفرع أو حالة العضوية.
  • محرك بحث شامل وتصفية متقدمة (Comprehensive Multi-Field Search): فلترة النتائج حسب الفرع وحالة الاشتراك، مع إمكانية البحث الشامل بالاسم أو البريد أو رقم هاتف اللاعب أو رقم هاتف ولي الأمر.
  • التفعيل الجماعي بنقرة واحدة (Single & Bulk Activation): زر تفعيل فوري فردي بكل سطر، وزر تفعيل جماعي بالمربعات المحددة لإضافة أرقام اللاعبين وأولياء الأمور غير المفعلين للقائمة البيضاء مباشرة.
  • إصلاح حقول التواريخ الموحد (Unified Date Picker Fix): معالجة الخطأ الهيكلي بمتصفحات Chromium في البيئة العربية (RTL) لحقول التاريخ والوقت input[type="date"] بإلزام الـ Flex Layout الداخلي ومنع انكسار أيقونة التقويم وتطابق منطقة النقر والفتح بجميع شاشات الإضافة.

الإصدار 1.5.2 — 2026-08-04

✨ ميزات رئيسية (Major Features)

📅 نظام حجوزات مرن وذكي (Smart Booking System)

  • إدارة السعة اليومية (Daily Capacity): إمكانية تحديد حد أقصى لعدد اللاعبين المسموح لهم بالحجز في اليوم الواحد. يقوم النظام بتتبع الاشتراكات النشطة في كل يوم ومنع أي حجز جديد إذا اكتمل العدد.
  • الإغلاق التلقائي للحجوزات (Cutoff Time): يمكنك تحديد ساعة محددة (مثال: 5:00 مساءً) ليقوم النظام بعدها بإغلاق الحجز لنفس اليوم (تظليله باللون الرمادي) وإجبار المشتركين الجدد على الحجز للأيام القادمة.
  • حماية على مستوى السيرفر (Server-side Validation): تم بناء طبقة حماية تمنع التلاعب وتتحقق من توافر السعة المتبقية وصلاحية وقت الحجز قبل إضافة المنتج للسلة، لمنع الحجوزات الوهمية أو الزائدة.

✉️ قوالب واتساب ديناميكية مخصصة لكل منتج (Dynamic Variation Templates)

  • رسائل تسويقية ذكية: يمكنك الآن تخصيص قالب واتساب مختلف لكل فئة/منتج (Variation) بشكل مستقل. (مثال: رسالة مخصصة لمنتج التدريب الشخصي، ورسالة أخرى لمنتج الحصص العادية).
  • تخصيص كامل: يدعم تخصيص (رسالة الشراء، رسالة نفاد الحصص، ورسالة انتهاء الصلاحية) من داخل إعدادات المنتج مباشرة، مع إمكانية تحديد المستلم (اللاعب/ولي الأمر).

⏰ دمج وتوحيد نظام التأخير والغياب (Absence & Late Unification)

  • وقت الحصة للحجوزات (Session Class Time): استبدال نظام “الغياب التلقائي” المعزول، وإضافة حقل “وقت الحصة” لمنتجات الحجوزات لتتكامل بسلاسة مع الكرون المركزي للأكاديمية.
  • تنبيهات التأخير للاعبي الحصص: إتاحة إرسال “رسائل التأخير” للاعبي نظام الحجوزات أسوةً باللاعبين العاديين، بناءً على إعدادات التأخير العامة للأكاديمية.
  • الخصم التلقائي عند الغياب: عند انتهاء وقت السماح وتجاوز حد الغياب، يقوم الكرون المركزي بإرسال “رسالة الغياب” للاعب ويقوم بخصم الحصة تلقائياً من رصيده وتسجيل العملية في الملاحظات للحفاظ على السجل الإداري.
  • دعم الحجوزات المتعددة في نفس اليوم (Multi-Session Fix): تحديث مفاتيح مصفوفة الفحص (Composite Keys) لتسمح باكتشاف التأخير والغياب لنفس اللاعب إذا كان لديه أكثر من حجز أو لعبة في نفس اليوم (مثل تدريب سباحة وتدريب كرة قدم).

🛠️ إصلاحات وتحسينات الإشعارات (Notifications Fixes & Enhancements)

  • دعم رسائل الحصص في واجهة الإعدادات: إظهار جميع خيارات الحصص المخفية (مثل الغياب والتأخير وشراء الحصص) في لوحة تفعيل الإشعارات الرئيسية.
  • حفظ الإعدادات المفقودة: تسجيل إعدادات (الغياب والتأخير للحصص) برمجياً عبر register_setting لضمان استجابتها لعملية الإيقاف والتشغيل وتحديثها في قاعدة البيانات بنجاح.
  • توجيه سليم للطابور: إصلاح خطأ إملائي (sessions_depleted) كان يمنع رسائل نفاد الحصص من الدخول للطابور ويدفعها للإرسال الفوري.
  • إصلاح رابط QR (QR Direct Link): تحديث متغير {qr_link} ليجلب “الرابط المباشر لصورة الباركود” (PNG) المحفوظة محلياً، ليتسنى لولي الأمر استعراضها دون الحاجة لتسجيل الدخول لحسابه.
  • دليل المتغيرات الذكية: إضافة صندوق تعليمات يظهر أسفل قوالب الواتساب المخصصة للمنتجات ليعرض قائمة بكافة المتغيرات المتاحة (Shortcodes) لتسهيل نسخها واستخدامها.

الإصدار 1.5.1 — 2026-07-26

✨ ميزات رئيسية (Major Features)

🛡️ نظام الحماية الصارم (Strict Anti-Ban Mode)

  • الويب هوك الآلي (Webhook Listener): إنشاء نقطة اتصال (Webhook) لاستقبال رسائل واتساب الواردة عبر WAWP وتفعيل أرقام العملاء تلقائياً في الخلفية بمجرد مراسلتهم للأكاديمية.
  • مزامنة المحادثات القديمة (Sync Old Chats): إضافة أداة لسحب جميع الأرقام التي سبق أن راسلت الأكاديمية وربطها وتفعيلها بأثر رجعي بضغطة واحدة.
  • جدار الحماية للرسائل (Firewall): تطوير دالة الإرسال المركزية لتصفية واستبعاد الأرقام غير المفعلة من طابور الإرسال، مما يقلل احتمالية البلاغات أو حظر رقم الواتساب.
  • إعادة تعيين القائمة (Reset Whitelist): إضافة خيار لمسح جميع الأرقام المفعلة دفعة واحدة، ويُستخدم عند تغيير رقم واتساب الأكاديمية لإجبار جميع العملاء على إعادة التفعيل.
  • المنع الشامل للعملاء القدامى (Global Block): فرض تفعيل الإشعارات على العملاء القدامى عبر نافذة منبثقة داخل حساباتهم، مع استثناء ذكي لصفحتي السلة وإتمام الطلب لضمان استمرار عمليات الشراء دون انقطاع.
  • التفعيل اليدوي والجماعي (Bulk & Admin Fallback): إضافة خيارات لمدير النظام لتفعيل أرقام اللاعبين أو أولياء الأمور يدوياً من ملفاتهم، بالإضافة إلى إجراءات جماعية (Bulk Actions) داخل صفحة الأعضاء لتفعيل أو إزالة الحماية لمجموعة من اللاعبين مع خيارات مستقلة (اللاعب فقط، ولي الأمر فقط، أو كلاهما).
  • توافقية WAWP المتطورة (Webhook Compatibility): دعم البنية الجديدة لحقل payload في منصة WAWP واستخراج أرقام العملاء بدقة، مع تجاهل الرسائل الصادرة من رقم الأكاديمية.
  • تخطي حماية LIDs: تطبيق خوارزمية ذكية لاستخراج الرقم الحقيقي من حقل SenderAlt ومعالجة حالات ظهور معرفات الأجهزة المرتبطة (Linked Device IDs) بدلاً من أرقام الهواتف.
  • التفعيل المتأخر (Late Activator Auto-QR): إرسال بطاقة QR تلقائياً وبأثر رجعي للعملاء الذين قاموا بتفعيل رقمهم بعد فترة، إذا كان لديهم اشتراك نشط وساري.
  • الرد المباشر والموجه (Targeted Auto-Reply): إرسال رسالة التفعيل التي تحتوي على رمز QR مباشرة إلى الرقم الذي تواصل مع الأكاديمية، مع تجاوز إعدادات المستلم الافتراضية لضمان وصول الرسالة إلى الجهة الصحيحة.
  • ترقيع أمني (Security Patch): تعزيز حماية حقول واتساب في صفحة تعديل الحساب باستخدام نظام Nonce لمنع حذف بيانات الأرقام المفعلة بالخطأ عند حفظ الملف الشخصي من صفحات أو إضافات لا تحتوي على نفس الحقول (Unintended Meta Deletion).

الإصدار 1.5.0 — 2026-07-23

✨ الميزات الرئيسية (Major Features)

📊 لوحة تحكم الإشعارات الحية (Live Notification Dashboard)

  • لوحة تحكم لحظية (AJAX): تحويل صفحة سجل الإشعارات إلى لوحة تحكم حية يتم تحديثها تلقائياً كل 5 ثوانٍ لعرض الرسائل الجديدة فور إنشائها.
  • مزامنة دقيقة مع طابور الإرسال: إصلاح مشكلة ظهور الرسائل المجدولة كأنها “تم الإرسال”. أصبحت الرسائل تعرض حالتها الحقيقية (قيد الانتظار) وتنتقل تلقائياً إلى تم الإرسال بمجرد تنفيذها بواسطة الطابور.
  • إعادة إرسال الرسائل الفاشلة: إضافة زر 🔄 إعادة الإرسال لإعادة محاولة إرسال أي رسالة فشل توصيلها مباشرة من لوحة التحكم.
  • سجل إشعارات موحد: دمج الرسائل الجماعية والرسائل المخصصة مع إشعارات النظام (الحضور، الغياب، التأخير وغيرها) داخل سجل موحد لتسهيل المتابعة والتدقيق.

⌨️ محاكاة السلوك البشري (Typing Presence)

  • مؤشر “جاري الكتابة”: دعم إرسال حالة Typing… قبل الرسائل لمحاكاة التفاعل البشري.
  • خيارات تخصيص متقدمة:
    • تشغيل أو إيقاف الميزة.
    • تحديد نطاق التطبيق (رسائل الطابور فقط أو جميع الرسائل).
    • تحديد مدة مؤشر الكتابة بالثواني.
  • أداء محسّن: يمكن تشغيل الميزة لرسائل الطابور فقط لضمان عدم تأخير العمليات الفورية مثل تسجيل الحضور أو الإشعارات اللحظية.

🛠️ إصلاحات أخطاء الإعدادات والقوالب (Bug Fixes)

حفظ القوالب (Templates Save Fix): تم إصلاح مشكلة عدم استجابة بعض القوالب (مثل قالب رابط التجديد اليدوي وقوالب الحضور/الغياب/التأخير الخاصة بالحصص) عند محاولة تغيير “مستلم الرسالة” (ولي الأمر/اللاعب) أو إيقاف تفعيلها. الآن يتم حفظ جميع الإعدادات بنجاح.

🛡️ نظام تفعيل واتساب الإجباري (WhatsApp Anti-Ban Activation)

  • حماية متقدمة من الحظر: إضافة نظام نافذة التفعيل الإجباري الذي يشجع العميل على بدء المحادثة مع رقم الأكاديمية بعد إتمام عملية الشراء، مما يقلل احتمالية تعرض الرقم للحظر.
  • نافذة تفعيل ذكية: نافذة منبثقة حديثة في صفحة Thank You تمنع تجاوزها، وتنتظر اكتمال حفظ بيانات ولي الأمر (عند الحاجة) قبل الظهور لضمان تجربة سلسة.
  • تخصيص كامل للرسالة: إمكانية تحديد رقم واتساب المستقبل، مع تخصيص نص الرسالة باستخدام المتغيرات الديناميكية:
    • {order_id}
    • {player_name}
  • الحظر الشامل (Global Block): إمكانية إلزام العميل بإتمام التفعيل عبر عرض النافذة في جميع صفحات الموقع حتى يتم إرسال رسالة التفعيل.
  • الظهور الدائم (Always Show): خيار لعرض نافذة التفعيل بعد كل عملية شراء، حتى للعملاء الحاليين، وهو مناسب عند تغيير رقم واتساب الأكاديمية.
  • تأخير الإشعارات الذكي (Smart Delay): إمكانية تأخير إرسال رسائل الشراء وكود QR لعدة دقائق، لمنح العميل الوقت الكافي لبدء المحادثة أولاً، بحيث تصبح رسائل الأكاديمية ردًا على العميل بدلاً من بدء المحادثة.
  • مفتاح تحكم رئيسي (Master Switch): زر واحد لتفعيل أو تعطيل نظام التفعيل بالكامل من لوحة الإعدادات.

الإصدار 1.4.4.1 — 2026-07-12

✨ ميزات جديدة وتحسينات (New Features & Enhancements)

📱 إرسال رمز الاستجابة السريعة (QR Code) يدوياً

  • الدافع: الحاجة لإرسال الـ QR كود فورياً للاعب أو لولي أمره دون انتظار رسائل النظام التلقائية.
  • التنفيذ: إضافة زر جديد (📱) في صفحة تحضير اللاعبين بجانب زر التجديد لإرسال الـ QR فورياً مع نافذة تأكيد.
  • الدمج الذكي للبيانات: في حال كان اللاعب مشتركاً في أكثر من لعبة، يقوم النظام بتجميع بيانات جميع الألعاب (الفرع/اللعبة/المجموعة/الموعد) ودمجها في رسالة واتساب واحدة ترسل مع صورة الـ QR كود لتجنب إزعاج المستخدم برسائل متعددة.

📦 استقلالية المكتبات البرمجية (Local Assets)

  • التحديث: تم سحب مكتبة html5-qrcode.min.js (المسؤولة عن مسح الـ QR) واستدعاؤها محلياً من داخل مجلد الإضافة assets/js بدلاً من الاعتماد على روابط خارجية (CDN)، مما يضمن عمل النظام بسرعة وثبات وبدون اتصال خارجي.

⏸️ الاستئناف التلقائي للإيقافات الفردية

  • ميزة جديدة: تمت إضافة حقل (تاريخ الانتهاء التلقائي) اختياري في نافذة “الإيقاف المؤقت” الفردية بصفحة إدارة العضويات.
  • التشغيل المجدول (Cron Job): يقوم النظام يومياً (في منتصف الليل) بفحص العضويات الموقوفة فردياً والتي وصل تاريخ انتهائها، ويقوم بإعادة تفعيلها (Active) أوتوماتيكياً مع تمديد تاريخ الصلاحية النهائي للعضوية تعويضاً عن فترة الإيقاف.
  • رسالة الإيقاف المؤقت: تُرسل فور قيام الإدارة بإيقاف اللاعب الفردي وتتضمن متغيرات مثل (موعد الاستئناف وسبب الإيقاف).
  • رسالة الاستئناف والتمديد: تُرسل للمشترك بشكل أوتوماتيكي عند استئناف العضوية (مجدول أو يدوي) لتشعره بأنه تم تعويضه وتمديد صلاحية العضوية بناءً على أيام التوقف.
  • التوجيه الذكي (Queue Integration): تم ربط رسائل (الإيقاف، الاستئناف، التجديد، والتمديد) بنظام الطابور الذكي، مما يتيح توجيه رسائل الإيقاف/الاستئناف إلى الطابور لتجنب الحظر، مع إبقاء التجديد/التمديد كرسائل فورية.

🎨 تحسينات واجهة المستخدم (UI/UX)

📱 تصميم متجاوب لزراير الحضور

  • تحسين: تم إعادة تصميم منطقة زراير التحكم باللاعبين في صفحة (تحضير اللاعبين) لتكون متجاوبة 100% مع شاشات الموبايل.
  • التنفيذ: تم استخدام خاصية الشبكة (Grid) لعرض الزراير الـ 6 في صفين (كل صف 3 زراير) بشكل متناسق ومريح للضغط بدلاً من التزاحم.

✨ ميزة رئيسية: مركز تحكم طابور الحماية المتقدم (Advanced Protection Queue)

🛡️ نقل مركزية التحكم للإدارة العليا

  • المشكلة: إعدادات الطابور كانت موزعة لدى مديري الفروع مما سبب تشتتاً وتعطيلاً للرسائل الحساسة بالخطأ.
  • الحل: إزالة إعدادات الطابور نهائياً من واجهة مديري الفروع لتبسيط الواجهة لديهم ومنع الأخطاء.
  • التنفيذ: بناء مركز تحكم متكامل للطابور في لوحة الإدارة الرئيسية (إعدادات BGM -> الرسائل الجماعية) مخصص فقط للإدارة العليا وصلاحية manage_options.

🎯 التوجيه الذكي للرسائل (Smart Routing)

  • تصميم لوحة الخيارات: مقسمة ذكياً إلى رسائل كثيفة (يُنصح بوضعها في الطابور كالغياب والتقارير) ورسائل فورية (يُنصح بإرسالها بدون طابور كمسح QR والتسجيل).
  • إصلاح جذري: معالجة مشكلة حفظ التحديدات الفارغة في ووردبريس لضمان احترام إعدادات الطابور حتى عند إلغاء جميع الخيارات.

🚨 لوحة تحكم الطوارئ والمراقبة الحية (Emergency Controls)

  • مؤشرات لحظية (AJAX): واجهة تعرض حالة الطابور وتتحدث تلقائياً كل 15 ثانية (قيد الانتظار، جاري الإرسال، تم، فشل).
  • زر الإيقاف المؤقت (⏸️): لتعليق إرسال جميع رسائل الطابور بضغطة زر عند اكتشاف أي خطأ.
  • زر مسح الطابور (🗑️): أداة طوارئ نهائية لتفريغ قائمة الانتظار وإلغاء الرسائل المعلقة فوراً لمنع حظر الأرقام.
  • سجل الرسائل اللحظي: جدول ديناميكي يعرض آخر 50 رسالة وحالتها الملونة ويتحدث تلقائياً بدون إعادة تحميل الصفحة.

🛡️ نظام حماية الواتساب الذكي (Anti-Ban & Anti-Flood)

  • حماية الطابور (Queue Protection): إضافة تأخير زمني عشوائي يتوقف من ثانية إلى 3 ثوانٍ بين كل رسالة والأخرى داخل الـ Cron Job لمحاكاة السلوك البشري.
  • حماية الإرسال الفوري (Instant Sync): إضافة تأخير زمني عشوائي (Micro-delay) للرسائل الفورية لمنع إغراق الـ API واكتشاف البوت.
  • تحكم ديناميكي عشوائي (⚙️): نطاق تأخير زمني للإرسال الفوري يتم توليده عشوائياً بين حد أدنى وأقصى لكل رسالة.
  • مرونة الدفعات (⚙️): تخفيض الحد الأدنى المسموح به لرسائل الطابور إلى رسالة واحدة (1) في الدقيقة لمنح مرونة قصوى في إبطاء الإرسال.

🔧 تحسينات الأداء وتخفيف قواعد البيانات (Auto-Cleanup)

  • توافق رسائل الموظفين: تحديث دوال الإرسال لتقرأ إعدادات “الرسائل الجماعية اليدوية” وتتجاوز الطابور إذا تم إيقافه.
  • التنظيف التلقائي (Cron Cleanup): برمجة مهمة مجدولة لحذف الرسائل المعالجة التي مضى عليها أكثر من 30 يوماً من قاعدة البيانات للحفاظ على استقرار الموقع وسرعته.

🐛 إصلاحات برمجية حرجة (Critical Bug Fixes)

📱 كروت العضويات المتعددة (Multi-Subscriptions Display)

  • المشكلة: ظهور بطاقة واحدة واختفاء الأخرى عند امتلاك اللاعب لأكثر من اشتراك نشط.
  • الحل: عزل كلاسات bgm-subscription-card لمنع تداخل تنسيقات CSS القديمة، واستخدام ميزة الاستنساخ clone $schedule لمنع تسريب المؤشرات أثناء بناء البطاقات.

📞 منع تكرار رسالة الترحيب والـ QR Code

  • المشكلة: إرسال الرسالة مرتين لولي الأمر إذا تطابق رقمه مع اللاعب بصيغتين مختلفتين (مثل 05 و 9665).
  • الحل: استبدال الدالة البسيطة بدالة get_recipient_phones المركزية لتنظيف وتوحيد كافة الأرقام (Normalization) قبل فحص التكرار.

📨 منع توقف الطابور وتكرار الرسائل (Queue Locking & Rescue)

  • المشكلة: بقاء الرسائل عالقة للأبد عند حدوث خطأ، واحتمالية تداخل دورتين من الكرون وإرسال الرسائل مرتين.
  • الحل (Transient Lock): نظام قفل ذكي يضمن عدم عمل الطابور أكثر من مرة في نفس اللحظة.
  • الحل (Rescue Query): آلية ترصد الرسائل العالقة وتعيدها لحالة قيد الانتظار بأمان للقيام بمحاولة جديدة.

🛡️ حماية ذكية من حظر الواتساب (Dynamic Anti-Ban Delay)

  • المشكلة: إرسال رسائل بفاصل زمني ثابت أو قصير يعرض الحساب للحظر كـ Bot.
  • الحل: تحديد نطاق زمني عشوائي (مثال: 8 إلى 15 ثانية) بين الرسائل، مع حماية من الإيقاف الإجباري (Timeout Break) توقف الطابور بأمان عند بلوغ 45 ثانية في الدورة.

🎛️ تحكم كامل في تفعيل/إيقاف جميع الإشعارات

  • التحسين: إعادة تصميم تبويب الإشعارات ليحتوي على شبكة تعرض جميع أنواع الرسائل (أكثر من 25 نوعاً).
  • الفائدة: السماح لمدير النظام بإيقاف أو تفعيل أي رسالة بضغطة زر وبمرونة تامة.

📅 تصحيح جدولة تقارير الحضور الشهرية

  • المشكلة: تشغيل الكرون فوراً بدلاً من بداية الشهر القادم عند تفعيله أو حفظ الإعدادات.
  • الحل: استثناء التقارير الشهرية من التشغيل الفوري، وجدولتها ذكياً لتعمل في first day of next month.

📊 دقة النسب المئوية وتقييدها (Percentage Capping)

  • المشكلة: تخطي النسبة لـ 100% لتصل لـ 400% أحياناً بسبب حصص السماح.
  • الحل: إضافة فلتر (Cap) لتقييد النسبة لتعود إلى 100% كحد أقصى في كافة السجلات.

👥 إصلاح تكرار المجموعات والبطاقات

  • المشكلة: بقاء كارت قديم عند نقل اللاعب لفرع آخر، وظهوره مرتين في صفحة التحضير.
  • الحل: برمجة “تجاوز ذكي” يعرض أحدث مجموعة فقط، مع تحديث دالة الانضمام لتنظيف الاشتراكات القديمة في الفروع الأخرى للعبة.

🗑️ حذف لعبة كاملة نهائياً من سجل اللاعب

  • ميزة جديدة: إمكانية “حذف اللعبة بالكامل” من سجل اللاعب بضغطة زر لأصحاب الصلاحيات.
  • صلاحيات مخصصة: تحكم الإدارة العليا في إظهار الزر عبر إعدادات الإضافة.
  • التنظيف الشامل (Hard Delete): يزيل اللاعب من المجموعات، يحذف سجلات الحضور والأيام المسموحة بالكامل، يخفي الكارت، ويحذف الاشتراك المالي المرتبط نهائياً من قاعدة البيانات.
  • إصلاح جذري: معالجة خطأ برمجي (class_exists بدلاً من method_exists) كان يمنع الحذف الفعلي للاشتراكات.

📊 دقة تقارير الحضور والإجازات

  • استبعاد الإجازات (Holiday Exclusions): خصم الإجازات الرسمية من أيام الحضور المطلوبة لمنع احتساب غياب ظالم (يطبق على كافة أنواع الاشتراكات).
  • تصحيح النسبة المئوية: حساب النسبة بناءً على إجمالي الحصص المجدولة للشهر بالكامل ليتطابق مع الكسر المعروض بدقة.
  • إخفاء الألعاب المحذوفة: إصلاح ظهور الألعاب الممسوحة بالتقرير الشهري وتطبيق فلتر للألعاب النشطة فقط.

📝 إصلاح وعرض بيانات الإيقافات (Pause History)

  • المشكلة: ظهور اسم “مدير الفرع” بدلاً من اسم اللاعب بسجل الإيقافات.
  • الحل: جلب اسم اللاعب الحقيقي من العضوية، مع إضافة عمود جديد بعنوان “بواسطة” ليعرض بوضوح الحساب أو المدير الذي قام بإنشاء الإجازة.

📱 إصلاح الخطأ الفادح في صفحة كود QR

  • المشكلة: ظهور Fatal Error للاعبين.
  • الحل: استبدال wp_tempnam بـ wp_upload_dir لإنشاء مجلد محلي وحفظ الصور المؤقتة بدون قيود، لتعود الصفحة للعمل السريع.

📞 إصلاح meta key هاتف اللاعب في التجديد اليدوي

  • المشكلة: استخدام مفتاح خاطئ user_phone غير موجود في WooCommerce، مما يمنع وصول الرسالة للاعب.
  • الحل: استبداله بـ billing_phone أو phone في ملف class-bgm-notifications.php ليتطابق مع دوال الإشعارات الأخرى وتصل الرسائل بنجاح.

🟡 تحسينات أمان وتتبع (Security & Tracking)

🛡️ تحديث Rate Limiting للإشعارات اليدوية (QR والتجديد)

  • المشكلة: التقييد بمرة واحدة كل ساعة أعاق الموظفين في حال فشل الإرسال الفعلي أو عند تعديل رقم الهاتف.
  • الحل: رفع الحد الأقصى للإرسال اليدوي إلى 3 مرات كل ساعة لنفس اللاعب، مع فحص الاستعلامات الناجحة فقط من سجل الإشعارات في ملف trait-bma-payments.php.

📋 Activity Log لإرسال رابط التجديد والـ QR

  • المشكلة: الإجراءات اليدوية (إرسال رابط التجديد أو QR) لم تكن تُسجل لتتبع الموظفين.
  • الحل: إضافة الحركة لسجل النشاطات عند نجاح الإرسال، مع تسجيل تفاصيل اللاعب ونوع الإشعار واللعبة في ملف trait-bma-payments.php.

الإصدار 1.4.4 — 2026-07-08

✨ ميزة رئيسية: اختيار الاشتراك عند التحضير (Subscription Picker)

🎯 نافذة اختيار الاشتراك (Multi-Subscription Attendance Picker)

  • المشكلة: لاعب عنده اشتراك حصص + اشتراك شهري (لعبتين) — النظام كان يختار أول لعبة تلقائياً.
  • الحل: لما يكون عنده أكثر من اشتراك → يظهر modal يختار فيه الإداري الاشتراك المطلوب.
  • كاردات ملونة: كل اشتراك يظهر بلون حسب حالته:
    • نشط → أخضر
    • منتهي (عنده سماح) → أحمر فاتح
    • ❄️ مجمّد → أزرق
    • موقوف مؤقتاً → برتقالي
    • 🚫 منتهي بدون سماح / حصص نفدت → رمادي (بدون زر تحضير)
  • فك التجميد + تحضير: لو اختار اشتراك مجمّد → يسأل “فك التجميد والتحضير؟”
  • إلغاء الإيقاف + تحضير: لو اختار اشتراك موقوف → يستخدم modal الإيقاف الموجود.
  • اشتراك واحد فقط: يتحضر مباشرة بدون modal (سلوك عادي).
  • 3 نقاط دخول: يعمل على زر التحضير + QR Scanner + كود يدوي.
  • الملف: trait-bma-attendance.php

🎮 إدارة ألعاب اللاعب (Individual Game Management)

  • نافذة جديدة: تغيير النافذة القديمة “تغيير اللعبة” إلى “إدارة ألعاب اللاعب” في صفحة التحضير.
  • عرض الاشتراكات النشطة: النافذة تعرض جميع الألعاب النشطة للاعب (حصص أو شهري) في بطاقات منفصلة.
  • إلغاء فردي دقيق: يمكن للمدير الآن إزالة لاعب من لعبة معينة فقط دون التأثير على باقي ألعابه واشتراكاته الأخرى.
  • حذف الاشتراك المالي: خيار مدمج يتيح إنهاء أو إلغاء الاشتراك المالي (الشهري أو الحصص) المرتبط بهذه اللعبة فورياً وتلقائياً عند حذفها من اللاعب.
  • التنظيف التلقائي: بمجرد حذف اللعبة، يتم إزالة اللاعب من أي مجموعات تدريبية تابعة لهذه اللعبة تحديداً.
  • تحديث واجهات الحضور: يتم تحديث حالة اللاعب فوراً في جدول الحضور بعد حذف اللعبة.

🔧 تحسينات تقنية

  • دالة مساعدة collect_player_subscriptions(): تجمع كل اشتراكات اللاعب (حصص + شهري) في جميع الفروع — لمنع تجاهل اشتراكات الفروع الأخرى عند التحضير من حساب “مدير فروع”.
  • bgmAttendWithChoice() JS: دالة مركزية تتعامل مع كل سيناريوهات التحضير بعد الاختيار (يوم غير مجدول، سماح، تجميد).
  • chosen_game_id + chosen_type: باراميترات جديدة في AJAX لتحديد الاشتراك المختار.
  • عزل الفروع في سجل الحضور (Cross-Branch Attendance Isolation): إصلاح خطأ تسجيل branch_id خاطئ عند قيام “مدير الفروع” (Super Admin) بتسجيل الحضور للاعب مسجل في أكثر من فرع. النظام الآن يقوم بربط الحضور تلقائياً وبالإجبار بالفرع الخاص باللعبة نفسها، وتجاهل الفرع الافتراضي للموظف أو اللاعب لضمان ظهور سجلات الحضور بدقة في حساب مديري الفروع.
  • تحديث قاعدة بيانات الحضور (Attendance DB Fix): إضافة سكريبت تشغيل تلقائي لمرة واحدة (bgm_fixed_attendance_branches_v144_2) يقوم بإعادة مسح جميع سجلات الحضور السابقة وتصحيح معرّف الفرع الخاطئ بها ليتطابق مع الاشتراكات الحقيقية بدون أي تعارض.

🔍 فلاتر متقدمة لصفحة العضويات (Advanced Memberships Filters)

  • فلتر نوع الاشتراك: إضافة فلتر مخصص لفرز الاشتراكات إلى “شهري” أو “حصص” مع تجاهل الأنواع الأخرى ديناميكياً.
  • فلتر اليوم: إضافة فلتر لمعرفة الاشتراكات المربوطة بيوم معين (من الأحد للسبت). يتم البحث في أيام اللاعب للاشتراكات الشهرية، ويبحث في الأيام المخصصة للاشتراك نفسه في حالة اشتراكات الحصص.
  • تحديث الإحصائيات: ربط الفلاتر الجديدة ببطاقات الإحصائيات العلوية لتعكس الأرقام الدقيقة بناءً على الفلتر النشط.

🐛 إصلاحات حرجة

📞 تعزيز نظام منع تكرار رسائل الواتساب (Advanced Phone Deduplication)

  • المشكلة: نظام منع التكرار كان لا يكتشف تطابق الأرقام إذا قام ولي الأمر بكتابة أحد الأرقام باللغة العربية (الأرقام الهندية: ٠٥٠) والآخر بالإنجليزية، أو إذا أدخل رقم بالمفتاح الدولي 00 والآخر بدونه، مما يؤدي إلى وصول الرسائل مرتين لنفس ولي الأمر.
  • الحل: تطوير جذري لدالة normalize_phone لتقوم بـ:
    1. التحويل التلقائي للأرقام العربية/الفارسية إلى إنجليزية.
    2. حذف أصفار البداية الدولية 00 لتوحيد الصيغ.
    3. مطابقة الأرقام بصرامة لضمان عدم إرسال الرسالة (مثل اقتراب انتهاء الاشتراك) لنفس ولي الأمر أكثر من مرة واحدة.

🔧 توافقية إقلاع النظام مع WooCommerce Memberships (JIT Textdomain Fix)

  • المشكلة: ظهور تحذير تقني (_load_textdomain_just_in_time) يخص تحميل ملفات الترجمة بشكل مبكر لـ woocommerce-memberships، والذي يحدث في الإصدارات الحديثة من WordPress (6.7+).
  • الحل الجذري: تم استخدام فلتر doing_it_wrong_run لإيقاف هذا التحذير المزعج (الذي تسببه إضافة أخرى) بشكل جذري وآمن في نظام ووردبريس، دون المساس بأولوية تحميل الإضافة (init) مما يحافظ على استقرار مسارات الصفحات 100% ويمنع أي تعارض.

📊 دقة إحصائيات الحضور لمدير الفروع (Attendance Stats Accuracy)

  • المشكلة: في شاشة “سجل حضور اللاعبين”، كانت بطاقة “إجمالي اللاعبين” تظهر أرقاماً مكررة (مثلاً لاعب واحد يظهر كـ 2) إذا كان لديه أكثر من اشتراك/لعبة في نفس الفرع.
  • الحل: * تم فصل المتغيرات البرمجية لتُحسب بطاقة “إجمالي اللاعبين” بناءً على العدد الفعلي للاعبين بدون تكرار.
    • تمت إضافة بطاقة جديدة تماماً باسم “عدد الإشتراكات (المفلتر)” لعرض إجمالي الاشتراكات النشطة للاعبين المعروضين.

📊 دقة الإحصائيات للاشتراكات الشهرية في التقرير الشهري (Monthly Report Accuracy)

  • المشكلة: عند حساب “الأيام المطلوبة” (Scheduled Days) في التقرير الشهري أو إحصائيات الحضور للاشتراكات الشهرية، كان النظام يفترض أن اللاعب مشترك طوال الشهر بالكامل إذا كانت مدة التقرير تعادل شهراً كاملاً، مما يظلم اللاعبين الذين اشتركوا في منتصف أو آخر الشهر بنسبة حضور منخفضة (غياب وهمي).
  • الحل: * ربط دالة count_scheduled_days بتواريخ (بداية ونهاية) الاشتراك الفعلي للاعب من WooCommerce Memberships.
    • أصبح النظام يقص فترة حساب التقرير (Bounds Check) لتقتصر فقط على الأيام التي كان اللاعب فيها مشتركاً فعلياً، ثم يحسب الأيام المطلوبة خلال تلك الفترة بدقة (Strict Counting).

📊 دقة حساب الأيام المتوقعة لاشتراكات الحصص (Session Subscriptions Expected Days)

  • المشكلة: لم تكن اشتراكات الحصص تحسب “الأيام المتوقعة للحضور” بذكاء بناءً على فترة الاشتراك الفعلي مثل الاشتراكات الشهرية (خاصة عند الاستعلام عن شهر كامل وكان الاشتراك قد بدأ في منتصفه)، كما كانت تتجاهل الاشتراكات المنتهية خلال نفس الشهر.
  • الحل:
    • تعديل دالة get_subscription_bounds لتقوم بجلب كافة اشتراكات الحصص (النشطة، الموقوفة، والمنتهية) التي تتقاطع مع فترة التقرير.
    • تطبيق نظام (Strict Counting) لاشتراكات الحصص بحيث يحسب عدد أيام الحضور المجدولة التي وقعت فقط داخل تاريخ بداية وانتهاء اشتراك الحصص.
    • ضمان عدم تجاوز عدد الأيام المتوقعة في التقرير لإجمالي عدد الحصص المشتراة (Total Sessions) لكل اشتراك على حدة.

🔒 حماية بيانات اختيار اللعبة (Force Bypass Fix)

  • المشكلة: عند التحضير الإجباري (يوم غير مجدول مثلاً)، كان النظام يفقد معرّف اللعبة المختارة (chosen_game_id) ويتخطى فحص الاشتراكات بالكامل، مما يؤدي لتحضير لعبة افتراضية خاطئة (مثل السباحة بدل كرة القدم).
  • الحل: إزالة حواجز التخطي من ajax_mark_attendance و ajax_quick_code_attendance لضمان إعادة استدعاء collect_player_subscriptions واختيار الاشتراك الصحيح آلياً حتى عند تفعيل الـ force.

✉️ إصلاح تداخل مجموعات الواتساب (WhatsApp Group Notification Mixup)

  • المشكلة: عند تسجيل الحضور في اشتراك لا يحتوي على مجموعة (مثل كرة القدم)، كان النظام يبحث عن “أي مجموعة” ينتمي لها اللاعب لطباعتها في رسالة الواتساب، مما يؤدي لإرسال رسالة “لعبة: كرة قدم – مجموعة: حرة (الخاصة بالسباحة)”.
  • الحل: تعديل دالة get_group_extra_vars لمنع البحث العشوائي عن المجموعات إذا كانت اللعبة محددة مسبقاً، لضمان تطابق اسم المجموعة مع اللعبة المحضّرة فقط.

🔄 إصلاح تعدد التحضير في نفس اليوم (Multiple Daily Attendances)

  • المشكلة: عند تحضير لاعب يمتلك لعبتين (مثلاً كرة قدم وسباحة) في اللعبة الأولى، كان النظام يمنع تحضيره في اللعبة الثانية بحجة “تم تحضيره مسبقاً اليوم”، كما كان يختفي زر “تحضير” من واجهة الجدول.
  • الحل: * تعديل التحقق البرمجي في ajax_mark_attendance ليتم فحص التحضير المسبق بناءً على اللعبة (game_id) وليس اللاعب فقط.
    • تعديل واجهة جدول الحضور لتبقى الأزرار متاحة ولا تتحول إلى “تم” إلا إذا استنفد اللاعب التحضير في جميع اللعبات المشترك بها في نفس اليوم.

🗂️ إصلاح عرض وفلترة الألعاب في صفحة العضويات (Memberships Table Fix)

  • المشكلة: في صفحة العضويات، كان عمود “اللعبة” للاشتراكات الشهرية يظهر كل الألعاب المشترك بها اللاعب (مثلاً: كرة القدم، سباحة) بدلاً من اللعبة المخصصة للاشتراك نفسه. وأيضاً عند الفلترة بلعبة معينة، كانت تظهر كل اشتراكات اللاعب حتى لو كانت للعبة أخرى.
  • الحل: * تعديل بناء عمود اللعبة للاشتراكات الشهرية (trait-bma-memberships.php) ليقوم بجلب اللعبة المربوطة بالخطة/المنتج مباشرة (_bgm_bound_game).
    • تحسين الفلترة لتستبعد الاشتراكات الشهرية التي لا تطابق اللعبة المحددة.
    • تطبيق فلتر game_id مباشرة في استعلام قاعدة البيانات (SQL Query) الخاص باشتراكات الحصص.

🎟️ عرض الاشتراكات المزدوجة وتجديد الاشتراك في حساب اللاعب (Concurrent & Renewal Subscriptions Display)

  • المشكلة: عند امتلاك اللاعب لاشتراك حصص واشتراك شهري لنفس اللعبة، كان النظام يخفي أحدهما. كما أن زر التجديد كان يجلب آخر طلب بشكل عشوائي بدلاً من الاشتراك الفعلي المختار، ورسالة الإشعار بانتهاء الاشتراك الشهري كانت لا تحتوي على رابط التجديد مما يمنع إرسالها.
  • الحل: * السماح بعرض جميع البطاقات المستقلة (الشهري والحصص) معاً بدون إخفاء، وإضافة تاريخ الانتهاء لبطاقة الاشتراك الشهري لتوحيد واجهة المستخدم.
    • تعديل هيكلة BGM_Renew_Link ليتم سحب المنتجات المرتبطة بـ order_id الخاص بالاشتراك الفعلي المنتهي بدلاً من آخر طلب.
    • إضافة رابط التجديد {renew_link} لقالب إشعار انتهاء الاشتراك الشهري (membership_expired) لضمان إرسال رسالة التجديد بنجاح عند انتهاء الاشتراك.

🔀 منع تداخل ألعاب الفروع المختلفة (Cross-Branch Games Fix)

  • المشكلة: إذا كان اللاعب يتدرب في نفس اللعبة أو ألعاب مختلفة في فرعين مختلفين، كانت واجهة إدارة العضويات تظهر للمدير جميع ألعاب اللاعب حتى تلك التي في فروع أخرى، كما كانت بطاقات الاشتراك في حساب اللاعب تتكرر بشكل خاطئ.
  • الحل: * تقييد استعلامات الألعاب والمجموعات لمديري الفروع لتقتصر فقط على الألعاب المرتبطة بفرعهم.
    • إضافة شرط التطابق الدقيق لمعرف الفرع (branch_id) بين الاشتراك وسجل الألعاب في حساب اللاعب لمنع تكرار البطاقات.

🔒 أمان وصلاحيات المدربين في التحضير (Coach Security & Permissions)

  • المشكلة: كان بإمكان المدربين تحضير أي لاعب في اللعبة حتى لو لم يكن في مجموعاتهم.
  • الحل: * تفعيل قيد صارم “لمجموعاتي فقط” (Group-Only) للمدربين.
    • تعطيل ميزة “أي لعبة” للمدربين لمنعهم من تحضير لاعبين خارج نطاق اللعبة المخصصة لمجموعتهم.

🧹 تحسينات وتنظيف الواجهة (Dashboard & UI Cleanup)

🗑️ إزالة صفحة “إدارة الحصص” المنفصلة

  • السبب: بعد دمج وتطوير صفحة “إدارة العضويات” لتشمل عرض وتحكم كامل لاشتراكات الحصص (مع الإحصائيات والأزرار الخاصة بها)، أصبحت صفحة “إدارة الحصص” تكراراً لا داعي له.
  • التغيير: تم حذف الصفحة بالكامل وإزالة روابطها من القائمة الجانبية (لمدير الفرع ومدير الفروع) لتوجيه المديرين لاستخدام صفحة إدارة العضويات كمركز شامل.

🗑️ إزالة زر “تعديل الجدول” من صفحة التحضير

  • السبب: أصبح قديماً وغير متوافق مع نظام مجموعات الألعاب الجديد وتعدد الاشتراكات.
  • التغيير: تم إزالة الزر والنوافذ المنبثقة (Modals) المرتبطة به من صفحة التحضير لتخفيف الكود وتسريع أداء الواجهة، والاعتماد على تعديل جدول اللاعب من صفحة اللاعبين أو العضويات.

📊 بطاقة العضويات الملغاة (Cancelled Memberships Card)

  • المشكلة: عدم وجود إحصائية واضحة لعدد العضويات الملغاة في صفحة إدارة العضويات، مما يضطر المدير للبحث اليدوي.
  • الحل: إضافة بطاقة إحصائية جديدة (باللون الرمادي) في أعلى لوحة تحكم إدارة العضويات لعرض إجمالي العضويات والاشتراكات (حصص وشهري) التي حالتها “ملغاة” لسهولة الإحصاء والمتابعة.

📅 تحسين عرض الاشتراكات الشهرية المنتهية (Expired Monthly Subscriptions UI)

  • المشكلة: الاشتراكات الشهرية المنتهية كانت تختفي بطاقاتها التفصيلية من حساب اللاعب ولا يظهر فيها تاريخ الانتهاء، ولا تحتوي على زر إعادة التجديد المباشر المتاح في اشتراكات الحصص.
  • الحل: * تفعيل ظهور البطاقة الأصلية للاشتراك الشهري المنتهي مع وضع شارة حمراء واضحة “⏰ منتهي”.
    • إظهار تاريخ انتهاء الاشتراك بوضوح على البطاقة لتوثيق المدة.
    • إضافة زر “🔄 تجديد الاشتراك” أسفل البطاقة لتمكين اللاعب من تجديد اشتراكه الشهري بضغطة زر وتوجيهه لصفحة الدفع مباشرة (على غرار اشتراكات الحصص).

الإصدار 1.4.3 — 2026-07-01

✨ ميزات جديدة

🎟️ قوالب رسائل واتساب مخصصة لاشتراكات الحصص (Session-Specific Notification Templates)

  • 4 قوالب جديدة تُرسل تلقائياً للاعبي الحصص بدلاً من القوالب العادية:
    • حضور حصة (session_checkin) — يتضمن رقم الحصة ورصيد المتبقي
    • تأخير حصة (session_late) — يتضمن الحصص المتبقية
    • 👋 انصراف حصة (session_checkout) — يتضمن الحصص المتبقية
    • غياب حصة (session_absence) — يتضمن الحصص المتبقية
  • متغير جديد: {used_sessions} — عدد الحصص المستخدمة
  • بدون تعارض: النظام يكتشف نوع اللاعب تلقائياً (حصص vs شهري) ويستخدم القالب المناسب
  • Fallback ذكي: لو القالب المخصص فاضي، يستخدم القالب العادي تلقائياً
  • الملفات: class-bgm-notifications.php، html-bm-message-templates.php

📐 تنسيق أزرار إدارة العضويات (Grid Layout)

  • المشكلة: أزرار الإجراءات في كارد اشتراكات الحصص كانت في صف واحد طويل — يوسّع الكارد بشكل مزعج
  • الحل: تعديل التنسيق من display:flex إلى display:grid;grid-template-columns:repeat(4,1fr) — 4 أزرار في كل صف (صفين بدل 8)
  • الملف: trait-bma-memberships.php

🔒 حماية الكرون من تخطي لاعبي الحصص (Session Player Cron Guard)

  • المشكلة: لاعب حصص عنده عضوية WC قديمة منتهية — كرون التأخر/الغياب كان يتخطاه بسبب فحص WC Membership
  • الحل: إضافة فحص اشتراك الحصص قبل فحص WC Membership — لو اللاعب عنده حصص نشطة، يتخطى فحص WCM تماماً
  • الملف: class-bgm-notifications.php

✨ ميزة رئيسية: مدة الحصة الديناميكية لكل لعبة في كل فرع

⏱️ نظام هرمي لمدة الحصة (Session Duration Hierarchy)

  • مدة مخصصة لكل لعبة في كل فرع: يمكن لمدير الفروع تحديد مدة حصة مختلفة لكل لعبة في كل فرع. مثال: السباحة 60 دقيقة في فرع الرياض و90 دقيقة في فرع جدة.
  • مدة أساسية لكل لعبة: لو مفيش مدة خاصة بالفرع، النظام بيستخدم المدة الأساسية المحددة للعبة.
  • المدة الافتراضية العامة: لو مفيش أي مدة محددة للعبة، النظام بيرجع للإعداد العام bgm_auto_checkout_minutes.
  • دالة مركزية: إضافة BGM_Attendance::get_session_duration($game_id, $branch_id) كـ static method يمكن استخدامه في أي مكان في النظام.

🏢 واجهة إدارة المدد (Frontend UI)

  • كارت جديد في صفحة الفروع: إضافة كارت “⏱️ مدة الحصة لكل لعبة” في لوحة مدير الفروع يعرض جدول بكل الألعاب المتاحة.
  • تعديل الفروع: زر “🏢 تعديل الفروع” لكل لعبة يكشف حقول override لكل فرع.
  • المدة الافتراضية العامة: إمكانية تعديل الإعداد العام مباشرة من نفس الكارت.
  • حفظ فوري: الإعدادات تُحفظ عبر AJAX بدون إعادة تحميل الصفحة.

🔧 تعديلات تقنية في الانصراف التلقائي

  • إزالة الـ Early Return: إزالة الشرط الذي كان يوقف الكرون بالكامل لو الإعداد العام = 0. الآن النظام بيفحص كل لاعب بناءً على لعبته وفرعه.
  • Debug Logs محسّنة: إضافة تفاصيل المدة المستخدمة لكل لاعب في سجلات التشغيل (get_session_duration per record).

✨ ميزة رئيسية: إدارة مجموعات اللاعبين ورابط التجديد اليدوي

👥 إدارة مجموعات اللاعبين (Group Management)

  • نافذة تفاعلية: إضافة زر 👥 جديد بجوار اسم اللاعب في صفحة “تحضير اللاعبين” لفتح نافذة إدارة مجموعات اللاعبين.
  • تخصيص حسب اللعبة: تدعم النافذة عرض الألعاب المنضم لها اللاعب في تبويبات (Tabs)، لتعيين كل لاعب في مجموعته الصحيحة بشكل منفصل لكل لعبة.
  • تنبيه تلقائي: خيار مدمج في النافذة يتيح إرسال إشعار فوري للاعب/لولي الأمر عبر الواتساب عند تغيير موعد تدريبه أو مجموعته.

🔗 إرسال رابط التجديد يدوياً (Manual Renew Link)

  • زر الإرسال السريع: إضافة زر 💳 جديد في جدول الحضور يتيح للإدارة إرسال رابط تجديد الاشتراك يدوياً وبسرعة فائقة.
  • قالب رسالة مخصص: تسجيل قالب رسالة جديد manual_renew_link في الإعدادات لدعم تخصيص نص رسالة التجديد اليدوية مع إمكانية تحديد المستلمين (اللاعب، ولي الأمر، أو كلاهما).
  • حماية من الإزعاج (Rate Limiting): إضافة قفل زمني ذكي يمنع إرسال رابط التجديد لنفس اللاعب أكثر من مرة خلال ساعة واحدة لتجنب أخطاء الإرسال المتكرر.
  • التوثيق (Activity Log): تسجيل كل عملية إرسال ناجحة لرابط التجديد في سجل النظام الإداري (Activity Log) مع توثيق اسم اللاعب واللعبة.
  • إصلاح حرج 🐛: حل مشكلة تقنية تمنع وصول رسالة التجديد لرقم اللاعب (بسبب اعتماد user_phone الخاطئ)، وتعديلها لجلب billing_phone بشكل صحيح ومتوافق مع WooCommerce.

🔴 إصلاحات حرجة (Critical Fixes)

📱 توليد QR محلي 100% (بدون أي APIs خارجية)

  • مكتبة phpqrcode: إضافة مكتبة PHP QR Code المحلية (includes/lib/phpqrcode.php — LGPL 3) لتوليد QR codes بالكامل على السيرفر.
  • عرض QR في المتصفح: توليد صورة PNG محلياً باستخدام phpqrcode + GD Library وتضمينها كـ base64 <img> — صفر طلبات خارجية.
  • صور QR للواتساب: توليد ملف PNG محلي في wp-content/uploads/bgm-qr/ باستخدام phpqrcode — مع تخزين ذكي (hash-based cache).
  • إزالة كاملة: تم حذف كل استخدامات api.qrserver.com و quickchart.io من النظام نهائياً.
  • إصلاح صفحة QR للاعب: الـ QR أصبح يظهر كصورة PNG حقيقية قابلة للمسح (scannable).

🎫 إصلاح كروت الحصص في صفحة اللاعب

  • مشكلة: ظهور كروت الحصص المنتهية/الملغية حتى بعد تجديد الاشتراك في نفس اللعبة.
  • الحل: تجميع الاشتراكات حسب (لعبة + فرع) وعرض الاشتراك الأحدث/الأنشط فقط. الاشتراكات المنتهية لا تظهر لو فيه اشتراك نشط بديل.

🔍 إصلاح فلتر الأيام (LIKE → JSON_CONTAINS)

  • المشكلة: فلتر البحث باليوم كان يستخدم LIKE '%1%' مما يسبب نتائج خاطئة (false positives).
  • الحل: استبدال كل LIKE queries بـ JSON_CONTAINS(custom_days, ...) لمطابقة دقيقة.
  • الملفات المُعدلة: trait-bma-sessions.php، class-bgm-session-service.php، class-bgm-membership-orders.php.

📞 منع تكرار رسائل الواتساب (Phone Deduplication)

  • المشكلة: send_session_notification() كانت ترسل رسائل مكررة لو رقم اللاعب ورقم ولي الأمر نفسهم بصيغ مختلفة.
  • الحل: استبدال المنطق اليدوي بـ BGM_Notifications::get_recipient_phones() المركزية مع normalize_phone().

📱 إصلاح هاتف اللاعب في إشعار التجديد اليدوي

  • المشكلة: دالة إرسال رابط التجديد اليدوي send_manual_renew_link_notification() كانت تستخدم user_phone كـ meta key (وهو غير موجود في WooCommerce) مما يمنع وصول الرسالة لرقم اللاعب نهائياً.
  • الحل: استبدال المفتاح بـ billing_phone (مع fallback لـ phone) لتتطابق الدالة مع كافة دوال الإشعارات الأخرى في النظام.

🟡 تحسينات الأداء والاستقرار

🔒 قفل تزامن لـ Cron Expiry Check

  • إضافة GET_LOCK('bgm_session_expiry_check') في check_expirations() لمنع التنفيذ المتزامن عند تداخل WP-Cron و System Cron.

⚡ تحسين أداء الإحصائيات

  • استبدال PHP array_filter() بـ SQL COUNT(*) في صفحة إدارة الحصص لتقليل استهلاك الذاكرة.

📄 Pagination في صفحة إدارة الحصص

  • إضافة تنقل بين الصفحات (30 اشتراك/صفحة) بدلاً من تحميل كل السجلات مرة واحدة.
  • أزرار تنقل ذكية: أزرار أرقام الصفحات + السابق/التالي مع الحفاظ على الفلاتر المطبقة.
  • استخدام get_sessions_for_page() المركزية مع LIMIT/OFFSET لأداء أفضل.

🏷️ تحسين فلتر الجنس

  • استبدال INNER JOIN على usermeta بفلتر مباشر على عمود s.gender في جدول الحصص (أسرع وأدق).

🛡️ حماية وتتبع إرسال روابط التجديد اليدوية

  • Rate Limiting: إضافة حماية تمنع إرسال رابط التجديد اليدوي لنفس اللاعب أكثر من مرة خلال ساعة واحدة (لمنع الإزعاج أو الإرسال المتكرر بالخطأ). الإرسال الفاشل لا يمنع المحاولة مجدداً.
  • Activity Log: تسجيل جميع عمليات إرسال روابط التجديد الناجحة في سجل النشاط (Activity Log) مع توثيق اسم اللاعب واللعبة لضمان الشفافية الإدارية.

🐛 إصلاحات

  • إصلاح رابط التجديد: استبدال order-again endpoint بإعادة التوجيه المباشر لصفحة المنتج الأصلي + جعل الرابط قابل لإعادة الاستخدام (30 يوم).
  • تحديث order_id عند الـ Stacking: عند شراء حصص إضافية على اشتراك قائم، يتم تحديث order_id لآخر طلب شراء.
  • إشعار عند Self-Heal: إضافة إرسال session_expired notification عندما يتم تعليم الاشتراك كمنتهي تلقائياً عند محاولة الحضور.
  • أزرار إجراءات للاشتراكات المنتهية/الملغية: إضافة زر “تعديل الحالة ⚙️” وزر “± تعديل الرصيد” للاشتراكات المنتهية والملغية في صفحة إدارة الحصص (كانت مخفية بالكامل).

🔄 نظام تجديد اشتراكات الحصص الذكي (Smart Session Renewal)

♻️ إعادة هندسة دورة حياة الاشتراك

  • المشكلة: عند تجديد اشتراك حصص منتهي، كان النظام يعيد تفعيل نفس السجل القديم — مما يمسح التاريخ ويسبب مشاكل في حساب الإيرادات.
  • الحل: تم إعادة هندسة create_or_stack() في مسارين واضحين:
    1. اشتراك نشط + شراء جديد: تراكم الحصص + تمديد الصلاحية + تحديث الباقة (product_id / variation_id) — سجل واحد فقط.
    2. اشتراك منتهي/ملغي + شراء جديد: إنشاء سجل جديد تماماً — القديم يبقى كأرشيف تاريخي بملاحظاته.
  • تحديث الباقة عند التراكم: عند الشراء المبكر بباقة مختلفة (variation مختلف)، يتم تحديث product_id و variation_id لآخر باقة.
  • النتيجة: كل طلب شراء يبقى مستقل في حساب الإيرادات، مع تاريخ كامل في الملاحظات.

📝 نظام ملاحظات تاريخي لاشتراكات الحصص (Audit Trail)

  • عمود notes جديد: إضافة عمود TEXT في جدول bgm_session_subscriptions لتسجيل كل الأحداث المهمة تلقائياً بالتاريخ والوقت.
  • الأحداث المسجلة:
    • 🆕 اشتراك جديد — عند أول شراء.
    • تم التجديد — عند إعادة تفعيل اشتراك منتهي.
    • 🔄 تجديد مبكر — عند إضافة حصص والاشتراك لسه نشط.
    • نفدت الحصص — عند وصول الرصيد لـ 0.
    • انتهت الصلاحية — عند انتهاء تاريخ الصلاحية (كرون أو self-heal).
  • زر 📝 في إدارة الحصص: زر ملاحظات ظاهر على كل اشتراك (نشط ومنتهي) يعرض السجل التاريخي في نافذة أنيقة ملونة.
  • ترحيل قاعدة البيانات: ALTER TABLE تلقائي عند التحديث لإضافة العمود الجديد.

📝 ملاحظات الطلب للاشتراكات الشهرية (WC Membership Order Notes)

📋 عرض ملاحظات الطلب في واجهة المدير

  • زر 📝 جديد: إضافة زر “ملاحظات الطلب” بجانب كل اشتراك شهري (WC Membership) في:
    • صفحة إدارة العضويات (PHP-rendered + AJAX-rendered بعد البحث/الفلترة).
    • صفحة إدارة العضويات البديلة (class-bgm-membership-orders.php).
  • AJAX Handler جديد bgm_get_membership_notes: يجلب ملاحظات الطلب المرتبط بالعضوية + ملاحظات العضوية نفسها، مع ترتيب بالتاريخ وحذف التكرارات.
  • نافذة عرض أنيقة: Modal بتصميم RTL يعرض كل ملاحظة بلون مختلف (🔒 ملاحظة خاصة / 👤 ملاحظة للعميل) مع التاريخ.
  • متاح لجميع الأدوار: مدير الفروع، مدير الفرع، الإداري، والأدمن.

الإصدار 1.4.2 — 2026-06-26

✨ ميزات وتحسينات جديدة

📊 تحسين تقارير الحضور للاعبين متعددي الألعاب (Multi-Game Attendance Reporting)

  • فصل الحضور لكل لعبة: تم إعادة برمجة جداول الحضور في لوحة مدير الفرع (trait-bma-players.php) ولوحة الإدارة (class-bgm-branches-manager-account.php) لتعتمد نظام “سطر واحد لكل لعبة”. اللاعب المشترك في أكثر من لعبة يظهر في سطر مستقل لكل لعبة، مع اسم اللعبة وأيقونتها، بدلاً من تجميع الحضور في سطر واحد غير دقيق.
  • حساب دقيق للحصص المتوقعة (Scheduled Days): إضافة دوال مساعدة مركزية get_user_scheduled_days_for_game و get_subscription_bounds لضمان أن حسابات الحصص “المتوقعة” و”الغياب” تُحسب بدقة تامة بناءً على جدول كل لعبة بشكل منفصل وصلاحية الاشتراك المربوط بها.
  • إحصائيات متزامنة للبطاقات العلوية: تم تعديل العدادات أعلى الجداول (إجمالي الحضور والنسبة المئوية) لتقوم بالعد بناءً على “إجمالي الاشتراكات المعروضة” بدلاً من “الأشخاص الفرديين”، مما يضمن دقة النسب الإحصائية وتوافقها تماماً مع الأسطر المعروضة.

🎟️ دمج شامل لاشتراكات الحصص في صفحة إدارة العضويات

  • دمج البيانات: توحيد عرض WooCommerce Memberships واشتراكات الحصص bgm_session_subscriptions في جدول واحد بصفحة إدارة العضويات لمدير الفرع.
  • فلتر الأيام المخصص: إضافة فلتر “البحث باليوم لمشتركي الحصص” يظهر فقط عند تفعيل نظام الحصص، ويتيح لمدير الفرع تصفية المشتركين بناءً على أيام حضورهم المجدولة.
  • إصلاح فلتر خطة العضوية: ضبط سلوك فلتر “خطة العضوية” ليتجاهل استدعاء اشتراكات الحصص عند البحث عن خطة ووكومرس محددة.
  • شريط تقدم الحصص: إضافة عمود جديد “تفاصيل الحصص” في الجدول يعرض شريط تقدم لوني (أخضر، أصفر، أحمر) يوضح الحصص المتبقية بصرياً مع عرض أيام الحضور المخصصة للاعب.
  • أزرار تحكم مدمجة: دمج أزرار الإجراءات السريعة لاشتراكات الحصص (± تعديل الرصيد، 📅 تعديل الأيام، 🗓️ تعديل الصلاحية) مباشرة داخل جدول إدارة العضويات لسهولة الوصول.
  • استقلالية صفحة الحصص: الإبقاء على صفحة “إدارة الحصص” كلوحة متابعة سريعة ومستقلة، مع جعل “إدارة العضويات” هي اللوحة المركزية الشاملة.

🗓️ تعديل صلاحية الحصص مع إشعارات واتساب

  • نافذة تعديل الصلاحية: إضافة نافذة جديدة (Modal) مخصصة لتعديل تاريخ انتهاء اشتراك الحصص يدوياً.
  • تحديث أمني: دعم النافذة بنظام أمني (IDOR Protection) للتأكد من أن التعديل يتم فقط للاعبين التابعين لنفس فرع المدير.
  • قالب واتساب جديد: إنشاء قالب إشعار session_expiry_changed ليتم إرساله تلقائياً للاعب أو لولي أمره عند تمديد أو تعديل صلاحية الاشتراك.

🎁 فصل إشعارات حصة السماح (Grace Session)

  • قالب مخصص لاشتراكات الحصص: إضافة قالب واتساب جديد منفصل تماماً session_grace (حضور حصة سماح – حصص) يتم إرساله فقط للاعبي الحصص عند استنفاد رصيدهم أو انتهاء صلاحيتهم واستخدامهم لحصة سماح.
  • استقلالية التنبيهات: تم فصل تنبيه حصة السماح للاشتراكات الشهرية (grace_session) عن تنبيه حصة السماح لاشتراكات الحصص (session_grace) لتوفير رسائل دقيقة ومخصصة لكل نوع اشتراك.
  • عرض دقيق للرصيد المتبقي: يقوم النظام ديناميكياً بحساب وعرض عدد حصص السماح المتبقية {remaining_grace} بداخل رسالة الواتساب الخاصة بحصة السماح للاعب الحصص.

⚙️ التحكم في حالات اشتراكات الحصص

  • الإنهاء التلقائي عند نفاد الحصص: تم ربط استنفاد الحصص بانتهاء الصلاحية بشكل تلقائي وفوري. بمجرد وصول رصيد الحصص إلى (0)، يتغير اشتراك اللاعب إلى “منتهي” (expired).
  • منع التمديد الخاطئ: الاشتراكات المنتهية بسبب نفاد الحصص أو الصلاحية لم تعد تقبل التمديد الخاطئ في حالة قيام اللاعب بالاشتراك مجدداً. بدلاً من ذلك، يُحسب كاشتراك جديد بصلاحية كاملة.
  • تحكم إداري كامل بالحالة: إضافة خيار “تعديل الحالة ⚙️” في جميع الجداول (إدارة العضويات، إدارة الحصص، تفاصيل الطلب) للسماح للمدراء بتغيير حالة الاشتراك يدوياً وبسهولة (نشط، مجمّد، ملغي، أو منتهي).

📝 سجل ملاحظات متكامل وإدارة ذكية لاشتراكات الحصص (Unified Audit & Management)

  • مزامنة مع ملاحظات الووكومرس: أي إجراء يتم على اشتراك الحصص (إنشاء، تجديد، تجميد، خصم حصص، تغيير الأيام) يُسجل فوراً في ملاحظات الطلب (WooCommerce Order Notes) للطلب المرتبط به، مع إرفاق نص صريح باسم الموظف الذي قام بالإجراء، لضمان أعلى مستوى من المتابعة والتدقيق الإداري.
  • نافذة إنهاء موحدة (Terminate Modal): تم تعميم نافذة الإنهاء المنبثقة (Pop-up) لتشمل كلاً من اشتراكات الحصص والعضويات الشهرية (WooCommerce Memberships). النافذة تحتوي على خيارين: “إلغاء فقط” (تحويل الحالة لملغاة) أو “حذف نهائي” (مسح من قاعدة البيانات)، مع رسائل تأكيد لمنع الأخطاء.
  • إخفاء ذكي لزر الحذف بناءً على الصلاحيات: تم ربط ظهور زر (السلة 🗑️) في جداول العضويات بصلاحية الحذف المعطاة للموظف. إذا لم يكن الموظف يمتلك الصلاحية، يختفي الزر تماماً من واجهته لمنع أي محاولة حذف خاطئة، بينما يظل بإمكانه “إلغاء” العضوية عبر زر “تعديل الحالة ⚙️”.
  • تخصيص صلاحيات الحذف النهائي: تمت إضافة إعدادات جديدة في قسم (نظام الحصص) بمنطقة الإعدادات، تُمكّن مدير الفروع من إعطاء أو سحب صلاحية “الحذف النهائي” للاشتراكات (حصص وشهرية) لـ “مدير الفرع” و “إداري الفرع”. هذا الإجراء يمنع الحذف العشوائي ويحمي البيانات المالية من التلاعب.
  • تسجيل تفصيلي للموظفين: دالة add_note أصبحت تلقائياً تلتقط الحساب الذي نفذ العملية وتضيف (بواسطة: [اسم الموظف])، وإذا تمت العملية تلقائياً تُسجل (بواسطة: النظام).

✉️ إصلاح توجيه رسائل الواتساب (WhatsApp Notifications Routing Fix)

  • المشكلة الأولى: رسائل التقارير الشهرية كانت تصل لولي الأمر فقط ولا تصل للاعب.
  • الحل: تم توحيد استدعاء رقم اللاعب في send_monthly_report ليعتمد على billing_phone بشكل أساسي مثل باقي النظام.
  • المشكلة الثانية: رسائل اشتراكات الحصص (مثل النفاد والإلغاء) كانت تصل للاعب فقط ولا تصل لولي الأمر.
  • الحل: في class-bgm-session-service.php، كان النظام يبحث بالخطأ عن حساب ولي الأمر عبر bgm_parent_id، تم التعديل ليقوم بسحب الرقم مباشرة من parent_phone المرفق بحساب اللاعب لضمان إرسال النسخة لولي الأمر بنجاح.

🐛 إصلاحات وتحديثات أمان

  • تأكيد الأزرار: توحيد سمة type="button" لجميع أزرار الحصص داخل النماذج (Forms) لمنع إعادة تحميل الصفحة الخاطئ عند ضغطها.
  • حماية البيانات: إضافة طبقة فحص إضافية (is_array) لبيانات أيام الحضور (custom_days) لتفادي ظهور أخطاء برمجية في حال كانت البيانات فارغة.
  • استدعاء ملفات آمن: ضمان استدعاء النوافذ المنبثقة (Modals) بطريقة موحدة في كل من صفحة الحصص وصفحة العضويات لتقليل تكرار الكود.

الإصدار 1.4.2 (تحديث إضافي) — 2026-05-26

✨ ميزات وتحسينات

  • تحديث بيانات اللاعبين: إضافة إمكانية تعديل “الجنسية” و”الرقم الضريبي” للاعب من خلال نافذة “تعديل بيانات اللاعب / ولي الأمر” في صفحة تحضير اللاعبين.
  • تحضير اللاعبين للإدارة العليا: إضافة صفحة “تحضير اللاعبين” للوحة تحكم مدير الفروع branches_manager، مع إمكانية عرض جميع اللاعبين أو الفلترة بناءً على الفرع، لتمكين الإدارة من تحضير أي لاعب من أي فرع بشكل مباشر.
  • الفاتورة الضريبية ZATCA: حل مشكلة اختفاء حقول الجنسية والرقم الضريبي من صفحة الدفع (Checkout) الخاصة بـ WooCommerce لتتوافق مع متطلبات الزكاة والدخل.

🐛 إصلاحات

  • صلاحيات التحضير: استثناء “مدير الفروع” branches_manager من القيود الأمنية التي تمنع تحضير لاعبين من فروع أخرى، لضمان قدرتهم على التحضير بحرية تامة (شمل التعديل التحضير العادي، السريع، وإلغاء الإيقاف المؤقت).
  • إصلاح عدم قدرة بعض الحسابات على رؤية حقول التسجيل المخصصة في حال تفعيل الشراء للزوار.

الإصدار 1.4.1 — 2026-06-20

✨ ميزة رئيسية: الفاتورة الضريبية (ZATCA A4 Tax Invoice)

  • تبويب الفواتير: إضافة تبويب جديد مخصص لإعدادات الفواتير في لوحة تحكم الإضافة (BGM -> الإعدادات -> الفواتير).
  • تخصيص الهوية: إضافة خيارات لتخصيص لون الفاتورة، شعار المؤسسة، اسم المنشأة، السجل التجاري، والرقم الضريبي.
  • QR Code ضريبي: بناء محرك داخلي لتوليد رمز الاستجابة السريعة (QR Code) بترميز TLV (Tag-Length-Value) وتشفيره بـ Base64 ليتوافق تماماً مع متطلبات هيئة الزكاة والضريبة والجمارك (ZATCA)، ويعمل بشكل ذاتي بدون الاعتماد على أي واجهات برمجية (APIs) خارجية لضمان السرعة المطلقة في طباعة الفواتير.
  • الحساب العكسي للضريبة: تطبيق نظام الحساب العكسي الذكي بحيث يعتبر إجمالي سلة ووكومرس شاملاً للضريبة وتقوم الإضافة باستخراج قيمة الضريبة منه آلياً حسب النسبة المحددة (مثلاً 15%).
  • تصميم A4: إضافة تصميم فاتورة ضريبية جديد بحجم A4 مخصص للطباعة وعرض كافة تفاصيل الطلب والمشتري بشكل متكامل.
  • واجهة المرافق والصالات: تحسين واجهة المستخدم وتغيير المسميات إلى “المرافق والصالات” لدعم مرونة أكبر، وإضافة نافذة منبثقة (Modal) لعرض المجموعات المرتبطة بكل مرفق بسهولة.

🐛 إصلاحات

  • ZATCA QR Date (UTC): تاريخ الفاتورة في QR Code كان يُحفظ بالتوقيت المحلي (UTC+3) مع لاحقة Z (التي تعني UTC) — تم إصلاحه باستخدام date('Y-m-d\TH:i:sP') لتوليد تاريخ بالتوقيت المحلي مع الـ Offset الصحيح بناءً على توصيات ZATCA.
  • QRCode.js CDN → Local: مكتبة QR Code كانت تُحمَّل من CDN خارجي (cdnjs) — تم تضمينها محلياً في assets/js/qrcode.min.js لضمان عمل الفاتورة بدون إنترنت.
  • Division by Zero Guard: إضافة حماية من القسمة على صفر عند حساب سعر الوحدة لو qty = 0.
  • CSS Injection Protection: التحقق من قيمة لون الفاتورة (bgm_invoice_color) بـ regex للتأكد إنه hex صالح، مع fallback لـ #0f3460.
  • esc_js() لـ QR Base64: إضافة esc_js() عند طباعة سلسلة QR Base64 في JavaScript.
  • $_GET['print'] sanitize: تحسين الوصول لـ $_GET['print'] باستخدام isset() بدل !empty().

✨ تحسينات

  • التحكم في عرض QR Code: إضافة خيار جديد في إعدادات الفواتير (BGM -> الإعدادات -> الفواتير) للتحكم في إظهار أو إخفاء رمز QR الضريبي من الفاتورة بشكل مرن.
  • حقول بيانات المستخدم: إضافة حقل “الجنسية” (Nationality) كقائمة منسدلة قابلة للبحث (Select2) تستخدم قائمة الدول الخاصة بـ WooCommerce لتتوافق مع إضافة TranslatePress تلقائياً، وإضافة حقل “الرقم الضريبي” كحقل اختياري في نموذج التسجيل وصفحة الملف الشخصي.
  • تكامل الفواتير مع الحقول الجديدة: استدعاء وطباعة حقول (الجنسية) و (الرقم الضريبي) تلقائياً داخل قسم معلومات المشتري في الفاتورة الضريبية ZATCA.
  • خيارات التحكم في الحقول: إضافة 4 خيارات جديدة في واجهة الإعدادات لتمكين/تعطيل ظهور حقول الجنسية والرقم الضريبي في كل من نموذج التسجيل والفواتير بشكل مستقل.
  • الفرع في الفاتورة الضريبية: إضافة عرض اسم الفرع (Branch) في قسم بيانات المشتري بالفاتورة الضريبية A4.
  • الكوبونات في الفاتورة الضريبية: إضافة عرض تفاصيل الكوبونات في قسم الإجمالي بالفاتورة الضريبية A4 (للاتساق مع الفاتورة المخصصة).
  • دمج صفحة الحصص: إلغاء صفحة “حصصي” المنفصلة من حساب اللاعب، ونقل كارد بيانات الحصص وتفاصيلها ليعرض داخل صفحة “جدولي وألعابي” لتجربة مستخدم أفضل وأكثر تركيزاً.
  • تحديث كارد الحصص: إضافة عرض “المجموعة” و “وقت تمرين المجموعة” مباشرة داخل كارد اشتراك الحصص في واجهة اللاعب.
  • إزالة كارد الاشتراكات الشهرية: إزالة كارد الاشتراكات الشهرية القديمة من صفحة جدولي وألعابي للاعتماد بشكل كامل على بطاقات الحصص (Sessions Cards).

📁 الملفات المعدّلة

الملفالتغيير
includes/class-bgm-invoice.phpZATCA QR date fix, local QRCode.js, color sanitize, QR toggle logic, esc_js, division guard, branch name, coupons, buyer nationality and tax id
admin/class-bgm-settings.phpتبويب إعدادات الفواتير، حقول الهوية الضريبية، زر تفعيل/تعطيل QR Code، خيارات تفعيل/تعطيل حقول الجنسية والرقم الضريبي
includes/class-bgm-user-fields.phpإضافة حقول الجنسية والرقم الضريبي وتفعيل Select2 وحفظها في بيانات المستخدم
includes/traits/trait-bma-facilities.phpواجهة المرافق والصالات + Modal المجموعات
assets/js/qrcode.min.js[NEW] مكتبة QR Code محلية بدل CDN

الإصدار 1.4.0 — 2026-06-17

✨ ميزة رئيسية: نظام اشتراكات الحصص (Session-Based Membership System)

نظام اشتراكات مبني على الحصص يعمل بالتوازي مع نظام عضويات WooCommerce Memberships. اللاعب يشتري عدد حصص محدد بدل اشتراك شهري — كل مرة يحضر تُخصم حصة.

📅 جدول حر — اللاعب يختار أيامه (Free Schedule)

  • حقل جديد على الـ Variation: _bgm_is_free_schedule — checkbox يحدد إن الاشتراك “جدول حر”
  • Frontend UI: عند اختيار variation “جدول حر”، تظهر checkboxes أيام (جمعة→خميس) يختار منها اللاعب أيام حضوره
  • تدفق البيانات: الأيام المختارة تتحفظ في السلة → تنتقل لميتا الطلب (_bgm_custom_days) → تتحفظ في bgm_session_subscriptions.custom_days
  • Validation: لا يمكن إضافة المنتج للسلة بدون اختيار يوم واحد على الأقل
  • عرض السلة: الأيام المختارة تظهر في صفحة السلة والـ Checkout كـ “📅 أيام الحضور: الأحد، الثلاثاء، الخميس”
  • صفحة حصصي: الأيام تظهر كـ badges ملونة (أخضر = مختار، أزرق = اليوم الحالي، رمادي = غير مختار)

🔍 فلتر الأيام في إدارة الحصص

  • فلتر جديد: dropdown “اليوم” في صفحة إدارة الحصص (لمدير الفروع/الفرع/الإداري)
  • يفلتر بالـ custom_days: يعرض فقط اللاعبين المشتركين في يوم محدد

🔧 Master Toggle — تفعيل/إيقاف النظام

  • إعداد جديد: bgm_sessions_system_enabled في إعدادات مدير الفروع
  • السلوك عند الإيقاف: كل واجهات الحصص تختفي تماماً — القوائم، الصفحات، حقول المنتجات
  • لا يؤثر على WCM: نظام العضويات الشهرية يعمل بشكل مستقل تماماً

🗃️ بنية البيانات (Database Schema)

  • جدول جديد bgm_session_subscriptions:
    • user_id, product_id, variation_id, order_id — ربط الاشتراك
    • game_id, branch_id, gender — تعيين الفرع واللعبة
    • total_sessions, used_sessions, remaining_sessions — رصيد الحصص
    • start_date, expiry_date — فترة الصلاحية
    • is_frozen, frozen_at, freeze_reason — حالة التجميد
    • custom_days — أيام الحضور المخصصة (JSON)
    • expiry_reminded — هل تم إرسال تنبيه الانتهاء
    • status (active/expired/cancelled)
  • عمود جديد is_session_attendance في bgm_attendance — لتمييز حضور الحصص من العادي
  • 4 فهارس (Indexes): idx_user_game_branch, idx_branch_status, idx_status, idx_expiry — لضمان الأداء

🛒 حقول المنتج (Product Session Fields)

  • حقل “عدد الحصص” (_bgm_session_count) على المنتجات البسيطة والـ Variations
  • حقل “مدة الصلاحية” (_bgm_session_validity_days) — عدد الأيام قبل انتهاء الاشتراك (اختياري)
  • حقل “اختيار المجموعة/الأيام” على صفحة المنتج — اللاعب يختار مجموعته أو أيام مخصصة عند الشراء
  • الحقول مخفية تلقائياً عند إيقاف النظام
  • حماية من التعارض: لو المنتج فيه حصص + خطة عضوية WCM → تحذير للمدير

🎫 BGM_Session_Service — الكلاس الرئيسي (657 سطر)

  • create_or_stack(): عند الشراء — لو عنده اشتراك نشط لنفس اللعبة/الفرع → يُضاف فوقه (Stacking). لو جديد → ينشئ اشتراك
  • deduct(): خصم حصة مع Atomic SQL (remaining_sessions = remaining_sessions - 1) لمنع Race Conditions
  • freeze() / unfreeze(): تجميد/إلغاء تجميد الاشتراك يدوياً أو من نظام الإجازات
  • cancel(): إلغاء مع تسجيل السبب
  • adjust_sessions(): إضافة/خصم حصص يدوياً
  • check_and_deduct(): الدالة اللي بيستدعيها نظام الحضور — بتفحص الصلاحية + اليوم + التجميد قبل الخصم
  • send_session_notification(): إرسال إشعارات واتساب (شراء/تمديد/نفاد/اقتراب انتهاء)
  • حماية من التعارض: Lock بـ GET_LOCK('bgm_sess_deduct_{sub_id}', 5) لمنع خصم مزدوج

📋 نظام الحضور (Attendance Integration)

  • فحص الحصص قبل WCM: عند تحضير لاعب → النظام يفحص أولاً هل عنده حصص نشطة → لو أيوه يخصم حصة ويسجل is_session_attendance = 1
  • لو مفيش حصص: يكمل فحص WCM العادي
  • لو الحصص نفدت: رسالة واضحة ⛔ نفدت الحصص — يرجى شراء باقة جديدة
  • لو الاشتراك مجمّد: رسالة ❄️ الاشتراك مجمّد
  • لو اليوم مش من أيامه المخصصة: رسالة 📅 غير مجدول اليوم
  • يشمل: التحضير بالزر + كود اللاعب + مسح QR

🎟️ Badge حضور الحصص في سجل الحضور

  • شكل جديد في الـ Grid: 🎟 بنفسجي (#ede9fe / #6d28d9) لسجلات حضور الحصص
  • تمييز بصري بين 4 أنواع: حضور عادي ✓ (أخضر) / سماح S (أصفر) / غير مجدول ! (برتقالي) / حصة 🎟 (بنفسجي)

📊 معدل الحضور المتوقع للحصص (Pro-rated Expected Attendance)

  • المشكلة: حساب الحضور المتوقع للاعبي الحصص كان يعتمد على عدد أيام الشهر (مثل العضويات الشهرية)، مما يؤدي إلى نسبة حضور غير دقيقة للمشتركين بحصص.
  • الحل: تم تخصيص حساب “المتوقع” للاعبي الحصص ليصبح معدل شهري متناسب مع مدة الصلاحية:
    • المتوقع في الشهر = (إجمالي الحصص ÷ أيام الصلاحية) × عدد أيام الشهر
    • مثال 1: 12 حصة / 30 يوم ← المتوقع في التقرير الشهري = 12 حصة.
    • مثال 2: 40 حصة / 60 يوم ← المتوقع في التقرير الشهري = 20 حصة.
  • النسبة المئوية: تُحسب بدقة بناءً على الحضور الفعلي في الشهر مقسوماً على “المتوقع في الشهر”.
  • عزل العضويات: التعديل يخص فقط لاعبي الحصص، وتبقى العضويات العادية تُحسب حسب أيام المجموعة بشكل طبيعي.
  • الملفات: class-bgm-branches-manager-account.php

📊 صفحة إدارة الحصص (Admin — Branch Manager)

  • صفحتين: manage-sessions لمدير الفرع + bm-sessions لمدير الفروع
  • بطاقات إحصائية: الإجمالي / نشط / مجمّد / نفدت / منتهي+ملغي
  • فلاتر: الحالة، اللعبة، بحث بالاسم — مع Enter key
  • جدول شامل: اللاعب، اللعبة، الحصص (progress bar)، الحالة، الصلاحية، إجراءات
  • إجراءات AJAX:
    • ❄️/☀️ تجميد/إلغاء تجميد
    • ± تعديل الحصص (إضافة/خصم)
    • 🗑️ إلغاء الاشتراك (مع سبب)
  • فلترة بالجنس: المدير يرى فقط لاعبي قسمه (admin_category)
  • الملفات: trait-bma-sessions.php, html-manage-sessions.php

🎟️ صفحة حصصي (Player — My Account)

  • Endpoint جديد: my-sessions في WooCommerce My Account
  • Menu item: 🎟️ حصصي — يختفي لو النظام مش مفعّل
  • كارد لكل اشتراك:
    • اسم اللعبة + الفرع
    • Badge حالة ملوّن: ✅ نشط / ❄️ مجمّد / ⛔ نفدت / ⏰ منتهي / 🚫 ملغي
    • Progress bar ملوّن (أخضر > 50%, أصفر > 20%, أحمر < 20%)
    • الأيام المخصصة + تاريخ الانتهاء + عدد المستخدمة
    • 🔄 زر تجديد الحصص — يظهر للاشتراكات المنتهية/النافدة (يستخدم BGM_Renew_Link)
  • الملف: class-bgm-my-account.php

🏖️ دمج نظام الحصص مع الإجازات (Holiday Integration)

  • bulk_freeze_sessions_for_holiday(): تجميد جماعي لحصص اللاعبين عند بدء الإجازة — بنفس فلاتر الإجازة (فرع/لعبة/جنس)
  • bulk_unfreeze_sessions_for_holiday(): إلغاء تجميد عند انتهاء/إلغاء الإجازة
  • استهداف دقيق: عمود freeze_reason = 'holiday_{log_id}' — التجميد اليدوي لا يتأثر عند إلغاء الإجازة
  • الملف: class-bgm-membership-service.php

✉️ قوالب رسائل واتساب للحصص

  • 4 قوالب جديدة:
    • 🎟️ شراء حصص (session_purchased) — عند أول شراء
    • 🔄 تمديد حصص (session_extended) — عند Stacking فوق اشتراك قائم
    • ⚠️ اقتراب نفاد الحصص (session_low_balance) — عند وصول الرصيد لعدد محدد
    • 📢 اقتراب انتهاء الصلاحية (session_expiry_reminder) — قبل انتهاء التاريخ بأيام
  • متغيرات: {parent_name}, {child_name}, {game_name}, {branch_name}, {total_sessions}, {remaining_sessions}, {used_sessions}, {expiry_date}, {selected_days}, {renew_link}
  • الملفات: class-bgm-session-service.php, html-bm-message-templates.php, class-bgm-settings.php

🔄 رابط التجديد (Renew Link)

  • كلاس جديد BGM_Renew_Link:
    • generate_token($user_id) — ينشئ token + يرجع URL
    • Token صالح لمدة 30 يوم (قابل للتعديل)
    • One-time use — يُحذف بعد الاستخدام
    • Auto-login + redirect لآخر طلب (أو المتجر)
  • الاستخدام:
    • في كارد اللاعب “حصصي” → زر 🔄 تجديد الحصص
    • في إشعارات واتساب → متغير {renew_link}

⏰ Cron يومي للحصص

  • Hook جديد: bgm_check_session_expirations — يعمل الساعة 8 صباحاً
  • الوظائف:
    • تغيير حالة الاشتراكات المنتهية الصلاحية إلى expired
    • إرسال تنبيه اقتراب الانتهاء
    • إرسال تنبيه نفاد الحصص
  • مسجّل في إدارة الكرون — يمكن تشغيله/إيقافه

🔒 حجب الصفحات عند عدم تفعيل الرخصة

  • my-sessions + manage-sessions + bm-sessions مضافين لقائمة frontend_endpoints في نظام الرخصة
  • لو الرخصة واقفة → كل صفحات الحصص تعرض رسالة “معلّق” — بنفس سلوك باقي صفحات الإضافة

📁 الملفات الجديدة

الملفالوصف
includes/services/class-bgm-session-service.phpالكلاس الرئيسي — 657 سطر
includes/traits/trait-bma-sessions.phpTrait إدارة الحصص + AJAX handlers
includes/views/html-manage-sessions.phpواجهة إدارة الحصص (Admin)
includes/class-bgm-renew-link.phpنظام روابط التجديد

📁 الملفات المعدّلة

الملفالتغيير
branch-games-manager.phpتسجيل ملفات الحصص + حجب الرخصة
includes/class-bgm-install.phpجدول الحصص + migration freeze_reason + cron + defaults
includes/class-bgm-attendance.phpفحص حصص قبل WCM + is_session_attendance
includes/class-bgm-branch-manager-account.phpTrait wiring + AJAX hooks + endpoint
includes/class-bgm-branches-manager-account.phpbm-sessions endpoint + session badge في الحضور
includes/services/class-bgm-membership-service.phpHoliday freeze/unfreeze للحصص
public/class-bgm-my-account.phpmy-sessions endpoint + كارد اللاعب
admin/class-bgm-settings.phpMaster toggle + notification template vars
includes/views/html-bm-message-templates.php4 قوالب رسائل حصص
includes/class-bgm-branch-product-binding.phpحقول المنتج + assign_sessions_on_order
uninstall.phpحذف جدول الحصص + cron

🐛 إصلاحات

  • expires_atexpiry_date: تصحيح اسم العمود في واجهة الأدمن واللاعب (كان يسبب PHP Notice)
  • selected_dayscustom_days: تصحيح اسم العمود في كارد اللاعب
  • BGM_Renew_Link::generate_url()generate_token(): استدعاء method غير موجودة — كان يسبب Fatal Error عند ظهور زر التجديد
  • my-sessions ناقص من حجب الرخصة: صفحة حصصي للاعب كانت تظهر حتى لو الرخصة واقفة — تم إضافتها لقائمة frontend_endpoints
  • حصص جديدة أثناء إجازة نشطة: لو لاعب اشترى حصص أثناء إجازة → الاشتراك كان يبقى active. تم إضافة auto_freeze_if_holiday_active() لتجميده تلقائياً مع freeze_reason = 'holiday_{log_id}'

🔒 تحسينات أمنية — حماية الفروع (Cross-Branch Guards)

  • IDOR Protection في إدارة الحصص: إضافة حماية (can_manage_session) في كل إجراءات الـ AJAX (تجميد، خصم/إضافة حصص، إلغاء، وتعديل الأيام) للتأكد من أن مدير الفرع لا يمكنه بأي شكل التلاعب باشتراك حصص تابع لفرع آخر عن طريق تعديل الـ sub_id.
  • ajax_mark_attendance(): إضافة فحص فرع — مدير/إداري الفرع لا يقدر يحضّر لاعب من فرع آخر (كان موجود في QR فقط)
  • ajax_attend_and_resume() (trait + membership-orders): إضافة فحص فرع — منع إلغاء إيقاف + تحضير لاعب من فرع مختلف
  • الـ Admin (administrator) + مدير الفروع (branches_manager): مستثنين — يقدروا يحضّروا أي لاعب في أي فرع

🛡️ تحسينات المتانة (Robustness)

  • Self-healing في check_status(): لو صلاحية الاشتراك انتهت لكن الكرون ما اشتغلش لسه → check_status() يغيّر الحالة لـ expired تلقائياً ويمنع التحضير
  • unfreeze() يمسح freeze_reason: كان بيقى freeze_reason موجود بعد فك التجميد — تم تنظيفه
  • uninstall.php: إضافة جدول bgm_holiday_pause_log لقائمة الحذف (كان ناقص من v1.3.5)
  • custom_days validation في الحضور: اللاعب اللي عنده أيام محددة في اشتراك الحصص → لو جاء يوم غير يومه تظهر رسالة تأكيد للإداري (زي الاشتراك الشهري بالضبط)
  • دمج الحصص في كل مسارات التحضير: التحضير اليدوي (زر) والكود/QR كانوا ما بيفحصوش الحصص ولا بيخصموا — تم إضافة: فحص الحالة + custom_days + خصم الحصة + is_session_attendance flag

الإصدار 1.3.5.3 — 2026-06-05

🐛 إصلاحات حرجة

🔄 إصلاح العضوية المؤجلة (Delayed) للاشتراكات الجديدة

  • المشكلة: عند اشتراك اللاعب لأول مرة، كان WooCommerce Memberships أحياناً يقيّم تاريخ البدء على أنه في المستقبل (بسبب اختلاف التوقيت المحلي عن UTC)، مما يؤدي لتعيين حالة العضوية الجديدة كـ “مؤجل” (delayed) وبدئها بعد يوم أو اثنين.
  • الحل:
    • تمت إضافة فحص فوري وقت إنشاء العضوية assign_on_membership لاكتشاف العضويات التي تم حفظها كـ wcm-delayed بالخطأ.
    • حماية استباقية: حتى لو لم يتم تقييم العضوية كـ “مؤجلة” فوراً، يتم فحص تاريخ البدء (_start_date). إذا كان في المستقبل (بسبب اختلاف الـ Timezone)، يتم التدخل قبل أن يغيّر الكرون حالتها لاحقاً.
    • يتم فرض تاريخ البدء إلى الوقت الحالي بالتوقيت العالمي الدقيق (gmdate('Y-m-d H:i:s')).
    • يتم إعادة حساب تاريخ الانتهاء بدقة بناءً على طول خطة العضوية.
    • يتم فرض تحديث الحالة فوراً إلى “نشط” (wcm-active).

🔄 إصلاح العضوية المؤجلة (Delayed) بعد تجديد اشتراك منتهي

  • المشكلة: لاعب عنده عضوية منتهية واشترى اشتراك جديد → التواريخ تتحدث صح (بداية وانتهاء جديدة من اليوم) لكن حالة العضوية تبقى “مؤجل” (delayed) بدل “نشط” (active)
  • السبب الجذري (مشكلتين):
    • ترتيب العمليات: الكود كان يغيّر الحالة أولاً قبل تحديث التواريخ → WCM يقرأ التواريخ القديمة ويقرر delayed
    • مشكلة Timezone: الكود كان يستخدم wp_date() (التوقيت المحلي UTC+3) لحفظ _start_date، لكن WCM يتوقع التواريخ بصيغة UTC/GMT. فلما نحفظ 21:10:34 محلي وWCM يقرأها كـ UTC → يعرضها كـ 00:10 بكره → يعتبرها “لسه مبدأتش” → delayed
  • الحل:
    1. تحديث التواريخ أولاً (_start_date, _end_date, _order_id) قبل أي تغيير في الحالة
    2. استخدام gmdate() بدل wp_date() لحفظ التواريخ بصيغة UTC — زي ما WCM متوقع
    3. مسح _cancelled_date و _paused_date
    4. مسح كل الكاشات (clean_post_cache + wp_cache_delete) عشان WCM يقرأ التواريخ الجديدة
    5. استخدام WCM API ($membership->update_status('active')) بدل wp_update_post المباشر
    6. Safety net: فحص الحالة النهائية — لو WCM رجّعها لغير wcm-active يتم فرضها مع تسجيل تحذير
    7. تحويل العرض: التواريخ في الملاحظات والرسائل تُحوّل من UTC للتوقيت المحلي عبر strtotime($date . ' UTC') + wp_date()
  • إضافة حالة delayed للمعالجة: العضويات اللي حالتها delayed أصبحت تُعالج في reactivate_expired_memberships (كانت مُتجاهلة سابقاً)
  • الملفات: class-bgm-branch-product-binding.php

🏖️ إصلاح نظام الإجازات الجماعية (Bulk Holiday Resumption)

  • إصلاح توقيت الانتهاء: الإجازة كانت تنتهي في صباح اليوم الأخير بسبب استخدام end_date <= today — تم تعديلها إلى end_date < today لضمان شمول اليوم بالكامل في الإجازة.
  • إصلاح فلترة الاستئناف: النظام كان يتجاهل فلتر “اللعبة” و”الجنس” عند استئناف العضويات، مما كان يسبب تداخلاً إذا كانت هناك عدة إجازات نشطة في نفس الفرع. تم توحيد فلاتر الاستئناف لتتطابق تماماً مع فلاتر الإيقاف.
  • إصلاح حالة العضوية بعد الاستئناف: العضويات كانت تتمدد بشكل صحيح لكن حالتها تظل “موقوفة مؤقتاً” لأن الكود كان يرسل الحالة wcm-active بدلاً من active لنظام العضويات. تم تصحيح الحالة لضمان تنشيط العضوية تلقائياً.
  • منع حلقة الإيقاف المفرغة: تعديل دورة الاستئناف لتغلق الإجازة في قاعدة البيانات قبل تنشيط العضويات، لمنع الدالة الحارسة (auto_pause_if_holiday_active) من إعادة إيقاف العضويات المجددة بشكل خاطئ في نفس اللحظة.
  • تأمين توافق الدالة الحارسة: إضافة فلتر التحقق من “اللعبة” (game_id) داخل الدالة الحارسة لمنعها من إيقاف اشتراكات جديدة في ألعاب غير مشمولة في الإجازة.
  • تنظيف بيانات ووكومرس: مسح بيانات التوقف المخفية (_pause_date و _paused_date) فور الاستئناف لضمان اختفاء رسالة (Paused since) من لوحة تحكم العضويات تماماً.

📨 إصلاح توجيه الإشعارات — الرسائل بتوصل لولي الأمر فقط بدل اللاعب وولي الأمر

  • المشكلة: بعض الإشعارات (الغياب، التأخير، الحضور، انتهاء الاشتراك…) كانت بتوصل لولي الأمر فقط رغم اختيار “اللاعب وولي الأمر” من الإعدادات.
  • السبب الجذري: القيم الافتراضية في كل مكان كانت 'parent' بدل 'both'.
  • الحل: تغيير كل القيم الافتراضية من 'parent' إلى 'both' في 5 ملفات رئيسية لتحديث القيم المبدئية عند التثبيت.
  • ⚠️ ملاحظة: بعد التحديث، يجب الدخول على صفحة إعدادات القوالب وتأكيد الحفظ لتحديث القيم بقاعدة البيانات.

🔄 إصلاح تمديد العضوية — التمديد بناءً على خطة العضوية بدل الـ Variation (Plan-Level Stacking)

  • المشكلة: لاعب عنده عضوية شهر فرع الشعلة لعمر 5 سنوات واشترى نفس العضوية لعمر 7 سنوات (variation مختلف بنفس الخطة) → النظام كان بيعمل SKIP ومش بيمدد العضوية لأنه بيشترط تطابق دقيق.
  • الحل: حذف الـ strict variation-level check واعتماد مطابقة على مستوى خطة العضوية (Membership Plan):
    • لو الخطة متطابقة → تمديد العضوية النشطة ✅
    • لو الخطة مختلفة (مثلاً شهر ← سنة) → لا يتم تمديد وWCM ينشئ عضوية جديدة ✅
  • الحماية لسه موجودة: Guard لنفس الطلب (يمنع مضاعفة المدة للمشتركين الجدد).

📅 إصلاح فلتر التاريخ الافتراضي في صفحة إدارة الطلبات

  • المشكلة: صفحة إدارة الطلبات بتظهر فلتر “هذا الشهر” كزر نشط (مُحدد)، لكن البيانات مش متفلترة فعلياً — لازم تضغط الزر مرة تانية عشان البيانات تتفلتر.
  • الحل: دمج التواريخ المحسوبة مع $_GET قبل إرسالها لضمان فلترة صحيحة تلقائياً عند الدخول.

📱 إصلاح رسالة “تم تحديث جدول التدريب” — كانت تتبعت عند كل شراء

  • المشكلة: رسالة واتساب “تم تحديث جدول التدريب” (schedule_assigned) كانت تتبعت لما لاعب يشترك أول مرة أو يجدد اشتراكه — مش بس لما الجدول يتحدث فعلياً.
  • الحل: تغيير $notify من true إلى false في assign_group_on_order(). الرسالة ستُرسل فقط عند تعديل الجدول يدوياً.

✨ تحسينات

📅 فلاتر سريعة بالتواريخ لصفحة إدارة الطلبات (Quick Date Filters)

  • الميزة: إضافة أزرار فلاتر سريعة في صفحة إدارة الطلبات لتسهيل التصفح حسب الفترة الزمنية (هذا الأسبوع، هذا الشهر، الشهر السابق، هذه السنة، السنة الماضية، الكل).
  • البطاقات (Stats Cards): تتحدث تلقائياً حسب الفلتر المحدد.

📱 منع تكرار الرسائل لنفس الرقم بصيغ مختلفة (Phone Deduplication)

  • المشكلة: لما رقم ولي الأمر ورقم اللاعب هما نفس الرقم بصيغ مختلفة (مثلاً 0564493555 و 966564493555)، النظام كان بيبعت رسالتين لنفس الشخص.
  • الحل: إضافة نظام تطبيع الأرقام (Phone Normalization) قبل الإرسال.

🔒 منع تسجيل حضور لاعب من فرع آخر (Cross-Branch Attendance Guard)

  • المشكلة: مدير فرع يقدر يكتب كود لاعب من فرع آخر ويسجل حضوره.
  • الحل: إضافة Guard يقارن user_branch بتاع اللاعب مع user_branch بتاع المدير — لو مختلفين يرجع رسالة خطأ واضحة.

Fixed

  • Critical Fix: Prevented duplicate session assignment when an order transitions multiple times. assign_on_order now checks an internal guard (_bgm_assigned_on_order) to ensure sessions and memberships are only assigned once per order.
  • Workflow Update: Removed woocommerce_order_status_processing hook for session allocation and membership assignment. Orders must now reach completed status to trigger QR codes, WhatsApp notifications, and session allocations.

الإصدار 1.3.5.2 — 2026-05-29

🐛 إصلاحات حرجة

🔄 إصلاح عدم تجديد العضوية عند إعادة شراء نفس الـ Variation

  • المشكلة: لما لاعب عنده عضوية منتهية يشتري نفس الاشتراك (نفس الـ Variation)، العضوية لا تتجدد — تفضل منتهية بتاريخ البدء والانتهاء القديم.
  • الحل: إعادة كتابة reactivate_expired_memberships بالكامل مع 6 طبقات مطابقة وتحديث الحالة عبر wp_update_post(post_status => 'wcm-active') مباشرة.

💾 إصلاح عدم حفظ إعدادات قوالب رسائل الإجازة

  • المشكلة: لما مدير الفروع يغير مستلم رسالة بداية/انتهاء الإجازة لـ “اللاعب وولي الأمر” ويحفظ، بعد تحديث الصفحة يرجع لـ “ولي الأمر فقط”.
  • الحل: إضافة القوالب المفقودة للـ save handler.

✨ تحسينات

🏖️ تحويل نظام الإجازات الجماعية إلى نظام per-branch (إجازات متعددة لكل فرع)

  • إجازات متعددة: كل فرع يقدر يكون عنده إجازة مستقلة في نفس الوقت بدون تعارض.
  • بانر الفرع: كل بانر إجازة أصبح يعرض اسم الفرع 🏢 بوضوح.
  • التغييرات التقنية: تحويل schedule_holiday() ليكون لكل فرع على حدة وتحديث دوال الإيقاف والاستئناف للتعامل مع هذا التغيير.

✨ ميزات جديدة

📱 قالب رسالة واتساب لتجديد الاشتراك (membership_renewed)

  • قالب جديد: رسالة تلقائية تُرسل عند تجديد اشتراك منتهي.
  • المتغيرات: {parent_name}, {child_name}, {branch_name}, {game_name}, {plan_name}, {new_end_date}.

🔒 إخفاء صفحة الاشتراكات التجريبية عند تعطيل الميزة

  • السلوك الجديد: صفحة “الاشتراكات التجريبية” تظهر فقط لو إعداد bgm_trial_subscription_enabled مفعّل من صفحة الفروع، وتختفي تماماً إذا كانت معطلة.

📅 تمديد العضوية النشطة عند إعادة الشراء (Early Renewal / Stacking)

  • السلوك الجديد: لو لاعب عنده عضوية نشطة واشترى نفس الاشتراك تاني → المدة الجديدة تتضاف على تاريخ الانتهاء الحالي (بدل ما يبدأ من اليوم).

🛡️ منع تكرار مدة العضوية عند الشراء لأول مرة (Double-Duration Guard)

  • المشكلة: عند شراء اشتراك لأول مرة، كان يكتشف Hook أن هذه عضوية قديمة ويضاعف المدة فيضيف شهرين بدل شهر.
  • الحل: إضافة Guard يقارن _order_id المحفوظ في العضوية مع رقم الأوردر الحالي لتخطي التمديد إذا كان متطابقاً.

الإصدار 1.3.5 — 2026-05-27

✨ ميزات جديدة

🏖️ نظام الإيقاف الجماعي للعضويات (Bulk Holiday Pause)

  • الميزة: إيقاف مؤقت جماعي لعضويات اللاعبين أثناء الإجازات الرسمية مع تمديد تلقائي عند الاستئناف.
  • فلاتر: اختيار فرع معين / لعبة معينة / جنس (بنين/بنات) أو كل اللاعبين.
  • خيار تضمين العضويات التجريبية: checkbox لتحديد هل العضويات التجريبية تتأثر بالإجازة أم لا.
  • استئناف تلقائي: عند انتهاء تاريخ الإجازة، الكرون يرجّع كل العضويات ويضيف أيام الإيقاف تلقائياً.
  • سجل الإيقافات: جدول يعرض كل الإيقافات (الجماعية والفردية) مع فلاتر وصفحات.

🛡️ حماية من التكرار (Deduplication Guards)

🔒 حماية 3 طبقات لرسائل الإجازة

  • الطبقة 1: GET_LOCK (MySQL) — يمنع تشغيل الإيقاف/الاستئناف مرتين في نفس اللحظة.
  • الطبقة 2: post_meta (_bgm_holiday_pause_notified / _bgm_holiday_resume_notified).
  • الطبقة 3: notification_log — شبكة أمان إضافية لنفس اليوم.

الإصدار 1.3.4 — 2026-05-19

✨ ميزات جديدة

⏰ نظام تنبيه اقتراب انتهاء الاشتراك (Expiry Reminder)

  • الميزة: إرسال رسالة واتساب تلقائية لأولياء الأمور/اللاعبين قبل انتهاء الاشتراك بعدد أيام محدد.
  • إعدادات مدير الفروع: مفتاح تفعيل/إيقاف الميزة، وتحديد عدد الأيام.
  • قالب رسالة جديد (expiry_reminder): يدعم تحديد المستلم ومتغير جديد {days_remaining} لعدد الأيام المتبقية.
  • كرون يومي (bgm_check_expiry_reminders): مسجّل في إدارة الكرون للتشغيل التلقائي كل صباح.

🛡️ حماية من التكرار (Deduplication Guards)

🔒 حماية 3 طبقات لرسالة اقتراب الانتهاء

  • الطبقة 1: GET_LOCK (MySQL).
  • الطبقة 2: post_meta (_bgm_expiry_reminder_sent) على العضوية.
  • الطبقة 3: notification_log.

🔒 حماية رسالة انتهاء واستئناف العضوية

  • تخزين تاريخ الإرسال في post_meta لتجنب إرسال الإشعار أكثر من مرة حتى لو تفعل Hook الووكومرس عدة مرات.

🐛 إصلاحات

🔄 إصلاح عدم تفعيل العضوية عند إعادة شراء نفس المنتج (Membership Renewal Fix)

  • المشكلة: لما العضوية تنتهي (expired) واللاعب يشتري نفس الـ Variation تاني، العضوية مش بتتفعل — المدة بتتضاف بس.
  • الحل: تم حلها من خلال كلاس تجديد ذكي يعالج العضويات المنتهية بتفعيلها مباشرة ويقوم بتمديد العضويات النشطة بإضافة المدة على نهايتها المجدولة.

الإصدار 1.3.3 — 2026-05-13

🔧 تحسينات تقنية

⚠️ كشف اللاعبين بدون عضوية (No-Membership Detection)

  • المشكلة: صفحة التحضير تعرض 93 لاعب بينما صفحة إدارة العضويات تعرض 88 فقط (لاعبين بفرع بدون عضوية مسجلة).
  • الحل: إضافة تنبيه في صفحة التحضير وكارت في صفحة الإدارة يعرضان عدد اللاعبين بدون عضوية مع قائمة بتفاصيلهم لتسوية أمورهم.

🧾 عرض الكوبون والخصم في الفاتورة (Invoice Coupon Display)

  • المشكلة: الفاتورة كانت تعرض فقط “المجموع الفرعي” و”الإجمالي” بدون توضيح الكوبون.
  • الحل: إضافة عرض تفصيلي للكوبونات في قسم الإجمالي (اسم الكوبون وقيمته).

⏱️ تمديد تلقائي للعضوية عند الاستئناف (Auto-Extend on Resume)

  • الخيار: toggle جديد في صفحة /bm-branches/ لتمكين التمديد التلقائي لانتهاء الاشتراك بحسب الأيام التي توقف فيها اللاعب.

▶️ رسالة واتساب عند استئناف العضوية (Membership Resume Notification)

  • قالب جديد: membership_resumed يتم الإرسال تلقائياً عند الاستئناف مع تمديد (لو خيار التمديد مفعل).

📨 خيار إشعارات الغياب/التأخير للعضويات الموقوفة

  • الخيار: إمكانية تشغيل أو إيقاف إرسال رسائل الغياب والتأخير للاعبين الموقوفين عبر الواجهة الخاصة لمدير الفروع.

الإصدار 1.3.2 — 2026-04-30

✨ ميزات وتحسينات جديدة

👔 إضافة موظفين من حساب مدیر الفروع (bm-staff)

  • زر إضافة جديد في حساب مدير الفروع لتسجيل الموظفين والمديرين والمدربين من الواجهة مباشرة.

🆓 دمج الاشتراكات التجريبية في صفحة إدارة العضويات

  • رؤية موحدة: ظهور الاشتراكات التجريبية جنباً إلى جنب مع العضويات المدفوعة في صفحة إدارة العضويات، مع أزرار للتحويل التلقائي لدفع.

🔧 تحسينات تقنية

🧾 توحيد كود الفواتير (Invoice Consolidation)

  • ملف مركزي جديد: class-bgm-invoice.php كمرجع موحد لجميع عمليات الفواتير بدلاً من التكرار السابق مما يقلل الكود بـ 900 سطر تقريباً.

🔧 تحسينات UX

📥 تصدير المصروفات CSV

  • ميزة جديدة: إضافة زر “تصدير CSV” في قسم المصروفات بلوحة الإيرادات يدعم جميع الفلاتر المتواجدة.

📋 عداد حالة القوالب

  • ميزة جديدة: شريط حالة أعلى القوالب يعرض المعبأ والفارغ بتلوين ديناميكي لتنبيه الإدارة للرسائل الناقصة.

📨 إضافة “إرسال إلى” لقوالب التجربة

  • التحسين: إضافة dropdown “إرسال إلى” (ولي الأمر / اللاعب / كلاهما) لكل قالب تجريبي.

🐛 إصلاحات

🔧 إصلاح القوالب الافتراضية الفارغة

  • المشكلة: 8 قوالب رسائل كانت تظهر فارغة في صفحة الإعدادات بعد الحفظ بدون تعبئة.
  • الحل: إصلاح استدعاء الإعدادات الافتراضية بحيث لو تم حفظها فارغة، ستستخدم النص الافتراضي بدلاً من اللاشيء.

✋ تأكيد حصص السماح قبل التحضير (Grace Session Confirmation)

  • السلوك القديم: عند تحضير لاعب اشتراكه منتهي وعنده حصص سماح، النظام يحضّره تلقائياً بدون سؤال.
  • السلوك الجديد: يظهر رسالة تأكيد توضح أن الاشتراك منتهي وعدد حصص السماح المتبقية لتنبيه المدرب/الإداري قبل التسجيل.

🔁 إصلاح إنشاء عضوية تجريبية مزدوجة

  • المشكلة: اشتراك اللاعب في التجربة كان ينتج عنه إنشاء عضويتين (تلقائية ويدوية).
  • الحل: حذف الفلاتر المانعة وتطوير “أداة تصحيح مسار” تقوم بتعديل العضوية التلقائية التي ينشئها النظام لتتوافق مع نظام التجربة المجانية بدلاً من إنشاء واحدة إضافية.

⏰ إصلاح التوقيت الخاطئ في عرض حضور الموظفين واللاعبين

  • المشكلة: وقت تسجيل الحضور كان يظهر بفارق ساعات بسبب التوقيتات المحلية (UTC+3).
  • الحل: عرض الوقت المخزن مباشرة بدون تحويل، وإضافة gmt=true لدوال الوقت.

🚫 منع الحضور للاعبين بدون عضوية نشطة

  • المشكلة: النظام كان يسمح بتسجيل حضور لاعبين ليس لديهم أي عضوية ووكومرس.
  • الحل: إضافة فحص جذري في جميع مسارات الحضور ليمنع أي تفاعل إذا لم يملك العميل أي اشتراك.

🔁 إصلاح إرسال رسائل التأخير والغياب مكررة

  • المشكلة: رسائل “تنبيه غياب” و”تنبيه تأخير” كانت تتبعت مرتين لنفس اللاعب بسبب تداخل في (Race Condition).
  • الحل: إضافة قفل تزامن (MySQL Concurrency Lock) لمنع التداخل تماماً.

🛒 استقرار جلسة دفع متجر ووكومرس (Checkout Session Stability)

  • المشكلة: ظهور تنبيه خطأ وهمي “لقد انتهت صلاحية جلستك” لبضع ثوانٍ بعد الدفع.
  • الحل: حقن كود JS في الخلفية لحجب الإشعارات الوهمية أثناء المعالجة وحفظ حالة الجلسة عبر جميع بوابات الدفع.

🔒 تحسينات أمنية واستقرار النظام

  • تأمين واجهات لوحة تحكم اللاعب: حماية تمنع الإداريين من التصفح الخطأ داخل ملفات العميل، وربط التوجيه التلقائي للمسار المناسب لدور الإداري.
  • تنظيف السلات عند التبديل الآمن: تفريغ السلة آلياً بمجرد عمل تسجيل الانصراف للمدير لعدم تداخل المنتجات.

الإصدار 1.3.1 — 2026-04-20

✨ ميزات جديدة

🆓 نظام الاشتراك التجريبي (Trial Subscription)

  • اشتراك تجريبي مجاني لمدة أسبوع: يمكن للاعبين تجربة الخدمة لمدة 7 أيام قبل الشراء، قابلة للتفعيل والإيقاف من مدير الفروع.
  • زر التجريبي على صفحة المنتج: يظهر تلقائياً للمستخدمين ويختفي إن سبق لهم الاستخدام.
  • تسجيل تلقائي كامل عند بدء التجربة: توليد كود QR وحجز المجموعة فوراً.

📋 صفحة إدارة التجارب (manage-trials)

  • صفحة جديدة لعرض وإدارة الاشتراكات التجريبية تتضمن الإحصائيات وفلترة القسم/الجنس والتحويل السريع لاشتراك مدفوع.

💰 بوابات دفع جديدة (كاش / شبكة)

  • بوابتا دفع مخصصتان للإداريين فقط — لا تظهر للعملاء العاديين لمساعدتهم في إنشاء الطلبات النقدية بسرعة.

✉️ قوالب رسائل تجريبية

  • 3 قوالب جديدة: (بدء الاشتراك التجريبي، حضور بعد انتهاء التجربة، انتهاء الفترة التجريبية) مدعومة بكرون يومي للمتابعة الآلية.

🗃️ بنية البيانات

  • جدول جديد bgm_trial_subscriptions وعمود جديد لتمييز حصص التجربة والسماح.

🔧 تحسينات تقنية

  • تقسيم ملف class-bgm-branch-manager-account.php: تم تجزئة الملف الضخم (أكثر من 12 ألف سطر) إلى 7 ملفات Traits مخصصة لتسهيل التطوير والصيانة وسرعة الأداء.

الإصدار 1.3.0 — 2026-04-10

✨ ميزات جديدة

🗑️ إدارة المستخدمين (حذف اللاعبين) لمدير الفروع

  • صفحة جديدة (bm-users): تبويب جديد يعرض حسابات اللاعبين مع نظام فلاتر.
  • حذف آمن مع تأكيد برقم الجوال: نافذة تأكيد تطلب إدخال رقم الجوال للتأكد قبل الحذف النهائي وتوثيق العملية في سجل الأنشطة (Activity Log).

🔒 تحسينات أمنية

  • إخفاء جميع صفحات الإضافة عند عدم تفعيل الرخصة: لحماية المحتوى وضمان قانونية الاستخدام.
  • حاجز حماية WooCommerce: إصلاح مشكلة ظهور الأخطاء القاتلة في حالة فتح تبويب الكوبونات وإضافة المتجر غير مفعلة.

📥 تصدير البيانات

  • تصدير العضويات (CSV): إضافة خيار لتصدير البيانات من الواجهة الأمامية مع فلاتر كاملة، وخيار لحجب أرقام التليفونات للحفاظ على الخصوصية.
  • تحسين تصدير الإيرادات (CSV): خيارات تصدير ذكية تتيح تحميل الصفحة الحالية أو جميع الصفحات التي تنطبق عليها شروط البحث.

الإصدار 1.2.9 — 2026-04-02

🔄 ترقية WAWP WhatsApp API إلى v2

  • ترقية Base URL والتوجيهات: الترقية لنظام الـ V2 الحديث بالكامل وتغيير مسارات إرسال النص والصور.
  • إرسال الصور بـ JSON Body: تطوير النظام لكشف نوع المرفق وتحويل الإرسال إلى بودي كامل بدلاً من معلمات الاستعلام.
  • Migration تلقائي للإعدادات: النظام يقوم بتحديث روابط الواتساب للإدارات السابقة تلقائياً بدون تدخل يدوي.

الإصدار 1.2.8 — 2026-03-28

✨ ميزات جديدة

🏆 نظام نقاط الولاء والمكافآت التلقائي (Loyalty System)

  • نظام مكافآت مرن مبني على مسارين (التجديدات أو الحضور): يمنح النقاط تلقائياً بناءً على الحضور الفعلي أو تجديد الاشتراك مع كوبونات مجزية.
  • لوحة تحكم متكاملة لمدير الفرع (bm-loyalty): تتيح التحكم بالتسعير، مدة الصلاحية، متابعة سجل الحركات، والخصم والإضافة اليدوية.
  • إشعار الواتساب التلقائي: إرسال رسالة تبريكات وكود الكوبون للاعب تلقائياً عند استحقاق الجائزة.

✉️ قوالب الرسائل لمدير الفرع (Message Templates)

  • إدارة كاملة من حساب فرونت إند: مدير الفرع لم يعد بحاجة لدخول لوحة التحكم (Dashboard) لتهيئة قوالب الفرع.

🧾 إدارة الضرائب (Tax Management)

  • تبويب جديد للضرائب (bm-taxes): يتيح للإدارة تفعيل الضرائب وتحديد نسبتها ليتم تطبيقها بسلاسة على كافة التعاملات داخل الفرع.

🎟️ كوبونات الخصم لطلبات الفرع الأمامية (Frontend Coupons)

  • إضافة حقل الكوبون: يمكن لمديري الفروع الآن إدخال كود خصم عند إنشاء طلب جديد وتطبيقه على النظام آلياً.

🌐 الإعدادات الأساسية الشاملة لنظام الولاء

  • استخدام الإعدادات العامة: يمكن ربط إعدادات أي فرع بالإعدادات الرئيسية الموحدة عبر لوحة تحكم مدير الفروع لمنع التعارض.

🛠️ تحسينات وإصلاحات

  • الصفحات الفارغة: إصلاح خلل بناء الروابط الذي كان يتسبب بظهور شاشات فارغة للمسارات الجديدة.
  • استبعاد الإداريين ومديري الفروع من سجل إحصائيات الولاء الخاص باللاعبين.

الإصدار 1.2.7 — 2026-03-22

✨ ميزات جديدة

⚙️ إعدادات حصص السماح (Grace Sessions)

  • إعداد جديد في صفحة الفروع لتشغيل أو إيقاف السماح وتحديد عددها المسموح به.

✉️ توقيع المرسل على الرسائل (Message Signature)

  • إعداد جديد لختم الرسائل اليدوية تلقائياً باسم الإداري ودوره الوظيفي لتعزيز مصداقية التواصل.

👨‍🏫 صلاحية تحضير اللاعبين للمدربين (Coach Attendance)

  • يمكن الآن من صفحة الموظفين تفعيل أو سحب صلاحية “التحضير” للمدربين.

🐛 إصلاحات وتحديثات (تحديثات الواجهة الدقيقة)

  • تحسين واجهة إعدادات الإضافة لحصص السماح: إضافة زر تفعيل/إيقاف صريح يعكس حالة الخاصية الفعلية.
  • تقييد وتحسين واجهة التحضير للمدربين: ربط صلاحية المدرب بمجموعاته المسندة إليه فقط لحفظ الخصوصية وتسهيل التحضير.

الإصدار 1.2.6 — 2026-03-20

🐛 إصلاحات

🔔 إرسال الإشعارات حسب اللعبة لمدير الفرع

  • المشكلة: إرسال إشعار حسب اللعبة كان يصل للجميع في الفروع الأخرى.
  • الحل: تقييد الاستعلام بالفرع الخاص بمدير الفرع فقط.

🔍 محرك البحث وعرض الجدول في صفحة إدارة العضويات

  • إصلاح الجداول الفارغة الناتجة عن أخطاء الجافاسكريبت وتعديل حالة البحث لتشمل اللاعبين من الفروع بصيغة صحيحة.

📊 بطاقات الإحصائيات في الداشبورد (Admin Dashboard)

  • ربط البيانات المسترجعة بالأيديهات الصحيحة وعرض عدد العضويات الموقوفة ضمن الإحصائيات العلوية.

🎮 الألعاب في إنشاء المجموعة و 🏟️ تحميل المرافق

  • دمج الألعاب من مصادر متعددة لعدم اختفائها، وإعطاء إداري الفرع صلاحيات سحب المرافق.

✨ تحسينات

🔀 حقل الـ Variation في بوب-اب “طلب جديد”

  • الميزة: السماح بظهور واختيار الـ Variations للمنتجات المتغيرة من واجهة الإداري بشكل مبسط ومفلتر لفرعه فقط.

🐛 إصلاحات (تحديث ما بعد الإصدار)

  • قسم رسائل الموظفين: إظهاره بالفرونت إند وإصلاح عدم ظهور المنتجات غير المرتبطة بالفرع.
  • إضافة مرفق للمصروفات: السماح برفع مستندات مرفقة (صور أو PDF) للمصروفات مع حمايتها من التعديل لغير مدير الفروع بعد إتمام اليوم.

🐛 إصلاحات (أخرى)

  • ظهور المنتجات غير المرتبطة بفرع: المنتجات كالأطقم الرياضية ستظهر بالطلبات كحالة احتياطية باستخدام فرع اللاعب الفعلي.
  • إيقاف إرسال الـ QR كود ورسائل الاشتراك للطلبات التي لا تحوي ربطاً بلعبة (مثل الملابس الرياضية).

الإصدار 1.2.5 — 2026-03-14

🐛 إصلاحات

⏰ استناد وقت رسالة الانصراف إلى توقيت الجدول

  • تم تعديل الجدولة للاستناد إلى الموعد الافتراضي للمجموعة لضمان حساب دقيق لمدة إرسال رسالة الانصراف.

👥 حقوق “إداري الفرع” في تعديل العضويات

  • إصلاح خطأ التصاريح الذي كان يمنع الإداري من إدارة التواريخ وإيقاف العضويات.

✨ تحسينات

🏷️ فلتر خطط العضوية حسب الفرع

  • الفلاتر الآن تقتصر على خطط العضوية الخاصة بفرع المدير لتجنب التكدس غير المجدي للبيانات.

🧾 فواتير BGM في صفحة “طلباتي” للعميل

  • استبدال الفواتير الافتراضية للعميل بفواتير BGM المخصصة القابلة للتحميل بضغطة زر.

👥 تطوير صفحة إدارة اللاعبين في الداشبورد

  • إضافة أعمدة لعدد الفروع، الألعاب والمجموعات مع القدرة على إدارة الألعاب وحذفها ودمج اللاعب بمجموعات مختلفة عبر نوافذ مبسطة.

⏰ تنبيه انتهاء الاشتراك (Expired Subscription Overlay)

  • عرض تذكير لوني على شكل غطاء (Overlay) يظهر بالفرونت إند للاعب إن انتهى اشتراكه، مع القدرة على إغلاقه لليوم الحالي.

🚫 منتجات متعارضة (Incompatible Products)

  • تحديد المنتجات التي لا يمكن شراؤها سويةً في نفس السلة لضمان عدم حدوث أخطاء محاسبية.

الإصدار 1.2.4 — 2026-03-07

🐛 إصلاحات

  • 🔒 user_branch يُكتب فوقه: تعديل النظام ليعين فرع اللاعب مرة واحدة فقط ولا يستبدله عند شرائه لمنتج جديد في فرع آخر.
  • ⚡ AJAX handlers مكررة لـ pause/resume: حذف التكرار لمنع تعارض الأكواد وحل مشكلة الخطأ في تحضير المشتركين متعددي الفروع.
  • 🏢 إصلاح جذري للاعب المشترك في فرعين: ضمان ظهوره المستقل بسجلات كلا الفرعين دون أن يُلغي فرعه الأساسي الأول عبر جميع الصفحات وميزة الإرسال الجماعي.
  • 🎮 إصلاح صفحة “جدولي وألعابي”: القضاء على التكرار الوهمي وجلب أسماء المجموعات بدقة من المصدر.
  • ⏰ إصلاح جذري لتنبيه الانتهاء: الاعتماد المباشر على حالة عضوية الووكومرس لتأمين ظهور التنبيهات بالشكل السليم.

الإصدار 1.2.3 — 2026-02-21

🐛 إصلاحات

🧾 إصلاح أزرار تنزيل الفاتورة (تظهر “0” أو تفتح بدل التنزيل)

  • المشكلة: زر تنزيل PDF كان يُخرج صفحات فارغة (“0”) ببعض المتصفحات لعدم تمرير رموز الأمان لبلجنات الـ PDF.
  • الحل: تم استبدال المحرك بالمولد الداخلي للنظام وإضافة الـ header الصحيح Content-Disposition: attachment للإجبار على التحميل.

🗂️ إصلاح بيانات المجموعة واللعبة في الفاتورة

  • المشكلة: كانت الفاتورة تعرض جميع ألعاب اللاعب.
  • الحل: الفاتورة الآن تقرأ فقط اللعبة والمجموعة الخاصة بالطلب الفردي نفسه.

🔒 تحسينات الترخيص

  • إخفاء صفحات المجموعات والملاعب والإيرادات عند انتهاء الترخيص: إغلاق الصفحات وحجب المسارات عن مديري الفروع والمسؤولين لإلزام التجديد وإظهار رسائل “معلق”.

🐛 إصلاحات أخرى

  • 📦 اسم المنتج في الفاتورة: القضاء على أكواد HTML الظاهرة باسم المنتج واستبدالها بالصيغة المقروءة.
  • 📱 رسالة QR عند الاشتراك: تعديل لتظهر بيانات لعبة الاشتراك الحديث فقط بدلاً من جمع كافة بطاقاته السابقة، وإضافة قالب مستقل يخص إعادة إرسال الكود للعميل.
  • ⏰ رسائل التأخير والغياب لا تُرسل يوم الجمعة: شمول كافة أيام الأسبوع بالكرون الافتراضي لحل مشكلة التوقف أيام الجمعة.
  • 📅 الأيام المقررة في “حضوري”: إصلاح لتظهر كافة عدد الأيام المجدولة للاعب الممتلك لاشتراكات متعددة ودمجها ببطاقة واحدة.
  • 📊 عمود “المتوقع الكلي”: توسيع حساب العمود ليغطي كامل أيام الشهر بدلاً من اقتصاره على الأيام المنقضية فقط.

✨ تحسينات

📊 أعمدة إضافية في سجل حضور اللاعبين لمدير الفروع

  • الميزة: 4 أعمدة جديدة يمكن تشغيلها (المتوقع الكلي، الألعاب، الفروع، نسبة الكل) مبنية باستعلام سريع لا يؤثر على الأداء.

🧾 تحسين الفواتير (Invoice Enhancement)

  • الفواتير المطبوعة أصبحت تعرض 12 حقلاً تفصيلياً مع تصميم حديث للبطاقات، وتسمية ملف الـ PDF برمز العميل والشهر.

الإصدار 1.2.2 — 2026-02-17

🐛 إصلاحات

  • إصلاح حماية المصروفات: ضبط المقارنات الزمنية لتواريخ السيرفر ليتمكن مدير الفرع من تعديل المصروفات قبل انتهاء اليوم دون مشاكل.
  • إصلاح نسبة الحضور في صفحة “حضوري”: شمول حصص السماح لضبط عداد النسبة بدلاً من إخراج “0%”.
  • إحصائيات بطاقات حضور اللاعبين لمدير الفروع: حساب مباشر للبطاقات العلوية من نفس الاستعلام لحل مشكلة التصفير.

✨ تحسينات

فلترة المصروفات حسب القسم (بنين / بنات)

  • مدير الفرع يمكنه الآن توجيه مصروفاته لقسم (بنات/بنين) لتصفية وعرض الأرباح والمصروفات حسب مسؤولياته بشكل منفصل ودقيق.

عرض الملاعب مجمعة بالفرع لمدير الفروع

  • تصنيف ملاعب الفروع داخل الفلاتر بأسماء الفروع الأساسية لتسهيل الاختيار.

🔒 قفل المصروفات (Expense Lock)

  • منع تعديل أو حذف مصروفات الأيام السابقة (يُفتح فقط لمدير الفروع للإدارة العليا).

✏️ تعديل المصروفات (Expense Edit)

  • إضافة نافذة تعديل للمصروفات مع تسجيل وحفظ عبر تقنية الـ AJAX.

الإصدار 1.2.1 — 2026-02-12

🐛 إصلاحات

  • 🔒 user_branch يُكتب فوقه عند كل شراء جديد: إصلاح أولوية تعيين الفرع ليظل الأول هو الأساس.
  • ⚡ AJAX handlers مكررة لـ pause/resume: حصر الاستعلام بملف واحد لعدم تعارض التفعيل للمستخدمين ذوي الفروع المتعددة.
  • 🧾 فواتير BGM في صفحة “طلباتي” للعميل: توفير الفواتير الخاصة بالنظام بدلاً من البدائل المعطلة.
  • 🔍 قائمة العضويات تُظهر لاعبين من كل الفروع: إصلاح تسريب البيانات بين الفروع وحصر الرؤية لكل مدير على فرعه.

✨ ميزات جديدة وتحسينات (إجازات الموظفين)

  • خيار احتساب الإجازة كحضور: مدير الفرع يمكنه تسجيل إجازة موظف واعتبارها كحضور مدفوع لكي لا تؤثر على نسبة التزامه الشهري، مع إضافة تبويب مستقل للإجازات.

🐛 إصلاحات وتعديلات أخرى

  • المصروفات لا تتفلتر بالتاريخ: ربط فلاتر المصروفات بفلاتر الإيرادات ليتزامنا ويتم استخراج الصافي الفعلي.
  • إصلاح سجلات وتقارير الموظفين: تحسين التصميم لعرض أربع أعمدة (الحضور، المتوقع، الغياب، النسبة).
  • إصلاح نظام التحديثات للإضافة: تبديل صيغة الإرسال إلى JSON لضمان استقبال لوحة تحكم ووردبريس للتحديثات بسلاسة.

الإصدار 1.2.0 — 2026-02-05

🐛 إصلاح حرج — جدول الأوردرات في صفحة الإيرادات (/payments) يعرض أوردرات من كل الفروع

  • المشكلة: الجدول كان يعرض أوردرات من جميع الفروع لمدير الفرع، رغم أن العدد في البطاقات كان صحيحاً.
  • الحل: إزالة شرط user_branch من الـ OR، والاعتماد فقط على _bgm_order_branch في الـ order meta.
  • (تم تطبيق تحديثات الفلترة الزمنية لضمان استقرار أرقام الإيرادات والمصروفات وصافي الربح وعملها على نفس المدة الزمنية).

الإصدار 1.1.9 — 2026-01-24

🐛 إصلاح — فلترة التاريخ في صفحة الإيرادات (/payments)

  • الإصلاح: التاريخ الافتراضي عند التحميل أصبح أول الشهر الحالي ← اليوم لضمان تطبيق الفلتر من أول لحظة.

✨ ميزة جديدة — أزرار فلتر سريع للتاريخ

  • إضافة شريط أزرار علوي يتيح اختيار (الشهر الحالي، الشهر السابق، آخر 7 أيام، هذه السنة، الكل) بضغطة زر.

الإصدار 1.1.8 — 2026-01-08

🐛 إصلاحات حرجة — صفحة الإيرادات (/payments) لمدير الفرع

  • إصلاح ظهور أوردرات كل الفروع بدل فرع المدير فقط: تعديل استعلام الطلبات ليقيد النتائج بناءً على فرع الإدارة.
  • إصلاح تحقق HPOS: اعتماد دالة التحقق الرسمية لمعرفة استقرار قاعدة طلبات ووكومرس.
  • إصلاح حساب إجمالي المبلغ مع HPOS: استخدام استعلام مباشر متوافق مع كافة حالات بناء قواعد البيانات.

الإصدار 1.1.7 — 2025-12-22

🔧 إصلاحات

  • إصلاح إيرادات صفحة الإيرادات والمصروفات (حرج): حل مشكلة جلب الإيرادات الخاطئة وتوحيدها عبر تغيير منطق المعالجة بـ per-player iteration.

✨ تحسينات

  • 🔄 دعم Changelog والأيقون في التحديثات: ظهور شعار وسجل التحديثات ضمن ووردبريس بشكل أنيق.
  • 📋 بطاقات حالة الاشتراكات: بطاقات مضافة للمتابعة (نشطة / على وشك الانتهاء / منتهية).
  • 💰📄 تقرير PDF محسّن: التقرير بات يحوي الموازنات المالية للإدارة (إيراد ومصروف وصافي) بالإضافة لزر تحميل سريع.

الإصدار 1.1.6 — 2025-12-05

✨ ميزات جديدة

📤 نظام المصروفات (Expenses)

  • قسم جديد بصفحة الإيرادات يدعم تسجيل المصروفات بأنواعها (رواتب، إيجارات، أخرى) وربطها إما بفرع معين أو “مصروفات عامة للأكاديمية”.

📈 بطاقة صافي الربح و 📋 أعمدة جديدة

  • إضافة بطاقة توضح حصيلة الإيراد مخصوم منه المصروف مع إضافة كود اللاعب والملعب وطريقة الدفع لجدول الإيرادات.

📊 تقارير مدير الفروع (أُعيدت بناؤها بالكامل)

  • إتاحة رؤية شاملة للمدير العالي لمراقبة الحضور اليومي والغياب والأرباح لأي فرع مع تنبيهات بأكثر اللاعبين التزاماً.

🔧 إصلاحات

  • إصلاح حساب الإيرادات (حرج): تعديل جلب الأموال عبر Date range filtering.
  • الصلاحيات: تحديد قدرة مدير الفرع على استعراض مصاريف وأموال فرعه فقط وفتح الصلاحيات المطلقة لمدير الفروع.

الإصدار 1.1.5 — 2025-11-18

🔥 إصلاحات حرجة

  • إصلاح رسائل التأخير والغياب: إلغاء نظام (Event-Driven) والاستعاضة عنه بنظام تتابع ثابت (Polling) كل 5 دقائق لضمان استقرار إرسال إشعارات التغيب عبر الكرون.
  • إصلاح متغيرات القوالب: حل مشكلة ظهور الأقواس الفارغة (كـ {group_name}) وإتاحتها ضمن كافة الإشعارات.

✨ ميزات جديدة

  • مدير الفرع يمكنه إنشاء مجموعات: فتح صلاحية الإنشاء للإداريين المباشرين لفرعهم.
  • تسجيل اللاعب تلقائياً في player_games: أتمتة الإضافة للمجموعة بدون تكرار الحفظ.
  • صفحة تشخيص الإشعارات: إضافة شورت كود [bgm_debug_notifications] لاستعراض حالة إرسال الرسائل للمشتركين وأسباب تعثرها.

الإصدار 1.1.4 — 2025-11-01

✨ ميزات جديدة

🏟️ إدارة الملاعب (Facilities)

  • جدولة وربط الصالات والملاعب بـ المجموعات لضمان عدم وجود حجز مزدوج لنفس الملعب ونفس الوقت، وتوفير شورت كود لاسم الملعب للرسائل.

🔑 Cron Ping URL

  • توفير رابط مباشر لتشغيل الكرون عبر Cpanel لضمان استقرار التنبيهات الدورية.

الإصدار 1.1.3 — 2025-10-15

✨ ميزات جديدة

  • 📅 نظام جدولة Event-Driven للإشعارات: بناء جدولة ذكية للرسائل مبنية على توقيت التدريب ومقدار التأخير المسموح به. (تم استبدالها لاحقاً لضمان الاستقرار).

🔧 إصلاحات

  • ⏰ إصلاح مشكلة تكرار وغياب الإشعارات: ضبط أقفال المهام (Transient Locks) لضمان عدم إرسال تنبيهين لنفس اللاعب باليوم.

الإصدار 1.1.2 — 2025-09-28

✨ ميزات جديدة

  • 💰 صفحة الإيرادات (جديدة): طرح لوحة الإيرادات وتصدير الـ CSV مع توفير فلاتر مجمعة لكل عناصر الفرع.

🐛 إصلاحات

  • إصلاح حرج: رسالة الغياب لا تُرسَل بعد رسالة التأخير: تصحيح قراءة سجلات الرسائل الفاشلة وتجاوزها لتستمر المحاولات.

الإصدار 1.1.1 — 2025-09-10

🐛 إصلاحات

  • إصلاح خطأ 404 بعد التحديث: تأجيل إعادة بناء الروابط لنهاية التحميلات.
  • منع نقل لاعب لمجموعة جنس مختلف: فلترة قوية تمنع اختلاط مجموعات البنين مع البنات في القوائم المنسدلة وعمليات الإضافة.

✨ تحسينات

  • إنشاء حسابات مدربين: القدرة على إضافة مدرب من الفرونت إند.
  • الجنس في الـ Variations: ربط تحديد الجنس بخيارات ووكومرس لفرز العميل فور الدفع.
  • بوب اب ولي الأمر عند إتمام الطلب: نافذة تطلب بيانات الوالد الإجبارية قبل تمرير الدفع.

الإصدار 1.1.0 — 2025-08-25

✨ نظام المجموعات التدريبية (Training Groups)

  • إدارة المجموعات: تقسيم الألعاب لمجموعات مقيدة بالزمن والفرع والجنس بمدرب خاص.
  • WooCommerce Integration: الربط التام للمجموعات باختيارات الدفع للجدولة الذاتية للمواعيد.
  • تحديث الجدول: تعديل مواعيد المجموعة يرسل رسائل تعديل للأعضاء تلقائياً ويحدث التقارير.

🏋️ دور المدرب (Coach) — جديد

  • تخصيص حساب بصلاحيات للقراءة فقط واستعراض “مجموعاتي” و”حضوري” مع نافذة لمراسلة اللاعبين.

🐛 إصلاحات

  • حل مشكلة حذف المجموعات عند حفظ الجدول وضبط الفلاتر لمراعاة الجنسيات الصحيحة بالمنظومة.

الإصدار 1.0.9 — 2025-08-01

✨ ميزات جديدة

  • 💰 صفحة الإيرادات (Revenue Page): تدشين الإصدار الأولي من التقارير المالية.
  • 📋 سجل حضور الموظفين لمدير الفروع: لوحة تحكم تضمن استعراض دقيق لأيام الغياب والالتزام.
  • 🔑 صفحة الرخصة لمدير الفروع: لمتابعة تفعيل الإضافة وصلاحيتها.

الإصدار 1.0.8 — 2025-07-12

🚀 تحديثات النظام (Remote Updates)

  • التحديث التلقائي للإضافة: توفير القدرة على التحديث المباشر من لوحة ووردبريس.

⚙️ إصلاحات المهام المجدولة (Cron)

  • إضافة وضع لحظي: سرعة فحص (30 ثانية) لتلبية حاجات الفروع المكتظة، مع إصلاح أخطاء الانصراف التلقائي.

🐛 إصلاحات أخرى

  • عدم احتساب الغياب فورياً للمشترك وانتظار انتهاء المهلة، ودمج اسم اللعبة برسائل التأخر.

الإصدار 1.0.7 — 2025-06-22

🔐 نظام الرخصة الجديد (Server-Based License)

  • حجب وتفعيل الإضافة والصفحات بناءً على الترخيص المركزي (Server-Based License) مع فحص يومي.

🛡 تكامل البيانات وإصلاحات

  • إصلاح قاعدة البيانات: تدارك نقص أعمدة is_grace_session وتحديثها آلياً.
  • مزامنة الإحصائيات: حذف الكاشات فوراً عند الحضور، وتطبيق الانصراف التلقائي بأوقات الراحة.

الإصدار 1.0.6 — 2025-06-02

🚀 ميزات جديدة

  • 🎮 تغيير اللعبة للاعب و ⚧ تعديل الجنس: توفير واجهات تعديل سريعة للمدراء.
  • ✅ التحضير اليدوي: مساواة نظام التحضير اليدوي بكاميرا الـ QR لتوفير رسائل التحذير وفحص العضويات المتوقفة.
  • 👤 بوب أب بيانات ولي الأمر: ربطه بإكمال طلبات ووكومرس لضمان جمع البيانات.

الإصدار 1.0.5 — 2025-05-15

🚀 ميزات جديدة

  • 👥 نظام حضور وانصراف الموظفين: تحديد عطلات خاصة لكل موظف لعدم إلحاق الضرر بنسبة التزامه.
  • ⏰ نظام الجدولة والإشعارات الذكية: طرح رسائل الواتساب للتأخير والانصراف الذاتي.

الإصدار 1.0.4 — 2025-04-25

🆕 دور مدير الفروع (branches_manager) — جديد بالكامل

  • إدارة عليا متكاملة: حساب فرونت إند بصلاحيات شاملة لكل الفروع يشمل إيقاف اللاعبين وتهيئة أرقام واتساب منفصلة لكل فرع ومراقبة الإيرادات وحظر واجهات الووكومرس المعقدة.

✨ ميزات جديدة

  • 🎫 صفحة إدارة العضويات و 🛒 إدارة الطلبات: واجهات مستخدم مخصصة بالكامل تغني المدراء عن دخول لوحة التحكم الرئيسية (Dashboard).

الإصدار 1.0.3 — 2025-04-08

✨ ميزات جديدة

  • 📄 تقرير شهري PDF: توفير طباعة تقارير الأداء والمواظبة للاعبين.
  • 📆 صفحة سجل حضور اللاعبين: استعراض شهري للالتزام وتصدير إكسل.

الإصدار 1.0.2 — 2025-03-20

✨ ميزات جديدة وإصلاحات

  • تأسيس التقارير الورقية وتوفير فئة الإداري (ولاد/بنات) للتحكم الدقيق بالرؤية وإصلاح أخطاء حساب الأيام وواجهات التعديل.

الإصدار 1.0.1 — 2025-03-05

  • عرض اللعبة في حسابي + QR تلقائي + إرسال QR واتساب
  • إعداد المستلم لكل قالب + دعم منتج بسيط ومتعدد
  • WAWP API v2 + تصدير إكسل + نظام رسائل جماعية

الإصدار 1.0.0 — 2025-02-18

  • الإصدار الأول: نظام الفروع، الألعاب، الحضور، QR، إشعارات واتساب