البدء
ثبّت AssetHub على cPanel أو Hostinger أو VPS الخاص بك في أقل من 10 دقائق.
المستخدمون والأدوار
5 أدوار جاهزة بصلاحيات Spatie، قابلة للضبط الدقيق لكل مستخدم.
ميزات المنتج
الأصول وسير العمل والصيانة والإهلاك وسجل التدقيق والمزيد.
التخصيص
أضف حقولاً مخصصة بلا حدود، وغيّر العلامة التجارية واللغات والمظاهر.
إعداد Hostinger
نشر تفصيلي خطوة بخطوة على باقة Single المشتركة الأرخص.
إعداد cPanel
نشر تفصيلي خطوة بخطوة على استضافة مشتركة cPanel قياسية — دون الحاجة إلى Terminal.
الأمن ورمز QR
HTTPS وWebhooks موقّعة HMAC وسجل تدقيق ومسح QR عبر الكاميرا.
التقارير والتصدير
8 تقارير مدمجة مع تصدير Excel + PDF وتصفية حسب التاريخ.
تنبيهات البريد
تذكيرات الضمان والصيانة وانتهاء الوثائق وعمليات الإخراج المتأخرة.
الأسئلة الشائعة
هل يمكنني تشغيل AssetHub على باقة Hostinger Single الأرخص؟
نعم — AssetHub متوافق تمامًا مع Hostinger Single (~$2.99/شهر). تتضمّن باقة Single نسخة PHP 8.3 وMySQL وCron Jobs أصلية وSSL مجاني — كل ما يحتاجه AssetHub. لا حاجة لـ SSH ولا Composer ولا سطر الأوامر. راجع قسم إعداد Hostinger للحصول على دليل خطوة بخطوة.
هل أحتاج إلى مهارات تقنية لتثبيته؟
لا. المثبّت الويب يتكفّل بكل شيء: فحص المتطلبات وإعداد قاعدة البيانات وعمليات Migration وإنشاء حساب المسؤول. فقط ارفع الملفات، وافتح /install في متصفحك، واتبع المعالج.
كيف تعمل رسائل البريد المجدولة (تنبيهات الضمان/الصيانة)؟
يستخدم AssetHub مجدّول Laravel. تحتاج فقط إلى تهيئة cron job واحد يعمل كل دقيقة، ويقوم Laravel داخليًا بتوزيع كل مهمة في وقتها الصحيح (يوميًا 08:00، شهريًا، إلخ). لـ cPanel، اضبطه في Advanced → Cron Jobs. لـ Hostinger، استخدم hPanel → Advanced → Cron Jobs. راجع إعداد cPanel → الخطوة 7 أو إعداد Hostinger → الخطوة 5. إذا لم يكن لدى مضيفك cron، استخدم رابط Cron داخل التطبيق مع خدمة cron-job.org المجانية.
ما طرق الإهلاك المدعومة؟
ثلاث طرق: القسط الثابت (إهلاك سنوي متساوٍ)، الرصيد المتناقص (متسارع، شائع للأغراض الضريبية)، ووحدات الإنتاج (حسب الاستخدام، لمعدات التصنيع). تُحدَّث قيم الأصول تلقائيًا في أول يوم من كل شهر.
هل يعمل ماسح QR على الهواتف المحمولة؟
نعم — يستخدم كاميرا المتصفح عبر html5-qrcode ويعمل على أي متصفح حديث للهاتف/الجهاز اللوحي/سطح المكتب. المتطلب الوحيد هو HTTPS. يعمل cPanel AutoSSL وHostinger Let's Encrypt SSL فور التثبيت.
هل يمكنني إضافة حقول خاصة بي دون برمجة؟
نعم. المسؤول ← الحقول المخصصة يتيح لك إضافة سمات بلا حدود (نص، رقم، تاريخ، اختيار، منطقة نص، ملف، مربع اختيار)، وحصرها بفئات محددة، وتعليمها كإلزامية، وإعادة ترتيبها بالسحب والإفلات — كل ذلك من الواجهة.
كم لغة يدعم AssetHub؟
11 لغة جاهزة: الإنجليزية، الفيتنامية، الإسبانية، الفرنسية، الألمانية، الصينية، اليابانية، البرتغالية (BR)، الروسية، العربية (بدعم RTL كامل)، والهندية (हिन्दी). يدير المسؤولون الترجمات من Administration → Translations (يتطلب صلاحية manage translations).
هل يمكنني تثبيت AssetHub على استضافة مشتركة cPanel؟
نعم — يعمل AssetHub على أي خطة استضافة مشتركة cPanel قياسية مع PHP 8.2+ وMySQL وCron Jobs. لا يلزم Composer أو Node.js على الخادم — الحزمة جاهزة مسبقًا. كثير من مضيفي cPanel لا يوفرون Terminal على الويب؛ هذا لا بأس. راجع قسم إعداد cPanel للحصول على الدليل الكامل خطوة بخطوة (بما في ذلك كيفية توليد APP_KEY بدون Terminal).
كيف أخصّص علامة AssetHub التجارية (صفحة الدخول وعنوان التبويب والألوان)؟
يمكن إعادة علامة AssetHub التجارية بالكامل من لوحة الإدارة — دون تعديل الكود أو npm run build. منذ v3.1.0 يتبع شعار الدخول والتذييل والشارة Settings → Branding → App Name. يضيف v4.0 عنوان تبويب المتصفح في الوقت الفعلي وتبويب Appearance لتخصيص الألوان على مستوى التطبيق للوضعين الفاتح والداكن.
auth.login_subtitle لكل لغة → خصّص الألوان في Settings → Appearance.
مرجع سريع:
| العنصر | مثال | طريقة التغيير |
|---|---|---|
| Top-left logo & wordmark | VimoticFAR | Settings → Branding → App Name |
| Login subtitle | Enter your credentials to access AssetHub | Administration → Translations → auth.login_subtitle |
| Footer copyright | © 2026 VimoticFAR | Settings → Branding → App Name |
| Right panel badge | VIMOTICFAR | Settings → Branding → App Name |
| Browser page title (tab) | YourAppName | Settings → Branding → App Name (v4.0+) |
| App colors (buttons, sidebar, badges…) | Custom green / blue palette | Settings → Appearance (v4.0+) |
1. Logo and wordmark:
- Sign in as an administrator.
- Go to Settings → Branding.
- Update App Name (and optionally upload a logo).
- Save.
This name appears on the login page (logo, footer, badge), in the sidebar, and — since v4.0 — in the browser tab title on every page.
2. Browser page title (v4.0):
The text shown in the browser tab follows Settings → Branding → App Name at runtime. Change App Name, save, and refresh — no .env edit or rebuild needed. The title updates on the login screen and after sign-in.
3. Login subtitle: the line below the main heading uses the translation key auth.login_subtitle (not App Name).
- In the app (recommended): Administration → Translations → select language → group auth → key
login_subtitle→ replaceAssetHubwith your app name → Save. Repeat for each language. - In code: edit
lang/{locale}/auth.php— e.g.'login_subtitle' => 'Enter your credentials to access YourAppName',
4. Footer and right-panel badge: since v3.1.0, the footer (© {year} …) and the uppercase badge on the right column use the same App Name as the logo. Change it once under Settings → Branding and refresh the login page.
5. App colors — Appearance (v4.0):
The Appearance tab lets you change the color scheme for the entire application — buttons, sidebar highlights, badges, links, and themed text — separately for light and dark mode. Colors are saved to the database.
- Open: Sidebar → Settings → Appearance (requires manage settings permission).
- Color groups: Brand & Accent (primary UI), Success / Warning / Danger / Info (status badges), Primary / Secondary / Muted / Link (text).
- Light & dark: use the Editing: Light / Dark toggle — configure both if your team uses dark mode. Live Preview on the right.
- Save: click Save appearance to apply app-wide. Reset to defaults restores AssetHub's built-in palette (save afterward to persist).
Branding vs Appearance: Branding = app name, logo, page title. Appearance = colors only. For a complete visual rebrand, update both tabs.
Notes:
- Changing App Name does not update translation strings — edit
auth.login_subtitle(and otherauth.*keys) per language. - Translation overrides in Administration → Translations are stored in the database and survive app updates.
- The login page right column (headline, features) uses other
auth.*keys — edit them under the same auth group if needed. - If colors do not update after saving Appearance, hard-refresh (Ctrl+F5) and confirm you are editing the correct light/dark palette.
- After upgrading from an older package, upload the full current
source/files (including pre-builtpublic/build/) if branding features are missing.
نظرة عامة
AssetHub نظام إدارة أصول متكامل مبني على Laravel 11 وVue 3 وTailwind CSS. الإصدار 3.0 يضيف Translation Editor كاملًا، locales مخصصة، استيراد/تصدير CSV، وتوطين فعّال للمنطقة الزمنية والعملة — فوق تتبّع الدُفعات/اللوت في v2 والتخصيصات والتخلص وصفحات QR العامة للتسليم.
تتبّع برمز QR
توليد رموز QR تلقائيًا لكل أصل. امسح بأي كاميرا متصفح.
الإهلاك
3 طرق: القسط الثابت، الرصيد المتناقص، وحدات الإنتاج.
الحقول المخصصة
أضف سمات مخصصة بلا حدود — نص، تاريخ، اختيار، ملف، مربع اختيار.
خطافات الويب
15 نوعًا من الأحداث مع توقيع HMAC وإعادة محاولة تلقائية.
سجل التدقيق
كل تغيير مسجّل مع عارض diff كامل.
التقارير
12 تقريرًا مع مخطّطات وتصدير Excel وPDF.
متطلبات الخادم
- PHP 8.2 أو أعلى
- MySQL 5.7+ أو MariaDB 10.3+
- Composer 2.x
- Node.js 18+ وnpm 9+
- خادم ويب: Apache أو Nginx
ملحقات PHP المطلوبة
- OpenSSL, PDO, PDO_MySQL, Mbstring, Tokenizer, XML, Ctype, JSON, GD, Fileinfo
مساحة القرص
200 ميغابايت على الأقل تقريبًا. خصّص مساحة إضافية لصور الأصول ومرفقات الوثائق.
التثبيت
الخيار A — المثبّت الويب (موصى به)
- ارفع ملفات المشروع إلى خادم الويب الخاص بك.
- وجّه document root للنطاق إلى
public/. - اضبط الصلاحيات: يجب أن تكون
storage/وbootstrap/cache/قابلة للكتابة (chmod 775). - انسخ
.env.exampleإلى.envواضبطAPP_KEY(نفّذphp artisan key:generateإذا كان لديك SSH/Terminal، أو راجع إعداد cPanel → الخطوة 5 لبدائل File Manager). - افتح
https://yourdomain.com/installفي متصفحك. - اتبع المعالج — Requirements ← Database ← Migrate ← Admin Account ← Done.
الخيار B — التثبيت عبر CLI
# 1. تثبيت الاعتماديات
composer install --no-dev --optimize-autoloader
npm install
npm run build
# 2. ضبط البيئة
cp .env.example .env
php artisan key:generate
# 3. تحرير .env لإعداد بيانات DB
# DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD
# 4. إنشاء جداول قاعدة البيانات وزرع البيانات الأولية
php artisan migrate --seed
# 5. إنشاء storage symlink للتحميلات
php artisan storage:link
# 6. تخزين مؤقت للإعدادات للإنتاج
php artisan config:cache
php artisan route:cache
php artisan view:cache
# 7. التعليم كمثبّت
echo "Installed" > storage/installed.lock
public/. لـ Apache، يتولّى .htaccess المرفق إعادة كتابة الـ URL. لـ Nginx، راجع دليل نشر Laravel.
الخطوة 2 في المعالج — إعداد قاعدة البيانات
عند وصول المعالج إلى الخطوة 2، يجب إدخال تفاصيل اتصال MySQL لقاعدة البيانات التي أنشأتها في لوحة الاستضافة. يجب أن تكون قاعدة البيانات موجودة مسبقًا (يمكن أن تكون فارغة — الخطوة التالية في المعالج ستنشئ الجداول).
| الحقل | الافتراضي / مثال | ملاحظات |
|---|---|---|
| Host | 127.0.0.1 | يعمل على 99% من الاستضافات المشتركة (Hostinger، cPanel، Plesk). اترك هذا الافتراضي ما لم يوفّر مضيفك اسم MySQL مخصصًا (خدمات DB مُدارة مثل AWS RDS، DigitalOcean Managed Database). |
| Port | 3306 | منفذ MySQL القياسي. غيّره فقط إذا كان مزوّدك يستخدم منفذًا غير قياسي (نادر). |
| اسم قاعدة البيانات | uXXXXXX_assethub | الاسم الكامل الظاهر في لوحة الاستضافة. معظم المضيفين المشتركين يضيفون بادئة معرّف المستخدم (مثل Hostinger: u287094729_assethub). |
| اسم المستخدم | uXXXXXX_assethub | مستخدم MySQL بصلاحيات على قاعدة البيانات أعلاه. لا تستخدم root — المضيفون المشتركون لا يسمحون بذلك. |
| كلمة المرور | (كلمة مرور DB الخاصة بك) | كلمة المرور التي ضبطتها أو نسختها عند إنشاء مستخدم MySQL. معظم المضيفين يعرضونها مرة واحدة عند الإنشاء — استخدم "View / Reset" إذا لم تحفظها. |
أين تجد هذه البيانات حسب لوحة الاستضافة
- Hostinger: hPanel → Databases → Management → انقر قاعدة البيانات. تعرض الصفحة الاسم واسم المستخدم وزر "Show password".
- cPanel: cPanel → MySQL Databases. قائمة قواعد البيانات تعرض الأسماء؛ المستخدمون مدرجون أدناه. استخدم "Change Password" عند الحاجة.
- Plesk: Plesk → Databases → انقر اسم قاعدة البيانات. صفحة التفاصيل تعرض البيانات وتوفّر إعادة تعيين كلمة المرور.
- DirectAdmin: DirectAdmin → MySQL Management → انقر قاعدة البيانات. البيانات وإعادة تعيين كلمة المرور في صفحة تفاصيل قاعدة البيانات.
- DB خارجي / مُدار: AWS RDS، DigitalOcean Managed Database، إلخ. استخدم اسم المضيف المخصص والمنفذ (غالبًا
3306لكن تحقّق)، اسم DB، المستخدم وكلمة المرور من وحدة التحكم السحابية. تأكّد من إدراج IP الخادم في قائمة السماح بجدار حماية DB.
أخطاء شائعة وكيفية إصلاحها
| رسالة الخطأ | السبب والإصلاح |
|---|---|
SQLSTATE[HY000] [1045] Access denied | اسم مستخدم أو كلمة مرور خاطئة، أو المستخدم لا يملك وصولًا إلى هذه قاعدة البيانات. تحقّق من الإملاء (بما في ذلك بادئة المستخدم على الاستضافة المشتركة). أعد تعيين كلمة المرور في لوحة الاستضافة إذا لم تكن متأكدًا. |
SQLSTATE[HY000] [1049] Unknown database | اسم قاعدة البيانات خاطئ، أو لم تنشئ قاعدة البيانات بعد في لوحة الاستضافة. أنشئها أولًا، ثم أعد إدخال الاسم الدقيق (بما في ذلك أي بادئة). |
SQLSTATE[HY000] [2002] Connection refused | لا يمكن الوصول إلى خادم MySQL. تحقّق من Host وPort. على الاستضافة المشتركة جرّب localhost بدلًا من 127.0.0.1 أو العكس. لقواعد DB المُدارة، تأكّد من إدراج IP الخادم في القائمة البيضاء. |
SQLSTATE[42S02] Base table not found: sessions | يحدث عند ضبط SESSION_DRIVER=database أو CACHE_STORE=database في .env قبل وجود الجداول. حرّر .env وغيّر كليهما إلى file، احفظ، ثم أعد تحميل المعالج. يمكنك العودة إلى database بعد التثبيت إذا فضّلت. |
could not find driver | امتداد PHP pdo_mysql مفقود أو معطّل. فعّله في لوحة استضافتك (PHP Configuration → Extensions). في cPanel: MultiPHP INI Editor → Extensions أو Select PHP Version → Extensions. في Hostinger: hPanel → Advanced → PHP Configuration → تبويب PHP Extensions. |
127.0.0.1 و3306) — اتركهما كما هما على الاستضافة المشتركة. تحتاج فقط إلى كتابة اسم قاعدة البيانات واسم المستخدم وكلمة المرور. انقر Test & Save → للتحقّق من الاتصال والانتقال إلى الخطوة 3.
الجهاز المحلي (التطوير المحلي)
دليل سريع لتشغيل AssetHub على جهاز الكمبيوتر الخاص بك لأغراض الاختبار أو التطوير قبل النشر إلى الإنتاج. اختر البيئة التي تطابق نظام التشغيل لديك.
الخيار 1 — Laravel Herd (موصى به، macOS و Windows)
Laravel Herd هي البيئة المحلية الرسمية من فريق Laravel — مجانية، أصلية، بدون Docker. تتضمّن PHP 8.2/8.3/8.4 وNginx و(في Herd Pro) MySQL/Redis.
- حمّل وثبّت Laravel Herd من herd.laravel.com.
- ضع مجلد مشروع AssetHub داخل
~/Herd/(macOS) أو%USERPROFILE%\Herd\(Windows). يُنشئ Herd تلقائيًا نطاقًا بصيغة.test— مثلًاhttp://assethub.test. - افتح Herd ← Sites وتحقّق من أن إصدار PHP هو 8.2 أو 8.3. انقر بالزر الأيمن على الموقع ← Secure لتفعيل HTTPS (مطلوب لماسح QR).
- أنشئ قاعدة بيانات MySQL. مع Herd Pro، استخدم Services ← MySQL ← Open in TablePlus. وإلا ثبّت MySQL Community أو استخدم SQLite (
DB_CONNECTION=sqlite،touch database/database.sqlite). - انسخ
.env.exampleإلى.env، املأ بيانات اعتماد قاعدة البيانات، ثم نفّذphp artisan key:generateمن جذر المشروع. - افتح
http://assethub.test/installفي متصفحك واتبع معالج التثبيت.
الخيار 2 — XAMPP (Windows وmacOS وLinux)
XAMPP يجمع Apache وMySQL/MariaDB وPHP. مجاني ومتعدد المنصات. احرص على اختيار إصدار بـ PHP 8.2 أو أحدث.
- حمّل XAMPP 8.2+ من apachefriends.org وثبّته.
- انسخ مشروع AssetHub إلى
C:\xampp\htdocs\AssetHub\(Windows) أو/Applications/XAMPP/htdocs/AssetHub/(macOS). - افتح XAMPP Control Panel وشغّل Apache وMySQL. إذا كانت المنافذ مشغولة، استخدم Config ← service.conf لتغيير Apache إلى 8080.
- اذهب إلى
http://localhost/phpmyadmin← جديد ← أنشئ قاعدة بيانات باسمassethubبترتيب utf8mb4. - في مجلد المشروع: انسخ
.env.exampleإلى.env، اضبطDB_DATABASE=assethub،DB_USERNAME=root، اتركDB_PASSWORDفارغًا (افتراضي XAMPP). نفّذphp artisan key:generate. - زر
http://localhost/AssetHub/public/installلتشغيل معالج التثبيت.
/public/: أنشئ مضيفًا افتراضيًا في C:\xampp\apache\conf\extra\httpd-vhosts.conf يشير DocumentRoot إلى مجلد public/ الخاص بالمشروع، ثم أضف 127.0.0.1 assethub.local إلى ملف hosts.
الخيار 3 — Laragon (Windows)
Laragon بيئة Windows محمولة مصمّمة لـ Laravel — vhosts تلقائية، روابط نظيفة، MySQL/MariaDB وHeidiSQL مدمج.
- حمّل Laragon Full من laragon.org وثبّته.
- في Laragon: القائمة ← PHP ← Version — بدّل إلى PHP 8.2 أو 8.3.
- انسخ مشروع AssetHub إلى
C:\laragon\www\AssetHub\. - اضغط على Start All. ينشئ Laragon vhost تلقائيًا:
http://assethub.test(يشير إلى مجلدpublic/). - افتح HeidiSQL (مدمج) ← أنشئ قاعدة البيانات
assethub. بيانات الاعتماد الافتراضية: المستخدمroot، كلمة المرور فارغة. - حرّر
.envببيانات اعتماد قاعدة البيانات، نفّذphp artisan key:generate، ثم زرhttp://assethub.test/install.
الخيار 4 — خادم PHP المدمج (لا حاجة لخادم ويب)
أبسط الخيارات: يأتي Laravel مع artisan serve الذي يشغّل خادم PHP للتطوير. لا حاجة لـ Apache أو Nginx. الأفضل للاختبار السريع.
# تثبيت الاعتماديات والتهيئة
cd /path/to/AssetHub
composer install
cp .env.example .env
php artisan key:generate
# تشغيل migration وبذر البيانات الأولية
php artisan migrate --seed
# تشغيل خادم التطوير
php artisan serve
# ثم زر: http://127.0.0.1:8000/install
مزالق شائعة في الجهاز المحلي
ماسح QR لا يفتح الكاميرا على http://
تتطلّب واجهات الكاميرا في المتصفح HTTPS، مع استثناء واحد: http://localhost وhttp://127.0.0.1 يُعامَلان كسياقات آمنة. إذا فتحت AssetHub عبر IP الشبكة المحلية (مثلًا http://192.168.1.10)، فسترفض الكاميرا. استخدم localhost للتطوير، أو فعّل HTTPS عبر Herd / mkcert.
Permission denied على storage (macOS / Linux)
إذا رأيت أخطاء كتابة عند محاولة التطبيق تسجيل أو التخزين المؤقّت، صحّح الصلاحيات: chmod -R 775 storage bootstrap/cache. على Windows ليس ضروريًا عادةً.
المنفذ مستخدم بالفعل
إذا كان المنفذ 8000 محجوزًا من تطبيق آخر، استخدم منفذًا مختلفًا:
php artisan serve --port=8001
اختبار البريد محليًا
SMTP الحقيقي غير متاح في معظم إعدادات الجهاز المحلي. خياران آمنان: (1) اضبط MAIL_MAILER=log في .env — تُكتب الرسائل في storage/logs/laravel.log بدلًا من إرسالها؛ أو (2) استخدم Mailtrap / MailHog لالتقاط البريد الصادر في صندوق وارد وهمي.
MAIL_MAILER=log
# كل الرسائل تُكتب في storage/logs/laravel.log
أصول الواجهة الأمامية (Vite / Tailwind)
واجهة Vue/Tailwind لـ AssetHub مبنية مسبقًا في الحزمة. إذا حرّرت مكوّنات Vue أو إعدادات Tailwind فستحتاج Node.js 18+:
npm install
npm run dev # إعادة تحميل ساخنة أثناء التطوير
npm run build # بناء الإنتاج (يُنفَّذ قبل النشر)
النشر على Hostinger Single (استضافة مشتركة)
هذا هو المسار الموصى به للمستخدمين الذين لا يملكون VPS أو خبرة تقنية. AssetHub متوافق تمامًا مع باقة Hostinger Single Web Hosting الأرخص (~$2.99/شهر). لا SSH ولا Composer ولا سطر أوامر — تتضمّن Single cron jobs أصلية وPHP 8.3 وSSL مجاني.
الخطوة 1 — تجهيز الاستضافة
- سجّل الدخول إلى Hostinger hPanel.
- اذهب إلى الاستضافة ← إدارة لنطاقك.
- اضبط إصدار PHP إلى 8.2 أو 8.3 عبر المتقدّم ← إعدادات PHP.
- تأكّد من تفعيل ملحقات PHP التالية (عادةً مفعّلة افتراضيًا):
- OpenSSL, PDO, PDO_MySQL, Mbstring, GD, Tokenizer, XML, Ctype, JSON, Fileinfo
الخطوة 2 — إنشاء قاعدة بيانات MySQL
- في hPanel، اذهب إلى قواعد البيانات ← MySQL Databases.
- اضغط على إنشاء قاعدة بيانات جديدة.
- دوّن هذه القيم الثلاث:
اسم قاعدة البيانات— مثلًاu123_AssetHubاسم المستخدم— مثلًاu123_adminكلمة المرور— تُولَّد تلقائيًا، احتفظ بها بأمان
الخطوة 3 — رفع الملفات
- اذهب إلى الملفات ← File Manager في hPanel.
- انتقل إلى
public_html/(هذا هو جذر نطاقك). - احذف أي
index.htmlأوdefault.phpافتراضي في هذا المجلد. - اضغط على رفع الملفات وارفع
source.zipبأكمله من الحزمة.
أو ارفع محتويات مجلد/source/مباشرة عبر FTP إذا فضّلت. - إذا رفعت ZIP، انقر بالزر الأيمن ← استخراج. بعد الاستخراج، يجب أن تكون كل الملفات في جذر
public_html/. - تأكّد من أن
public_html/يحتوي على:app/،public/،vendor/،.htaccess،index.php(فيpublic/)،.env، إلخ.
.htaccess موجود في جذر public_html/. يحتوي على قواعد إعادة كتابة الـ URL. إذا كان File Manager يُخفي الملفات المخفية، اضغط على الإعدادات ← إظهار الملفات المخفية.
الخطوة 4 — تشغيل المثبّت
- افتح متصفحك واذهب إلى
https://yourdomain.com/install. - ستظهر شاشة AssetHub Installer.
- الخطوة 1: Requirements — يجب أن تنجح كل الفحوصات (خضراء). إذا فشل أيّ فحص، تواصل مع دعم Hostinger لتفعيل ملحق PHP المفقود.
- الخطوة 2: Database — أدخل بيانات الاعتماد من الخطوة 2 أعلاه:
- المضيف:
localhost - المنفذ:
3306 - قاعدة البيانات:
u123_AssetHub - اسم المستخدم:
u123_admin - كلمة المرور: (التي ولّدها Hostinger)
- المضيف:
- الخطوة 3: Migrate — اضغط على "Run Migrations & Seed". تستغرق ~10 ثوان. لا تُحدّث الصفحة.
- الخطوة 4: Admin — أنشئ حساب المسؤول. استخدم كلمة مرور قوية.
- تم! — سترى رابط Cron (احفظه!) وزر تسجيل الدخول.
الخطوة 5 — إعداد تنبيهات البريد التلقائية عبر Hostinger Cron
يستخدم AssetHub مجدّول Laravel لمهام الخلفية: تنبيهات الضمان، تذكيرات الصيانة، انتهاء الوثائق، تحديث الإهلاك، وعمليات الإخراج المتأخرة. اضبط cron job واحدًا في hPanel وسيقرّر Laravel أيّ مهمة تُنفَّذ ومتى.
- في hPanel، اذهب إلى المتقدّم ← Cron Jobs.
- اضغط على إنشاء Cron job.
- اختر النوع: Custom (وليس "PHP" — نحتاج إلى تمرير وسيط).
- للأمر، أدخل (استبدل
uXXXXXXباسم مستخدم حسابك في Hostinger):
نصيحة: افتح File Manager، حدّد ملف/usr/bin/php /home/uXXXXXX/public_html/artisan schedule:runartisan(جذر المشروع)، انقر بالزر الأيمن ← الخصائص لنسخ المسار الكامل. - اضبط الجدولة على كل دقيقة — كل الحقول الخمسة (الدقيقة، الساعة، اليوم، الشهر، يوم الأسبوع) على
*. - اضغط على حفظ.
هذا كل شيء — يرسل AssetHub الآن تلقائيًا تذكيرات عمليات الإخراج المتأخرة، وتنبيهات الصيانة، وتنبيهات انتهاء الوثائق، وتنبيهات الضمان، ويُحدّث قيم إهلاك الأصول. يجدول Laravel داخليًا كل مهمة بترددها الصحيح (يوميًا 08:00، شهريًا، إلخ).
public_html/public/؟ لا مشكلة — لا يزال كود Laravel في جذر public_html/، لذا يظل مسار cron /home/uXXXX/public_html/artisan (لا تُضِف /public/).
- سجّل الدخول كمسؤول ← الإعدادات ← تبويب النظام ← انسخ رابط Cron الخاص بك.
- سجّل مجانًا في cron-job.org.
- أنشئ cronjob، الصق الرابط، اضبطه على كل 15 دقيقة، احفظه.
الخطوة 6 — إعداد البريد (SMTP)
يوفّر Hostinger حسابات بريد مع كل باقة. لاستخدامها في إشعارات AssetHub:
- في hPanel، اذهب إلى البريد ← حسابات البريد وأنشئ حسابًا (مثلًا
noreply@yourdomain.com). - حرّر ملف
.envفيpublic_html/عبر File Manager:MAIL_MAILER=smtp MAIL_HOST=smtp.hostinger.com MAIL_PORT=587 MAIL_USERNAME=noreply@yourdomain.com MAIL_PASSWORD=your_email_password MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=noreply@yourdomain.com MAIL_FROM_NAME="Your Company Name" - احفظ الملف.
- سجّل الدخول إلى AssetHub ← الإعدادات ← تبويب البريد ← إرسال بريد تجريبي. إذا استلمته فقد انتهيت.
المشكلات الشائعة على Hostinger Single
"500 Internal Server Error" بعد الرفع
- تحقّق من وجود
.htaccessفي جذرpublic_html/واحتوائه على قواعد rewrite. - تحقّق من ضبط إصدار PHP على 8.2 أو 8.3 في hPanel.
- افحص
storage/logs/laravel.logعبر File Manager لمعرفة الخطأ الفعلي.
"Permission denied" عند التحميل
عادةً يضبط Hostinger الصلاحيات الصحيحة، وإلا:
- انقر بالزر الأيمن على
storage/في File Manager ← الصلاحيات ← اضبطها على755بشكل تكراري. - ونفس الشيء لـ
bootstrap/cache/.
ماسح QR لا يفتح الكاميرا
تتطلّب واجهات كاميرا المتصفح HTTPS. يوفّر Hostinger SSL مجاني عبر Let's Encrypt — فعّله في hPanel ضمن SSL ← إدارة.
رسائل البريد المجدولة لا تُرسَل
- في hPanel ← Cron Jobs ← تحقّق من عمود Last run في مدخل cron. إذا كان فارغًا فإن cron لا يعمل — تحقّق من صحة مسار artisan.
- اختبر الأمر يدويًا: افتح Terminal في hPanel (إن توفّر) ونفّذ أمر cron. إذا فشل، ستحدّد رسالة الخطأ المشكلة (إصدار PHP خاطئ، مسار خاطئ، إلخ).
- تحقّق من ضبط SMTP بشكل صحيح (الإعدادات ← البريد ← إرسال اختبار).
- افحص
storage/logs/laravel.logلأخطاء المجدول.
أداء بطيء
Hostinger Single يستخدم CPU/RAM مشتركة. إذا كان فريقك يفوق 20 مستخدمًا، فكّر في:
- الترقية إلى Premium (~$3.99/شهر) — خوادم أسرع، موارد أكثر، قواعد بيانات متعدّدة.
- أو Business (~$5.99/شهر) — موارد مخصّصة، نسخ احتياطية يومية، بيئة staging.
النشر على cPanel (الاستضافة المشتركة)
يغطي هذا الدليل الاستضافة المشتركة cPanel القياسية (Namecheap وBluehost وGoDaddy ومعظم المضيفين الاقتصاديين). تأتي حزمة AssetHub مع vendor/ وأصول الواجهة الأمامية جاهزة مسبقًا — لا يلزم Composer أو npm أو Terminal. إذا كان cPanel الخاص بك يفتقر إلى Terminal، استخدم SSH Access أو حلول File Manager أدناه.
/home/CPANELUSER/ — تحقق من الشريط الجانبي في cPanel تحت General Information.
الخطوة 1 — ضبط إصدار PHP والامتدادات
- سجّل الدخول إلى cPanel.
- افتح MultiPHP Manager (أو Select PHP Version) واضبط نطاقك على PHP 8.2 أو 8.3.
- افتح MultiPHP INI Editor أو PHP Extensions وتأكّد من تفعيل هذه الامتدادات:
- OpenSSL, PDO, PDO_MySQL, Mbstring, GD, Tokenizer, XML, Ctype, JSON, Fileinfo
- إذا كان أحد الامتدادات مفقودًا، فعّله من قائمة الامتدادات أو تواصل مع دعم مضيفك.
الخطوة 2 — تفعيل SSL (HTTPS)
- اذهب إلى SSL/TLS Status (أو Let's Encrypt SSL / AutoSSL).
- شغّل AutoSSL أو ثبّت شهادة مجانية لنطاقك.
- HTTPS مطلوب لكي يتمكن ماسح QR في المتصفح من الوصول إلى الكاميرا.
https://yourdomain.com للتأكد من ظهور أيقونة القفل.
الخطوة 3 — إنشاء قاعدة بيانات MySQL ومستخدم
- افتح Manage My Databases (ضمن Databases).
- في Create New Database، أدخل اسمًا (مثلًا
assethub) وانقر على إنشاء. يضيف cPanel بادئة حسابك تلقائيًا — سيبدو الاسم الكامل مثلcpaneluser_assethub. - في MySQL Users، أنشئ مستخدمًا بكلمة مرور قوية. انسخ اسم المستخدم الكامل مع البادئة.
- في Add User To Database، اختر المستخدم وقاعدة البيانات، انقر على إضافة، ثم امنح ALL PRIVILEGES. هذه الخطوة سهلة النسيان — بدونها ستحصل على أخطاء
Access denied (1045). - دوّن هذه القيم الثلاث كما تظهر في cPanel:
اسم قاعدة البيانات— مثلًاu123_AssetHubاسم المستخدم— مثلًاu123_adminكلمة المرور— تُولَّد تلقائيًا، احتفظ بها بأمان
الخطوة 4 — رفع الملفات
- افتح File Manager وانتقل إلى
public_html/(جذر مستندات نطاقك). - فعّل Settings → Show Hidden Files حتى تتمكن من رؤية
.htaccessو.env. - احذف أي
index.htmlافتراضي فيpublic_html/إن وُجد. - ارفع حزمة
source.zipواستخرجها، أو ارفع محتويات مجلد/source/عبر FTP. - بعد الاستخراج، يجب أن يحتوي
public_html/علىapp/وpublic/وvendor/وملف.htaccessالجذري وملفartisanفي نفس المستوى.
.htaccess الجذري يعيد توجيه كل الطلبات إلى مجلد public/ — لا تحتاج إلى تغيير جذر المستندات يدويًا على معظم المضيفين.
الخطوة 5 — تجهيز .env قبل تشغيل المثبّت
أكمل هذه الخطوة قبل زيارة /install. يتطلب Laravel وجود APP_KEY صالح وإعدادات قاعدة بيانات صحيحة في .env.
- في File Manager، انسخ
.env.exampleإلى.env(نفس مجلدartisan). - حرّر
.envواضبط كحد أدنى:APP_NAME=AssetHub APP_ENV=production APP_DEBUG=false APP_URL=https://yourdomain.com DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=cpaneluser_assethub DB_USERNAME=cpaneluser_admin DB_PASSWORD="your_password" SESSION_DRIVER=file CACHE_STORE=file - اضبط
DB_CONNECTION=mysql— ملف.env.exampleالافتراضي يستخدم SQLite؛ الاستضافة المشتركة تتطلب MySQL. - اضبط
SESSION_DRIVER=fileوCACHE_STORE=fileقبل أول migration (يتجنب أخطاء "جدول sessions غير موجود"). - غلّف
DB_PASSWORDبعلامات اقتباس مزدوجة إذا كانت تحتوي على أحرف خاصة (#،$،!، إلخ).
توليد APP_KEY (لا يلزم Terminal)
كثير من خطط cPanel لا تتضمن Terminal على الويب. استخدم إحدى هذه الطرق:
- SSH Access (cPanel → Security → SSH Access): اتصل باستخدام PuTTY أو PowerShell، ثم نفّذ
cd ~/public_html && php artisan key:generate. - مساعد File Manager — أنشئ
public/genkey.phpمؤقتًا، زره في متصفحك، انسخ المخرج فيAPP_KEY=، ثم احذف الملف فورًا.<?php echo 'base64:' . base64_encode(random_bytes(32)); - على جهاز الكمبيوتر — إذا كان PHP مثبتًا محليًا، نفّذ
php -r "echo 'base64:'.base64_encode(random_bytes(32));"والصق النتيجة في.env.
genkey.php فور نسخ المفتاح. لا تترك سكريبتات مساعدة على خادم إنتاجي.
- اضبط صلاحيات
storage/وbootstrap/cache/على 755 (تكراري) إذا أبلغ المثبّت عن أخطاء كتابة.
الخطوة 6 — تشغيل مثبّت الويب
- افتح
https://yourdomain.com/installفي متصفحك. - الخطوة 1: Requirements — يجب أن تنجح جميع الفحوصات (خضراء). أصلح أي امتدادات PHP مفقودة من الخطوة 1 أعلاه.
- الخطوة 2: Database — أدخل الأسماء الدقيقة مع البادئة من الخطوة 3:
- المضيف:
127.0.0.1orlocalhost - المنفذ:
3306 - قاعدة البيانات:
cpaneluser_assethub - المستخدم:
cpaneluser_admin - كلمة المرور: (your MySQL password)
- المضيف:
- الخطوة 3: Migrate — انقر على "Run Migrations & Seed". تستغرق ~10 ثوانٍ. لا تُحدّث الصفحة.
- ألغِ تحديد Include demo data لتثبيت إنتاجي نظيف.
- الخطوة 4: Admin — أنشئ حساب المسؤول.
- تم! — احفظ رابط Cron المعروض في الشاشة الأخيرة.
الخطوة 7 — إعداد Cron Jobs لتنبيهات البريد
يحتاج AssetHub إلى cron job واحد يعمل كل دقيقة حتى يتمكن Laravel من إرسال تنبيهات الضمان وتذكيرات الصيانة والبريد المجدول الآخر.
- في cPanel، اذهب إلى Advanced → Cron Jobs.
- في Add New Cron Job، اضبط الجدول على كل دقيقة (
* * * * *). - أدخل الأمر (استبدل
CPANELUSERباسم مستخدم cPanel من General Information):
نصيحة: قد يكون مسار PHP هو/usr/local/bin/php /home/CPANELUSER/public_html/artisan schedule:run/usr/local/bin/phpأو/usr/bin/php— اسأل مضيفك إذا لم تكن متأكدًا. مسار artisan هو المكان الذي رفعت فيه المشروع (عادةً/home/CPANELUSER/public_html/artisan). - انقر على Add New Cron Job للحفظ.
public_html/public/؟ لا يزال Cron يشير إلى /home/CPANELUSER/public_html/artisan — لا تضف /public/.
- سجّل الدخول كمسؤول ← الإعدادات ← النظام ← انسخ رابط Cron.
- سجّل في cron-job.org (مجاني).
- أنشئ مهمة تزور ذلك الرابط كل 15 دقيقة.
الخطوة 8 — إعداد البريد الإلكتروني (SMTP)
أنشئ حساب بريد cPanel للإشعارات الصادرة:
- اذهب إلى Email Accounts ← أنشئ مثلًا
noreply@yourdomain.com. - حرّر
.envفي File Manager:MAIL_MAILER=smtp MAIL_HOST=mail.yourdomain.com MAIL_PORT=587 MAIL_USERNAME=noreply@yourdomain.com MAIL_PASSWORD=your_email_password MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=noreply@yourdomain.com MAIL_FROM_NAME="Your Company Name" - احفظ، ثم في AssetHub: الإعدادات ← البريد ← إرسال بريد تجريبي.
المشكلات الشائعة على cPanel
"Access denied for user" (SQLSTATE 1045)
- انسخ اسم قاعدة البيانات واسم المستخدم بدقة من cPanel — بما في ذلك بادئة الحساب.
- تأكّد من إتمام Add User To Database مع ALL PRIVILEGES.
- أعد تعيين كلمة مرور MySQL في cPanel وحدّث
.env— استخدم علامات اقتباس حولDB_PASSWORDإذا كانت تحتوي على أحرف خاصة.
فشل Migration بعد نجاح خطوة Database
- يختبر المثبّت بيانات اعتماد النموذج، لكن Migrate يقرأ من
.env. تأكّد من تطابق الاثنين. - احذف
bootstrap/cache/config.phpإن وُجد، ثم أعد المحاولة. - تأكّد من ضبط
DB_CONNECTION=mysqlفي.env(وليس sqlite).
"Invalid default value" أثناء Migration (1067)
تم الإصلاح في AssetHub v2.1.0+ (جدول checkouts يستخدم أعمدة dateTime). إذا كان لديك نسخة أقدم، حدّث ملف migration أو نزّل الحزمة الأحدث من CodeCanyon.
"500 Internal Server Error" بعد الرفع
- تأكّد من وجود
.htaccessالجذري وأن PHP هو 8.2+. - افحص
storage/logs/laravel.logللاطلاع على الخطأ الفعلي. - تأكّد من ضبط
APP_KEYفي.env— المفتاح الفارغ يسبب أخطاء 500.
لا يوجد Terminal في cPanel
هذا أمر طبيعي على كثير من خطط الاستضافة المشتركة. استخدم SSH Access (إذا كان مفعّلًا)، أو طريقة genkey.php المؤقتة في الخطوة 5، أو ولّد المفتاح على جهاز الكمبيوتر الشخصي.
كاميرا ماسح QR لا تفتح
فعّل SSL عبر SSL/TLS Status → AutoSSL وادخل إلى الموقع عبر https://.
الإعدادات
ملف .env
| المفتاح | الوصف | مثال |
|---|---|---|
APP_NAME | اسم التطبيق الظاهر في شريط العنوان | AssetHub |
APP_URL | الـ URL العام لتثبيتك | https://assets.example.com |
APP_DEBUG | اضبطه على false في الإنتاج | false |
DB_* | تفاصيل اتصال قاعدة البيانات | mysql, 127.0.0.1, 3306, ... |
MAIL_MAILER | مشغّل البريد | smtp, log, mailgun |
MAIL_HOST | اسم مضيف خادم SMTP | smtp.gmail.com |
MAIL_PORT | منفذ SMTP | 587 |
MAIL_USERNAME | اسم مستخدم SMTP | your@email.com |
MAIL_PASSWORD | كلمة مرور SMTP أو app token | ********** |
MAIL_FROM_ADDRESS | عنوان From الافتراضي | noreply@example.com |
الإعدادات داخل التطبيق
معظم الخيارات غير الحسّاسة قابلة للضبط من المسؤول ← الإعدادات:
- عام: اسم/بريد/هاتف الشركة، بادئة asset tag
- البريد: إرسال بريد تجريبي للتحقّق من SMTP
- الإشعارات: عتبات تنبيه الضمان، نافذة تذكير الصيانة
- التوطين: المنطقة الزمنية (قائمة قابلة للبحث تشمل
Europe/Skopje)، تنسيق التاريخ، رمز العملة (يشملMKD— Denar مقدوني)، الرمز وموضعه — يُطبَّق على التطبيق بالكامل بعد الحفظ - عام → صفحة الأصل العامة: ظهور QR (عام / تسجيل دخول / معطّل) وإعادة توليد جميع رموز QR بعد تغيير URL
- تبويب التوطين يربط بـ Administration → Translations لـ Translation Editor الكامل (للمسؤول فقط)
- Branding: اسم التطبيق والشعار — يحدّث شعار الدخول والتذييل والشارة وعنوان تبويب المتصفح (v4.0+). العنوان الفرعي: عدّل
auth.login_subtitleفي Administration → Translations - Appearance (v4.0+): خصّص ألوان العلامة والحالة والنص للوضعين الفاتح والداكن — راجع دليل إعادة العلامة في الأسئلة الشائعة
دعم متعدد اللغات
يأتي AssetHub مع 11 لغة جاهزة، بما في ذلك العربية RTL والهندية. يبدّل المستخدمون اللغة عبر قائمة العلم في الرأس العلوي الأيمن.
اللغات المضمنة
| الرمز | اللغة | الاتجاه |
|---|---|---|
en | English (default) | LTR |
vi | Tiếng Việt | LTR |
es | Español | LTR |
fr | Français | LTR |
de | Deutsch | LTR |
zh | 简体中文 | LTR |
ja | 日本語 | LTR |
pt-BR | Português (Brasil) | LTR |
ru | Русский | LTR |
ar | العربية | RTL |
hi | हिन्दी | LTR |
كيفية تبديل اللغة
- انقر على أيقونة العلم في الزاوية اليمنى العلوية لفتح القائمة المنسدلة.
- اختر لغتك من القائمة.
- يتم إعادة تحميل الصفحة؛ وتتبدل جميع تسميات الواجهة والتواريخ وتنسيقات العملة.
- يتم حفظ اختيارك في كل من حساب المستخدم وكوكي (سنة واحدة).
/locale/{code}، والذي يعمل فقط عند تشغيل خادم PHP. ادخل دائمًا عبر نطاقك الحقيقي (الإنتاج) أو http://localhost:8000 (التطوير مع php artisan serve). أما ملفات التوثيق مثل هذا فهي قائمة بذاتها تمامًا ويمكن فتحها مباشرة.
إضافة لغة مخصصة (المشرف)
اذهب إلى Administration → Translations (مستخدمو admin بصلاحية manage translations):
- انقر "Add Locale" — قدّم رمزًا (مثل
mkللمقدونية)، اسم العرض، الاسم الأصلي، اسم ملف SVG للعلم، الاتجاه (LTR/RTL)، وlocale أساس لنسخ الترجمات منه. - يظهر locale الجديد في مبدّل اللغة وقائمة اللغة الافتراضية في Settings → Localization.
- الترجمات المخزّنة في DB تتجاوز تلقائيًا ترجمات الملف في
lang/{code}/.
Translation Editor
يعرض المحرّر كل مفتاح ترجمة مجمّعًا حسب الملف (مثل assets، nav، settings). تعرض المفاتيح baseline الملف وأي تجاوز DB.
- تصفية حسب locale أو مجموعة الترجمة أو نص البحث.
- انقر قيمة للتحرير مباشرة؛ تُحفظ التغييرات في DB فورًا.
- أعد تعيين مفتاح للعودة إلى baseline الملف.
- Locales المدمجة (en، vi، es، …) قابلة للتحرير؛ locales المخصصة تعتمد كليًا على DB.
- فقط المستخدمون بصلاحية manage translations يمكنهم الوصول إلى هذه الصفحة.
CSV import / export
- Export — نزّل جميع المفاتيح لـ locale كـ CSV (
group,key,value). - Import — ارفع CSV بنفس الأعمدة؛ تُحدَّث تجاوزات DB الموجودة، تُدرَج المفاتيح الجديدة.
اللغة الافتراضية لكل مستخدم
لكل مستخدم عمود locale. ترسل إشعارات البريد الإلكتروني تلقائيًا بلغة المستلم المفضلة بفضل عقد HasLocalePreference الخاص بـ Laravel.
اللغة الافتراضية للموقع تُضبط تحت Settings → Localization → Default Language. المستخدمون الفرديون يتجاوزون هذا عبر مبدّل اللغة في الرأس.
قائمة الميزات
إدارة الأصول
- asset tag مُولَّدة تلقائيًا
- صور متعدّدة لكل أصل
- توليد رمز QR
- تتبّع الحالة والوضع
- استيراد/تصدير جماعي
- استنساخ أصل
- تتبّع كمية الدُفعات / اللوت (v2)
سير العمل
- إسناد / إرجاع / نقل
- طلبات تتطلّب موافقة
- حجز Check-in / Check-out
- كشف التعارض
الصيانة
- جدولة وقائية/تصحيحية
- عرض تقويم
- جدولة تلقائية للتالية
- تتبّع التكاليف
- تذكيرات بالبريد
الوثائق
- إرفاق فواتير وأدلة
- معاينة inline
- تنبيهات الانتهاء
- أنواع وثائق متعدّدة
الإهلاك
- 3 طرق حساب
- تحديث القيمة تلقائيًا
- مخطّط جدولة
- ملخّص سنوي
التقارير
- 12 نوع تقرير
- تصدير Excel + PDF
- مخطّطات ولوحات
- فلاتر التاريخ
تشغيلي (v2)
- أصول دُفعات / لوت مع تسوية مباشرة
- تخصيصات للموظفين والأقسام والمستودع
- تخلص مع موافقة فصل المهام
- صفحة تسليم QR عامة على /a/{tag}
التوطين والترجمات (v3)
- 11 لغة واجهة مدمجة + locales مخصصة
- Translation Editor مع بحث وتصفية المجموعات وتحرير مباشر
- استيراد/تصدير CSV لتحديثات الترجمة الجماعية
- إعدادات المنطقة الزمنية والعملة تُطبَّق على التطبيق بالكامل
العلامة التجارية والمظهر (v4)
- يتم تحديث عنوان تبويب المتصفح من الإعدادات → العلامة التجارية → اسم التطبيق
- تخصيص ألوان التطبيق في الإعدادات → المظهر (الوضع الفاتح والداكن)
المستخدمون والأدوار
يأتي AssetHub مع 5 أدوار جاهزة:
| الدور | الصلاحيات |
|---|---|
| Admin | وصول كامل للنظام — المستخدمون، الأقسام، الإعدادات، سجل التدقيق، Webhooks، الترجمات |
| مدير تقنية المعلومات | إدارة الأصول (مفردة + دُفعة/لوت) والفئات والصيانة والطلبات؛ الموافقة على النقل؛ عرض التقارير والإهلاك |
| محاسب | إدارة الأصول والإهلاك، إجراء جرد المخزون، الموافقة على النقل والتخلص، وصول كامل للتقارير (تركيز مالي) |
| مشرف | الموافقة على طلبات القسم، إدارة عمليات الإخراج، المشاركة في الجرد، عرض التقارير |
| موظّف | عرض الأصول المسنَدة، إنشاء طلبات، إدارة عمليات الإخراج الخاصة به |
تُخزَّن الصلاحيات كأدوار Spatie — يمكن للمسؤولين الضبط الدقيق لكل صلاحية عبر قاعدة البيانات.
إدارة الأصول
إنشاء الأصول
- انتقل إلى الأصول ← أصل جديد.
- املأ الاسم والفئة والعلامة التجارية والطراز والرقم التسلسلي.
- أضف تاريخ الشراء والسعر (مطلوب للإهلاك).
- ارفع الصور (يدعم ملفات متعدّدة، حد أقصى 5 ميغابايت لكل ملف).
- احفظ — يُولَّد asset tag ورمز QR تلقائيًا.
تنسيق Asset Tag
افتراضيًا: {PREFIX}-{YEAR}-{NNNN}، مثلًا AS-2026-0001. قابل للضبط عبر الإعدادات ← عام ← بادئة Asset Tag.
استيراد جماعي
- اضغط على استيراد في صفحة الأصول.
- نزّل قالب Excel.
- املأ بياناتك — الأعمدة المطلوبة:
name،category_name. - ارفع الملف.
أصول الدُفعات / اللوت (v2)
للعناصر المتطابقة بالكمية (كراسٍ، لوحات مفاتيح، زي موحّد)، اختر نوع التتبّع → Batch / Lot في نموذج أصل جديد بدلًا من إنشاء سجلات مكررة.
- أدخل الكمية والوحدة (قطعة، طقم، صندوق). عند الحفظ، يُوضَع المخزون في مجموعة المستودع.
- افتح الأصل ← تبويب Allocations ← Allocate وحدات لموظّف أو قسم.
- استخدم Return، Adjust (تالف/مفقود/إصلاح)، أو إجراءات التصرف — يجب أن تتسوّى الملخّص المباشر مع إجمالي الكمية.
- أصول الدُفعات تدعم سعر الوحدة فقط؛ الإهلاك اختياري ومعطّل افتراضيًا للإعداد السريع.
php artisan migrate بعد التحديث إلى v2 — لا فقدان للبيانات.رموز QR
كل أصل يتلقى رمز QR تلقائيًا عند الإنشاء. المسح يفتح الصفحة العامة أو المصادق عليها للأصل (انظر أدناه). المسح داخل التطبيق ينقلك إلى شاشة تفاصيل الأصل.
طباعة البطاقات
- بطاقة واحدة: اضغط على أيقونة الطابعة في أيّ صف أصل.
- صيغة PDF: A4، بطاقتان لكل صف، تشمل asset tag والاسم والعلامة والرقم التسلسلي.
المسح
اضغط على مسح QR في صفحة الأصول. اسمح بصلاحية الكاميرا. يستخدم الماسح html5-qrcode ويعمل على أيّ متصفح حديث. ملاحظة: يتطلّب الوصول إلى الكاميرا HTTPS أو localhost.
صفحة تسليم QR العامة (v2)
لكل أصل أيضًا URL عام قابل للطباعة على /a/{asset_tag} — مفيد للتسليم المادي دون تسجيل دخول.
- اضبط في Settings → General → Public Asset Page: Public، Login required، أو Disabled.
- تعرض الصفحة الصورة والحقول الرئيسية و(للدُفعات) تفصيل الكمية. يمكن للمستخدمين طباعتها كورقة تسليم.
- بعد تغيير
APP_URL، انقر Regenerate all QR codes في نفس لوحة الإعدادات.
سير العمل
إسناد الأصل
- افتح صفحة تفاصيل أصل.
- اضغط على إسناد (يظهر إذا كان الأصل متاحًا).
- اختر المستخدم وتاريخ الإرجاع الاختياري والملاحظات.
- أرسل — تُنشأ المعاملة ويُرسَل إشعار البريد.
طلبات الأصول
يمكن للموظفين تقديم طلبات للأصول التي يحتاجونها. للطلبات 4 حالات: pending ← approved ← fulfilled، أو rejected. تُرسَل رسائل الموافقة تلقائيًا.
Check-in / Check-out
للأصول المشتركة (الكاميرات، أجهزة العرض، المركبات). للحجوزات نطاقات تواريخ؛ يمنع النظام تداخل عمليات الإخراج. يُظهر عرض التقويم كل الحجوزات في لمحة.
التخلص — شطب رسمي (v2)
تُشطب العناصر البالية أو التالفة في دُفعات موثّقة مع فصل المهام (المقترح ≠ الموافق). يتطلب صلاحيات manage disposals وapprove disposals.
- الشريط الجانبي ← Disposals ← New Disposal. حدّد العنوان والفترة (Q1–Q4، سنوي، أو ad-hoc).
- افتح المسودة ← Add items — وحدات دُفعة تالفة مؤهّلة أو أصول مفردة بحالة Poor.
- انقر Submit for approval — تُقفَل الدُفعة.
- موافق مختلف ينقر Approve & execute — تُعلَّم الأصول/الوحدات كمُتخلَّص منها.
- اطبع disposal minutes (PDF) لسجلات الامتثال.
الإهلاك
يحسب AssetHub إهلاك الأصول بواحدة من ثلاث طرق:
| الطريقة | الصيغة | الحالة |
|---|---|---|
| القسط الثابت | (Cost - Salvage) / Useful Life | الأكثر شيوعًا، إهلاك سنوي متساوٍ |
| الرصيد المتناقص | 2 / Useful Life × Book Value | متسارع، لأغراض ضريبية |
| وحدات الإنتاج | حسب الاستخدام | معدات التصنيع |
تُرث الإعدادات الافتراضية من فئة الأصل. تُولَّد إدخالات الجدول شهريًا. تُحدَّث current_value للأصل تلقائيًا في أول كل شهر.
الحقول المخصصة
المسؤول ← الحقول المخصصة يتيح لك إضافة سمات مخصّصة بلا حدود للأصول:
- الأنواع: نص، رقم، تاريخ، اختيار (dropdown)، منطقة نص، ملف، مربع اختيار
- النطاق: تطبيق على كل الفئات أو فئة محدّدة
- إعادة الترتيب: اسحب المقبض
- يتم التحقّق من الحقول الإلزامية عند حفظ الأصل
التقارير
اثنا عشر تقريرًا مدمجًا، يمكن الوصول إليها من قائمة التقارير:
- ملخّص الأصول — الإجماليات حسب الحالة والوضع والفئة والقسم
- الإهلاك — فقد القيمة لكل فئة، أكثر الأصول إهلاكًا
- المعاملات — نشاط الإسناد والإرجاع والنقل عبر الزمن
- تكلفة الصيانة — الإنفاق حسب الشهر والفئة والنوع
- انتهاء الضمان — الأصول التي تحتاج اهتمامًا خلال 30/60/180 يومًا
- أصول الأقسام — توزيع الأصول واستخدام الميزانية حسب القسم
- الأصول حسب المصدر — التوزيع بين الشراء والمشروع والتبرّع والنقل
- ملخّص جرد المخزون — الفروقات بين دورات الجرد الدورية
- Employee Assignments (v2) — من يحمل ماذا، بما في ذلك تخصيصات الدُفعات
- Department / Location (v2) — الأصول والكميات حسب القسم أو الموقع
- Inventory Reconciliation (v2) — المخزون مقابل المخصّص مقابل التالف/المفقود/المُتخلَّص منه
- Damaged Assets (v2) — عناصر مُعلَّمة للإصلاح أو الشطب
جميع التقارير تدعم تصدير Excel وPDF عبر أزرار في رأس الصفحة. تقارير v2 واعية بالكمية (عدد الأصول + إجمالي الوحدات).
خطافات الويب
يمكن لـ AssetHub إخطار الخدمات الخارجية عند الأحداث الرئيسية.
الأحداث المتاحة
asset.created,asset.updated,asset.deletedasset.assigned,asset.returned,asset.transferredrequest.created,request.approved,request.rejected,request.fulfilledmaintenance.scheduled,maintenance.started,maintenance.completedcheckout.created,checkout.returned
صيغة Payload
{
"event": "asset.assigned",
"timestamp": "2026-05-05T08:00:00+00:00",
"data": {
"asset_id": 1,
"asset_tag": "AS-2026-0001",
"asset_name": "HP EliteDesk 800",
"to_user_id": 4,
"transaction_id": 12
}
}
التحقّق من التوقيع
إذا ضُبط secret، تتضمّن الطلبات الترويسة X-AssetHub-Signature الحاوية على HMAC-SHA256 للـ payload body. تحقّق في طرفك:
$expected = hash_hmac('sha256', $rawBody, $secret);
if (hash_equals($expected, $request->header('X-AssetHub-Signature'))) {
// صالح
}
سياسة إعادة المحاولة
يُعاد التسليم 3 مرات بفاصل 200 مللي ثانية عند الفشل. بعد 10 إخفاقات متتالية، يُعطَّل webhook تلقائيًا.
المهام المجدولة
يستخدم AssetHub مجدّول Laravel لمهام الخلفية. تحتاج فقط إلى مدخل cron واحد — يُوزّع Laravel داخليًا كل مهمة على الوقت الصحيح.
الاستضافة المشتركة (واجهة Cron Jobs لـ cPanel / Hostinger)
راجع قسم إعداد cPanel → الخطوة 7 أو إعداد Hostinger → الخطوة 5 للحصول على تعليمات مع لقطات الشاشة. باختصار: Advanced → Cron Jobs، الأمر:
/usr/bin/php /home/uXXXXXX/public_html/artisan schedule:run
الجدول: كل دقيقة (* في كل الحقول الخمسة).
أمر cron لـ cPanel
استبدل CPANELUSER باسم مستخدم cPanel الخاص بك:
/usr/local/bin/php /home/CPANELUSER/public_html/artisan schedule:run
VPS / خادم مخصّص (crontab)
نفّذ crontab -e كمستخدم الويب (غالبًا www-data) وأضف:
* * * * * cd /path/to/AssetHub && php artisan schedule:run >> /dev/null 2>&1
حلّ بديل: pinger URL خارجي
إذا لم يكن لدى مضيفك cron على الإطلاق، استخدم رابط Cron داخل التطبيق (الإعدادات ← تبويب النظام) مع cron-job.org (مجاني، كل 15 دقيقة).
المهام التي تعمل تلقائيًا
| الوقت | الأمر | الغرض |
|---|---|---|
| يوميًا 08:00 | send-overdue-checkout-alerts | تذكيرات بريد لعمليات الإخراج المتأخرة |
| يوميًا 08:30 | send-maintenance-reminders | تذكيرات الصيانة القادمة |
| يوميًا 09:00 | send-document-expiry-alerts | الوثائق التي تنتهي خلال 30/14/7/1 أيام |
| يوميًا 09:30 | send-warranty-alerts | تنبيهات انتهاء الضمان + التأمين |
| يوميًا 10:00 | assethub:send-depreciation-end-alerts | تنبيهات عند بلوغ الأصول نهاية العمر الإنتاجي |
| يوميًا 10:30 | send-inventory-audit-reminders | تذكيرات الجرد النشطة |
| شهريًا في الأول 02:00 | update-asset-values | تحديث current_value الأصل من الإهلاك |
Upgrade Guides
Step-by-step guides for updating an existing installation. Open the guide that matches your current version.
- v3.1 → v4.0 — Full upgrade guide — Appearance settings, browser tab title from Branding. No migration required.
- v3.0 → v3.1 — Full upgrade guide — Visible languages checklist in navbar picker. No migration required.
- v2.x → v3.0 — Full upgrade guide — Translation Editor, custom locales, localization settings.
- v1.x → v2.0 — Full upgrade guide — Batch assets, disposals, public QR page, operational reports.
حل المشكلات
"Permission denied" على storage
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
ماسح QR لا يفتح الكاميرا
تتطلّب واجهات كاميرا المتصفح HTTPS. ثبّت شهادة SSL أو استخدم localhost للاختبار.
البريد لا يصل
افحص storage/logs/laravel.log بحثًا عن أخطاء. استخدم الإعدادات ← البريد ← إرسال بريد تجريبي للتحقّق من بيانات SMTP. تأكّد من أن خادم SMTP يسمح لـ IP المرسِل.
قاعدة البيانات "Access denied" (1045) على cPanel
اسم مستخدم/كلمة مرور خاطئة، عدم ربط المستخدم بقاعدة البيانات، أو أحرف خاصة في كلمة المرور تُعطّل تحليل .env. راجع إعداد cPanel → المشكلات الشائعة.
خطأ Migration 1067 (Invalid default value)
وضع MySQL الصارم على الاستضافة المشتركة يرفض أعمدة timestamp متعددة NOT NULL. تم الإصلاح في v2.1.0+. حدّث حزمتك أو غيّر checkout_date / expected_return_date إلى dateTime في migration الـ checkouts.
APP_KEY مفقود / خطأ 500 قبل التثبيت
يتطلب Laravel وجود APP_KEY في .env قبل تحميل التطبيق. إذا لم يكن لدى cPanel Terminal، راجع إعداد cPanel → الخطوة 5 لطرق SSH أو genkey.php أو التوليد المحلي.
إعادة ضبط التثبيت
احذف storage/installed.lock وزر /install مجدّدًا. سيتم محو البيانات الموجودة إذا أعدت تشغيل الـ migrations.
الأداء — قائمة أصول بطيئة
نفّذ php artisan optimize لتخزين الإعدادات والمسارات والـ views مؤقتًا. تأكّد من وجود فهارس MySQL على assets.asset_tag، assets.serial_number، assets.status (تُنشأ تلقائيًا بواسطة الـ migrations).
Upgrading from v3.0.x to v3.1
Download the v3.1 package from CodeCanyon, replace application files (keep your .env and storage/ uploads). No new migrations are required. The new visible_locales setting is optional — if unset, all languages remain visible in the navbar picker.
v3.0 → v3.1 — Full upgrade guide
الترقية من v2.x إلى v3.0
نزّل ZIP v3 من CodeCanyon، استبدل ملفات التطبيق (احتفظ بـ .env وتحميلات storage/)، ثم نفّذ php artisan migrate. تُضاف جداول locales المخصصة وتجاوزات الترجمة تلقائيًا. الإعدادات والأصول الحالية محفوظة.
v2.x → v3.0 — Full upgrade guide
الترقية من v1.x إلى v2.0
نزّل ZIP v2 من CodeCanyon، استبدل ملفات التطبيق (احتفظ بـ .env وتحميلات storage/)، ثم نفّذ php artisan migrate. الترقية غير مُدمِرة — أصول v1 المفردة تستمر بالعمل؛ جداول batch/disposal تُضاف تلقائيًا.
سجل التغييرات
v3.1.0 — Visible Language Picker (2026-06)
- Settings → Localization: checklist to choose which languages appear in the navbar language dropdown (built-in + custom locales)
- Default language is always visible; picker auto-hides when only one language is selected
- Backend validates locale switches; users on a hidden locale fall back to the default language
- No database migration required — upgrade is file-replace only
- علامة صفحة الدخول: التذييل والشارة تتبع Settings → Branding → App Name (بدون تعديل كود)
v3.0.0 — التوطين وTranslation Editor (2026-06)
- واجهة Translation Editor في Administration → Translations (Add Locale، تحرير مباشر، بحث/تصفية حسب المجموعة)
- Locales مخصصة مخزّنة في DB — الرمز، اسم العرض، الاسم الأصلي، SVG العلم، الاتجاه، locale الأساس
- استيراد/تصدير CSV لتحديثات الترجمة الجماعية
- إعدادات المنطقة الزمنية والعملة تُطبَّق الآن على التطبيق بالكامل (config/localization.php يشمل Europe/Skopje، MKD)
- Settings → Localization: قوائم منسدلة للمنطقة الزمنية/العملة قابلة للبحث مع دعم القيم المخصصة
- إضافة Hindi (hi) كلغة مدمجة 11؛ date_format محترم عبر صفحات Vue
- manage translations محمية بالصلاحيات؛ تجاوزات DB تدمج مع baseline ملف lang/
v2.0.0 — إصدار تشغيلي (2026-06)
- أصول دُفعات / لوت — تتبّع الكمية، التخصيصات، الإرجاع، التسوية المباشرة
- 4 تقارير تشغيلية: Employee Assignments، Department/Location، Inventory Reconciliation، Damaged Assets
- وحدة التخلص — دُفعات شطب، موافقة فصل المهام، محضر PDF قابل للطباعة
- صفحة QR عامة للأصل على
/a/{tag}مع ظهور قابل للضبط - التقارير القديمة محدّثة لعرض عدد الأصول + إجمالي الوحدات
- رموز QR ترتبط بصفحة التسليم العامة؛ سجل المعاملات يسجّل الكمية عند نقل الدُفعات
- بيانات demo محدّثة، دليل المستخدم (يُشحن منفصلًا في
documentation/)، وسلاسل i18n
v1.0.0 — الإصدار الأول (2026-05)
- CRUD الأصول مع توليد QR تلقائيًا
- 5 أدوار مستخدمين (Admin، مدير IT، محاسب، مشرف، موظف) بصلاحيات دقيقة
- تتبّع مصدر الأصل (شراء مركزي، شراء لامركزي، مشروع استثماري، تبرّع، نقل داخلي)
- سير عمل الإسناد والإرجاع مع إشعارات بالبريد
- سير عمل الموافقة على النقل (pending ← approved/rejected) مع بوّابة الصلاحيات
- سير الموافقة على طلبات الأصول
- Check-in/check-out مع عرض التقويم
- جدولة الصيانة مع التجديد التلقائي
- مرفقات الوثائق مع تنبيهات الانتهاء
- الإهلاك بـ 3 طرق حساب + تنبيهات نهاية العمر
- وحدة جرد المخزون — جرد دوري مع تتبّع الفروقات
- الحقول المخصصة بـ 7 أنواع إدخال وفرز drag-drop
- 8 تقارير مع مخطّطات وتصدير Excel وPDF (تشمل الأصول حسب المصدر، ملخّص الجرد)
- سجل تدقيق عبر Spatie Activitylog مع عارض diff
- Webhooks مع توقيع HMAC وإعادة محاولة تلقائية
- واجهة متعدّدة اللغات: 10 لغات (en، vi، es، fr، de، zh، ja، pt-BR، ru، ar مع RTL)
- واجهة إعدادات للشركة والبريد والإشعارات والتوطين والترجمات
- معالج تثبيت قائم على الويب
- وضع داكن بلوحة ألوان emerald-teal
الاعتمادات
المكتبات مفتوحة المصدر المستخدمة
- Laravel 11 — MIT
- Vue 3 — MIT
- Inertia.js — MIT
- Tailwind CSS — MIT
- Spatie Permission, Media Library, Activitylog — MIT
- Phosphor Icons — MIT (duotone weight)
- ApexCharts — MIT
- html5-qrcode — Apache 2.0
- Simple QrCode — MIT
- Laravel Excel — MIT
- Laravel DomPDF — MIT