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

الإصدار 1.6.4 — 24-09-2026

🗂️ توحيد سجل الملاحظات والحجوزات السابقة مع التحميل الكسول وتحسين واجهة الإجراءات

(Unified Notes Modal, On-Demand Lazy Loading & Equal Action Buttons)

  • دمج أزرار السجل في زر موحد (📝):
    • دمج زري سجل الملاحظات وتاريخ الحجوزات السابقة في زر واحد للحفاظ على صف الإجراءات مدمجاً ومنع إضافة صفوف أو أزرار زائدة.
  • نافذة منبثقة مبوبة بتبويبين (Two-Tab Modal):
    • التبويب الأول —📝 سجل ملاحظات الحصة:
      • عرض سجل الحركات الإدارية والتدقيقية للحصة، بما يشمل الإنشاء، تسجيل الحضور، الخصم، التعديلات، والتجميد، في بطاقات واضحة ومميزة.
    • التبويب الثاني —📅 تاريخ الحجوزات والطلبات السابقة:
      • عرض سجل الاشتراكات والحجوزات السابقة لنفس اللاعب ونفس اللعبة، مع تفاصيل الحصص، الحالة، التواريخ، والملاحظات.
      • عرض ملاحظات طلبات WooCommerce والملاحظات الإدارية المرتبطة بالاشتراكات.
  • التحميل عند الطلب (On-Demand Lazy Loading):
    • إلغاء التحميل المسبق لبيانات السجل عند فتح صفحة “إدارة العضويات”، بحيث لا يتم إرسال أي طلب للسيرفر إلا عند فتح سجل اللاعب.
    • عند فتح النافذة، يتم تحميل بيانات التبويب الأول فقط عبر استعلام خفيف.
    • لا يتم تحميل بيانات التبويب الثاني إلا عند انتقال المدير إليه فعلياً.
    • استخدام التخزين المؤقت المحلي عبر data-loaded="1" لمنع تكرار طلبات AJAX عند التنقل بين التبويبات.
  • توحيد أبعاد ومظهر أزرار الإجراءات:
    • توحيد جميع أزرار الإجراءات على مقاس 30px × 30px.
    • إعادة تنظيم الأزرار باستخدام شبكة:
      grid-template-columns: repeat(4, 30px);
    • توزيع الأزرار الثمانية في صفين متناسقين 4×2، بما يتوافق مع تصميم أزرار صفحة “تحضير اللاعبين” ويحافظ على شكل الجدول المدمج.

🏬 ترقية نظام إرجاع المقاعد والمخزون وإدارة الكرون

(Stock Release & Cron Automation)

  • تحسين استعلامات تحرير المخزون (Optimized Unreleased Query):
    • استهداف الاشتراكات التي لم يتم تحرير مخزونها مسبقاً أو التي تم تجديدها بعد آخر عملية تحرير مباشرة من قاعدة البيانات.
    • تحسين التعامل مع قواعد البيانات التي تحتوي على آلاف العضويات لمنع البطء أو تخطي الاشتراكات القديمة.
  • إعادة المنتج الأب إلى حالةIn Stockتلقائياً:
    • عند تحرير مقعد لأي Variation وإعادته إلى In Stock، يتم تلقائياً التأكد من إعادة المنتج الأب (Parent Product) إلى In Stock.
    • يضمن ذلك ظهور المنتج مباشرة في أرشيف المتجر والكتالوج للعملاء الجدد.
  • تصفير علامة التحرير عند التجديد (Auto-Reset on Renewal):
    • ربط الخطاف wc_memberships_user_membership_saved لمسح علامات تحرير المخزون السابقة عند تجديد الاشتراك أو إعادة تفعيل العضوية.
    • تجهيز الاشتراك تلقائياً لدورة الانتهاء التالية.
  • خيارات تردد مرنة لإدارة الكرون (Flexible Cron Scheduling):
    • إضافة خيارات التردد التالية:
      • مرة واحدة يومياً (كل 24 ساعة)
      • مرتين في اليوم (كل 12 ساعة)
      • 3 مرات يومياً (كل 8 ساعات)
      • 4 مرات يومياً (كل 6 ساعات)
      • مرتين في الأسبوع (كل 3.5 أيام)
      • مرة في الأسبوع (أسبوعياً)
    • ترتيب الخيارات من الأسرع إلى الأبطأ مع توضيح الفاصل الزمني باللغة العربية.
  • التشغيل التلقائي لكافة أيام الأسبوع (Active Days Fallback):
    • اعتماد أيام الأسبوع السبعة تلقائياً عند عدم تحديد أيام معينة.
    • يضمن ذلك تشغيل الكرون يومياً دون الحاجة إلى تحديد الأيام يدوياً.
  • إضافة كرون انتهاء اشتراكات الحصص إلى إدارة الكرون:
    • إدراج المهمة bgm_check_session_expirations ضمن شاشة “إدارة الكرون”.
    • إمكانية متابعة توقيتها وحالتها وتشغيلها يدوياً ومراجعة سجلاتها.
  • إشعار نجاح فوري في لوحة التحكم:
    • إضافة إشعار أخضر واضح عند الضغط على “تشغيل يدوي فوري” لتنفيذ عملية إرجاع المخزون.

🛡️ إصلاح التخطي الكاذب لمنع تكرار الرسائل

(False Duplicate Suppression Elimination)

  • إصلاح مشكلة التخطي الكاذب:
    • معالجة ظهور رسالة تم تخطي الإرسال لمنع التكرار (أُرسلت مسبقاً) مع حالة “مُرسل” رغم عدم وصول الرسالة فعلياً إلى العميل.
    • شمل الإصلاح رسائل مهمة مثل رسالة الشراء لأول مرة ورسائل QR Code.
  • تصحيح توقيت تسجيل قفل التكرار:
    • كان قفل الـ 15 دقيقة:
      bgm_sent_dedup_*
      يتم تخزينه قبل فحص تفعيل الرقم عبر is_phone_whitelisted وقبل تنفيذ الإرسال الفعلي.
    • في حال فشل الإرسال بسبب عدم تفعيل الرقم، كان القفل يبقى مسجلاً، مما يؤدي إلى اعتبار الرسالة مكررة عند إعادة المحاولة بعد تفعيل الرقم.
    • أصبح تسجيل قفل التكرار يتم فقط بعد نجاح الإرسال فعلياً عبر API واستلام كود استجابة 200.
  • إضافة In-Flight Lock خفيف:
    • استخدام قفل مؤقت لمدة 30 ثانية فقط أثناء تنفيذ عملية الإرسال لمنع تضارب العمليات المتزامنة.
    • حذف القفل تلقائياً بعد انتهاء طلب الإرسال.
  • دعم الإرسال الإجباري:
    • إضافة $force_send = true عند استخدام المدير:
      • “إعادة إرسال 🔄”
      • “فحص التفعيل”
    • يسمح ذلك بتجاوز أي قفل زمني وإعادة الإرسال فوراً.
  • دعم صيغ المتغيرات المختلفة:
    • دعم الأقواس الفردية والمزدوجة في قوالب WhatsApp:
      • {var}
      • {{var}}

🏦 تعزيز موثوقية رسائل التحويل البنكي BACS والإنقاذ الفوري للرسائل المعلقة

  • استمرار إنقاذ الرسائل للأرقام المفعلة سابقاً:
    • تعديل دالة الويب هوك activate_phone_number لمواصلة فحص وإنقاذ الرسائل المحتجزة بحالات:
      • waiting_activation
      • not_activated
    • يتم ذلك حتى إذا كان الرقم مسجلاً ومفعلاً مسبقاً في القائمة البيضاء.
  • تطهير أقفال التكرار عند تفعيل الرقم:
    • حذف أقفال التكرار المؤقتة الخاصة بالرقم فور تفعيله.
    • يضمن ذلك إعادة تشغيل جميع الرسائل المحتجزة مباشرة عند مراسلة العميل للأكاديمية.
  • دعم طلبات الزوار وهاتف الفاتورة:
    • دعم الطلبات التي تمت كزائر أو التي تأخر فيها ربط الطلب بالمستخدم.
    • الاعتماد مباشرة على:
      $order->get_billing_phone()
      للحصول على رقم العميل دون إسقاط رسالة التحويل البنكي.
  • دعم القوالب الخاصة والعامة:
    • اعتماد القالب الخاص بالمنتج أولاً:
      _bgm_bacs_custom_template
    • ثم الرجوع إلى القالب العام:
      bgm_template_bacs_order
    • ثم استخدام القالب الافتراضي المدمج عند عدم توفر أي منهما.
    • يشمل ذلك المنتجات البسيطة والمتغيرة.
  • دعم متغيرات القوالب:
    • {wp-display-name}
    • {customer_name}
    • {parent_name}
    • {child_name}
    • {player_name}
    • {order_id}
    • {order_total}
    • {order_currency}
    • {order_date}
    • {branch_name}
    • {items_list}
  • إضافة خطافات أمان لصفحة اكتمال الطلب:
    • ربط النظام أيضاً مع:
      • woocommerce_thankyou_bacs
      • woocommerce_thankyou
    • لضمان محاولة إرسال الرسالة مهما كان سلوك بوابة الدفع.
  • الإلغاء الذكي لرسائل انتظار الدفع:
    • عند انتقال الطلب إلى حالة completed أو processing، يتم تلقائياً إلغاء رسائل BACS المعلقة الخاصة بالطلب، مثل:
      نحن بانتظارك لإكمال الدفع
    • يمنع ذلك إرسال رسائل انتظار الدفع بعد اعتماد الطلب.
    • بالتزامن، يتم إرسال رسائل تفعيل الاشتراك ورسالة QR Code الرسمية.

🔑 دعم روابط تسجيل الدخول التلقائي في إشعارات الحصص والحجوزات الذكية

({login_link} & {autologin_link})

  • دعم وسوم تسجيل الدخول التلقائي:
    • دعم كامل للوسمين:
      • {login_link}
      • {autologin_link}
    • دعم الصيغتين بالشرطة والشرطة السفلية في جميع قوالب WhatsApp المرتبطة بنظام الحصص والحجوزات الذكية.
  • تغطية قوالب إشعارات الحصص:
    • إشعار نفاد الحصص.
    • إشعار قرب انتهاء الصلاحية.
    • إشعار الخصم.
    • تأكيد التجميد.
    • تأكيد إلغاء التجميد.
  • دعم القوالب المخصصة للمنتجات والمتغيرات:
    • دعم الوسوم داخل القوالب:
      _bgm_wa_msg_*
  • توليد رابط دخول آمن ومؤقت:
    • إنشاء رابط دخول مباشر باستخدام:
      BGM_Autologin_Link::generate_token($user_id)
    • استخدام رمز أمان مشفر ومؤقت.
    • إضافة معالجة بديلة لاستبدال أي وسم متبقٍ قبل الإرسال.
  • تسهيل وصول ولي الأمر:
    • إمكانية الدخول للحساب بنقرة واحدة لتجديد الحصص أو حجز المواعيد دون الحاجة إلى كتابة كلمة المرور.

👥 منع تكرار المشتركين مع الحفاظ الكامل على سجل الحجوزات السابقة

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

🎟️ تحسين عرض الحصص المتبقية والمستهلكة ودقة الحساب

(Session Count & BiDi Display)

  • إصلاح مشكلة اتجاه الأرقام في RTL:
    • معالجة مشكلة انعكاس ترتيب الأرقام عند عرض الحصص بصيغة مثل:
      4 / 3
    • كان ذلك قد يؤدي إلى فهم خاطئ بأن المتبقي هو 1 من أصل 4، بينما القيمة الفعلية هي 3 متبقية و1 مستهلكة.
  • استبدال العرض الرقمي بصيغة واضحة:
    • اعتماد الصيغة:
      🎟️ متبقي: X من Y (مستهلك: Z)
    • إزالة اللبس الناتج عن استخدام / داخل النص العربي.
  • توحيد العرض في جميع الواجهات:
    • تطبيق الصيغة الجديدة في:
      • بطاقة العضوية داخل طلبات WooCommerce.
      • جدول إدارة العضويات.
      • نافذة الملاحظات والسجل التاريخي.
  • قراءة الحصص المتبقية مباشرة من قاعدة البيانات:
    • الاعتماد على القيمة المحفوظة في:
      remaining_sessions
    • استخدام قيمة بديلة (Fallback) عند عدم وجود القيمة في السجل.
    • ضمان عرض العدد الفعلي للحصص المتبقية حتى في الحالات التي تنتهي فيها صلاحية الحصص دون استهلاكها أثناء التدريب.

الإصدار 1.6.3.1 — 2026-09-17

🛡️ إصلاح حرج وحماية متعددة الطبقات لنظام الحجوزات الذكية (Smart Bookings System)

🔴 المشكلة

تم اكتشاف عدة مشاكل في منتجات الحجز الذكي والتدريب الخاص (Smart Booking Products)، أبرزها:

  • ظهور رسالة واتساب بتفاصيل غير صحيحة مثل:
    📆 يوم الحجز: كل الأيام
    بدلاً من اليوم الفعلي الذي اختاره العميل.
  • إمكانية إتمام الطلب دون اختيار يوم للحجز.

🔍 الأسباب الجذرية

  1. تجاوز فحص الأيام عبر زر الشراء السريع في قالب Woodmart
    • كان كود JavaScript يتحقق من زر الإضافة للسلة التقليدي فقط.
    • زر الشراء السريع .wd-buy-now-btn كان يتجاوز هذا التحقق.
  2. قيمة افتراضية غير صحيحة في إشعارات واتساب
    • كانت دالة send_session_notification تستخدم:
      $selected_days_str = 'كل الأيام';
    • عند عدم توفر مصفوفة الأيام داخل كائن الاشتراك، كانت الرسالة تعرض “كل الأيام” بشكل خاطئ.
  3. تعطيل اليوم الحالي بعد وقت الإغلاق
    • عند تجاوز وقت الإغلاق، يتم تعطيل حقل اليوم باستخدام disabled.
    • الحقول المعطلة لا يتم إرسالها مع النموذج، مما سمح بمرور الطلب دون تحديد يوم عند استخدام الشراء السريع.
  4. تحديث اشتراكات الحصص بمعيار ربط غير دقيق
    • كان التحديث يعتمد على:
      user_id + game_id + branch_id
    • بدلاً من الربط المباشر برقم الاشتراك الجديد $sub_id.

🛠️ الحلول الجذرية

1. اعتراض شامل في الواجهة الأمامية (JavaScript)

تم تعزيز التحقق ليشمل جميع مسارات تنفيذ الطلب:

  • زر الإضافة للسلة التقليدي.
  • زر الشراء السريع في Woodmart:
    .wd-buy-now-btn
  • زر submit.

وعند عدم اختيار يوم:

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

2. حماية صارمة من جهة الخادم (Server-Side Validation)

تم تعزيز الدالة:

validate_free_schedule_days

لتطبيق تحقق إلزامي على منتجات الحجز الذكي التي تستخدم:

_bgm_enable_booking_system

ويشمل التحقق:

  • إلزام العميل باختيار يوم للحجز.
  • منع الحجز بعد وقت الإغلاق المحدد في:
    _bgm_lock_current_day_time
  • التحقق من السعة اليومية القصوى المحددة في:
    _bgm_daily_capacity

وبذلك لا يمكن تجاوز القيود حتى في حال تجاوز JavaScript أو إرسال الطلب مباشرة.

3. استئصال القيمة الافتراضية “كل الأيام”

تم إلغاء استخدام “كل الأيام” كقيمة افتراضية لمنتجات الحجوزات الذكية.

وفي حال عدم توفر بيانات الأيام، يتم استخدام آلية Fallback ذكية لاسترجاع الأيام من الطلب الأصلي بدلاً من افتراض اختيار جميع الأيام.

4. تحديث اشتراكات الحصص بدقة

تم تعديل:

assign_group_and_days

للربط مباشرة مع:

$sub_id

مع تحديث الأيام المختارة تلقائياً عند تنفيذ التجديد المبكر (Stack Renewal).

🔗 خيار إداري جديد لروابط تجديد الحجوزات الذكية

Smart Bookings Renew Link Option

تمت إضافة خيار جديد ضمن إعدادات الإضافة:

الموقع: عام / نظام الحصص

الاسم البرمجي:

bgm_booking_renew_redirect_product

النص الظاهر في لوحة التحكم:

🔗 توجيه روابط تجديد الحجوزات الذكية إلى صفحة المنتج (لاختيار موعد جديد)

⚙️ آلية العمل

✅ عند التفعيل — موصى به

عند نقر العميل على رابط التجديد:

{renew_link}

لأي منتج حجز ذكي:

  1. يتم تسجيل دخول العميل تلقائياً (Auto-Login).
  2. يتم تحويله مباشرة إلى صفحة المنتج.
  3. يختار يوماً وموعداً جديداً متاحاً.
  4. يتم تجنب إعادة استخدام موعد سابق قد يكون قديماً أو مغلقاً.

⛔ عند التعطيل

يتم:

  1. تسجيل دخول العميل تلقائياً.
  2. إضافة المنتج إلى السلة بتفاصيل الحجز السابقة.
  3. الانتقال مباشرة إلى صفحة الدفع، بنفس آلية باقي الاشتراكات.

📅 توحيد ترتيب الأيام — السبت أولاً

تم توحيد ترتيب الأيام في جميع أجزاء النظام ليبدأ دائماً من السبت:

السبت → الأحد → الاثنين → الثلاثاء → الأربعاء → الخميس → الجمعة

وتم تطبيق الترتيب المعياري في:

  1. خيارات الأيام المحظورة في إعدادات المنتج داخل لوحة التحكم.
  2. أزرار اختيار الأيام في الواجهة الأمامية لصفحة المنتج.
  3. الأيام المعروضة داخل سلة التسوق وعناصر الطلب.
  4. نصوص قوالب إشعارات واتساب.
  5. كلا نظامي الفواتير.

📝 تدوين ملاحظات الطلب باسم المنتج ديناميكياً

تم تحديث نظام التدوين التلقائي لملاحظات طلبات WooCommerce بحيث يستخدم اسم المنتج الفعلي بشكل ديناميكي بدلاً من اسم ثابت.

الصيغة الجديدة:

BGM: 🎟️ حجز "[اسم المنتج الفعلي]" — اللعبة: %s | الفرع: %s | 📅 يوم الحجز: %s | ⏰ وقت الحصة: %s | 👤 المدرب: %s | 📍 المكان: %s | الحصص: %d

🧾 دعم شامل لنظامي الفواتير

تم تعزيز دعم بيانات الحجوزات الذكية في:

  • الفاتورة الموحدة.
  • فاتورة زكاة الضريبة A4.

🧾 فاتورة زكاة الضريبة A4

render_tax_invoice_a4

تمت إضافة:

  • فك تشفير مصفوفة الأيام سواء كانت Array أو JSON String.
  • استخدام آلية Fallback لاسترجاع بيانات الأيام من جدول:
    bgm_session_subscriptions
  • استخدام رقم الطلب في عملية الاسترجاع.

كما يتم عرض تفاصيل الحجز الذكي أسفل اسم الصنف بالشكل التالي:

📅 يوم الحجز: [اليوم] | ⏰ الموعد: [الوقت] | 📍 المكان: [المكان] | 👤 المدرب: [المدرب]

وبالنسبة لاشتراكات الحصص ذات الجدول الحر، يتم عرض:

📅 أيام الحضور: [الأيام]

🧾 الفاتورة الموحدة وصفحة العرض والنافذة المنبثقة

تم تحديث:

  • render_full_page
  • get_modal_html

لاستخراج كائن بيانات الحجز:

booking_info

وعرض بيانات الحجز داخل بطاقة:

بيانات الاشتراك

🔒 حماية من ربط الحجوزات بالمجموعات القديمة

بالنسبة لمنتجات الحجوزات الذكية، تم استبعاد البحث عن المجموعة المرتبطة باللاعب لتجنب ربط الحجز الحالي بمجموعة قديمة.

وفي المقابل، تستمر اشتراكات الشهر العادية بالعمل بنفس آليتها السابقة دون أي تغيير.

📂 الملفات المعدلة

  • branch-games-manager.php
  • admin/class-bgm-settings.php
  • includes/class-bgm-branch-product-binding.php
  • includes/class-bgm-renew-link.php
  • includes/class-bgm-install.php
  • includes/services/class-bgm-session-service.php
  • includes/class-bgm-invoice.php
  • CHANGELOG.md

الإصدار 1.6.3 — 2026-09-13

🔄 إصلاح حرج: تجديد العضويات المنتهية عبر Product Variations

المشكلة:
كان تجديد العضوية لا يعمل عند إعادة شراء اللاعب لاشتراك مرتبط بـ Variation محدد. وكانت العضوية تظل بحالة expired، مع ظهور سجلات مثل:

No match for membership ... _product_id: 2672
granted_plans=[]
plan_products=[]

السبب الجذري:
كان نظام التجديد يعتمد على بيانات المنتج الأب ويتجاهل ميتاداتا الـ Variation، رغم أن WooCommerce Memberships يخزن خطة العضوية المرتبطة بالتنويع في:

_membership_plan_id

الحل المطبق:

  • اعتماد Variation-First Priority واستخراج _membership_plan_id من الـ Variation مباشرة قبل الرجوع للمنتج الأب.
  • دعم دالة WooCommerce Memberships الأصلية:
    wc_memberships_get_membership_plans_from_product()
  • تطبيق Strict Authoritative Plan Match لضمان تجديد الخطة المطابقة فقط، ومنع تجديد خطة مختلفة بالاعتماد على المنتج الأب.
  • توحيد التحقق من العضوية النشطة باستخدام:
    clean_status === 'active'
  • منع العضويات النشطة من الدخول لمسار التجديد بالخطأ.
  • تطبيق Future Timestamp Stacking بحيث يبدأ التمديد من التاريخ المستقبلي الحالي إن وجد، دون تغيير تاريخ بداية العضوية.
  • إعادة تفعيل bgm_user_schedule وbgm_player_games مباشرة عند تجديد العضوية المنتهية.
  • تصفير Grace Sessions عند نجاح التجديد.
  • ترتيب العضويات بحيث تظهر العضويات النشطة أولاً باستخدام Active-First usort.
  • إضافة فحص مسبق لمنع معالجة عضوية الطلب الحالي أكثر من مرة.
  • إغلاق أي fallback غير صارم يسمح بمطابقة Variation مختلفة من خلال المنتج الأب.

الملف المتأثر:

includes/class-bgm-branch-product-binding.php

النتيجة:
أصبح تجديد العضوية يعتمد على الـ Variation الذي اشتراه اللاعب فعليًا باعتباره المصدر الأساسي لخطة العضوية، مع منع التجديد الخاطئ لخطة أخرى وإعادة تفعيل بيانات اللاعب تلقائيًا بعد تجديد العضوية المنتهية.

🏆 منظومة تقارير التجديد والولاء والمكافآت الذكية

Renewal, Loyalty & Smart Rewards System

  • 🏆 صفحة تقارير مركزية للتجديد والولاء
    • إنشاء صفحة إدارية وتسويقية متكاملة ضمن قائمة BGM لمتابعة المشتركين الملتزمين وتحليل المنقطعين واستهدافهم بعروض الاستعادة.
    • تبويب أبطال التجديد المستمر (Champions):
      • عرض اللاعبين أصحاب التجديدات المتتالية.
      • احتساب سلسلة التجديد المستمر Streak 🔥.
      • عرض إجمالي عدد التجديدات وتاريخ الانضمام.
    • تبويب المشتركين المنقطعين والمتأخرين (Lapsed):
      • عرض المشتركين الذين انتهت عضوياتهم.
      • احتساب عدد أيام الانقطاع الحالية.
      • تحليل متوسط فترات الانقطاع السابقة.
    • تبويب سجل العمليات والكوبونات (Audit Log):
      • تسجيل رسائل التكريم والاستعادة والعروض والكوبونات التي تم إنشاؤها.
      • حفظ تاريخ الإرسال واسم الإداري المنفذ وحالة استلام الرسالة.

🎟️ التوليد الآلي لكوبونات WooCommerce المقيدة بالعميل

Automated Restricted WooCommerce Coupons

  • إنشاء كوبونات خصم تلقائياً بصيغة:
    reward-{player_code}-{random_number}
  • ربط الكوبون بالبريد الإلكتروني للعميل فقط عبر customer_email.
  • منع مشاركة الكوبون أو استخدامه من حساب آخر.
  • تحديد مدة صلاحية الكوبون بالأيام أو تركه بدون تاريخ انتهاء.
  • ضبط حد الاستخدام على مرة واحدة فقط:
    usage_limit = 1
  • دعم استخدام الكوبونات كمكافآت للمشتركين الملتزمين أو كحافز لاستعادة المشتركين المنقطعين.

💬 المعاينة الحية والتعديل الفردي للرسائل

Live Preview & Single-Send Message Customization

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

🛡️ الصلاحيات المتقدمة وعزل البيانات

Role-Based Access & Data Scoping

  • تطبيق عزل صارم للبيانات حسب الرتبة الوظيفية:
    • مدير النظام ومدير الفروع: الوصول إلى جميع الفروع مع إمكانية الفلترة حسب الفرع.
    • مدير الفرع (Branch Manager): عرض لاعبي فرعه فقط عبر user_branch.
    • إداري الفرع (Branch Admin): عرض لاعبي فرعه فقط، مع تطبيق فلترة الجنس تلقائياً.
      • male → البنين.
      • female → البنات.
    • المدرب (Coach): عرض لاعبي المجموعات التدريبية المسندة إليه فقط.
  • إضافة Master Toggle لتفعيل أو تعطيل منظومة التقارير بالكامل وإخفاء صفحاتها من القوائم عند التعطيل.
  • إضافة إعداد Grace Window Days لتحديد المهلة المستخدمة في احتساب التجديد المتتالي، والقيمة الافتراضية 7 أيام.
  • التحكم في إمكانية وصول مدير الفرع والإداري والمدرب إلى صفحة التقارير.

📜 الخط الزمني للاشتراكات وتصدير البيانات

Subscription Timeline & UTF-8 CSV Export

  • إضافة نافذة Interactive Timeline لاستعراض التاريخ الكامل لاشتراكات اللاعب.
  • عرض الاشتراكات عبر السنوات والفصول.
  • توضيح الفواصل الزمنية بين التجديدات.
  • إبراز التجديدات المتزامنة وفترات الانقطاع.
  • إضافة تصدير فوري لبيانات الملتزمين والمنقطعين إلى Excel وCSV.
  • دعم UTF-8 BOM لضمان ظهور اللغة العربية بشكل صحيح عند فتح ملفات CSV في Excel.

✉️ القوالب الأربعة والروابط الذكية

4 Master Templates & Smart Placeholders

توفير أربعة قوالب أساسية:

  1. قالب تكريم الملتزمين بدون كوبون.
  2. قالب تكريم الملتزمين مع كوبون خصم.
  3. قالب تذكير واستعادة المنقطعين بدون كوبون.
  4. قالب استعادة تسويقي للمنقطعين مع كوبون خصم.

المتغيرات الذكية المدعومة:

{player_name} · {player_code} · {parent_name} · {branch_name} · {game_name} · {streak_months} · {total_renewals} · {coupon_code} · {coupon_amount} · {coupon_expiry} · {autologin_link} · {renew_link}

🔒 التحديث الأمني المزدوج وجدار الحماية المعزز

Anti-Ban & Whitelist Hardening — Push #2

  • Strict Phone-Level Whitelist Firewall
    • ربط فحص الأرقام بخيار الحماية العام:
      bgm_wa_activation_enabled
    • منع إرسال أي رسالة إلى رقم غير موجود في:
      bgm_wa_activated_phones
    • إلغاء تجاوز manual_bypass بالكامل لضمان عدم تمرير أي رقم غير مفعّل.
    • دعم التفعيل اليدوي من لوحة القائمة البيضاء أو من بروفايل اللاعب.
  • التطبيق التلقائي للكوبون مع رابط التجديد
    • تحديث BGM_Renew_Link لتطبيق كوبون المكافأة reward-* تلقائياً في السلة عند الضغط على {renew_link}.
    • توجيه العميل مباشرة إلى صفحة Checkout مع الخصم جاهزاً.
    • التحقق من صلاحية الكوبونات السابقة لمنع أخطاء الدفع.
  • منع تكرار الرسائل
    • توحيد أرقام الهواتف بصيغتي 05 و966.
    • منع إرسال أكثر من نسخة عند تطابق رقم اللاعب وولي الأمر.

الإصدار 1.6.2 — 2026-09-09

📬 إصلاح إشعارات شراء وتجديد العضويات

Membership Purchase & Renewal Notification Dispatch Fix

  • إزالة شرط $has_prior_game الخاطئ الذي كان يمنع إرسال إشعارات membership_created وكود QR للاعبين القدامى عند شراء خطة جديدة أو باقة مختلفة.
  • ضمان إرسال إشعارات الشراء وكود QR فوراً مع ربطها ببيانات العضوية والطلب الحالي.
  • الاعتماد على الدالة الرسمية:
    wc_memberships_get_membership_plans_from_product
  • دعم التعرف على الخطط الممنوحة من المنتجات والـ Variations في نظام التجديد التلقائي.

🔑 رابط الدخول التلقائي والسريع

Enhanced Direct Magic Login & Auto-Cart Checkout Shortcut

  • إضافة نافذة تفاعلية عند الضغط على زر 🔑 في جدول تحضير اللاعبين.
  • توفير خيارين:
    • 🔑 دخول فقط.
    • 🛒 دخول + إضافة المنتج للسلة.
  • Dynamic Single-Product Variations Filtering
    • جلب منتجات WooCommerce عبر AJAX.
    • حصر الـ Variations في المنتج المحدد فقط.
    • إخفاء قائمة الـ Variations تلقائياً للمنتجات البسيطة.
  • Auto-Cart Clearance & Direct Checkout
    • إفراغ السلة الحالية تلقائياً عند الدخول.
    • إضافة المنتج والـ Variation المحدد إلى سلة اللاعب.
    • التوجيه مباشرة إلى Checkout أو الصفحة المحددة.

📱 منع تكرار إشعارات WhatsApp وتوحيد أرقام الهواتف

WhatsApp Notification Deduplication & Universal Phone Normalization

  • توحيد جميع صيغ أرقام الهواتف من خلال:
    BGM_Notifications::normalize_phone
  • دعم:
    • الأرقام العربية ٠٥...
    • 05...
    • 9665...
    • +9665...
    • 009665...
    • 96605...
  • تحديث:
    BGM_Notifications::get_recipient_phones
  • منع إرسال الرسالة أكثر من مرة عند وجود نفس الرقم لدى اللاعب وولي الأمر بصيغ مختلفة.

🏬 نظام إرجاع المقاعد والمخزون تلقائياً

Stock Auto-Release & Grace Period System

  • إنشاء الخدمة المستقلة:
    BGM_Stock_Manager
  • إضافة Daily Cron Job لفحص الاشتراكات والعضويات المنتهية بعد تجاوز فترة السماح.
  • تحرير المقاعد تلقائياً.
  • زيادة مخزون WooCommerce بمقدار +1.
  • إعادة المنتج إلى حالة:
    In Stock
  • Granular Module Toggles
    • إضافة:
      should_process_product_stock($product_id, $variation_id)
    • منع التعارض مع إدارة المخزون القياسية.
    • إضافة خيار:
      bgm_stock_release_include_smart_bookings
    • إضافة خيار:
      bgm_stock_release_include_sessions
    • تعطيل وتظليل الخيارات التابعة تلقائياً عند إيقاف الخيار الرئيسي.
  • Custom Daily Capacity Integration
    • دمج get_booked_capacities.
    • تحديث السعة المتاحة لكروت الأيام مباشرة بعد تحرير المقعد.
    • التعامل مع تغيير حالة العضوية إلى expired.
  • Responsive Out-of-Stock Interception
    • اعتراض محاولة الشراء أو التجديد عند اكتمال السعة.
    • منع إنشاء الطلبات غير الصالحة.
    • تفريغ السلة تلقائياً.
    • عرض نافذة Responsive تدعم الجوال والتابلت.
    • توفير خيارات:
      • اختيار موعد جديد.
      • التواصل عبر WhatsApp.
    • دعم {product_name} داخل الرسائل.
    • دعم TranslatePress وGettext.

⚠️ اعتراض المنتجات المتعارضة وقفل Checkout

Incompatible Products Interception & Dynamic Checkout Lock

  • منع إضافة المنتجات المتعارضة إلى السلة.
  • منع الشراء المزدوج لاشتراكات الحصص والعضويات لنفس اللعبة.
  • عرض نافذة اعتراض Responsive.
  • قفل زر إتمام الطلب عند وجود منتجات متعارضة.
  • إضافة شريط تنبيه أعلى زر Checkout.
  • تخصيص أزرار النافذة حسب الصفحة:
    • Checkout: التوجيه إلى السلة لتعديل المنتجات.
    • المنتج / المتجر / السلة: خيارات الدفع والسلة والإغلاق.
  • إضافة مفتاح:
    bgm_enable_incompatible_modal
  • التحكم الكامل في النصوص والعناوين والأزرار من لوحة التحكم.
  • دعم TranslatePress وGettext.

🔑 محرك روابط الدخول التلقائي وإبطال الطوارئ

Auto-Login Link Engine & Emergency Revocation System

  • إنشاء:
    BGM_Autologin_Link
  • توليد روابط دخول مختصرة وآمنة بصيغة:
    ?al=TOKEN
  • إضافة زر Emergency Revocation لإبطال جميع روابط الدخول التلقائي فوراً عبر AJAX.
  • حذف جميع الـ Transients والـ Permanent Tokens دون التأثير على روابط التجديد.
  • تطبيق Server-Side DOM Suppression لإخفاء أيقونة نسخ الرابط عن الرتب غير المصرح لها.
  • دعم الاستبدال التلقائي للمتغيرات:
    {autologin_link} و{login_link}
  • دعم التوجيه إلى:
    • المتجر.
    • السلة.
    • Checkout.
    • حسابي.
    • رابط مخصص.

🤖 بوابة الذكاء الاصطناعي وروابط الدخول الآمنة

n8n AI Gateway & Secure Auto-Login Link Integration

  • إضافة autologin_url إلى:
    • GET /me/profile
    • GET /me/memberships
  • إضافة إعداد:
    bgm_ai_share_autologin_url
  • التحكم في مشاركة روابط الدخول التلقائي مع الـ AI.
  • إضافة Anti-Spam Cooldown لمنع الإفراط في إنشاء الروابط وحماية WhatsApp من الحظر.
  • إعادة استخدام الرابط السابق عند الحاجة.
  • دعم المتغير:
    {cooldown}
  • تحديث أدلة التكامل:
    • docs/AI_API_GATEWAY_DOCS.md
    • docs/N8N_AI_AGENT_INTEGRATION_GUIDE.md
  • تحديث تعليمات ChatGPT وn8n لاستخدام روابط الدخول المباشرة عند طلبها.

🛒 محرك روابط السلة والدخول التلقائي للـ AI

AI Gateway & n8n Cart Link Engine

  • إضافة Endpoint:
    POST /wp-json/bgm/v1/ai/cart-link
  • توليد روابط دخول مؤقتة مدمج بها:
    • المنتج.
    • الـ Variation.
    • الأيام المحددة.
  • دعم Smooth Account Switch:
    • تسجيل خروج المستخدم الحالي.
    • تسجيل دخول حساب اللاعب المستهدف.
    • تفريغ السلة.
    • إضافة المنتج.
    • التوجيه مباشرة إلى Checkout.
  • إضافة daily_capacities لتمكين الـ AI من معرفة السعة المتبقية لكل يوم.
  • منع اختيار الأيام الممتلئة.
  • دعم التعرف على حسابات العائلة وتعدد الأبناء المرتبطين بنفس رقم ولي الأمر.
  • مطالبة الـ AI بتحديد الابن قبل إنشاء الرابط.
  • تحديث Workflow:
    docs/BGM Academy - Optimized WAWP AI Agent Workflow (v1.6.2).json
  • إضافة أداة:
    generate_cart_link

الإصدار 1.6.1 — 2026-09-01

🔍 تطوير نظام البحث الشامل وتعزيز استقرار القائمة البيضاء والإشعارات

Comprehensive Multi-Field Search & Whitelist Synchronization

  • البحث المتقدم والموحد في شاشة “تحضير اللاعبين” (Attendance Multi-Field Search):
    • دعم البحث المباشر والتصفية اللحظية في جميع شاشات تحضير الحضور لدى مسؤول النظام، مدير الفروع، مدير الفرع، الإداري، والمدرب.
    • يشمل البحث اسم اللاعب، هاتف اللاعب، هاتف ولي الأمر، اسم ولي الأمر، البريد الإلكتروني، وكود اللاعب (BGM-XXXXX / player_code).
    • دعم التجميع الميداني السريع عبر data-search في صفوف الجداول لضمان أداء مرتفع وتصفية لحظية دون تأخير.
  • تحديث البحث المتقدم في شاشة “إدارة العضويات” (Memberships Multi-Field Meta Query):
    • تطوير دالة AJAX Backend (ajax_get_memberships) باستخدام meta_query متقدمة، مع توسيع نطاق البحث ليشمل بيانات البريد الإلكتروني وأرقام الهواتف الخاصة باللاعبين وأولياء الأمور، بالإضافة إلى أكواد QR.
    • الحفاظ على عزل البيانات بين الفروع وتحسين سرعة تنفيذ الاستعلامات.
    • تحديث واجهة المستخدم وحقل البحث في الـ Backend والـ Frontend لتوضيح جميع حقول البحث الشاملة المتاحة.
  • معالجة واستقرار نظام القائمة البيضاء والإشعارات العالقة (Whitelist & Activation Queue Logic):
    • حل مشكلة التحذير البرمجي Use of unassigned variable $is_queue في خدمة إشعارات الواتساب (class-bgm-whatsapp-service.php).
    • منع تكرار معالجة الأرقام المفعلة من خلال فحص مبكر داخل activate_phone_number، مع إيقاف إعادة إرسال رسائل الاشتراكات النشطة عند استلام أي رسالة من العميل.
    • ضمان تسليم رسائل التجديد والتمديد الرسمية فور تفعيل الرقم، من خلال تشغيل الطابور الفوري (process_queue()) مباشرة بعد استعادة الرسائل العالقة.
    • حجب رسالة QR العامة عند وجود رسالة تجديد تفصيلية جاهزة للإرسال لتجنب ازدواجية الإشعارات.
    • تحسين آلية تفعيل الأرقام، سواء تلقائياً عبر Webhook أو يدوياً من خلال زر المزامنة والقائمة البيضاء، بحيث تتم استعادة الرسائل حديثة الإنشاء خلال آخر 7 أيام فور التفعيل.
    • تحويل الرسائل العالقة القديمة جداً إلى حالة expired لمنع إرسال إشعارات قديمة أو غير ملائمة.
    • توفير وتأكيد عمل زر الإعادة الفردي 🔄 في سجل الإشعارات، لتمكين الإدارة من إعادة إرسال أي رسالة سابقة يدوياً عند الحاجة.
  • تكامل وحماية تسجيل الدخول عبر إضافة WAWP OTP (BGM WAWP Whitelist Enforcer):
    • إنشاء وتفعيل الفئة المخصصة BGM_WAWP_Integration لفرض القائمة البيضاء على عمليات تسجيل الدخول وOTP في إضافة WAWP دون تعديل ملفاتها الأصلية، بما يضمن التوافق مع تحديثات الإضافة.
    • اعتراض طلبات REST API (/wawp/) وAJAX (admin-ajax.php) وعمليات المصادقة (authenticate).
    • منع أي رقم غير مفعل في القائمة البيضاء من استلام رمز OTP أو تنفيذ تسجيل الدخول، مع إرجاع استجابة 403 مخصصة.
    • إضافة نافذة منبثقة تفاعلية للواجهة الأمامية (#bgm-wawp-whitelist-modal) بتصميم حديث، مع زر مباشر لتوجيه المستخدم إلى واتساب وتفعيل حسابه بنقرة واحدة.
    • اعتراض طلبات Fetch API وjQuery AJAX وMutationObserver الخاصة بالـ DOM لمنع ظهور الأخطاء الخام واستبدالها بالنافذة المنبثقة التفاعلية فوراً.
    • توثيق عمليات تسجيل الدخول الناجحة عبر WAWP في سجل النشاط (BGM_Activity_Log).
    • دعم التخصيص الكامل لنصوص النافذة وإعدادات تفعيل التكامل من لوحة الإعدادات.
    • إضافة حقول إعدادات مخصصة للجملة الفرعية (bgm_wawp_modal_subtext) ونص الرسالة الجاهزة للإرسال عبر واتساب (bgm_wawp_modal_send_msg)، مع إضافة خيار لإخفاء زر الإغلاق/الإلغاء من النافذة (bgm_wawp_hide_close_btn).

🛡️ نظام حماية وتنبيه الشراء التكراري للاشتراكات (Duplicate Purchase Warning & Child Account Protection)

  • حماية الشراء التكراري: إنشاء وتفعيل الفئة المخصصة BGM_Recent_Purchase_Warning لمنع تكرار شراء الاشتراك بالخطأ لنفس حساب الابن، خصوصًا عند فتح الموقع مع بقاء العميل مسجّل الدخول على المتصفح.
  • فحص عمليات الشراء الأخيرة: فحص طلبات العميل خلال مدة زمنية قابلة للتخصيص من الإعدادات، مثل 60 دقيقة من أحدث حجز أو عملية شراء.
  • حماية متعددة المستويات: اعتراض محاولات أضف للسلة وإتمام الطلب لحظيًا على مستوى الفرونت إند باستخدام JS Interceptor، بالإضافة إلى التحقق على مستوى الباك إند عبر:
    • woocommerce_add_to_cart_validation
    • woocommerce_checkout_process
    ولا يتم السماح بمتابعة عملية الشراء إلا بعد الضغط الصريح على زر “متابعة الشراء”.
  • نافذة تنبيه مخصصة: إظهار Popup Modal أنيق يوضح اسم الابن الذي تم الحجز أو الشراء له مؤخرًا، مع توجيه ولي الأمر إلى رابط الواتساب لتجديد اشتراك الطفل الآخر.
  • إعدادات قابلة للتخصيص: إضافة كارد مستقل في لوحة إعدادات الإضافة للتحكم في:
    • مدة فحص عمليات الشراء بالدقائق.
    • عنوان التنبيه.
    • الرسائل التوضيحية.
    • دعم المتغير الديناميكي {player_name} لإظهار اسم الابن تلقائيًا.
    • دعم ترجمة جميع النصوص بشكل كامل عبر TranslatePress.
  • تسجيل الخروج عند الإلغاء: إضافة الخيار bgm_recent_purchase_logout_on_dismiss، والذي يسمح بتسجيل خروج العميل فورًا عند الضغط على “حسنًا، فهمت ذلك”، لمنع تداخل الجلسات عند فتح رابط تجديد الاشتراك لطفل آخر عبر الواتساب.

الإصدار 1.6.0.1 — 2026-08-23

📊 تطوير وتأمين نظام تصفية الحجوزات وعزل صلاحيات الفروع والمدربين

  • زرين الحجوزات السابقة والقادمة (Past & Upcoming Booking Scope Buttons): إضافة زرين تفاعليين `⏪ الحجوزات السابقة` (لعرض كافة الحجوزات التاريخية قبل اليوم) و `⏩ الحجوزات القادمة` (لعرض كافة الحجوزات النشطة اليوم والمستقبلية)، متاحين لمديري الفروع والإداريين والمدربين مع إمكانية التطبيق الفوري للبحث بالاسم ورقم الهاتف والبريد، مع حفظ العزل الصارم حسب الفرع للإداري وحسب اللاعبين المسندين للمدرب (`_bgm_session_coach`).
  • فلاتر الألعاب والمنتجات (Game & Product Filters): إضافة فلترين تفاعليين داخل شاشة كشوفات حضور الحجوزات (coach-bookings.php) للتصفية حسب اللعبة (game_id) والمنتج (product_id)، مع دعم التمييز بين الخدمات المختلفة مثل التدريب الخاص وتقييم الأداء.
  • العزل الصارم لحجوزات الفروع (Strict Branch Isolation): تقييد استعلامات الحجوزات لمدير الفرع والإداري باستخدام s.branch_id = $current_user_branch، لضمان عدم ظهور أو الوصول إلى حجوزات الفروع الأخرى. كما يتم حصر قوائم الألعاب والمنتجات على العناصر المرتبطة بفرع المستخدم فقط.
  • تقييد بيانات المدربين (Strict Coach Data Scoping): ربط الحجوزات مباشرة ببيانات الـ Postmeta الخاصة بالـ Variation والمنتج (_bgm_session_coach) لضمان عرض الحجوزات المخصصة للمدرب الحالي فقط، ومنع ظهور أي حجوزات غير تابعة له.
  • وسام نوع المنتج (Product Name Badge): إضافة شارة بصرية داخل جدول الحضور والغياب اليومي تعرض نوع الخدمة المحجوزة بصيغة واضحة مثل 📦 اسم المنتج، لتسهيل التعرف على نوع الحجز للمدرب أو المدير.
  • المراجعة الأمنية وسلامة الكود (Security & Error-Free Audit): إجراء مراجعة شاملة لأكواد الشاشة والاستعلامات، ومعالجة متغيرات الصلاحيات والعزل مثل $is_branches_manager، مع تنظيف الاستعلامات والتحقق من المتغيرات لتجنب PHP Notices والأخطاء والتعارضات البرمجية.
  • الهدف النهائي: ضمان أن كل مستخدم يرى فقط الحجوزات والبيانات المسموح له بالوصول إليها وفق الفرع والدور والمدرب، مع توفير أدوات تصفية واضحة وسريعة لتحسين إدارة الحجوزات والحضور.

👑 نظام الصلاحيات الهرمي والمؤشر البصري لإدارة العطلات الأسبوعية

Hierarchical Off-Days Permission System & Visual Lock Badge

  • نظام الصلاحيات الهرمي المزدوج (Dual-Tier Permission Engine):
    إضافة نظام مركزي من حساب مدير الفروع للتحكم في صلاحيات مديري الفروع المتعلقة بـ إضافة وتعديل العطلات الأسبوعية للموظفين والمدربين. يدعم النظام ثلاث حالات مستقلة لكل فرع:
    • 🌐 اتباع العام — الالتزام بإعدادات الصلاحية العامة.
    • ✅ مسموح — السماح للفرع بشكل مستقل.
    • 🔒 غير مسموح — منع الفرع بشكل مستقل.
    مع أولوية واضحة للإعداد الفردي للفرع عند وجود Override، دون التأثير على بقية الفروع.
  • الفصل الكامل بين صلاحية الإضافة والتعديل (Add vs Edit Permissions):
    التعامل مع عمليتي إضافة وتعديل كصلاحيتين مستقلتين، بحيث يمكن السماح بإضافة عطلات جديدة مع منع تعديل العطلات الحالية، أو العكس، وفق إعدادات الإدارة العليا لكل فرع.
  • تطبيق الصلاحيات على مستوى الموظف والمدرب:
    يجب أن تسري قواعد الصلاحيات على جميع عمليات إدارة العطلات الأسبوعية الخاصة بالموظفين والمدربين، سواء تمت من شاشة الموظف/المدرب أو من أي شاشة إدارية أخرى توفر إمكانية تعديل هذه البيانات.
  • المؤشر البصري للقفل (Visual Lock Badge):
    عند منع مدير الفرع من تعديل عطلات معينة، تظهر بجانب اليوم شارة واضحة:
    🔒 مقفلةكما يتحول زر إدارة العطلات إلى:
    🔒 العطلات (مغلقة)مع منع فتح واجهة التعديل أو جعلها للعرض فقط بحسب سياق الشاشة.
  • التنبيه التفاعلي عند محاولة التعديل:
    عند محاولة مدير الفرع تنفيذ عملية محظورة، تظهر رسالة مباشرة توضّح أن تعديل العطلات غير مسموح من خلال هذا الفرع، وأن الصلاحية مقيدة من الإدارة العليا، مع عدم تنفيذ أي تغيير على البيانات.
  • التحقق الإجباري في الـ Backend (Backend Enforcement):
    لا يعتمد النظام على إخفاء الأزرار أو تعطيل عناصر الواجهة فقط، بل يجب إجراء فحص الصلاحيات داخل جميع نقاط الحفظ والتحديث في الـ Backend، لمنع تجاوز القيود من خلال AJAX أو REST API أو أي طلب مباشر.
  • التمييز البرمجي بين الإضافة والتعديل:
    عند التعامل مع سجل لا يحتوي على عطلات سابقة، تعتبر العملية إضافة وتخضع لصلاحية الإضافة.
    أما عند وجود عطلة محفوظة مسبقًا وتغييرها أو حذفها، فتعتبر العملية تعديلًا وتخضع لصلاحية التعديل.
  • المزامنة الثنائية للبيانات (Dual-Write & Database Sync):
    توحيد ومزامنة بيانات العطلات الأسبوعية بين:
    • User Meta: bgm_staff_off_days
    • جدول الحضور المركزي: bgm_attendance
    بحيث يتم تحديث المصدرين بشكل متزامن عند إجراء تغيير مسموح، مع ضمان عدم ترك أحد المصدرين بحالة مختلفة عن الآخر.
  • ضمان الاتساق عبر جميع واجهات النظام:
    يجب أن تنعكس حالة العطلات الموحدة والمتزامنة بشكل صحيح في حساب المدرب، مدير الفرع، مدير الفروع، الحضور، وكشوف وتقارير النظام، مع احترام صلاحيات المستخدم الحالي في كل واجهة.
  • أولوية الصلاحيات:
    يتم احتساب الصلاحية النهائية وفق التسلسل التالي:
    الإعداد الفردي للفرع → الإعداد العام → الصلاحية الافتراضية للنظام، مع اعتبار 🔒 غير مسموح Override صريحًا يمنع العملية حتى لو كانت الصلاحية العامة مسموحة.

🗓️ نظام وتسعير الحجوزات متعددة الأيام (Multi-Day Pricing System)

  • تسعير ديناميكي حسب عدد الأيام (Dynamic Multi-Day Pricing): إضافة إعداد إداري للمنتجات والـVariations يتيح للاعب تحديد عدد أيام الحجز، مع تحديث السعر تلقائياً وبشكل لحظي عند إضافة أو إزالة الأيام.
  • تحديث واجهة حساب السعر (Responsive Pricing Banner): تحسين تصميم بنر السعر ليكون متجاوباً مع جميع الشاشات، وعرض الحساب بصيغة 100 ريال × 2 = 200 ريال مع إزالة النصوص الزائدة.
  • دعم الترجمة الشاملة (Gettext Localization): تغليف جميع نصوص بنر التسعير وميتا السلة باستخدام __() و_n() ضمن branch-games-manager لدعم الترجمة عبر Loco Translate وأدوات التدويل.
  • تنظيف بيانات السلة والدفع (Cart Item Meta Cleanup): تبسيط عرض بيانات الحجز في السلة والسلة الجانبية وصفحة الدفع إلى 💰 عدد أيام الحجز: 2 مع إزالة (سعر مجمع) وكلمة أيام الزائدة.
  • الحد الأقصى للأيام (Max Selectable Days Constraint): إضافة إعداد إداري لتحديد الحد الأقصى للأيام القابلة للاختيار، مع التحقق على الواجهة الأمامية والسيرفر لمنع تجاوز الحد.
  • مضاعفة استحقاق الحصص (Session Entitlement Multiplier): ربط عدد أيام الحجز بمنطق استحقاق الحصص في get_session_count وcreate_or_stack لمضاعفة عدد الحصص المتاحة تلقائياً حسب عدد الأيام المختارة.
  • تكامل السلة والتجديد (Cart & Renewal Integration): حماية حساب أسعار السلة باستخدام Idempotent لمنع تكرار الضرب، مع نقل وتأكيد ميتا الأيام المختارة تلقائياً عند تجديد الاشتراك عبر BGM_Renew_Link.
  • إصلاح حفظ قوالب الإشعارات (Notification Templates AJAX Fix): إصلاح استرجاع وتطهير مدخلات AJAX باستخدام wp_unslash لضمان حفظ وتحديث قوالب الإشعارات بشكل صحيح ومستمر.

🛡️ تأمين وإخفاء روابط صور QR (Cryptographic Streamer & URL Obfuscation)

  • روابط قصيرة وآمنة ديناميكياً (Concise Secure Dynamic Endpoint): استبدال روابط صور QR المباشرة بـEndpoint ديناميكي قصير وآمن بالشكل https://domain.com/?bgm_qr=389_a7f3b890 مع إخفاء المسار الفعلي لملفات QR.
  • إخفاء وحظر مجلد الـUploads (Directory Shield & Access Denial): حماية المسار wp-content/uploads/bgm-qr/ ومنع الوصول المباشر إلى الملفات أو استعراض محتويات المجلد باستخدام .htaccess.
  • تشفير HMAC ضد هجمات التخمين (Cryptographic HMAC Token Verification): توليد Token تشفيري باستخدام hash_hmac('sha256', 'user_qr_' . $uid, AUTH_KEY) وربطه بمعرف المستخدم، مع رفض أي محاولة لتعديل المعرف أو التلاعب بالرابط وإرجاع 403 Forbidden.
  • بث صور PNG مباشرة (Raw Image Streaming): إضافة handle_qr_stream_request لبث صور QR مباشرة باستخدام Content-Type: image/png لتظهر بشكل طبيعي في WhatsApp وتطبيقات الهواتف والواجهات المختلفة.

📲 تعميم متغيرات QR وتعزيز توافق التوكن وروابط الإشعارات

Universal QR Shortcodes & Token Resilience

  • دعم متغيرات QR الشاملة في قوالب الإشعارات (Global QR Template Variables):
    إضافة ودعم المتغيرين {player_code} لرمز اللاعب الفريد و{qr_link} لرابط صورة QR المباشرة، وإتاحتهما في جميع إشعارات الاشتراكات الشهرية مثل membership_created وmembership_renewed وmembership_extended، بالإضافة إلى جميع إشعارات باقات الحصص والحجوزات مثل session_purchased وsession_extended وsessions_low وsessions_depleted وsession_expired وsession_days_changed وغيرها.
  • تعزيز مرونة التحقق من التوكن وروابط QR القديمة (Backward-Compatible Token Validation):
    دعم قراءة ومعالجة روابط QR القديمة والمختصرة مثل ?bgm_qr=... و?bgmqr=... بمختلف صيغها، سواء مع أو بدون الشرطة السفلية، مع تطبيق آلية تحقق متدرجة للتوكن تضمن استمرار عمل جميع روابط QR السابقة دون الحاجة إلى تسجيل دخول أو منع الوصول العام.
  • تحديث لوحة تحكم WordPress (Dashboard Shortcodes & Card Hints):
    إضافة {player_code} و{qr_link} إلى قائمة المتغيرات المتاحة للنسخ بضغطة واحدة داخل لوحة التحكم، مع تحديث البطاقات الإرشادية الخاصة بكل قالب رسالة لتوضيح المتغيرات المدعومة وطريقة استخدامها.

🎟️ استقلالية خصم الغياب واستكمال متغيرات القوالب (Independent Absence Deduction & Comprehensive Shortcodes)

  • فصل إعدادات خصم الحصص عند الغياب (Independent Absence Deduction Settings): إضافة إعدادين مستقلين بالكامل للتحكم في خصم الحصص عند تسجيل الغياب، بحيث يتم استخدام bgm_deduct_session_on_absence لاشتراكات الحصص العادية، وbgm_deduct_booking_on_absence لاشتراكات نظام الحجوزات الذكية. تم دمج الإعدادين في لوحة تحكم ووردبريس ولوحة تحكم مدير الفروع الأمامية، مع دعم الحفظ الفوري عبر AJAX.
  • الاكتشاف الذكي لنوع الاشتراك (Smart Subscription Type Detection): تحديث الدالة BGM_Session_Service::handle_absence_deduction لتحديد نوع اشتراك اللاعب تلقائياً قبل تنفيذ الخصم، ثم تطبيق إعداد الخصم المرتبط بنوع الاشتراك الصحيح، مما يمنع التداخل أو تطبيق إعدادات الحجوزات على اشتراكات الحصص العادية والعكس.
  • تضمين وأولوية رسائل الحجوزات المخصصة (Custom Booking Templates Priority): تحسين آلية استرجاع القوالب المخصصة من صفحة المنتج والـ Variation (`_bgm_wa_msg_*`) لضمان إرسال الرسالة المخصصة للحجز المحددة بالمنتج/النوعية فوراً وتغليبها على القوالب الافتراضية العامة.
  • استكمال مرجع متغيرات القوالب الشامل (Comprehensive Universal Shortcodes Reference): تحديث صندوق متغيرات القوالب في إعدادات الرسائل داخل كلٍ من لوحة تحكم ووردبريس ولوحة تحكم مدير الفروع، ليشمل جميع متغيرات القوالب المتاحة في النظام، والتي تتجاوز 55 متغيراً، مع توفير إمكانية نسخ أي متغير مباشرة بضغطة واحدة.

📋 تحسين كشف الحجوزات والتصدير إلى Excel (Coach Bookings Roster & Excel Export)

  • إبقاء الغائبين والمنتهين في كشف اليوم (Preserve Absence & Expired Roster Visibility): تحديث استعلام كشف الحجوزات اليومي (Coach Bookings) لضمان عدم اختفاء اللاعبين الذين تم تسجيل غيابهم أو انتهى رصيدهم في نفس اليوم، مع استمرار ظهورهم في كشف اليوم وإظهار حالتهم بوضوح: حاضر / غائب / منتظر.
  • تصدير كشف الحجوزات إلى Excel (Coach Bookings Excel Export): إضافة زر 📥 تصدير كشف اليوم (Excel) إلى واجهة المدرب ومدير الفرع، يتيح تصدير كشف الحضور والغياب اليومي مباشرةً بصيغة Excel، مع دعم كامل للغة العربية، وتنسيق مناسب للطباعة والأرشفة.

👔 تعديل وإدارة حضور الموظفين لمدير الفروع (Manual Staff Attendance Management & Corrections)

  • السجل الشهري التفاعلي (Interactive Monthly Staff Attendance Grid): تحويل خلايا السجل الشهري لحضور الموظفين والمدربين إلى عناصر تفاعلية قابلة للنقر، تتيح لمدير الفروع استعراض حالة الحضور والغياب وتعديلها مباشرة من السجل.
  • نافذة تعديل الحضور والتاريخ (bgm-edit-att-modal): إنشاء نافذة تعديل متكاملة تتيح لمدير الفرع:
    • تحديد حالة الحضور: حاضر / غائب / إجازة رسمية / إجازة مرضية.
    • تخصيص تاريخ ووقت تسجيل الحضور عند اختيار حالة «حاضر».
    • إضافة وتعديل الملاحظات المرتبطة بسجل الحضور.
    • حفظ التعديل مع تحديث السجل مباشرة دون الحاجة لإعادة تحميل الصفحة.
  • زر التعديل المباشر بالقائمة اليومية (Daily List Edit Shortcut): إضافة زر ✏️ تعديل واضح بجانب كل موظف في قائمة الحضور اليومية، لفتح نافذة التعديل مباشرة وتسريع تصحيح الحالات المسجلة بشكل خاطئ.
  • المزامنة الخلفية والتدقيق (Backend Synchronization & Audit): تطوير وتأمين المعالج ajax_bm_toggle_staff_attendance بحيث يضمن:
    • المزامنة الصحيحة بين جدول bgm_attendance وبيانات user_meta.
    • التحقق الصارم من صلاحيات المستخدم قبل تنفيذ أي تعديل.
    • التحقق من صحة الموظف والتاريخ والحالة قبل الحفظ.
    • تطهير والتحقق من جميع المدخلات القادمة من AJAX.
    • منع التلاعب بسجلات موظفين أو فروع غير مصرح بها.
    • تسجيل عمليات التعديل المهمة لأغراض المراجعة والتدقيق (Audit Trail).

📱 نظام تحكم إشعارات الـ QR عند التجديد والتمديد (QR & Renewal Notification Controls)

  • خيار التحكم في إرسال الـ QR مع التجديد (bgm_send_qr_on_renewal): إضافة إعداد إداري مستقل في لوحة التحكم وحساب مدير الفروع، يسمح بتفعيل أو تعطيل إرسال رسالة الاشتراك وكود الـ QR عند تجديد أو تمديد الاشتراكات.
  • الفصل الكامل بين التجديد والشراء لأول مرة (Renewal vs First-Time Isolation):
    • إرسال رسالة وكود الـ QR إلزامياً عند شراء الاشتراك والتسجيل لأول مرة.
    • تطبيق إعداد bgm_send_qr_on_renewal فقط على عمليات التجديد والتمديد.
    • عدم السماح للإعداد بتعطيل إشعارات التسجيل الأول أو إنشاء اللاعب لأول مرة.
    • توحيد منطق التحقق من نوع العملية لمنع إرسال QR بالخطأ أو إيقافه في الحالات غير المستهدفة.
  • التوافق مع الإرسال الفوري والمؤجل (Cron Delay & Instant Dispatch Compatibility): تحديث جميع مسارات الإرسال، بما في ذلك:
    • auto_generate_qr_on_order
    • handle_delayed_qr_notification
    • أي مسارات أخرى مسؤولة عن إرسال إشعارات QR.
    بحيث يتم تطبيق إعداد bgm_send_qr_on_renewal بشكل موحد، سواء تم إرسال الإشعار فورياً أو من خلال Cron / Delayed Queue، مع منع الإرسال المكرر نتيجة اختلاف مسار التنفيذ.
  • سلامة إشعارات تفعيل الرقم (WhatsApp Activation Dispatch Integrity): عند تفعيل رقم اللاعب عبر WhatsApp، يجب أن يقوم النظام تلقائياً بإرسال:
    • ملخص الاشتراكات النشطة.
    • كود اللاعب.
    • صورة QR الخاصة باللاعب.
    ويجب تنفيذ الإرسال مباشرة بعد نجاح عملية التفعيل، مع التأكد من استخدام بيانات اللاعب والاشتراكات الحالية، ومنع إرسال بيانات قديمة أو QR غير محدث.
  • التدقيق ومنع التكرار (Notification Integrity & Deduplication): إضافة آلية تمنع إرسال نفس إشعار QR أكثر من مرة لنفس العملية، خصوصاً عند تداخل الإرسال الفوري مع Cron أو إعادة تنفيذ الـ webhook، مع الاحتفاظ بحالة الإرسال وسبب الإرسال لتسهيل المراجعة والتتبع.

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

🤖 بوابة الربط مع الذكاء الاصطناعي و 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، إشعارات واتساب