# تثبيت FinanceTracker ERP — استضافة PHP وأندرويد

## الملفات التي تحتاجها

- حزمة `FinanceTracker-ERP-PHP-*.zip`: نظام الويب وAPI والمكتبات ومثبّت المتصفح، بدون بيانات تطوير أو كلمات مرور.
- `FinanceTracker-ERP-1.7.0.aab`: نسخة إصدار موقّعة لرفعها إلى Google Play.
- `FinanceTracker-ERP-1.7.0.apk`: نسخة إصدار موقّعة للتثبيت المباشر والتجربة.
- مجلد `private-signing` بجانب ملفات المشروع: مفتاح الرفع وكلمة مروره وشهادته. انسخه إلى مكان آمن؛ لا ترفعه إلى الاستضافة أو Git أو تشاركه مع المستخدمين.

## متطلبات الاستضافة

PHP 8.4.1 أو أحدث (اختر PHP 8.5 إن توفر)، MySQL 8 أو MariaDB متوافقة، HTTPS، Apache مع mod_rewrite (أو إعداد مكافئ لدى المضيف). فعّل إضافات PHP: ctype, curl, dom, fileinfo, filter, hash, iconv, mbstring, openssl, pcre, pdo_mysql, session, tokenizer, xml. يلزم مجلد خاص خارج جذر الموقع العام. لا تحتاج Terminal أو Composer على الاستضافة؛ المكتبات موجودة داخل الحزمة. مكتبات الحزمة المقفلة تتطلب PHP 8.4.1 حتى لو كان الحد العام للمشروع 8.3.

## خطوات التثبيت من لوحة التحكم فقط

1. فعّل شهادة HTTPS للدومين، وأنشئ قاعدة MySQL **فارغة** ومستخدمًا لها، واربط المستخدم بالقاعدة بكل صلاحياتها.
2. فك الحزمة. من مدير الملفات، ارفع `erp-app` إلى مجلد خاص خارج جذر الموقع، وارفع **محتويات** `public_html` إلى جذر الدومين. أظهر الملفات المخفية وتأكد من رفع `.htaccess`.

   ```text
   /home/ACCOUNT/erp-app/
   /home/ACCOUNT/public_html/
   ```

   يجب أن يكون المجلدان بجانب بعضهما. إذا اختلف مسار الاستضافة، عدّل سطر `$appRoot` في `index.php` وسطر `$root` في `install.php` و`update.php` لعنوان مجلد التطبيق الصحيح. لا تضع مجلد erp-app داخل المجلد العام.
3. امنح PHP إمكانية الكتابة في `erp-app` أثناء التثبيت، وفي `storage` و`bootstrap/cache`. استخدم صلاحيات المضيف المناسبة (غالبًا 755/775)، وليس 777.
4. داخل `erp-app` أنشئ ملفًا نصيًا اسمه `install-token.txt`. اكتب فيه رمزًا سريًا عشوائيًا خاصًا من 32 حرفًا على الأقل، واحتفظ به مؤقتًا. لا تستخدم المثال كرمز، ولا تضع الملف في public_html.
5. افتح `https://your-domain.com/install.php`. أدخل الرمز، رابط الموقع، بيانات القاعدة، واسم وبريد وكلمة مرور المدير. اختر كلمة مرور من 12 حرفًا على الأقل. اضغط «تثبيت النظام وإنشاء المدير» وانتظر.
6. بعد نجاح التثبيت، احذف `install.php` و`update.php` من المجلد العام. المثبّت يقفل نفسه تلقائيًا ويزيل رمز التثبيت، وينشئ مفتاح تشفير مستقلًا لهذه النسخة.
7. افتح الموقع وسجّل الدخول بحساب المدير. جرّب إضافة صنف وعميل وفاتورة قبل بدء العمل الحقيقي.

لا توجد كلمة مرور مدير افتراضية، ولا بيانات محاسبية تجريبية في الحزمة. لا يمكن تثبيت النظام فوق قاعدة فيها جداول. إذا انقطعت العملية، افتح صفحة التثبيت مجددًا بالرمز نفسه؛ تستخدم ملف `.env.installing` المحفوظ وتكمل الجداول دون مسحها. إذا أُنشئ المدير وفشل نقل الإعدادات، يطلب المثبّت نقل `.env.installing` إلى `.env` يدويًا. لا تحذف بيانات القاعدة لحل مشكلة تثبيت.

إذا ظهر 403 بسبب HTTPS خلف وكيل استضافة، اطلب من المضيف تمرير حالة HTTPS الصحيحة إلى PHP. لا تعطّل الحماية. إذا ظهرت صفحة الدخول لكن الاتصال يفشل، تحقق من `.htaccess` وPHP وسجل `erp-app/storage/logs/laravel.log`.

## أكثر من نسخة ويب

لكل نسخة دومين أو دومين فرعي مستقل، مجلد erp-app مستقل، وقاعدة بيانات ومستخدم قاعدة مستقلان. ارفع الحزمة نفسها وكرر خطوات التثبيت. لا تشارك ملف `.env` أو قاعدة البيانات أو مجلد storage بين النسخ. خصص مسارًا مثل:

```text
/home/ACCOUNT/company-a/erp-app/
/home/ACCOUNT/company-a/public_html/  ← جذر a.example.com
/home/ACCOUNT/company-b/erp-app/
/home/ACCOUNT/company-b/public_html/  ← جذر b.example.com
```

الإصدار الجاهز للويب مخصص لجذر دومين/دومين فرعي، وليس مجلدًا فرعيًا مثل example.com/company. يمكن للأندرويد الاتصال بمسارات API فرعية، لكن نشر واجهة الويب في مسار فرعي يحتاج إعداد بناء إضافيًا.

## ربط أندرويد

عند أول فتح تظهر شاشة «الاتصال بنظامك». أدخل `erp.example.com` أو `https://erp.example.com` ثم اضغط «تحقق واتصل». لا تضف /api/v1. يسجّل التطبيق دخولك إلى النسخة المحددة فقط. لتغييرها استخدم «تغيير عنوان الخادم» في التطبيق أو صفحة الدخول. تغيير الرابط يمسح جلسة الدخول السابقة ويطلب حسابًا من النسخة الجديدة. كل نسخة تحتفظ ببياناتها على استضافتها؛ يلزم اتصال بالإنترنت للعمل.

نسخة الإصدار تستخدم HTTPS فقط. APK وAAB بنفس اسم الحزمة `com.financetracker.erp`، الإصدار 1.7.0 ورقم البناء 5، والحد الأدنى Android 7 (API 24)، والاستهداف Android 16 (API 36).

## Google Play

ارفع AAB إلى اختبار داخلي أولًا، وفعّل Play App Signing، واحتفظ بمفتاح الرفع الموجود في private-signing للتحديثات. لا تغيّر اسم الحزمة بعد النشر. لا ترسل كلمات مرور التوقيع في المحادثة.

ملف AAB الموقّع هو ناتج البناء المطلوب للرفع، لكن نشره يحتاج حساب مطور مكتملًا، صفحة متجر وصورًا وأيقونة، رابط سياسة خصوصية منشورًا، نموذج Data safety والتصنيف العمري، وحساب مراجعة ودومين يعمل يستطيع فريق Google الدخول إليهما. استكمل أي متطلبات اختبار تظهر لحسابك في Play Console. لا يعني نجاح البناء ضمان قبول المتجر. جرّب الكاميرا والمسح والمشاركة والطباعة وتغيير الخادم على جهاز فعلي ومن Play internal testing.

قد لا يمكن استبدال APK المثبّت مباشرة بنسخة Google Play إذا اختلف مفتاح توقيع Play؛ احذف نسخة التجربة قبل تثبيت نسخة المتجر (البيانات الأساسية محفوظة على الخادم).

[متطلبات استهداف Android](https://developer.android.com/google/play/requirements/target-sdk)
[توقيع Google Play](https://support.google.com/googleplay/android-developer/answer/9842756)

## النسخ الاحتياطي والتحديثات

فعّل نسخًا احتياطية لقاعدة كل نسخة وملف .env ومجلد storage، وجرّب الاستعادة. احفظ APP_KEY؛ تغيير المفتاح قد يمنع قراءة البيانات المشفرة. هذه الحزمة للتثبيت الجديد؛ لا تستخدم المثبّت لتحديث قاعدة مستخدمة.

لإعادة إنشاء حزمة PHP شغّل `Package-SharedHosting.ps1` محليًا. لإصدار أندرويد لاحق شغّل `Release-Android.ps1` بمسار المفتاح واسم `erp-upload` وإصدار ورقم بناء أعلى، مع JDK 21 وAndroid SDK 36. يطلب السكربت كلمات المرور محليًا ويبني AAB وAPK. لا تستخدم debug للنشر.

## ترقية نسخة مثبتة سابقًا إلى 1.7.0

1. احفظ نسخة احتياطية قابلة للاستعادة من قاعدة البيانات وكل الملفات، خصوصًا `.env` و`storage`.
2. ارفع ملفات الإصدار الجديد في وقت قليل الاستخدام. احتفظ بملف `.env` ومجلد `storage` الحاليين ولا تستبدلهما. حدّث بقية ملفات التطبيق والمكتبات وملفات الموقع العام. لا تشغّل install.php للترقية.
3. أنشئ `erp-app/update-token.txt` برمز عشوائي خاص من 32 حرفًا على الأقل، خارج المجلد العام.
4. افتح `https://your-domain.com/update.php` وأدخل الرمز وأكد النسخة الاحتياطية. تتوقف الخدمة مؤقتًا أثناء إضافة جداول الشحن، ثم تعود عند النجاح. إذا كان الموقع في الصيانة مسبقًا، يبقى كذلك.
5. عند النجاح يقفل المحدّث نفسه ويحذف الرمز. احذف update.php وinstall.php من المجلد العام. إذا فشلت الترقية فقد يبقى الموقع في الصيانة؛ افحص السجل وأعد المحاولة بعد إصلاح السبب، ولا تحذف القاعدة أو تغيّر APP_KEY.

## ربط شركة الشحن التي تستخدم LogesTechs

من الإعدادات ← الشحن، أدخل اسم شركة الشحن ورقم Company ID الذي تعطيك إياه الشركة، وبريد حساب الشحن وكلمة مروره. اختر عملة الحساب المطابقة لعملة النظام وأدخل بيانات المرسل وابحث عن منطقة الاستلام واخترها، ثم فعّل الربط واحفظ. لكل نسخة ويب حساب شحن مستقل؛ LogesTechs منصة تخدم شركات متعددة وليست اسم شركة الشحن نفسها.

من فاتورة بيع مؤكدة اضغط «خيارات الشحن والتبديل والإحضار» لإكمال البيانات يدويًا، أو «شحن الآن» للإرسال المباشر. راجع اسم المستلم ورقمه وعنوانه واختر منطقة التوصيل وعدد الطرود ومبلغ التحصيل. المبلغ الافتراضي هو إجمالي الفاتورة متضمنًا التوصيل؛ عدّله عند وجود دفعة مسبقة. اختر دفعًا مسبقًا بمبلغ صفر إذا لا يوجد تحصيل. اضغط إرسال بعد إكمال البيانات. بعد النجاح يمكنك تحديث الحالة وإصدار رابط بوليصة الشحن وطلب الإلغاء وفق ما تسمح به الشركة. لا يغيّر تحديث حالة الشحن الأرصدة أو المحاسبة تلقائيًا.

عند انقطاع الاتصال بعد الإرسال، يمنع النظام إرسالًا ثانيًا لتجنب تكرار الطلب. افحص لوحة شركة الشحن، ثم اربط الباركود الموجود بعد التأكد بنفسك من مطابقته للفاتورة؛ واجهة الاستعلام لا تعيد رقم الفاتورة للتحقق الآلي. يمكن إضافة عدة شركات تستخدم LogesTechs، وتبقى كل بوليصة مرتبطة بحساب شركتها الأصلي. لا يسمح بتبديل بريد الحساب المرتبط ببوالص؛ يمكن تحديث كلمة مروره. يتوفر COD والمدفوع مسبقًا والإحضار BRING والتبديل SWAP؛ الأخيران يحتاجان مراجعة حقل المبلغ المطلوب تحصيله من المستلم.

يلزم السماح باتصالات HTTPS الصادرة من الاستضافة إلى apisv2.logestechs.com. تم اختبار العقد البرمجي بمحاكاة الاستجابات؛ نفّذ أول شحنة حقيقية تحت إشرافك بعد إدخال بيانات شركتك. لم تُرسل أي شحنة حقيقية أثناء التطوير.

## التحديث برفع ZIP من الويب — دون إعادة تثبيت

للنسخ القديمة، أضف صفحة التحديث مرة واحدة: انسخ `system-update.php` إلى `public_html` في حزمة الاستضافة، أو `ERP/backend/public` عند تشغيل السورس المحلي. لا تستبدل .env ولا قاعدة البيانات. على النسخ الجديدة الصفحة موجودة مسبقًا، وتصل إليها من الإعدادات ← تحديث النظام.

1. فعّل إضافة PHP zip. اضبط upload_max_filesize=40M وpost_max_size=48M، ثم أعد تشغيل PHP محليًا عند الحاجة.
2. أنشئ مرة واحدة `update-token.txt` في المجلد الخاص بجانب .env، واكتب فيه رمزًا عشوائيًا من 32 حرفًا أو أكثر. احتفظ به للتحديثات اللاحقة. لا تضعه في public_html.
3. افتح `/system-update.php` على عنوان خادم PHP. عند تشغيل واجهة Vite القديمة افتح الصفحة على عنوان PHP مباشرة (مثل http://127.0.0.1:18080/system-update.php)، لأن الواجهة القديمة لا تمرر مسار صفحة التحديث. بعد هذا التحديث يمكن فتحها من إعدادات النظام. في الاستضافة العامة يلزم HTTPS.
4. أدخل الرمز وارفع `FinanceTracker-ERP-UPDATE-1.7.0.zip`، وليس حزمة التثبيت الجديدة. يفحص النظام توقيع الحزمة ومحتوياتها قبل تغيير أي ملف.
5. احفظ نسخة احتياطية مستقلة من قاعدة البيانات والملفات، وأكد ذلك ثم ابدأ التحديث. اترك الصفحة مفتوحة؛ النسخ يتم على دفعات وتتابع الصفحة تلقائيًا. عند انقطاع المتابعة افتح الصفحة نفسها وأكمل؛ لا ترفع الحزمة مرة ثانية أثناء عملية نشطة.
6. تُحفظ الملفات القديمة في `storage/app/private/system-updates` خارج المجلد العام. يمكن استعادتها من الصفحة قبل بدء تحديث قاعدة البيانات. إذا فشلت مرحلة قاعدة البيانات يبقى الموقع في الصيانة: أصلح السبب ثم أعد المحاولة، أو استعد قاعدة البيانات والملفات معًا من نسختك الاحتياطية. لا تُستعاد قاعدة البيانات تلقائيًا.
7. بعد النجاح يعود الموقع، ويُحفظ رقم الإصدار. أعد تشغيل خادم Vite/PHP إذا تعمل على السورس المحلي ثم أعد تحميل المتصفح. احتفظ بمفتاح توقيع التحديث داخل private-signing محليًا فقط؛ لا ترفعه إلى الاستضافة. لن تحتاج إعادة تثبيت أو إنشاء مدير جديد في التحديثات التالية.

التحديث يحافظ على .env وAPP_KEY وstorage وإعدادات شركة الشحن والمرفقات. لا يفعّل تجاوز شهادة الشحن من تلقاء نفسه. وضع الإنتاج يفرض التحقق من الشهادة.

## إدارة الشحنات في 1.7.0

- تظهر بوليصة شركة الشحن وحالتها والحالة الداخلية واستلام التحصيل بجانب الفاتورة. البحث يقبل رقم بوليصة الشركة كما هو، بما فيه الأصفار في البداية.
- زر «تحديث حالة جميع الشحنات» يفحص البوالص على جميع الصفحات، حتى الملغاة، ويعرض التقدم والأخطاء. اترك الصفحة مفتوحة؛ يمكن إيقافه بعد الطلب الحالي. التحديث يقرأ الحالة فقط ولا يُنشئ شحنات.
- إدارة الشحنات تقبل مسح البوليصة بلوحة المفاتيح/قارئ USB أو الكاميرا. يدعم التحميل، والإلغاء الداخلي، واستلام المرتجعات. الرقم غير المرتبط بفاتورة مرفوض لمنع خلط الطلبات؛ اربطه من فاتورته أولًا بعد التحقق من بوابة الشركة.
- الحالة الداخلية مستقلة عن حالة الشركة. الإلغاء الداخلي لا يلغي الشحنة لدى الشركة، ولا يلغي الفاتورة أو يغيّر المخزون. استخدم زر الإلغاء لدى الشركة في شاشة الشحن والتتبع لذلك.
- استلام التحصيل يسجل المبلغ الفعلي والموظف والوقت ومرجع التسوية مرة واحدة لكل بوليصة. يمكن أن يكون أقل من مبلغ COD عند خصم الرسوم. هذا سجل متابعة فقط، ولا يُنشئ سند قبض محاسبي تلقائيًا.
- يوجد سجل حركات، وتصفية حسب التاريخ والحالة والتحصيل، وملخصات يومية، وطباعة وتصدير، وطباعة مرتجعات اليوم.
- تُضاف أصناف الفاتورة وكمياتها إلى وصف وملاحظات الشحنات الجديدة. الشحنات المنشأة سابقًا لا يعاد إرسالها أو تعديلها تلقائيًا؛ شكل ظهور التفاصيل على بوليصة PDF يعتمد على قالب شركة الشحن.


## إضافات الإصدار 1.7.0

- الحفظ مباشر بعد قراءة البوليصة، دون الحاجة لزر تسجيل. اختر الإجراء والشركة قبل المسح؛ عند تطابق رقم لدى شركتين يجب تحديد الشركة.
- استلام الراجع ينشئ مسودة مرتجع عملاء مرتبطة بالفاتورة ورقم البوليصة. راجع المسودة من المرتجعات وأكّدها؛ لا يتغير المخزون عند المسح وحده.
- التحصيل الافتراضي يساوي الفاتورة بدون التوصيل. يمكن تجهيز جميع البوالص غير المحصلة المطابقة للفلاتر ومراجعة المبالغ قبل حفظها، أو تعديل مبلغ مسجل من تفاصيل البوليصة. يحتفظ سجل الحركة بالمبلغ السابق والمنفّذ.
- من الفواتير افتح الإرسال الجماعي، واختر الشركة والفواتير وحدد منطقة كل مستلم من دليل الشركة. يمكن تطبيق منطقة على مجموعة محددة بعد مراجعتها. تظهر نتيجة كل فاتورة، ولا تُعاد المحاولة غير المؤكدة تلقائيًا.
- من الأصناف يمكن إدخال رصيد أول المدة لمستودع مسموح قبل أول حركة للصنف فيه. يلزم إذن تسوية المخزون. بعد بدء الحركات تستخدم سندات المخزون والتسويات المعتادة.
- استيراد الأصناف والعملاء والموردين بصيغة XLSX: نزّل النموذج من الشاشة، املأ حتى 500 صف، واحفظ الهواتف والباركود كنص. افحص الملف ثم أكد الاستيراد. يمنع الرمز/الباركود المكرر ولا يستبدل سجلات قائمة. للأصناف اختر مستودع الرصيد الافتتاحي.
- في تعريف المستخدم: جميع الفواتير أو فواتيره فقط، وجميع المستودعات أو مستودعات محددة. تشمل القيود الخادم والتفاصيل والتقارير والشحن. المدير العام يحتفظ بصلاحياته الكاملة. تبقى صلاحيات المستخدمين السابقين كما هي بعد الترقية؛ راجعها وحدد القيود المطلوبة.
- سجل الحركات يعرض منفّذ العمليات وتاريخها ووقتها ومرجعها منذ تثبيت هذا التحديث. صلاحية عرض السجل مستقلة، والسجل لا يخزن كلمات المرور أو بيانات الدخول للشحن.
- فلترة الأرصدة والحركات بالمستودع والصنف تشمل التصدير. حالات الشركة وحالاتنا تظهر في أعمدة مستقلة، والتفاصيل في نوافذ منبثقة.
- في أندرويد: الإعدادات ← عنوان الخادم. تغيير العنوان يتطلب تسجيل الدخول للحساب على الخادم الجديد.


## الصلاحيات والتقارير في 1.7.0

- فواتير البيع والشراء بشاشتين وصلاحيات منفصلة. تنتقل الصلاحيات السابقة إلى النوعين للحفاظ على الوصول السابق؛ راجع الأدوار لتقييد كل نوع حسب حاجتك.
- من تعريف المستخدم: «صلاحيات خاصة لهذا المستخدم» تتيح حسب الدور / مسموح / ممنوع، لتأكيد البيع والشراء والمرتجعات والسندات، وللتعديل والإلغاء والحذف. المنع الفردي يتجاوز سماح الدور؛ المدير العام يبقى كامل الصلاحيات. تعديل الاستثناءات يحتاج إدارة الصلاحيات.
- صلاحية تعديل الفاتورة بعد الشحن تسمح بتعديل فاتورة بيع معتمدة مرتبطة ببوليصة، مع تصحيح المخزون وتسجيل الحدث. لا تتغير البوليصة لدى الشركة تلقائيًا. إذا كانت نتيجة الإرسال غير محسومة يجب حلها أولًا؛ الفاتورة المرتبطة بمرتجع غير ملغي لا تُعدل.
- طلب إلغاء شحنة فعّالة لدى الشركة يحتاج صلاحية الإلغاء بعد الشحن بالإضافة لصلاحية إلغاء الشحن. لا يمكن إلغاء فاتورتها حتى تؤكد الشركة إلغاء البوليصة، ثم يكفي إذن إلغاء الفاتورة المعتاد.
- الحذف يخفي المسودة أو المستند الملغي من القوائم مع الاحتفاظ به للمراجعة. المستند المعتمد يحتاج إلغاءً أولًا. صلاحيات الحذف مستقلة.
- يُرفض إرسال أو ربط أو تحميل شحنة لفاتورة ملغاة.
- من إدارة الشحنات ← تقرير الشركات والتحصيل: عدد البوالص المسلّمة، المرتجعات، الملغي، التحصيل المسجل، المستلم والمتبقي؛ وتوزيع مستقل حسب حالاتنا وحالات الشركة. كل شركة وعملة منفصلتان. العدد يمثل البوالص لا أصناف الفاتورة. المتبقي المالي للبوالص المسلّمة غير المرتجعة أو الملغاة لدينا وفواتيرها غير ملغاة: صافي الفاتورة دون التوصيل ناقص التحصيل المسجل، بحد أدنى صفر. حالات الشركة هي آخر تحديث محفوظ.
- أضيفت فلاتر متعددة للفواتير والسندات والشحنات والأصناف والعملاء والموردين والمستخدمين والتقارير. التصدير يستخدم الفلاتر المطبّقة.
- صفحة التحديث تعرض تفاصيل المشكلة للمسؤول بعد دخوله بالرمز، مع مرجع الخطأ والمرحلة والرسالة، وتحجب كلمات المرور وتفاصيل الاستعلامات الحساسة. يحتفظ النظام بسجل خاص للتشخيص. أثناء التحديث تظهر رسالة صيانة ويعيد التطبيق المحاولة تلقائيًا.

## تعديلات الحسابات والتحصيل في 1.7.0

- يمكن إضافة حسابات متعددة بنفس Company ID، مع اسم مميز وبريد وكلمة مرور لكل حساب. اختر «إضافة شركة شحن» لإنشاء حساب مستقل. الفاتورة والبوليصة والتقارير مرتبطة بالحساب المحدد، ولا ينتقل ارتباط البوالص عند اختيار حساب آخر.
- البحث متاح في قوائم الاختيار، ونماذج إضافة الأصناف والعملاء والموردين والفواتير والمستخدمين والأدوار والمستودعات وحسابات الشحن تفتح في نوافذ منبثقة.
- اختر حساب الشحن السريع في قائمة فواتير البيع، ثم «شحن الآن». أول مرة لكل عميل وحساب يجب اختيار منطقة من دليل الشركة وإكمال العنوان والهاتف؛ تُحفظ المنطقة لهذا الحساب. المرات التالية تُرسل مباشرة دون مربع تأكيد. عند تعدد الحسابات وعدم اختيار حساب، يفتح نموذج الاختيار.
- الشحن السريع يرسل طلب تحصيل عادي بقيمة الفاتورة كاملة مع التوصيل. زر «خيارات الشحن والتبديل والإحضار» يسمح بتغيير النوع والمبلغ والمنطقة قبل الإرسال. استخدمه إذا كان عنوان العميل أو نوع الطلب مختلفًا.
- في إدارة الشحنات اختر «تعديل مبلغ التحصيل المستلم»، وعدّل مبالغ الصفوف ثم «حفظ مبالغ التحصيل». تُحفظ التعديلات تباعًا مع سجل المبلغ السابق والموظف والوقت. عند فشل بعض الصفوف تبقى وحدها لإعادة المحاولة؛ لا تعيد الناجحة. هذا تعديل متابعة محلي ولا يغيّر مبلغ البوليصة لدى الشركة.
- إرجاع بوليصة سبق تسجيل استلام تحصيلها يحتاج صلاحية «إرجاع فاتورة بعد استلام التحصيل» من الدور أو تعريف المستخدم، إضافة لصلاحيات إدارة الشحنات وإنشاء المرتجع. يصبح التحصيل صفرًا مع حفظ المبلغ السابق في الحركة، وتبقى مسودة المرتجع بحاجة للتأكيد المعتاد لإعادة المخزون.
- استلام أو تعديل تحصيل بوليصة مرتجعة يسجل صفرًا دائمًا. أثناء الترقية تُصفّر مبالغ التحصيل القديمة للبوالص ذات الحالة الداخلية «مرتجع مستلم» فقط، وتُسجل حركة نظام تحتفظ بالمبلغ السابق. لا يُنشأ سند قبض ولا يتغير التحصيل أو حالة البوليصة لدى شركة الشحن.

## إصلاحات البحث والصلاحيات والتحديث في 1.7.0

- جميع قوائم الاختيار تستخدم حقلًا واحدًا: اكتب للبحث ثم اختر من النتائج، مثل العملاء والأصناف في الفاتورة. تعمل النتائج داخل النوافذ المنبثقة وعلى الهاتف، ويمكن إعادة فتح القائمة بالنقر على الحقل. مناطق الشحن تُبحث تلقائيًا بعد كتابة حرفين.
- التأكيد المباشر والتأكيد بالمطابقة صلاحيتان مستقلتان لكل نوع مستند. يمكن منحهما أو منعهما من الدور أو تعريف المستخدم كل واحدة على حدة. صلاحية المطابقة وحدها تؤكد بعد اكتمال مسح الأصناف، ولا تسمح بالتأكيد المباشر.
- لا يمكن إلغاء أو حذف فاتورة مرتبطة بشحنة فعّالة، حتى مع صلاحية إلغاء بعد الشحن. ألغِ الشحنة لدى الشركة أولًا ثم حدّث حالتها. الإلغاء الداخلي في إدارة الشحنات لا يحقق هذا الشرط. الفاتورة الملغاة لا يمكن شحنها.
- لا يمكن حذف صنف أو عميل أو مورد عليه مستندات أو حركات، حتى لو أُلغي المستند أو أصبح المخزون صفرًا. استخدم الإيقاف بدل الحذف.
- اتصال الخادم في أندرويد موجود تحت قائمة الإعدادات بعد تسجيل الدخول، ومتاح أيضًا للمستخدم الذي لا يملك صلاحية إعدادات الشركة. تغيير الخادم يخرجك من الحساب السابق حفاظًا على فصل النسخ.
- عند التحديث تظهر تفاصيل الخطوة الأخيرة وسجل الخطأ. إعادة طلب إنهاء تحديث ناجح لا تعيد تشغيل الترحيل ولا تعرض فشلًا كاذبًا. للترقية من 1.2 يُفضّل استبدال system-update.php في المجلد العام بالملف الجديد أولًا، ثم رفع حزمة UPDATE. لا تستبدل .env أو APP_KEY أو الرمز الخاص بك.
