Commit e80202ff authored by Mahmoud Aglan's avatar Mahmoud Aglan

TUTORIALZZ

parent 485c9da7
...@@ -176,6 +176,48 @@ final class TutorialRegistry ...@@ -176,6 +176,48 @@ final class TutorialRegistry
'icon' => 'waves', 'icon' => 'waves',
'color' => '#0EA5E9', 'color' => '#0EA5E9',
], ],
'users' => [
'title' => 'إدارة المستخدمين',
'subtitle' => 'إنشاء الحسابات وتعيين الأدوار والصلاحيات',
'icon' => 'users',
'color' => '#6366F1',
],
'notifications' => [
'title' => 'الإشعارات',
'subtitle' => 'القوالب والمشغلات وسجل الإرسال',
'icon' => 'bell',
'color' => '#F97316',
],
'player-affairs' => [
'title' => 'شؤون اللاعبين',
'subtitle' => 'التسجيل والتقييم والإصابات واللياقة',
'icon' => 'medal',
'color' => '#0D9488',
],
'forms' => [
'title' => 'النماذج الإلكترونية',
'subtitle' => 'بناء النماذج والتعبئة والطباعة',
'icon' => 'clipboard-list',
'color' => '#8B5CF6',
],
'pricing-management' => [
'title' => 'إدارة التسعير',
'subtitle' => 'قواعد التسعير والخصومات الخاصة',
'icon' => 'tag',
'color' => '#059669',
],
'audit' => [
'title' => 'سجل المراجعة',
'subtitle' => 'تتبع جميع التعديلات والعمليات في النظام',
'icon' => 'eye',
'color' => '#64748B',
],
'playgrounds' => [
'title' => 'الملاعب',
'subtitle' => 'إدارة الملاعب والجدولة والمرآة الحية',
'icon' => 'layout-grid',
'color' => '#16A34A',
],
]; ];
} }
...@@ -210,6 +252,13 @@ final class TutorialRegistry ...@@ -210,6 +252,13 @@ final class TutorialRegistry
'reservations' => self::reservationsTutorials(), 'reservations' => self::reservationsTutorials(),
'match-center' => self::matchCenterTutorials(), 'match-center' => self::matchCenterTutorials(),
'pool-management' => self::poolManagementTutorials(), 'pool-management' => self::poolManagementTutorials(),
'users' => self::usersTutorials(),
'notifications' => self::notificationsTutorials(),
'player-affairs' => self::playerAffairsTutorials(),
'forms' => self::formsTutorials(),
'pricing-management' => self::pricingManagementTutorials(),
'audit' => self::auditTutorials(),
'playgrounds' => self::playgroundsTutorials(),
default => [], default => [],
}; };
} }
...@@ -273,6 +322,32 @@ final class TutorialRegistry ...@@ -273,6 +322,32 @@ final class TutorialRegistry
['title' => 'متابعة الصرف', 'body' => 'النظام يقارن المصروفات الفعلية مع المخطط.<span class="warn">عند تجاوز 80% من ميزانية بند يظهر تنبيه تلقائي.</span>'], ['title' => 'متابعة الصرف', 'body' => 'النظام يقارن المصروفات الفعلية مع المخطط.<span class="warn">عند تجاوز 80% من ميزانية بند يظهر تنبيه تلقائي.</span>'],
['title' => 'التقارير', 'body' => 'اضغط <span class="field">تقرير الانحرافات</span> لمعرفة البنود المتجاوزة والبنود المتبقية.'], ['title' => 'التقارير', 'body' => 'اضغط <span class="field">تقرير الانحرافات</span> لمعرفة البنود المتجاوزة والبنود المتبقية.'],
], ],
'accounting.fiscal-year-setup' => [
['title' => 'فتح السنوات المالية', 'body' => 'من <span class="field">المحاسبة</span> > <span class="field">السنوات المالية</span> > <span class="field">سنة جديدة</span>.'],
['title' => 'بيانات السنة', 'body' => 'أدخل <span class="field">الاسم</span>، <span class="field">تاريخ البدء</span>، <span class="field">تاريخ الانتهاء</span>. النظام يقسّمها لفترات (شهرية/ربع سنوية) تلقائياً.'],
['title' => 'التفعيل', 'body' => 'اضغط <span class="field">تفعيل</span>. لا يمكن وجود أكثر من سنة مالية مفتوحة في نفس الوقت.<span class="warn">تفعيل سنة جديدة يتطلب إقفال السنة السابقة أولاً.</span>'],
],
'accounting.cost-centers' => [
['title' => 'فتح مراكز التكلفة', 'body' => 'من <span class="field">المحاسبة</span> > <span class="field">مراكز التكلفة</span> > <span class="field">مركز جديد</span>.'],
['title' => 'البيانات', 'body' => 'أدخل <span class="field">الكود</span>، <span class="field">الاسم</span>، <span class="field">القسم المسؤول</span>. يمكنك إنشاء مراكز فرعية تابعة لمركز رئيسي.'],
['title' => 'الربط بالقيود', 'body' => 'عند إنشاء قيد يمكن ربطه بمركز تكلفة. التقارير تعرض المصروفات موزعة حسب المراكز.<span class="info">مراكز التكلفة مفيدة لمعرفة تكلفة كل قسم أو نشاط.</span>'],
],
'accounting.opening-entries' => [
['title' => 'فتح القيود الافتتاحية', 'body' => 'من <span class="field">المحاسبة</span> > <span class="field">القيود الافتتاحية</span> > <span class="field">إدخال جديد</span>.'],
['title' => 'إدخال الأرصدة', 'body' => 'لكل حساب أدخل الرصيد الافتتاحي (مدين أو دائن). النظام يتحقق من التوازن.'],
['title' => 'المراجعة والتأكيد', 'body' => 'راجع الأرصدة ثم <span class="field">تأكيد</span>. يُنشأ قيد افتتاحي واحد بجميع الأرصدة.<span class="warn">هذه العملية تُنفذ مرة واحدة عند بدء تشغيل النظام — لا يمكن تعديلها بعد التأكيد.</span>'],
],
'accounting.period-closing' => [
['title' => 'فتح إقفال الفترة', 'body' => 'من <span class="field">المحاسبة</span> > <span class="field">إقفال الفترة</span>.'],
['title' => 'اختيار الفترة', 'body' => 'حدد الفترة المراد إقفالها. النظام يعرض: عدد القيود، إجمالي الحركة، أي قيود معلقة.'],
['title' => 'التنفيذ', 'body' => 'اضغط <span class="field">إقفال</span>. يتم منع أي تعديل أو إضافة قيود على هذه الفترة.<span class="warn">الإقفال نهائي — لا يمكن التراجع. تأكد من اكتمال جميع القيود قبل الإقفال.</span>'],
],
'accounting.financial-instruments' => [
['title' => 'فتح الأوراق المالية', 'body' => 'من <span class="field">المحاسبة</span> > <span class="field">أوراق مالية</span>.'],
['title' => 'إضافة ورقة', 'body' => 'اضغط <span class="field">إضافة</span>. حدد النوع (شيك/كمبيالة/سند)، المبلغ، تاريخ الاستحقاق، الجهة.'],
['title' => 'المتابعة', 'body' => 'النظام يعرض الأوراق حسب تاريخ الاستحقاق. التنبيهات تظهر قبل 7 أيام من الاستحقاق.'],
['title' => 'التحصيل/السداد', 'body' => 'عند التحصيل غيّر الحالة. يتم ترحيل القيد المحاسبي تلقائياً.<span class="info">الأوراق المستحقة تظهر في لوحة التحكم المالية.</span>'],
],
// ── HR ── // ── HR ──
'hr.add-employee' => [ 'hr.add-employee' => [
['title' => 'إنشاء حساب موظف', 'body' => 'أولاً من <span class="field">إدارة المستخدمين</span> أنشئ حساب دخول للموظف (اسم المستخدم وكلمة المرور).'], ['title' => 'إنشاء حساب موظف', 'body' => 'أولاً من <span class="field">إدارة المستخدمين</span> أنشئ حساب دخول للموظف (اسم المستخدم وكلمة المرور).'],
...@@ -304,6 +379,36 @@ final class TutorialRegistry ...@@ -304,6 +379,36 @@ final class TutorialRegistry
['title' => 'حساب المستحقات', 'body' => 'النظام يحسب تلقائياً: رصيد إجازات، مكافأة نهاية خدمة، أي مستحقات أخرى.<span class="info">المكافأة تُحسب وفقاً لقانون العمل المصري (نصف شهر عن كل سنة لأول 5 سنوات، شهر كامل بعدها).</span>'], ['title' => 'حساب المستحقات', 'body' => 'النظام يحسب تلقائياً: رصيد إجازات، مكافأة نهاية خدمة، أي مستحقات أخرى.<span class="info">المكافأة تُحسب وفقاً لقانون العمل المصري (نصف شهر عن كل سنة لأول 5 سنوات، شهر كامل بعدها).</span>'],
['title' => 'التأكيد', 'body' => 'اضغط <span class="field">تأكيد الإنهاء</span>. يتم إيقاف الحساب وإنشاء طلب دفع بالمستحقات.<span class="warn">لا يمكن التراجع عن إنهاء الخدمة بعد التأكيد.</span>'], ['title' => 'التأكيد', 'body' => 'اضغط <span class="field">تأكيد الإنهاء</span>. يتم إيقاف الحساب وإنشاء طلب دفع بالمستحقات.<span class="warn">لا يمكن التراجع عن إنهاء الخدمة بعد التأكيد.</span>'],
], ],
'hr.create-contract' => [
['title' => 'فتح صفحة العقود', 'body' => 'من <span class="field">الموارد البشرية</span> > <span class="field">العقود</span> > <span class="field">عقد جديد</span>.'],
['title' => 'بيانات العقد', 'body' => 'حدد <span class="field">الموظف</span>، <span class="field">نوع العقد</span> (محدد المدة/غير محدد)، <span class="field">تاريخ البدء</span>، <span class="field">تاريخ الانتهاء</span>.'],
['title' => 'الراتب والبدلات', 'body' => 'أدخل <span class="field">الراتب الأساسي</span>، <span class="field">بدل السكن</span>، <span class="field">بدل المواصلات</span>، <span class="field">بدلات أخرى</span>.'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. العقد يظهر في ملف الموظف ويُستخدم في حساب الرواتب.<span class="warn">انتهاء العقد بدون تجديد يُنشئ تنبيه قبل 30 يوم.</span>'],
],
'hr.insurance-management' => [
['title' => 'فتح التأمينات', 'body' => 'من <span class="field">الموارد البشرية</span> > <span class="field">التأمينات الاجتماعية</span>.'],
['title' => 'بيانات الاشتراك', 'body' => 'لكل موظف: <span class="field">الرقم التأميني</span>، <span class="field">أساس الاشتراك</span>، <span class="field">تاريخ التسجيل</span>. النظام يحسب حصة الشركة وحصة الموظف.'],
['title' => 'إصدار الاستمارات', 'body' => 'اضغط <span class="field">استمارة 1</span> (تسجيل) أو <span class="field">استمارة 6</span> (إنهاء). الاستمارة تُطبع بالتنسيق الرسمي.'],
['title' => 'التقارير الشهرية', 'body' => 'النظام يُنشئ كشف التأمينات الشهري تلقائياً مع الرواتب.<span class="info">الخصم يظهر في مفردات الراتب تحت بند «تأمينات اجتماعية».</span>'],
],
'hr.disciplinary-action' => [
['title' => 'إنشاء إجراء تأديبي', 'body' => 'من <span class="field">الموارد البشرية</span> > <span class="field">الإجراءات التأديبية</span> > <span class="field">إجراء جديد</span>.'],
['title' => 'تفاصيل المخالفة', 'body' => 'حدد <span class="field">الموظف</span>، <span class="field">نوع المخالفة</span>، <span class="field">تاريخ الواقعة</span>، <span class="field">الوصف</span>.'],
['title' => 'الجزاء', 'body' => 'اختر <span class="field">الجزاء</span>: إنذار شفهي، إنذار كتابي، خصم من الراتب، إيقاف مؤقت.'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. يتم إخطار الموظف وتسجيل الجزاء في ملفه.<span class="warn">الجزاءات المتكررة تُصعّد تلقائياً حسب لائحة العمل.</span>'],
],
'hr.employee-loan' => [
['title' => 'إنشاء سلفة', 'body' => 'من <span class="field">الموارد البشرية</span> > <span class="field">السلف</span> > <span class="field">سلفة جديدة</span>.'],
['title' => 'البيانات', 'body' => 'حدد <span class="field">الموظف</span>، <span class="field">المبلغ</span>، <span class="field">عدد الأقساط</span> للخصم من الراتب.'],
['title' => 'الاعتماد', 'body' => 'السلفة تحتاج اعتماد المدير المالي. بعد الاعتماد يتم جدولة الخصم تلقائياً.'],
['title' => 'المتابعة', 'body' => 'النظام يخصم القسط شهرياً من الراتب حتى السداد الكامل.<span class="info">يظهر القسط في مفردات الراتب تحت «خصم سلفة».</span>'],
],
'hr.overtime-management' => [
['title' => 'تسجيل ساعات إضافية', 'body' => 'من <span class="field">الموارد البشرية</span> > <span class="field">الإضافي</span> > <span class="field">تسجيل جديد</span>.'],
['title' => 'البيانات', 'body' => 'حدد <span class="field">الموظف</span>، <span class="field">التاريخ</span>، <span class="field">عدد الساعات</span>، <span class="field">نوع الإضافي</span> (عادي/عطلة/ليلي).'],
['title' => 'الاعتماد', 'body' => 'يحتاج موافقة المدير المباشر. بعد الاعتماد يُضاف للراتب.'],
['title' => 'الحساب', 'body' => 'النظام يحسب تلقائياً: عادي (×1.35)، عطلة (×2)، ليلي (×1.5).<span class="success">يظهر في مسير الرواتب تحت بند «ساعات إضافية».</span>'],
],
// ── PROCUREMENT ── // ── PROCUREMENT ──
'procurement.create-purchase-requisition' => [ 'procurement.create-purchase-requisition' => [
['title' => 'طلب شراء جديد', 'body' => 'من <span class="field">المشتريات</span> > <span class="field">طلبات الشراء</span> > <span class="field">طلب جديد</span>.'], ['title' => 'طلب شراء جديد', 'body' => 'من <span class="field">المشتريات</span> > <span class="field">طلبات الشراء</span> > <span class="field">طلب جديد</span>.'],
...@@ -335,6 +440,12 @@ final class TutorialRegistry ...@@ -335,6 +440,12 @@ final class TutorialRegistry
['title' => 'سبب الإرجاع', 'body' => 'أدخل <span class="field">سبب الإرجاع</span> (عيب تصنيع، عدم مطابقة، انتهاء صلاحية).'], ['title' => 'سبب الإرجاع', 'body' => 'أدخل <span class="field">سبب الإرجاع</span> (عيب تصنيع، عدم مطابقة، انتهاء صلاحية).'],
['title' => 'التأكيد', 'body' => 'اضغط <span class="field">تأكيد</span>. يُخصم من المخزون ويُنشأ إشعار دائن على المورد.<span class="warn">المرتجع يخفض رصيد المورد المستحق.</span>'], ['title' => 'التأكيد', 'body' => 'اضغط <span class="field">تأكيد</span>. يُخصم من المخزون ويُنشأ إشعار دائن على المورد.<span class="warn">المرتجع يخفض رصيد المورد المستحق.</span>'],
], ],
'procurement.request-for-quotation' => [
['title' => 'إنشاء طلب عروض', 'body' => 'من <span class="field">المشتريات</span> > <span class="field">عروض الأسعار</span> > <span class="field">طلب عرض جديد</span>.'],
['title' => 'تحديد الأصناف', 'body' => 'أضف <span class="field">الأصناف</span> المطلوب تسعيرها مع <span class="field">الكميات</span> والمواصفات.'],
['title' => 'اختيار الموردين', 'body' => 'حدد الموردين المطلوب إرسال الطلب إليهم (3 موردين كحد أدنى).'],
['title' => 'المقارنة والاختيار', 'body' => 'بعد ورود الردود: اضغط <span class="field">مقارنة العروض</span>. يعرض الأسعار جنباً إلى جنب. اختر الأفضل ثم <span class="field">تحويل لأمر شراء</span>.<span class="success">المقارنة تُحفظ كمرجع للمراجعة.</span>'],
],
// ── INVENTORY ── // ── INVENTORY ──
'inventory.setup-warehouse' => [ 'inventory.setup-warehouse' => [
['title' => 'إنشاء مخزن', 'body' => 'من <span class="field">المخازن</span> > <span class="field">المخازن</span> > <span class="field">مخزن جديد</span>.'], ['title' => 'إنشاء مخزن', 'body' => 'من <span class="field">المخازن</span> > <span class="field">المخازن</span> > <span class="field">مخزن جديد</span>.'],
...@@ -365,6 +476,28 @@ final class TutorialRegistry ...@@ -365,6 +476,28 @@ final class TutorialRegistry
['title' => 'إدخال الكميات', 'body' => 'لكل صنف أدخل <span class="field">الكمية</span> و<span class="field">تكلفة الوحدة</span>.<span class="info">هذه الخطوة تُنفذ مرة واحدة عند بدء تشغيل النظام.</span>'], ['title' => 'إدخال الكميات', 'body' => 'لكل صنف أدخل <span class="field">الكمية</span> و<span class="field">تكلفة الوحدة</span>.<span class="info">هذه الخطوة تُنفذ مرة واحدة عند بدء تشغيل النظام.</span>'],
['title' => 'التأكيد', 'body' => 'اضغط <span class="field">تأكيد</span>. يتم تحديث الأرصدة وترحيل القيد المحاسبي.<span class="warn">لا يمكن تعديل الأرصدة الافتتاحية بعد التأكيد.</span>'], ['title' => 'التأكيد', 'body' => 'اضغط <span class="field">تأكيد</span>. يتم تحديث الأرصدة وترحيل القيد المحاسبي.<span class="warn">لا يمكن تعديل الأرصدة الافتتاحية بعد التأكيد.</span>'],
], ],
'inventory.stock-transfer' => [
['title' => 'إنشاء إذن تحويل', 'body' => 'من <span class="field">المخازن</span> > <span class="field">التحويلات</span> > <span class="field">تحويل جديد</span>.'],
['title' => 'البيانات', 'body' => 'حدد <span class="field">المخزن المصدر</span>، <span class="field">المخزن المستقبل</span>. أضف الأصناف والكميات المطلوب تحويلها.'],
['title' => 'التأكيد', 'body' => 'اضغط <span class="field">تأكيد</span>. يتم خصم الكمية من المصدر وإضافتها للمستقبل فوراً.<span class="info">إذن التحويل يحمل رقم مرجعي فريد يظهر في حركات المخزون.</span>'],
],
'inventory.purchase-order' => [
['title' => 'إنشاء أمر شراء', 'body' => 'من <span class="field">المخازن</span> > <span class="field">أوامر الشراء</span> > <span class="field">أمر جديد</span>.'],
['title' => 'البيانات', 'body' => 'حدد <span class="field">المورد</span>، <span class="field">تاريخ التوريد المتوقع</span>. أضف الأصناف مع الكميات والأسعار.'],
['title' => 'الاعتماد', 'body' => 'أمر الشراء يحتاج اعتماد حسب القيمة. بعد الاعتماد يُرسل للمورد.'],
['title' => 'الاستلام', 'body' => 'عند وصول البضاعة: اضغط <span class="field">استلام</span> وأدخل الكميات الفعلية.<span class="warn">يمكن الاستلام الجزئي — الكميات المتبقية تبقى مفتوحة.</span>'],
],
'inventory.manage-suppliers' => [
['title' => 'إضافة مورد', 'body' => 'من <span class="field">المخازن</span> > <span class="field">الموردين</span> > <span class="field">مورد جديد</span>.'],
['title' => 'البيانات', 'body' => 'أدخل <span class="field">اسم الشركة</span>، <span class="field">السجل التجاري</span>، <span class="field">الهاتف</span>، <span class="field">العنوان</span>، <span class="field">مسؤول الاتصال</span>.'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. المورد متاح الآن في أوامر الشراء والمشتريات.<span class="info">صفحة المورد تعرض تاريخ جميع التعاملات وأداء التوريد.</span>'],
],
'inventory.asset-management' => [
['title' => 'تسجيل أصل ثابت', 'body' => 'من <span class="field">المخازن</span> > <span class="field">الأصول الثابتة</span> > <span class="field">أصل جديد</span>.'],
['title' => 'البيانات', 'body' => 'أدخل <span class="field">اسم الأصل</span>، <span class="field">الكود</span>، <span class="field">الفئة</span>، <span class="field">القيمة</span>، <span class="field">تاريخ الشراء</span>، <span class="field">العمر الافتراضي</span>.'],
['title' => 'العهدة', 'body' => 'حدد <span class="field">الموظف المسؤول</span> (العهدة). يمكن نقل العهدة لاحقاً مع محضر تسليم.'],
['title' => 'الإهلاك', 'body' => 'النظام يحسب الإهلاك السنوي تلقائياً (قسط ثابت). القيد يُرحل مع إقفال الفترة.<span class="info">يمكنك عرض تقرير الإهلاك والقيمة الدفترية من التقارير.</span>'],
],
// ── CASHIER ── // ── CASHIER ──
'cashier.process-payment-queue' => [ 'cashier.process-payment-queue' => [
['title' => 'فتح طابور الدفع', 'body' => 'من <span class="field">خزنة العضويات</span> > <span class="field">طابور الدفع</span>. تأكد من وجود وردية مفتوحة (الشريط الأخضر أعلى الصفحة).'], ['title' => 'فتح طابور الدفع', 'body' => 'من <span class="field">خزنة العضويات</span> > <span class="field">طابور الدفع</span>. تأكد من وجود وردية مفتوحة (الشريط الأخضر أعلى الصفحة).'],
...@@ -945,6 +1078,158 @@ final class TutorialRegistry ...@@ -945,6 +1078,158 @@ final class TutorialRegistry
['title' => 'الإجراءات', 'body' => 'حدد أي صيانة تمت: تنظيف، إضافة كيماويات، إصلاح.'], ['title' => 'الإجراءات', 'body' => 'حدد أي صيانة تمت: تنظيف، إضافة كيماويات، إصلاح.'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. يُسجل في سجل الصيانة الدوري.<span class="warn">قراءات خارج النطاق الآمن تُنشئ تنبيه فوري.</span>'], ['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. يُسجل في سجل الصيانة الدوري.<span class="warn">قراءات خارج النطاق الآمن تُنشئ تنبيه فوري.</span>'],
], ],
// ── USERS ──
'users.create-user' => [
['title' => 'فتح إدارة المستخدمين', 'body' => 'من القائمة الجانبية: <span class="field">الإعدادات</span> > <span class="field">المستخدمين</span> > <span class="field">مستخدم جديد</span>.'],
['title' => 'البيانات الأساسية', 'body' => 'أدخل <span class="field">اسم المستخدم</span> (فريد)، <span class="field">الاسم الكامل</span>، <span class="field">البريد الإلكتروني</span>، <span class="field">كلمة المرور</span>.<span class="info">اسم المستخدم لا يمكن تغييره بعد الإنشاء.</span>'],
['title' => 'تعيين الدور', 'body' => 'اختر <span class="field">الدور الوظيفي</span> من القائمة. يمكن تعيين أكثر من دور.'],
['title' => 'الحفظ والتفعيل', 'body' => 'اضغط <span class="field">حفظ</span>. الحساب يصبح فعالاً فوراً ويمكن للمستخدم تسجيل الدخول.<span class="success">يمكنك لاحقاً تعطيل الحساب مؤقتاً بدون حذفه.</span>'],
],
'users.edit-user' => [
['title' => 'البحث عن المستخدم', 'body' => 'من <span class="field">المستخدمين</span>: ابحث بالاسم أو البريد الإلكتروني.'],
['title' => 'تعديل البيانات', 'body' => 'اضغط <span class="field">تعديل</span>. يمكنك تغيير: الاسم، البريد، الهاتف، القسم.'],
['title' => 'إعادة تعيين كلمة المرور', 'body' => 'اضغط <span class="field">إعادة تعيين كلمة المرور</span> لتوليد كلمة مرور جديدة.<span class="warn">المستخدم سيحتاج لتغييرها عند أول دخول.</span>'],
],
'users.manage-user-permissions' => [
['title' => 'فتح صلاحيات المستخدم', 'body' => 'من ملف المستخدم > تبويب <span class="field">الصلاحيات</span>.'],
['title' => 'الصلاحيات من الأدوار', 'body' => 'يعرض جميع الصلاحيات الموروثة من الأدوار المعيّنة (لا يمكن تعديلها هنا).'],
['title' => 'صلاحيات مخصصة', 'body' => 'اضغط <span class="field">إضافة صلاحية</span> لمنح صلاحية إضافية خارج الدور.<span class="info">الصلاحيات المخصصة تتقدم على صلاحيات الدور.</span>'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. التغييرات تسري فوراً في الجلسة التالية للمستخدم.'],
],
'users.user-activity-log' => [
['title' => 'فتح سجل النشاط', 'body' => 'من ملف المستخدم > <span class="field">سجل النشاط</span>.'],
['title' => 'محتوى السجل', 'body' => 'يعرض: تاريخ ووقت كل عملية، نوع العملية (إنشاء/تعديل/حذف)، الكيان المتأثر.'],
['title' => 'الفلترة', 'body' => 'صفّي حسب <span class="field">التاريخ</span> أو <span class="field">نوع العملية</span>.<span class="info">هذا السجل لا يمكن تعديله أو حذفه — مرجع للمراجعة الداخلية.</span>'],
],
// ── NOTIFICATIONS ──
'notifications.create-template' => [
['title' => 'فتح القوالب', 'body' => 'من <span class="field">الإشعارات</span> > <span class="field">القوالب</span> > <span class="field">قالب جديد</span>.'],
['title' => 'تصميم القالب', 'body' => 'أدخل <span class="field">اسم القالب</span>، <span class="field">نوع الإشعار</span> (SMS/بريد/نظام)، و<span class="field">نص الرسالة</span>.<span class="info">استخدم المتغيرات مثل {member_name} و{amount} للبيانات الديناميكية.</span>'],
['title' => 'المعاينة والحفظ', 'body' => 'اضغط <span class="field">معاينة</span> لرؤية الشكل النهائي ثم <span class="field">حفظ</span>.'],
],
'notifications.setup-trigger' => [
['title' => 'فتح المشغلات', 'body' => 'من <span class="field">الإشعارات</span> > <span class="field">المشغلات التلقائية</span> > <span class="field">مشغل جديد</span>.'],
['title' => 'اختيار الحدث', 'body' => 'حدد <span class="field">الحدث</span> المُشغّل (مثال: إنشاء عضوية، استحقاق قسط، قرب انتهاء اشتراك).'],
['title' => 'ربط القالب', 'body' => 'اختر <span class="field">القالب</span> الذي سيُستخدم و<span class="field">المستلم</span> (العضو نفسه / المسؤول / كلاهما).'],
['title' => 'التفعيل', 'body' => 'اضغط <span class="field">حفظ وتفعيل</span>. الإشعار يُرسل تلقائياً عند تحقق الحدث.<span class="warn">اختبر المشغل بحدث تجريبي قبل التفعيل النهائي.</span>'],
],
'notifications.send-manual' => [
['title' => 'فتح صفحة الإرسال', 'body' => 'من <span class="field">الإشعارات</span> > <span class="field">إرسال إشعار</span>.'],
['title' => 'اختيار المستلمين', 'body' => 'حدد المستلمين: عضو محدد، مجموعة (حسب النوع/الحالة/اللعبة)، أو الجميع.'],
['title' => 'كتابة الرسالة', 'body' => 'اختر قالب جاهز أو اكتب رسالة مخصصة. حدد <span class="field">القناة</span> (SMS/بريد/إشعار نظام).'],
['title' => 'الإرسال', 'body' => 'اضغط <span class="field">إرسال</span>. يتم تسجيل الإرسال في السجل مع حالة التسليم.<span class="success">يمكنك متابعة حالة الإرسال من سجل الإشعارات.</span>'],
],
'notifications.notification-log' => [
['title' => 'فتح السجل', 'body' => 'من <span class="field">الإشعارات</span> > <span class="field">السجل</span>.'],
['title' => 'محتوى السجل', 'body' => 'يعرض: التاريخ، المستلم، القناة، الحالة (مرسل/فشل/في الانتظار)، نص مختصر.'],
['title' => 'الفلترة', 'body' => 'صفّي حسب: <span class="field">التاريخ</span>، <span class="field">القناة</span>، <span class="field">الحالة</span>، <span class="field">المشغل</span>.<span class="info">الإشعارات الفاشلة يمكن إعادة إرسالها يدوياً.</span>'],
],
// ── PLAYER AFFAIRS ──
'player-affairs.register-player' => [
['title' => 'فتح صفحة اللاعبين', 'body' => 'من <span class="field">شؤون اللاعبين</span> > <span class="field">اللاعبين</span> > <span class="field">لاعب جديد</span>.'],
['title' => 'البيانات الشخصية', 'body' => 'أدخل <span class="field">الاسم</span>، <span class="field">تاريخ الميلاد</span>، <span class="field">الرقم القومي</span>، <span class="field">العنوان</span>، وبيانات ولي الأمر.'],
['title' => 'البيانات الرياضية', 'body' => 'حدد <span class="field">اللعبة</span>، <span class="field">المستوى</span>، <span class="field">التصنيف العمري</span>. ارفع <span class="field">الصورة الشخصية</span>.'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. يتم توليد رقم لاعب فريد.<span class="success">اللاعب جاهز للتسجيل في المجموعات والبرامج.</span>'],
],
'player-affairs.player-evaluation' => [
['title' => 'فتح التقييمات', 'body' => 'من <span class="field">شؤون اللاعبين</span> > <span class="field">التقييمات</span> > <span class="field">تقييم جديد</span>.'],
['title' => 'اختيار اللاعب والمعايير', 'body' => 'حدد <span class="field">اللاعب</span> و<span class="field">نوع التقييم</span> (فني/بدني/نفسي). أدخل الدرجات لكل محور.'],
['title' => 'الملاحظات والتوصيات', 'body' => 'أضف <span class="field">ملاحظات المدرب</span> و<span class="field">التوصيات</span> (ترقية/بقاء/تنزيل).'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. التقييم يظهر في ملف اللاعب.<span class="info">يمكن مقارنة التقييمات عبر الوقت لمتابعة التطور.</span>'],
],
'player-affairs.record-injury' => [
['title' => 'تسجيل إصابة', 'body' => 'من <span class="field">شؤون اللاعبين</span> > <span class="field">الإصابات</span> > <span class="field">إصابة جديدة</span>.'],
['title' => 'التفاصيل', 'body' => 'حدد <span class="field">اللاعب</span>، <span class="field">نوع الإصابة</span>، <span class="field">تاريخ الإصابة</span>، <span class="field">المنطقة</span>، <span class="field">الوصف</span>.'],
['title' => 'فترة التعافي', 'body' => 'حدد <span class="field">المدة المتوقعة</span> و<span class="field">تاريخ العودة</span>.<span class="warn">اللاعب المصاب لا يظهر في قوائم الحضور حتى تاريخ العودة.</span>'],
['title' => 'المتابعة', 'body' => 'يمكن تحديث حالة الإصابة (قيد التعافي/شُفي) من صفحة التفاصيل.'],
],
'player-affairs.fitness-test' => [
['title' => 'إنشاء اختبار', 'body' => 'من <span class="field">شؤون اللاعبين</span> > <span class="field">اختبارات اللياقة</span> > <span class="field">اختبار جديد</span>.'],
['title' => 'إدخال النتائج', 'body' => 'حدد اللاعب وأدخل نتائج الاختبارات: <span class="field">الجري</span>، <span class="field">القوة</span>، <span class="field">المرونة</span>، <span class="field">التحمل</span>.'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. النتائج تُقارن بالمعايير المعتمدة وتظهر في ملف اللاعب.<span class="success">يمكن عرض رسم بياني لتطور اللياقة عبر الزمن.</span>'],
],
'player-affairs.medical-approval' => [
['title' => 'فتح الموافقات الطبية', 'body' => 'من <span class="field">شؤون اللاعبين</span> > <span class="field">الموافقات الطبية</span>.'],
['title' => 'مراجعة الملف', 'body' => 'يعرض النظام: نتائج الفحص الطبي، الإصابات السابقة، الحالة الصحية.'],
['title' => 'القرار', 'body' => 'اضغط <span class="field">موافقة</span> (لائق) أو <span class="field">رفض</span> (غير لائق) مع ذكر السبب.<span class="warn">اللاعب غير المعتمد طبياً لا يمكن تسجيل حضوره.</span>'],
],
// ── FORMS ──
'forms.build-form' => [
['title' => 'فتح أداة البناء', 'body' => 'من <span class="field">النماذج</span> > <span class="field">بناء نموذج</span> > <span class="field">نموذج جديد</span>.'],
['title' => 'إضافة الحقول', 'body' => 'اسحب الحقول من الشريط الجانبي: نص، رقم، تاريخ، قائمة منسدلة، مرفق. رتّبها بالسحب.'],
['title' => 'الإعدادات', 'body' => 'لكل حقل حدد: <span class="field">العنوان</span>، <span class="field">مطلوب/اختياري</span>، <span class="field">قيمة افتراضية</span>.'],
['title' => 'الحفظ والنشر', 'body' => 'اضغط <span class="field">حفظ</span> ثم <span class="field">نشر</span>. النموذج يصبح متاحاً للتعبئة.<span class="info">يمكنك تضمين النموذج في صفحة العضو أو استخدامه مستقلاً.</span>'],
],
'forms.fill-form' => [
['title' => 'فتح النموذج', 'body' => 'من <span class="field">النماذج</span> > اختر النموذج المطلوب، أو من ملف العضو إذا كان النموذج مرتبطاً.'],
['title' => 'تعبئة الحقول', 'body' => 'أكمل جميع الحقول المطلوبة (المحددة بعلامة *). ارفع المرفقات إن وُجدت.'],
['title' => 'الإرسال', 'body' => 'اضغط <span class="field">إرسال</span>. يتم حفظ الاستمارة وإرسالها للمراجعة.<span class="success">يمكنك طباعة النموذج المعبأ من صفحة التقديمات.</span>'],
],
'forms.review-submissions' => [
['title' => 'فتح التقديمات', 'body' => 'من <span class="field">النماذج</span> > <span class="field">التقديمات</span>. يعرض جميع النماذج المُقدّمة.'],
['title' => 'عرض التفاصيل', 'body' => 'اضغط على أي تقديم لعرض البيانات المعبأة والمرفقات.'],
['title' => 'المعالجة', 'body' => 'يمكنك <span class="field">قبول</span> أو <span class="field">رفض</span> أو <span class="field">طلب تعديل</span>.<span class="info">حالة كل تقديم تظهر في قائمة التقديمات.</span>'],
],
'forms.print-form' => [
['title' => 'اختيار النموذج', 'body' => 'من <span class="field">النماذج</span> > اختر النموذج أو التقديم المطلوب طباعته.'],
['title' => 'الطباعة', 'body' => 'اضغط <span class="field">طباعة</span>. يتم عرض النموذج بتنسيق جاهز للطباعة مع شعار النادي.'],
],
// ── PRICING MANAGEMENT ──
'pricing-management.setup-pricing-rules' => [
['title' => 'فتح التسعير', 'body' => 'من <span class="field">التسعير</span>. يعرض جميع قواعد الأسعار الحالية.'],
['title' => 'فئات التسعير', 'body' => 'الأسعار مصنفة حسب: نوع العضوية، الفئة العمرية، نوع الخدمة. لكل فئة سعر مستقل.'],
['title' => 'تطبيق الأسعار', 'body' => 'الأسعار تُطبق تلقائياً عند إنشاء طلب دفع. تغيير السعر لا يؤثر على الطلبات القائمة.<span class="warn">أي تغيير في التسعير يحتاج صلاحية المدير المالي.</span>'],
],
'pricing-management.special-discounts' => [
['title' => 'فتح الخصومات', 'body' => 'من <span class="field">التسعير</span> > <span class="field">خصومات خاصة</span> > <span class="field">خصم جديد</span>.'],
['title' => 'بيانات الخصم', 'body' => 'حدد <span class="field">اسم الخصم</span>، <span class="field">النسبة أو المبلغ</span>، <span class="field">الفئة المستفيدة</span> (فرد/مجموعة/الكل).'],
['title' => 'الفترة والشروط', 'body' => 'حدد <span class="field">تاريخ البدء</span> و<span class="field">الانتهاء</span> والحد الأقصى للاستخدام.'],
['title' => 'التفعيل', 'body' => 'اضغط <span class="field">حفظ وتفعيل</span>. الخصم يُطبق تلقائياً عند الدفع.<span class="info">يمكنك تعطيل الخصم في أي وقت.</span>'],
],
'pricing-management.edit-pricing' => [
['title' => 'اختيار قاعدة التسعير', 'body' => 'من <span class="field">التسعير</span> > اضغط <span class="field">تعديل</span> بجانب القاعدة المطلوبة.'],
['title' => 'تعديل المبلغ', 'body' => 'عدّل <span class="field">السعر</span> أو <span class="field">الشروط</span>. يمكنك تحديد تاريخ سريان جديد.'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. السعر الجديد يسري على الطلبات الجديدة فقط.<span class="warn">الطلبات المعلقة تبقى بالسعر القديم.</span>'],
],
// ── AUDIT ──
'audit.view-audit-log' => [
['title' => 'فتح سجل المراجعة', 'body' => 'من القائمة: <span class="field">سجل المراجعة</span>. يعرض آخر العمليات بترتيب زمني.'],
['title' => 'محتوى كل سجل', 'body' => 'يعرض: <span class="field">التاريخ والوقت</span>، <span class="field">المستخدم</span>، <span class="field">نوع العملية</span>، <span class="field">الكيان المتأثر</span>، <span class="field">القيم قبل وبعد</span>.'],
['title' => 'التفاصيل', 'body' => 'اضغط على أي سجل لعرض التفاصيل الكاملة بما فيها القيم المتغيرة.<span class="info">هذا السجل لا يمكن تعديله — يُستخدم في المراجعة المالية والقانونية.</span>'],
],
'audit.entity-history' => [
['title' => 'الوصول لتاريخ الكيان', 'body' => 'من ملف أي عضو/سجل > <span class="field">سجل التعديلات</span>، أو من سجل المراجعة بتحديد الكيان.'],
['title' => 'عرض التعديلات', 'body' => 'يعرض جميع التعديلات على هذا السجل بالترتيب الزمني: من عدّل، متى، ماذا تغير.'],
['title' => 'المقارنة', 'body' => 'اضغط <span class="field">مقارنة</span> بين نسختين لعرض الفروقات جنباً إلى جنب.<span class="success">مفيد لمعرفة من غيّر بيانات عضو أو دفعة.</span>'],
],
'audit.filter-audit' => [
['title' => 'فتح الفلاتر', 'body' => 'من سجل المراجعة اضغط <span class="field">فلترة</span>.'],
['title' => 'معايير البحث', 'body' => 'صفّي حسب: <span class="field">الفترة</span>، <span class="field">المستخدم</span>، <span class="field">نوع العملية</span> (إنشاء/تعديل/حذف)، <span class="field">الوحدة</span>.'],
['title' => 'التصدير', 'body' => 'اضغط <span class="field">تصدير</span> للحصول على ملف Excel بالنتائج.<span class="info">مفيد لتقارير المراجعة الدورية.</span>'],
],
// ── PLAYGROUNDS ──
'playgrounds.create-playground' => [
['title' => 'إنشاء ملعب', 'body' => 'من <span class="field">الملاعب</span> > <span class="field">ملعب جديد</span>.'],
['title' => 'المواصفات', 'body' => 'أدخل <span class="field">الاسم</span>، <span class="field">النوع</span> (كرة قدم/تنس/كرة سلة)، <span class="field">المساحة</span>، <span class="field">السعة</span>، <span class="field">نوع الأرضية</span>.'],
['title' => 'ساعات التشغيل', 'body' => 'حدد ساعات الفتح والإغلاق لكل يوم وسعر الساعة.'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ</span>. الملعب جاهز لإنشاء الجداول والحجوزات.<span class="info">يمكن إضافة صور ومرفقات للملعب.</span>'],
],
'playgrounds.playground-schedule' => [
['title' => 'فتح جدول الملعب', 'body' => 'من صفحة الملعب > <span class="field">الجداول</span> > <span class="field">جدول جديد</span>.'],
['title' => 'تحديد الفترات', 'body' => 'قسّم اليوم إلى فترات: تدريب فرق، مباريات، إيجار خارجي، صيانة. لكل فترة حدد الوقت والمسؤول.'],
['title' => 'التكرار', 'body' => 'حدد أيام التكرار (يومي/أسبوعي) ومدة سريان الجدول.'],
['title' => 'التفعيل', 'body' => 'اضغط <span class="field">تفعيل</span>. الجدول يظهر في المرآة وتقويم الحجوزات.<span class="warn">تعديل جدول نشط يؤثر على الأيام المستقبلية فقط.</span>'],
],
'playgrounds.playground-mirror' => [
['title' => 'فتح المرآة', 'body' => 'من الملعب > <span class="field">المرآة</span>، أو من <span class="field">الملاعب</span> > <span class="field">المرآة الحية</span>.'],
['title' => 'العرض', 'body' => 'تعرض حالة كل خانة زمنية: <span style="color:#16A34A">متاح</span>، <span style="color:#DC2626">محجوز</span>، <span style="color:#F59E0B">صيانة</span>. مع اسم الحاجز ونوع النشاط.'],
['title' => 'التنقل', 'body' => 'تنقل بين الأيام والأسابيع. اضغط على أي خانة لعرض التفاصيل أو إنشاء حجز.<span class="success">يمكن عرض المرآة على شاشة كبيرة في الاستقبال.</span>'],
],
'playgrounds.playground-attendance' => [
['title' => 'فتح الحضور', 'body' => 'من الملعب > <span class="field">الحضور</span>. يعرض الحصص المجدولة لليوم.'],
['title' => 'تسجيل الحضور', 'body' => 'اختر الحصة. حدد اللاعبين الحاضرين بعلامة ✓. الغائبين يبقون بدون علامة.'],
['title' => 'الحفظ', 'body' => 'اضغط <span class="field">حفظ الحضور</span>. النسبة تُحسب وتظهر في تقارير المدرب.<span class="info">يمكن تعديل الحضور خلال 24 ساعة.</span>'],
],
]; ];
} }
...@@ -979,6 +1264,13 @@ final class TutorialRegistry ...@@ -979,6 +1264,13 @@ final class TutorialRegistry
'reservations' => self::reservationsCategories(), 'reservations' => self::reservationsCategories(),
'match-center' => self::matchCenterCategories(), 'match-center' => self::matchCenterCategories(),
'pool-management' => self::poolManagementCategories(), 'pool-management' => self::poolManagementCategories(),
'users' => self::usersCategories(),
'notifications' => self::notificationsCategories(),
'player-affairs' => self::playerAffairsCategories(),
'forms' => self::formsCategories(),
'pricing-management' => self::pricingManagementCategories(),
'audit' => self::auditCategories(),
'playgrounds' => self::playgroundsCategories(),
default => [], default => [],
}; };
} }
...@@ -1030,6 +1322,46 @@ final class TutorialRegistry ...@@ -1030,6 +1322,46 @@ final class TutorialRegistry
'category' => 'reports', 'category' => 'reports',
'order' => 5, 'order' => 5,
], ],
'fiscal-year-setup' => [
'title' => 'إعداد السنة المالية',
'subtitle' => 'إنشاء سنة مالية جديدة وتحديد فتراتها',
'icon' => 'calendar',
'color' => '#0891B2',
'category' => 'setup',
'order' => 6,
],
'cost-centers' => [
'title' => 'مراكز التكلفة',
'subtitle' => 'إنشاء مراكز تكلفة وربطها بالأقسام',
'icon' => 'target',
'color' => '#F59E0B',
'category' => 'setup',
'order' => 7,
],
'opening-entries' => [
'title' => 'القيود الافتتاحية',
'subtitle' => 'إدخال الأرصدة الافتتاحية عند بدء النظام',
'icon' => 'file-input',
'color' => '#7C3AED',
'category' => 'setup',
'order' => 8,
],
'period-closing' => [
'title' => 'إقفال الفترة',
'subtitle' => 'إقفال فترة محاسبية ومنع التعديل عليها',
'icon' => 'lock',
'color' => '#DC2626',
'category' => 'operations',
'order' => 9,
],
'financial-instruments' => [
'title' => 'الأوراق المالية',
'subtitle' => 'إدارة الشيكات والكمبيالات والسندات',
'icon' => 'file-check',
'color' => '#059669',
'category' => 'operations',
'order' => 10,
],
]; ];
} }
...@@ -1089,6 +1421,46 @@ final class TutorialRegistry ...@@ -1089,6 +1421,46 @@ final class TutorialRegistry
'category' => 'payroll', 'category' => 'payroll',
'order' => 5, 'order' => 5,
], ],
'create-contract' => [
'title' => 'إنشاء عقد عمل',
'subtitle' => 'تسجيل عقد جديد مع المدة والراتب',
'icon' => 'file-signature',
'color' => '#3B82F6',
'category' => 'setup',
'order' => 6,
],
'insurance-management' => [
'title' => 'التأمينات الاجتماعية',
'subtitle' => 'إدارة اشتراكات التأمينات وإصدار الاستمارات',
'icon' => 'shield-check',
'color' => '#0891B2',
'category' => 'payroll',
'order' => 7,
],
'disciplinary-action' => [
'title' => 'الإجراءات التأديبية',
'subtitle' => 'تسجيل مخالفة موظف وتطبيق الجزاء',
'icon' => 'alert-triangle',
'color' => '#DC2626',
'category' => 'operations',
'order' => 8,
],
'employee-loan' => [
'title' => 'سلفة موظف',
'subtitle' => 'إنشاء سلفة وجدولة الخصم من الراتب',
'icon' => 'banknote',
'color' => '#F59E0B',
'category' => 'payroll',
'order' => 9,
],
'overtime-management' => [
'title' => 'إدارة الإضافي',
'subtitle' => 'تسجيل ساعات العمل الإضافية واعتمادها',
'icon' => 'timer',
'color' => '#059669',
'category' => 'operations',
'order' => 10,
],
]; ];
} }
...@@ -1148,6 +1520,14 @@ final class TutorialRegistry ...@@ -1148,6 +1520,14 @@ final class TutorialRegistry
'category' => 'payments', 'category' => 'payments',
'order' => 5, 'order' => 5,
], ],
'request-for-quotation' => [
'title' => 'طلب عروض أسعار',
'subtitle' => 'إرسال طلب عرض لعدة موردين ومقارنة العروض',
'icon' => 'mail',
'color' => '#0891B2',
'category' => 'operations',
'order' => 6,
],
]; ];
} }
...@@ -1206,6 +1586,38 @@ final class TutorialRegistry ...@@ -1206,6 +1586,38 @@ final class TutorialRegistry
'category' => 'setup', 'category' => 'setup',
'order' => 5, 'order' => 5,
], ],
'stock-transfer' => [
'title' => 'تحويل بين المخازن',
'subtitle' => 'نقل أصناف من مخزن لآخر مع إذن تحويل',
'icon' => 'truck',
'color' => '#3B82F6',
'category' => 'operations',
'order' => 6,
],
'purchase-order' => [
'title' => 'أمر شراء',
'subtitle' => 'إنشاء أمر شراء للمخزون واستلام البضاعة',
'icon' => 'shopping-cart',
'color' => '#D97706',
'category' => 'operations',
'order' => 7,
],
'manage-suppliers' => [
'title' => 'إدارة الموردين',
'subtitle' => 'إضافة مورد وتسجيل بياناته وتاريخ التعامل',
'icon' => 'building-2',
'color' => '#059669',
'category' => 'setup',
'order' => 8,
],
'asset-management' => [
'title' => 'إدارة الأصول الثابتة',
'subtitle' => 'تسجيل أصل ثابت ومتابعة الإهلاك والعهدة',
'icon' => 'hard-drive',
'color' => '#DC2626',
'category' => 'operations',
'order' => 9,
],
]; ];
} }
...@@ -2480,4 +2892,349 @@ final class TutorialRegistry ...@@ -2480,4 +2892,349 @@ final class TutorialRegistry
'operations' => ['label' => 'التشغيل', 'icon' => 'calendar-clock', 'color' => '#059669'], 'operations' => ['label' => 'التشغيل', 'icon' => 'calendar-clock', 'color' => '#059669'],
]; ];
} }
// ─────────────────────────────────────────────────────────────────────
// USERS
// ─────────────────────────────────────────────────────────────────────
private static function usersTutorials(): array
{
return [
'create-user' => [
'title' => 'إنشاء مستخدم جديد',
'subtitle' => 'إضافة حساب دخول للنظام مع البيانات الأساسية',
'icon' => 'user-plus',
'color' => '#6366F1',
'category' => 'setup',
'order' => 1,
],
'edit-user' => [
'title' => 'تعديل بيانات المستخدم',
'subtitle' => 'تحديث المعلومات الشخصية وبيانات الاتصال',
'icon' => 'user-cog',
'color' => '#3B82F6',
'category' => 'operations',
'order' => 2,
],
'manage-user-permissions' => [
'title' => 'إدارة صلاحيات المستخدم',
'subtitle' => 'تعيين أدوار وصلاحيات مخصصة للمستخدم',
'icon' => 'shield',
'color' => '#7C3AED',
'category' => 'operations',
'order' => 3,
],
'user-activity-log' => [
'title' => 'سجل نشاط المستخدم',
'subtitle' => 'مراجعة العمليات التي قام بها المستخدم',
'icon' => 'activity',
'color' => '#059669',
'category' => 'reports',
'order' => 4,
],
];
}
private static function usersCategories(): array
{
return [
'setup' => ['label' => 'إنشاء الحسابات', 'icon' => 'user-plus', 'color' => '#6366F1'],
'operations' => ['label' => 'الإدارة', 'icon' => 'user-cog', 'color' => '#3B82F6'],
'reports' => ['label' => 'المتابعة', 'icon' => 'activity', 'color' => '#059669'],
];
}
// ─────────────────────────────────────────────────────────────────────
// NOTIFICATIONS
// ─────────────────────────────────────────────────────────────────────
private static function notificationsTutorials(): array
{
return [
'create-template' => [
'title' => 'إنشاء قالب إشعار',
'subtitle' => 'تصميم قالب رسالة قابل لإعادة الاستخدام',
'icon' => 'file-text',
'color' => '#F97316',
'category' => 'setup',
'order' => 1,
],
'setup-trigger' => [
'title' => 'إعداد مشغل تلقائي',
'subtitle' => 'ربط حدث بإشعار يُرسل تلقائياً',
'icon' => 'zap',
'color' => '#059669',
'category' => 'setup',
'order' => 2,
],
'send-manual' => [
'title' => 'إرسال إشعار يدوي',
'subtitle' => 'إرسال رسالة لعضو أو مجموعة مختارة',
'icon' => 'send',
'color' => '#3B82F6',
'category' => 'operations',
'order' => 3,
],
'notification-log' => [
'title' => 'سجل الإشعارات',
'subtitle' => 'مراجعة الإشعارات المرسلة وحالة التسليم',
'icon' => 'list',
'color' => '#7C3AED',
'category' => 'reports',
'order' => 4,
],
];
}
private static function notificationsCategories(): array
{
return [
'setup' => ['label' => 'الإعداد', 'icon' => 'settings', 'color' => '#F97316'],
'operations' => ['label' => 'الإرسال', 'icon' => 'send', 'color' => '#3B82F6'],
'reports' => ['label' => 'السجل', 'icon' => 'list', 'color' => '#7C3AED'],
];
}
// ─────────────────────────────────────────────────────────────────────
// PLAYER AFFAIRS
// ─────────────────────────────────────────────────────────────────────
private static function playerAffairsTutorials(): array
{
return [
'register-player' => [
'title' => 'تسجيل لاعب جديد',
'subtitle' => 'إضافة لاعب مع البيانات الشخصية والرياضية',
'icon' => 'user-plus',
'color' => '#0D9488',
'category' => 'setup',
'order' => 1,
],
'player-evaluation' => [
'title' => 'تقييم اللاعب',
'subtitle' => 'إجراء تقييم فني وبدني للاعب',
'icon' => 'star',
'color' => '#F59E0B',
'category' => 'operations',
'order' => 2,
],
'record-injury' => [
'title' => 'تسجيل إصابة',
'subtitle' => 'تسجيل إصابة لاعب مع التفاصيل والمتابعة',
'icon' => 'heart-pulse',
'color' => '#DC2626',
'category' => 'operations',
'order' => 3,
],
'fitness-test' => [
'title' => 'اختبار لياقة بدنية',
'subtitle' => 'تسجيل نتائج اختبارات اللياقة',
'icon' => 'activity',
'color' => '#059669',
'category' => 'operations',
'order' => 4,
],
'medical-approval' => [
'title' => 'الموافقة الطبية',
'subtitle' => 'اعتماد اللاعب طبياً للمشاركة في التدريب',
'icon' => 'stethoscope',
'color' => '#3B82F6',
'category' => 'medical',
'order' => 5,
],
];
}
private static function playerAffairsCategories(): array
{
return [
'setup' => ['label' => 'التسجيل', 'icon' => 'user-plus', 'color' => '#0D9488'],
'operations' => ['label' => 'التقييم والمتابعة', 'icon' => 'star', 'color' => '#F59E0B'],
'medical' => ['label' => 'الملف الطبي', 'icon' => 'stethoscope', 'color' => '#3B82F6'],
];
}
// ─────────────────────────────────────────────────────────────────────
// FORMS
// ─────────────────────────────────────────────────────────────────────
private static function formsTutorials(): array
{
return [
'build-form' => [
'title' => 'بناء نموذج إلكتروني',
'subtitle' => 'تصميم نموذج مخصص باستخدام أداة السحب والإفلات',
'icon' => 'layout',
'color' => '#8B5CF6',
'category' => 'setup',
'order' => 1,
],
'fill-form' => [
'title' => 'تعبئة نموذج',
'subtitle' => 'ملء نموذج وإرساله',
'icon' => 'edit',
'color' => '#3B82F6',
'category' => 'operations',
'order' => 2,
],
'review-submissions' => [
'title' => 'مراجعة التقديمات',
'subtitle' => 'عرض الردود المقدمة ومعالجتها',
'icon' => 'inbox',
'color' => '#059669',
'category' => 'operations',
'order' => 3,
],
'print-form' => [
'title' => 'طباعة نموذج',
'subtitle' => 'طباعة نموذج فارغ أو معبأ',
'icon' => 'printer',
'color' => '#F59E0B',
'category' => 'operations',
'order' => 4,
],
];
}
private static function formsCategories(): array
{
return [
'setup' => ['label' => 'تصميم النماذج', 'icon' => 'layout', 'color' => '#8B5CF6'],
'operations' => ['label' => 'الاستخدام', 'icon' => 'edit', 'color' => '#3B82F6'],
];
}
// ─────────────────────────────────────────────────────────────────────
// PRICING MANAGEMENT
// ─────────────────────────────────────────────────────────────────────
private static function pricingManagementTutorials(): array
{
return [
'setup-pricing-rules' => [
'title' => 'إعداد قواعد التسعير',
'subtitle' => 'تحديد أسعار العضويات والخدمات',
'icon' => 'tag',
'color' => '#059669',
'category' => 'setup',
'order' => 1,
],
'special-discounts' => [
'title' => 'الخصومات الخاصة',
'subtitle' => 'إنشاء خصم لفئة أو عضو محدد',
'icon' => 'percent',
'color' => '#DC2626',
'category' => 'operations',
'order' => 2,
],
'edit-pricing' => [
'title' => 'تعديل الأسعار',
'subtitle' => 'تحديث أسعار الخدمات والاشتراكات',
'icon' => 'edit',
'color' => '#F59E0B',
'category' => 'operations',
'order' => 3,
],
];
}
private static function pricingManagementCategories(): array
{
return [
'setup' => ['label' => 'الإعداد', 'icon' => 'tag', 'color' => '#059669'],
'operations' => ['label' => 'العمليات', 'icon' => 'edit', 'color' => '#F59E0B'],
];
}
// ─────────────────────────────────────────────────────────────────────
// AUDIT
// ─────────────────────────────────────────────────────────────────────
private static function auditTutorials(): array
{
return [
'view-audit-log' => [
'title' => 'عرض سجل المراجعة',
'subtitle' => 'البحث في سجل التعديلات والعمليات',
'icon' => 'scroll',
'color' => '#64748B',
'category' => 'operations',
'order' => 1,
],
'entity-history' => [
'title' => 'تاريخ كيان محدد',
'subtitle' => 'عرض كل التعديلات على عضو أو سجل',
'icon' => 'history',
'color' => '#3B82F6',
'category' => 'operations',
'order' => 2,
],
'filter-audit' => [
'title' => 'فلترة وتصدير السجل',
'subtitle' => 'البحث بالتاريخ والمستخدم والنوع والتصدير',
'icon' => 'filter',
'color' => '#059669',
'category' => 'reports',
'order' => 3,
],
];
}
private static function auditCategories(): array
{
return [
'operations' => ['label' => 'العرض والبحث', 'icon' => 'scroll', 'color' => '#64748B'],
'reports' => ['label' => 'التقارير', 'icon' => 'filter', 'color' => '#059669'],
];
}
// ─────────────────────────────────────────────────────────────────────
// PLAYGROUNDS
// ─────────────────────────────────────────────────────────────────────
private static function playgroundsTutorials(): array
{
return [
'create-playground' => [
'title' => 'إنشاء ملعب',
'subtitle' => 'تعريف ملعب جديد مع المواصفات',
'icon' => 'layout-grid',
'color' => '#16A34A',
'category' => 'setup',
'order' => 1,
],
'playground-schedule' => [
'title' => 'جدول الملعب',
'subtitle' => 'إنشاء جدول أسبوعي للتدريبات والمباريات',
'icon' => 'calendar',
'color' => '#3B82F6',
'category' => 'operations',
'order' => 2,
],
'playground-mirror' => [
'title' => 'المرآة الحية للملعب',
'subtitle' => 'عرض حالة الملعب لحظياً مع الحجوزات',
'icon' => 'monitor',
'color' => '#7C3AED',
'category' => 'operations',
'order' => 3,
],
'playground-attendance' => [
'title' => 'حضور الملعب',
'subtitle' => 'تسجيل حضور اللاعبين لكل حصة',
'icon' => 'check-square',
'color' => '#059669',
'category' => 'operations',
'order' => 4,
],
];
}
private static function playgroundsCategories(): array
{
return [
'setup' => ['label' => 'الإعداد', 'icon' => 'layout-grid', 'color' => '#16A34A'],
'operations' => ['label' => 'التشغيل', 'icon' => 'calendar', 'color' => '#3B82F6'],
];
}
} }
...@@ -190,6 +190,9 @@ window.addEventListener('load', function() { ...@@ -190,6 +190,9 @@ window.addEventListener('load', function() {
}); });
</script> </script>
<?= $__template->yield('scripts', '') ?> <?= $__template->yield('scripts', '') ?>
<?php if (str_starts_with($_SERVER['REQUEST_URI'] ?? '', '/tutorials/')): ?>
<script src="/assets/js/tutorial-screenshots.js"></script>
<?php endif; ?>
<?php if ($app->isDebug()): ?> <?php if ($app->isDebug()): ?>
<?= \App\Core\DebugBar::render() ?> <?= \App\Core\DebugBar::render() ?>
<?php endif; ?> <?php endif; ?>
......
(function() {
'use strict';
var path = window.location.pathname;
if (path.indexOf('/tutorials') !== 0) return;
var parts = path.replace(/^\/tutorials\/?/, '').split('/');
if (parts.length < 2 || !parts[1]) return;
var section = parts[0];
var slug = parts[1];
var steps = document.querySelectorAll('.tut-step');
if (!steps.length) return;
var style = document.createElement('style');
style.textContent = '.tut-screenshot{margin-top:12px;border:1px solid #E5E7EB;border-radius:8px;overflow:hidden;cursor:pointer;max-height:220px;position:relative;transition:max-height .3s ease}.tut-screenshot::after{content:"\\1F50D اضغط للتكبير";position:absolute;bottom:0;left:0;right:0;padding:8px;text-align:center;font-size:11px;color:#6B7280;background:linear-gradient(transparent,#fff 80%)}.tut-screenshot.expanded{max-height:none}.tut-screenshot.expanded::after{content:"اضغط للتصغير";background:#F9FAFB;position:static;display:block;padding:8px;border-top:1px solid #E5E7EB}.tut-screenshot img{width:100%;display:block;border-radius:8px 8px 0 0}';
document.head.appendChild(style);
var basePath = '/assets/tutorials/' + section + '/' + slug + '/';
steps.forEach(function(stepEl, idx) {
var imgPath = basePath + 'step-' + (idx + 1) + '.png';
var img = new Image();
img.onload = function() {
var wrapper = document.createElement('div');
wrapper.className = 'tut-screenshot';
wrapper.onclick = function() { this.classList.toggle('expanded'); };
wrapper.appendChild(img);
stepEl.appendChild(wrapper);
};
img.src = imgPath;
img.alt = 'لقطة شاشة - خطوة ' + (idx + 1);
});
})();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment