AssetHub الوثائق

الأسئلة الشائعة

هل يمكنني تشغيل 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، شهريًا، إلخ). على Hostinger، اضبطه عبر hPanel ← المتقدّم ← Cron Jobs. إذا لم يكن لدى مضيفك cron، استخدم رابط Cron داخل التطبيق مع الخدمة المجانية cron-job.org.

ما طرق الإهلاك المدعومة؟

ثلاث طرق: القسط الثابت (إهلاك سنوي متساوٍ)، الرصيد المتناقص (متسارع، شائع للأغراض الضريبية)، ووحدات الإنتاج (حسب الاستخدام، لمعدات التصنيع). تُحدَّث قيم الأصول تلقائيًا في أول يوم من كل شهر.

هل يعمل ماسح QR على الهواتف المحمولة؟

نعم — يستخدم كاميرا المتصفح عبر html5-qrcode ويعمل على أي متصفح حديث للهاتف/اللوحي/سطح المكتب. الشرط الوحيد هو HTTPS. يوفّر Hostinger SSL مجاني عبر Let's Encrypt، لذا يعمل مباشرة.

هل يمكنني إضافة حقول خاصة بي دون برمجة؟

نعم. المسؤول ← الحقول المخصصة يتيح لك إضافة سمات بلا حدود (نص، رقم، تاريخ، اختيار، منطقة نص، ملف، مربع اختيار)، وحصرها بفئات محددة، وتعليمها كإلزامية، وإعادة ترتيبها بالسحب والإفلات — كل ذلك من الواجهة.

كم لغة يدعم AssetHub؟

10 لغات جاهزة: الإنجليزية والفيتنامية والإسبانية والفرنسية والألمانية والصينية واليابانية والبرتغالية (BR) والروسية والعربية (مع دعم RTL كامل). الترجمات قابلة للتحرير من المسؤول ← Translations.

نظرة عامة

AssetHub هو نظام كامل لإدارة أصول تكنولوجيا المعلومات، مبني على Laravel 11 وVue 3 وTailwind CSS. يساعد المؤسسات في تتبّع دورة حياة المعدات، وإدارة الإسنادات، وجدولة الصيانة، وحساب الإهلاك، وإنشاء تقارير مفصّلة.

تتبّع برمز QR

توليد رموز QR تلقائيًا لكل أصل. امسح بأي كاميرا متصفح.

الإهلاك

3 طرق: القسط الثابت، الرصيد المتناقص، وحدات الإنتاج.

الحقول المخصصة

أضف سمات مخصصة بلا حدود — نص، تاريخ، اختيار، ملف، مربع اختيار.

Webhooks

15 نوعًا من الأحداث مع توقيع HMAC وإعادة محاولة تلقائية.

سجل التدقيق

كل تغيير مسجّل مع عارض diff كامل.

التقارير

8 تقارير مع مخططات وتصدير إلى 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 — المثبّت الويب (موصى به)

  1. ارفع ملفات المشروع إلى خادم الويب الخاص بك.
  2. وجّه document root للنطاق إلى public/.
  3. اضبط الصلاحيات: يجب أن تكون storage/ وbootstrap/cache/ قابلة للكتابة (chmod 775).
  4. انسخ .env.example إلى .env ونفّذ php artisan key:generate.
  5. افتح https://yourdomain.com/install في متصفحك.
  6. اتبع المعالج — 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
إعداد خادم الويب: يجب أن يشير document root إلى الدليل public/. لـ Apache، يتولّى .htaccess المرفق إعادة كتابة الـ URL. لـ Nginx، راجع دليل نشر Laravel.

Wizard Step 2 — Database Configuration

When the wizard reaches Step 2, you must enter the MySQL connection details for the database you created in your hosting panel. The database must already exist (it can be empty — the next wizard step will create the tables).

FieldDefault / ExampleNotes
Host127.0.0.1Works on 99% of shared hosts (Hostinger, cPanel, Plesk). Keep this default unless your hosting provides a custom MySQL hostname (managed DB services like AWS RDS, DigitalOcean Managed Database).
Port3306Standard MySQL port. Only change if your provider uses a non-standard port (rare).
Database nameuXXXXXX_assethubThe full name shown in your hosting panel. Most shared hosts prefix it with your user ID (e.g. Hostinger: u287094729_assethub).
UsernameuXXXXXX_assethubMySQL user with permissions on the database above. Do not use root — shared hosts don't allow it.
Password(your DB password)The password you set or copied when creating the MySQL user. Most hosts show it once on creation — use "View / Reset" if you didn't save it.

Where to find these credentials by hosting panel

  • Hostinger: hPanel → Databases → Management → click your database. The page shows name, username, and a "Show password" button.
  • cPanel: cPanel → MySQL Databases. The database list shows names; users are listed below. Use "Change Password" if needed.
  • Plesk: Plesk → Databases → click the database name. The detail page shows credentials and offers a password reset.
  • DirectAdmin: DirectAdmin → MySQL Management → click the database. Credentials and password reset are on the database detail page.
  • External / managed DB: AWS RDS, DigitalOcean Managed Database, etc. Use the custom hostname, port (often 3306 but verify), DB name, user, and password from your cloud console. Make sure the server's IP is whitelisted in the DB firewall.

Common errors and how to fix them

Error messageCause and fix
SQLSTATE[HY000] [1045] Access deniedWrong username or password, or the user doesn't have access to this database. Double-check spelling (including the user prefix on shared hosts). Reset the password in the hosting panel if unsure.
SQLSTATE[HY000] [1049] Unknown databaseThe database name is wrong, or you haven't created the database yet in your hosting panel. Create it first, then re-enter the exact name (including any prefix).
SQLSTATE[HY000] [2002] Connection refusedThe MySQL server can't be reached. Verify Host and Port. On shared hosts try localhost instead of 127.0.0.1 or vice versa. For managed DBs, make sure your server IP is whitelisted.
SQLSTATE[42S02] Base table not found: sessionsHappens when SESSION_DRIVER=database or CACHE_STORE=database is set in .env before the tables exist. Edit .env and change both to file, save, then reload the wizard. You can switch back to database after install if you prefer.
could not find driverPHP pdo_mysql extension is missing or disabled. Enable it in your hosting panel (PHP Configuration → Extensions). On Hostinger: hPanel → Advanced → PHP Configuration → PHP Extensions tab.
Tip: The Host and Port fields are pre-filled with the most common values (127.0.0.1 and 3306) — leave them as-is on shared hosting. You only need to type Database name, Username, and Password. Click Test & Save → to verify the connection and move to Step 3.

الجهاز المحلي (التطوير المحلي)

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

موصى به: Laravel Herd هو الأسرع على macOS وWindows — بدون Docker، بدون إعداد يدوي لـ Apache/MySQL. XAMPP وLaragon بدائل مجانية جيدة إذا كنت تفضّل بيئة تقليدية.

الخيار 1 — Laravel Herd (موصى به، macOS و Windows)

Laravel Herd هي البيئة المحلية الرسمية من فريق Laravel — مجانية، أصلية، بدون Docker. تتضمّن PHP 8.2/8.3/8.4 وNginx و(في Herd Pro) MySQL/Redis.

  1. حمّل وثبّت Laravel Herd من herd.laravel.com.
  2. ضع مجلد مشروع AssetHub داخل ~/Herd/ (macOS) أو %USERPROFILE%\Herd\ (Windows). يُنشئ Herd تلقائيًا نطاقًا بصيغة .test — مثلًا http://assethub.test.
  3. افتح Herd ← Sites وتحقّق من أن إصدار PHP هو 8.2 أو 8.3. انقر بالزر الأيمن على الموقع ← Secure لتفعيل HTTPS (مطلوب لماسح QR).
  4. أنشئ قاعدة بيانات MySQL. مع Herd Pro، استخدم Services ← MySQL ← Open in TablePlus. وإلا ثبّت MySQL Community أو استخدم SQLite (DB_CONNECTION=sqlite، touch database/database.sqlite).
  5. انسخ .env.example إلى .env، املأ بيانات اعتماد قاعدة البيانات، ثم نفّذ php artisan key:generate من جذر المشروع.
  6. افتح http://assethub.test/install في متصفحك واتبع معالج التثبيت.

الخيار 2 — XAMPP (Windows وmacOS وLinux)

XAMPP يجمع Apache وMySQL/MariaDB وPHP. مجاني ومتعدد المنصات. احرص على اختيار إصدار بـ PHP 8.2 أو أحدث.

  1. حمّل XAMPP 8.2+ من apachefriends.org وثبّته.
  2. انسخ مشروع AssetHub إلى C:\xampp\htdocs\AssetHub\ (Windows) أو /Applications/XAMPP/htdocs/AssetHub/ (macOS).
  3. افتح XAMPP Control Panel وشغّل Apache وMySQL. إذا كانت المنافذ مشغولة، استخدم Config ← service.conf لتغيير Apache إلى 8080.
  4. اذهب إلى http://localhost/phpmyadminجديد ← أنشئ قاعدة بيانات باسم assethub بترتيب utf8mb4.
  5. في مجلد المشروع: انسخ .env.example إلى .env، اضبط DB_DATABASE=assethub، DB_USERNAME=root، اترك DB_PASSWORD فارغًا (افتراضي XAMPP). نفّذ php artisan key:generate.
  6. زر 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 مدمج.

  1. حمّل Laragon Full من laragon.org وثبّته.
  2. في Laragon: القائمة ← PHP ← Version — بدّل إلى PHP 8.2 أو 8.3.
  3. انسخ مشروع AssetHub إلى C:\laragon\www\AssetHub\.
  4. اضغط على Start All. ينشئ Laragon vhost تلقائيًا: http://assethub.test (يشير إلى مجلد public/).
  5. افتح HeidiSQL (مدمج) ← أنشئ قاعدة البيانات assethub. بيانات الاعتماد الافتراضية: المستخدم root، كلمة المرور فارغة.
  6. حرّر .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 مجاني.

تم اختباره على: باقات Hostinger Single وPremium وBusiness (PHP 8.2+ وMySQL 5.7+، تتضمّن جميعها Cron Jobs أصلية).

الخطوة 1 — تجهيز الاستضافة

  1. سجّل الدخول إلى Hostinger hPanel.
  2. اذهب إلى الاستضافة ← إدارة لنطاقك.
  3. اضبط إصدار PHP إلى 8.2 أو 8.3 عبر المتقدّم ← إعدادات PHP.
  4. تأكّد من تفعيل ملحقات PHP التالية (عادةً مفعّلة افتراضيًا):
    • OpenSSL, PDO, PDO_MySQL, Mbstring, GD, Tokenizer, XML, Ctype, JSON, Fileinfo

الخطوة 2 — إنشاء قاعدة بيانات MySQL

  1. في hPanel، اذهب إلى قواعد البيانات ← MySQL Databases.
  2. اضغط على إنشاء قاعدة بيانات جديدة.
  3. دوّن هذه القيم الثلاث:
    • اسم قاعدة البيانات — مثلًا u123_AssetHub
    • اسم المستخدم — مثلًا u123_admin
    • كلمة المرور — تُولَّد تلقائيًا، احتفظ بها بأمان

الخطوة 3 — رفع الملفات

  1. اذهب إلى الملفات ← File Manager في hPanel.
  2. انتقل إلى public_html/ (هذا هو جذر نطاقك).
  3. احذف أي index.html أو default.php افتراضي في هذا المجلد.
  4. اضغط على رفع الملفات وارفع source.zip بأكمله من الحزمة.
    أو ارفع محتويات مجلد /source/ مباشرة عبر FTP إذا فضّلت.
  5. إذا رفعت ZIP، انقر بالزر الأيمن ← استخراج. بعد الاستخراج، يجب أن تكون كل الملفات في جذر public_html/.
  6. تأكّد من أن public_html/ يحتوي على: app/، public/، vendor/، .htaccess، index.php (في public/.env، إلخ.
مهم: تأكّد من أن ملف .htaccess موجود في جذر public_html/. يحتوي على قواعد إعادة كتابة الـ URL. إذا كان File Manager يُخفي الملفات المخفية، اضغط على الإعدادات ← إظهار الملفات المخفية.

الخطوة 4 — تشغيل المثبّت

  1. افتح متصفحك واذهب إلى https://yourdomain.com/install.
  2. ستظهر شاشة AssetHub Installer.
  3. الخطوة 1: Requirements — يجب أن تنجح كل الفحوصات (خضراء). إذا فشل أيّ فحص، تواصل مع دعم Hostinger لتفعيل ملحق PHP المفقود.
  4. الخطوة 2: Database — أدخل بيانات الاعتماد من الخطوة 2 أعلاه:
    • المضيف: localhost
    • المنفذ: 3306
    • قاعدة البيانات: u123_AssetHub
    • اسم المستخدم: u123_admin
    • كلمة المرور: (التي ولّدها Hostinger)
  5. الخطوة 3: Migrate — اضغط على "Run Migrations & Seed". تستغرق ~10 ثوان. لا تُحدّث الصفحة.
  6. الخطوة 4: Admin — أنشئ حساب المسؤول. استخدم كلمة مرور قوية.
  7. تم! — سترى رابط Cron (احفظه!) وزر تسجيل الدخول.

الخطوة 5 — إعداد تنبيهات البريد التلقائية عبر Hostinger Cron

يستخدم AssetHub مجدّول Laravel لمهام الخلفية: تنبيهات الضمان، تذكيرات الصيانة، انتهاء الوثائق، تحديث الإهلاك، وعمليات الإخراج المتأخرة. اضبط cron job واحدًا في hPanel وسيقرّر Laravel أيّ مهمة تُنفَّذ ومتى.

  1. في hPanel، اذهب إلى المتقدّم ← Cron Jobs.
  2. اضغط على إنشاء Cron job.
  3. اختر النوع: Custom (وليس "PHP" — نحتاج إلى تمرير وسيط).
  4. للأمر، أدخل (استبدل uXXXXXX باسم مستخدم حسابك في Hostinger):
    /usr/bin/php /home/uXXXXXX/public_html/artisan schedule:run
    نصيحة: افتح File Manager، حدّد ملف artisan (جذر المشروع)، انقر بالزر الأيمن ← الخصائص لنسخ المسار الكامل.
  5. اضبط الجدولة على كل دقيقة — كل الحقول الخمسة (الدقيقة، الساعة، اليوم، الشهر، يوم الأسبوع) على *.
  6. اضغط على حفظ.

هذا كل شيء — يرسل AssetHub الآن تلقائيًا تذكيرات عمليات الإخراج المتأخرة، وتنبيهات الصيانة، وتنبيهات انتهاء الوثائق، وتنبيهات الضمان، ويُحدّث قيم إهلاك الأصول. يجدول Laravel داخليًا كل مهمة بترددها الصحيح (يوميًا 08:00، شهريًا، إلخ).

هل ضُبط document root على public_html/public/؟ لا مشكلة — لا يزال كود Laravel في جذر public_html/، لذا يظل مسار cron /home/uXXXX/public_html/artisan (لا تُضِف /public/).
حل بديل للمضيفين بدون cron: إذا لم تكن على Hostinger أو لم يدعم مزوّدك cron jobs، يوفّر AssetHub أيضًا رابط تشغيل webhook.
  1. سجّل الدخول كمسؤول ← الإعدادات ← تبويب النظام ← انسخ رابط Cron الخاص بك.
  2. سجّل مجانًا في cron-job.org.
  3. أنشئ cronjob، الصق الرابط، اضبطه على كل 15 دقيقة، احفظه.

الخطوة 6 — إعداد البريد (SMTP)

يوفّر Hostinger حسابات بريد مع كل باقة. لاستخدامها في إشعارات AssetHub:

  1. في hPanel، اذهب إلى البريد ← حسابات البريد وأنشئ حسابًا (مثلًا noreply@yourdomain.com).
  2. حرّر ملف .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"
  3. احفظ الملف.
  4. سجّل الدخول إلى AssetHub ← الإعدادات ← تبويب البريد ← إرسال بريد تجريبي. إذا استلمته فقد انتهيت.
حدود SMTP على Single: يسمح Hostinger Single بـ ~100 رسالة صادرة في الساعة. للنشر الأكبر، استخدم مزوّدًا مخصصًا مثل SendGrid أو Mailgun أو Postmark (مع باقات مجانية).

المشكلات الشائعة على 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.

الإعدادات

ملف .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اسم مضيف خادم SMTPsmtp.gmail.com
MAIL_PORTمنفذ SMTP587
MAIL_USERNAMEاسم مستخدم SMTPyour@email.com
MAIL_PASSWORDكلمة مرور SMTP أو app token**********
MAIL_FROM_ADDRESSعنوان From الافتراضيnoreply@example.com

الإعدادات داخل التطبيق

معظم الخيارات غير الحسّاسة قابلة للضبط من المسؤول ← الإعدادات:

  • عام: اسم/بريد/هاتف الشركة، بادئة asset tag
  • البريد: إرسال بريد تجريبي للتحقّق من SMTP
  • الإشعارات: عتبات تنبيه الضمان، نافذة تذكير الصيانة
  • التوطين: المنطقة الزمنية، تنسيق التاريخ، العملة

دعم متعدد اللغات

يأتي AssetHub مع 10 لغات جاهزة للاستخدام، بما في ذلك العربية RTL. يقوم المستخدمون بتبديل اللغة عبر قائمة الأعلام المنسدلة في الزاوية اليمنى العلوية.

اللغات المضمنة

الرمزاللغةالاتجاه
enEnglish (default)LTR
viTiếng ViệtLTR
esEspañolLTR
frFrançaisLTR
deDeutschLTR
zh简体中文LTR
ja日本語LTR
pt-BRPortuguês (Brasil)LTR
ruРусскийLTR
arالعربيةRTL

كيفية تبديل اللغة

  1. انقر على أيقونة العلم في الزاوية اليمنى العلوية لفتح القائمة المنسدلة.
  2. اختر لغتك من القائمة.
  3. يتم إعادة تحميل الصفحة؛ وتتبدل جميع تسميات الواجهة والتواريخ وتنسيقات العملة.
  4. يتم حفظ اختيارك في كل من حساب المستخدم وكوكي (سنة واحدة).
لا تفتح ملفات .html الخاصة بالتطبيق مباشرة. AssetHub هو تطبيق Laravel + Vue من جانب الخادم — تبديل اللغة يرسل POST إلى /locale/{code}، والذي يعمل فقط عند تشغيل خادم PHP. ادخل دائمًا عبر نطاقك الحقيقي (الإنتاج) أو http://localhost:8000 (التطوير مع php artisan serve). أما ملفات التوثيق مثل هذا فهي قائمة بذاتها تمامًا ويمكن فتحها مباشرة.

إضافة لغة مخصصة (المشرف)

المشرف → الإعدادات → الترجمات:

  • انقر "إضافة لغة" — قدم رمزًا (مثل th للتايلاندية)، اسم العرض، الاسم الأصلي، العلم، الاتجاه، ولغة أساس لنسخ الترجمات.
  • حرر الترجمات مباشرة في محرر الترجمات، أو عبر استيراد/تصدير CSV.
  • الترجمات المخزنة في قاعدة البيانات تتجاوز تلقائيًا ترجمات الملفات.

اللغة الافتراضية لكل مستخدم

لكل مستخدم عمود locale. ترسل إشعارات البريد الإلكتروني تلقائيًا بلغة المستلم المفضلة بفضل عقد HasLocalePreference الخاص بـ Laravel.

قائمة الميزات

إدارة الأصول

  • asset tag مُولَّدة تلقائيًا
  • صور متعدّدة لكل أصل
  • توليد رمز QR
  • تتبّع الحالة والوضع
  • استيراد/تصدير جماعي
  • استنساخ أصل

سير العمل

  • إسناد / إرجاع / نقل
  • طلبات تتطلّب موافقة
  • حجز Check-in / Check-out
  • كشف التعارض

الصيانة

  • جدولة وقائية/تصحيحية
  • عرض تقويم
  • جدولة تلقائية للتالية
  • تتبّع التكاليف
  • تذكيرات بالبريد

الوثائق

  • إرفاق فواتير وأدلة
  • معاينة inline
  • تنبيهات الانتهاء
  • أنواع وثائق متعدّدة

الإهلاك

  • 3 طرق حساب
  • تحديث القيمة تلقائيًا
  • مخطّط جدولة
  • ملخّص سنوي

التقارير

  • 8 أنواع تقارير
  • تصدير Excel + PDF
  • مخطّطات ولوحات
  • فلاتر التاريخ

المستخدمون والأدوار

يأتي AssetHub مع 5 أدوار جاهزة:

الدورالصلاحيات
Adminوصول كامل للنظام — المستخدمون، الأقسام، الإعدادات، سجل التدقيق، Webhooks، الترجمات
مدير تقنية المعلوماتإدارة الأصول والفئات والصيانة والطلبات، الموافقة على عمليات النقل، عرض التقارير والإهلاك
محاسبإدارة الأصول والإهلاك، إجراء الجرد، الموافقة على النقل، وصول كامل للتقارير (تركيز مالي)
مشرفالموافقة على طلبات القسم، إدارة عمليات الإخراج، المشاركة في الجرد، عرض التقارير
موظّفعرض الأصول المسنَدة، إنشاء طلبات، إدارة عمليات الإخراج الخاصة به

تُخزَّن الصلاحيات كأدوار Spatie — يمكن للمسؤولين الضبط الدقيق لكل صلاحية عبر قاعدة البيانات.

إدارة الأصول

إنشاء الأصول

  1. انتقل إلى الأصول ← أصل جديد.
  2. املأ الاسم والفئة والعلامة التجارية والطراز والرقم التسلسلي.
  3. أضف تاريخ الشراء والسعر (مطلوب للإهلاك).
  4. ارفع الصور (يدعم ملفات متعدّدة، حد أقصى 5 ميغابايت لكل ملف).
  5. احفظ — يُولَّد asset tag ورمز QR تلقائيًا.

تنسيق Asset Tag

افتراضيًا: {PREFIX}-{YEAR}-{NNNN}، مثلًا AS-2026-0001. قابل للضبط عبر الإعدادات ← عام ← بادئة Asset Tag.

استيراد جماعي

  1. اضغط على استيراد في صفحة الأصول.
  2. نزّل قالب Excel.
  3. املأ بياناتك — الأعمدة المطلوبة: name، category_name.
  4. ارفع الملف.

رموز QR

يتلقّى كل أصل رمز QR تلقائيًا عند الإنشاء. يُرمِّز QR رابط الأصل، لذا يأخذ المسحُ المستخدمَ مباشرةً إلى صفحة تفاصيل الأصل.

طباعة البطاقات

  • بطاقة واحدة: اضغط على أيقونة الطابعة في أيّ صف أصل.
  • صيغة PDF: A4، بطاقتان لكل صف، تشمل asset tag والاسم والعلامة والرقم التسلسلي.

المسح

اضغط على مسح QR في صفحة الأصول. اسمح بصلاحية الكاميرا. يستخدم الماسح html5-qrcode ويعمل على أيّ متصفح حديث. ملاحظة: يتطلّب الوصول إلى الكاميرا HTTPS أو localhost.

سير العمل

إسناد الأصل

  1. افتح صفحة تفاصيل أصل.
  2. اضغط على إسناد (يظهر إذا كان الأصل متاحًا).
  3. اختر المستخدم وتاريخ الإرجاع الاختياري والملاحظات.
  4. أرسل — تُنشأ المعاملة ويُرسَل إشعار البريد.

طلبات الأصول

يمكن للموظفين تقديم طلبات للأصول التي يحتاجونها. للطلبات 4 حالات: pending ← approved ← fulfilled، أو rejected. تُرسَل رسائل الموافقة تلقائيًا.

Check-in / Check-out

للأصول المشتركة (الكاميرات، أجهزة العرض، المركبات). للحجوزات نطاقات تواريخ؛ يمنع النظام تداخل عمليات الإخراج. يُظهر عرض التقويم كل الحجوزات في لمحة.

الإهلاك

يحسب AssetHub إهلاك الأصول بواحدة من ثلاث طرق:

الطريقةالصيغةالحالة
القسط الثابت(Cost - Salvage) / Useful Lifeالأكثر شيوعًا، إهلاك سنوي متساوٍ
الرصيد المتناقص2 / Useful Life × Book Valueمتسارع، لأغراض ضريبية
وحدات الإنتاجحسب الاستخداممعدات التصنيع

تُرث الإعدادات الافتراضية من فئة الأصل. تُولَّد إدخالات الجدول شهريًا. تُحدَّث current_value للأصل تلقائيًا في أول كل شهر.

الحقول المخصصة

المسؤول ← الحقول المخصصة يتيح لك إضافة سمات مخصّصة بلا حدود للأصول:

  • الأنواع: نص، رقم، تاريخ، اختيار (dropdown)، منطقة نص، ملف، مربع اختيار
  • النطاق: تطبيق على كل الفئات أو فئة محدّدة
  • إعادة الترتيب: اسحب المقبض
  • يتم التحقّق من الحقول الإلزامية عند حفظ الأصل

التقارير

ثمانية تقارير مدمجة يمكن الوصول إليها من قائمة التقارير:

  1. ملخّص الأصول — الإجماليات حسب الحالة والوضع والفئة والقسم
  2. الإهلاك — فقد القيمة لكل فئة، أكثر الأصول إهلاكًا
  3. المعاملات — نشاط الإسناد والإرجاع والنقل عبر الزمن
  4. تكلفة الصيانة — الإنفاق حسب الشهر والفئة والنوع
  5. انتهاء الضمان — الأصول التي تحتاج اهتمامًا خلال 30/60/180 يومًا
  6. أصول الأقسام — توزيع الأصول واستخدام الميزانية حسب القسم
  7. الأصول حسب المصدر — التوزيع بين الشراء والمشروع والتبرّع والنقل
  8. ملخّص جرد المخزون — الفروقات بين دورات الجرد الدورية

تدعم كل التقارير التصدير إلى Excel وPDF عبر أزرار في رأس الصفحة.

Webhooks

يمكن لـ AssetHub إخطار الخدمات الخارجية عند الأحداث الرئيسية.

الأحداث المتاحة

  • asset.created, asset.updated, asset.deleted
  • asset.assigned, asset.returned, asset.transferred
  • request.created, request.approved, request.rejected, request.fulfilled
  • maintenance.scheduled, maintenance.started, maintenance.completed
  • checkout.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 داخليًا كل مهمة على الوقت الصحيح.

Hostinger / استضافة مشتركة (واجهة Cron Jobs في hPanel)

راجع قسم إعداد Hostinger ← الخطوة 5 للحصول على إرشادات بنمط لقطات الشاشة. باختصار: المتقدّم ← Cron Jobs ← Custom، الأمر:

/usr/bin/php /home/uXXXXXX/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:00send-overdue-checkout-alertsتذكيرات بريد لعمليات الإخراج المتأخرة
يوميًا 08:30send-maintenance-remindersتذكيرات الصيانة القادمة
يوميًا 09:00send-document-expiry-alertsالوثائق التي تنتهي خلال 30/14/7/1 أيام
يوميًا 09:30send-warranty-alertsتنبيهات انتهاء الضمان + التأمين
يوميًا 10:00assethub:send-depreciation-end-alertsتنبيهات عند بلوغ الأصول نهاية العمر الإنتاجي
يوميًا 10:30send-inventory-audit-remindersتذكيرات الجرد النشطة
شهريًا في الأول 02:00update-asset-valuesتحديث current_value الأصل من الإهلاك

حل المشكلات

"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 المرسِل.

إعادة ضبط التثبيت

احذف storage/installed.lock وزر /install مجدّدًا. سيتم محو البيانات الموجودة إذا أعدت تشغيل الـ migrations.

الأداء — قائمة أصول بطيئة

نفّذ php artisan optimize لتخزين الإعدادات والمسارات والـ views مؤقتًا. تأكّد من وجود فهارس MySQL على assets.asset_tag، assets.serial_number، assets.status (تُنشأ تلقائيًا بواسطة الـ migrations).

سجل التغييرات

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

الاعتمادات

المكتبات مفتوحة المصدر المستخدمة