# دليل نقل FaceTrack HR إلى دومين أو قاعدة بيانات جديدة

هذا الملف هو المرجع السريع عند نقل المشروع إلى دومين جديد أو سيرفر جديد أو قاعدة بيانات جديدة.

المشروع الحالي يعتمد على 3 أجزاء مرتبطة ببعض:

- تطبيق Flutter: `mobile/`
- API التطبيق: `mobile/api/`
- لوحة HRMS: `hrms/`

## أهم إعدادات النقل تحت بعض

استخدم هذا الجزء أولًا عند نقل المشروع إلى دومين جديد أو قاعدة بيانات جديدة. عدّل القيم التالية بنفس القيم الجديدة في كل الملفات.

### 1. بيانات الدومين والمسار

اكتب القيم الجديدة هنا قبل التعديل:

```text
الدومين الجديد:
https://NEW-DOMAIN.com

مسار المشروع على الدومين:
/attendance_app

رابط مجلد mobile:
https://NEW-DOMAIN.com/attendance_app/mobile

رابط app_config:
https://NEW-DOMAIN.com/attendance_app/mobile/app_config.php

رابط HRMS:
https://NEW-DOMAIN.com/attendance_app/hrms/public

رابط Web:
https://NEW-DOMAIN.com/attendance_app/mobile/web/

base href للويب:
/attendance_app/mobile/web/
```

لو غيرت اسم المجلد من `attendance_app` إلى مثلًا `hr-system` تصبح القيم:

```text
رابط مجلد mobile:
https://NEW-DOMAIN.com/hr-system/mobile

رابط app_config:
https://NEW-DOMAIN.com/hr-system/mobile/app_config.php

رابط HRMS:
https://NEW-DOMAIN.com/hr-system/hrms/public

رابط Web:
https://NEW-DOMAIN.com/hr-system/mobile/web/

base href للويب:
/hr-system/mobile/web/
```

### 2. بيانات قاعدة البيانات الجديدة

اكتب بيانات قاعدة البيانات الجديدة هنا:

```text
DB_HOST=localhost
DB_PORT=3306
DB_NAME=NEW_DATABASE_NAME
DB_USER=NEW_DATABASE_USER
DB_PASS=NEW_DATABASE_PASSWORD
```

### 3. الملفات التي تتغير عند النقل

عدّل هذه الملفات بالترتيب:

```text
mobile/api/config.php
hrms/app/config.php
mobile/env.json
mobile/web/assets/env.json
mobile/web/index.html
mobile/lib/config.dart
```

### 4. القيم المطلوبة داخل كل ملف

#### `mobile/api/config.php`

```php
define('DB_HOST', 'localhost');
define('DB_USER', 'NEW_DATABASE_USER');
define('DB_PASS', 'NEW_DATABASE_PASSWORD');
define('DB_NAME', 'NEW_DATABASE_NAME');
define('DB_PORT', 3306);

define('PUBLIC_BASE_URL', 'https://NEW-DOMAIN.com/attendance_app/mobile');
define('BASE_PATH', '/attendance_app/mobile');
define('BASE_URL', rtrim(PUBLIC_BASE_URL, '/'));
```

#### `hrms/app/config.php`

```php
'db' => [
  'host' => 'localhost',
  'port' => '3306',
  'name' => 'NEW_DATABASE_NAME',
  'user' => 'NEW_DATABASE_USER',
  'pass' => 'NEW_DATABASE_PASSWORD',
  'charset' => 'utf8mb4',
],

'app' => [
  'name' => 'Face Track HR',
  'base_url' => 'https://NEW-DOMAIN.com/attendance_app/hrms/public',
],
```

#### `mobile/env.json`

```json
{
  "BOOTSTRAP_URL": "https://NEW-DOMAIN.com/attendance_app/mobile/app_config.php"
}
```

#### `mobile/web/assets/env.json`

```json
{
  "BOOTSTRAP_URL": "https://NEW-DOMAIN.com/attendance_app/mobile/app_config.php"
}
```

#### `mobile/web/index.html`

```html
<base href="/attendance_app/mobile/web/">
```

#### `mobile/lib/config.dart`

راجع أي دومين ثابت أو fallback قديم وغيّره للدومين الجديد، خصوصًا أي رابط فيه:

```text
do-lap.online
attendance_app/mobile
attendance_app/hrms
```

### 5. أوامر البحث بعد التعديل

بعد تغيير الملفات، شغّل:

```powershell
rg -n "do-lap.online|localhost|NEW-DOMAIN|attendance_app" mobile hrms
```

راجع أي نتيجة فيها دومين قديم أو مسار قديم.

### 6. بعد تغيير الدومين

لازم تعمل:

```text
استيراد قاعدة البيانات الجديدة
رفع مجلد mobile/uploads
بناء APK جديد
بناء Web جديد
اختبار API و app_config و HRMS والويب
```

## 1. الملفات التي ستعدلها عند النقل

### الملف الأول: إعدادات API التطبيق

المسار:

```text
mobile/api/config.php
```

غيّر هذه القيم:

```php
define('DB_HOST', 'localhost');
define('DB_USER', 'ali');
define('DB_PASS', '1531712');
define('DB_NAME', 'attendance_db');
define('DB_PORT', 3306);

define('PUBLIC_BASE_URL', 'https://NEW-DOMAIN.com/attendance_app/mobile');
define('BASE_PATH', '/attendance_app/mobile');
```

لو رفعت المشروع داخل مجلد مختلف، مثال:

```text
https://NEW-DOMAIN.com/hr-system/mobile
```

يبقى:

```php
define('PUBLIC_BASE_URL', 'https://NEW-DOMAIN.com/hr-system/mobile');
define('BASE_PATH', '/hr-system/mobile');
```

ملاحظات مهمة:

- `PUBLIC_BASE_URL` بدون `/` في الآخر.
- `BASE_PATH` هو مسار مجلد `mobile` من جذر الدومين.
- هذا الملف هو أهم ملف لاتصال التطبيق والويب بالـ API.

## 2. إعدادات HRMS

المسار:

```text
hrms/app/config.php
```

غيّر بيانات قاعدة البيانات:

```php
'db' => [
  'host' => 'localhost',
  'port' => '3306',
  'name' => 'attendance_db',
  'user' => 'ali',
  'pass' => '1531712',
  'charset' => 'utf8mb4',
],
```

ولو عندك دومين ثابت للـ HRMS ضع:

```php
'app' => [
  'name' => 'نظام الموارد البشرية (متعدد الفروع)',
  'base_url' => 'https://NEW-DOMAIN.com/attendance_app/hrms/public',
]
```

لو سيبته فاضي النظام يشتغل عادي غالبًا، لكن يفضل ضبطه على الدومين الجديد خصوصًا لروابط البريد واستعادة كلمة المرور.

## 3. ملف Bootstrap الخاص بالتطبيق

المسار:

```text
mobile/env.json
```

غيّر الرابط:

```json
{
  "BOOTSTRAP_URL": "https://NEW-DOMAIN.com/attendance_app/mobile/app_config.php"
}
```

هذا الملف مهم جدًا للـ APK؛ التطبيق يقرأ منه أول رابط يعرفه بالـ API.

بعد تغييره:

- لازم تبني APK جديد.
- لازم تحدث نسخة الويب.

## 4. ملف Bootstrap داخل نسخة الويب

بعد بناء الويب أو لو ستنقل يدويًا، تأكد من الملف:

```text
mobile/web/assets/env.json
```

يكون مثل:

```json
{
  "BOOTSTRAP_URL": "https://NEW-DOMAIN.com/attendance_app/mobile/app_config.php"
}
```

## 5. base href لنسخة الويب

المسار:

```text
mobile/web/index.html
```

لو الويب على:

```text
https://NEW-DOMAIN.com/attendance_app/mobile/web/
```

يبقى:

```html
<base href="/attendance_app/mobile/web/">
```

لو الويب على:

```text
https://NEW-DOMAIN.com/hr-system/mobile/web/
```

يبقى:

```html
<base href="/hr-system/mobile/web/">
```

الأفضل عند بناء الويب تستخدم:

```powershell
cd C:\xampp\htdocs\attendance_app\mobile
C:\src\flutter\bin\flutter.bat build web --release --base-href /attendance_app/mobile/web/
```

وغيّر `/attendance_app/mobile/web/` حسب مكان الرفع الجديد.

## 6. إعدادات SMTP والبريد

لا تعدل SMTP من الملفات إلا للضرورة.

الإعداد الموحد للبريد موجود في قاعدة البيانات داخل جدول:

```text
app_settings
```

ويمكن تعديله من HRMS:

```text
HRMS > إدارة النظام > إعدادات البريد SMTP
```

المفاتيح:

```text
smtp_enabled
smtp_host
smtp_port
smtp_encryption
smtp_username
smtp_password
smtp_from_email
smtp_from_name
smtp_reply_to
```

هذه الإعدادات يستخدمها:

- HRMS
- تطبيق APK
- نسخة الويب
- نسيان كلمة المرور
- إرسال البريد من التطبيق

## 7. روابط ثابتة داخل كود Flutter يجب مراجعتها عند تغيير الدومين

هذه ليست أساسية لو `env.json` مضبوط، لكنها روابط مباشرة موجودة داخل التطبيق لبعض صفحات HRMS.

ابحث عن الدومين القديم:

```powershell
rg -n "do-lap.online|attendance_app/hrms|attendance_app/mobile" mobile/lib
```

الملفات التي ظهرت حاليًا:

```text
mobile/lib/config.dart
mobile/lib/api/api_client.dart
mobile/lib/screens/admin_catalog_screen.dart
mobile/lib/screens/home_screen.dart
```

المهم:

- `mobile/lib/config.dart` فيه fallback فقط، الأفضل تغييره للدومين الجديد.
- أي رابط HRMS مباشر مثل الشات أو إعدادات الدوام يفضل تحديثه للدومين الجديد.

## 8. أوامر البحث السريعة قبل التسليم

بعد النقل، نفذ:

```powershell
rg -n "do-lap.online|localhost|attendance_app" mobile hrms
```

أي نتيجة فيها الدومين القديم راجعها.

ممكن بعض النتائج تكون داخل ملفات build أو logs، المهم راجع:

```text
mobile/api/config.php
mobile/env.json
mobile/web/assets/env.json
mobile/web/index.html
mobile/lib/config.dart
hrms/app/config.php
```

## 9. استيراد قاعدة البيانات الجديدة

على السيرفر الجديد:

1. أنشئ قاعدة بيانات جديدة.
2. استورد ملف SQL.
3. عدّل:

```text
mobile/api/config.php
hrms/app/config.php
```

بنفس اسم قاعدة البيانات والمستخدم وكلمة المرور.

## 10. الملفات والمجلدات التي يجب رفعها

ارفع هذه المجلدات:

```text
mobile/
hrms/
```

وتأكد من رفع مجلدات الملفات:

```text
mobile/uploads/
```

لو عندك صور تحقق وجه، مرفقات طلبات، صور حضور، أو APK update، فهي غالبًا داخل:

```text
mobile/uploads/
```

## 11. بعد النقل اختبر هذه الروابط

اختبار API:

```text
https://NEW-DOMAIN.com/attendance_app/mobile/api/
```

لازم يرجع JSON فيه:

```json
{
  "ok": true,
  "service": "FaceTrack HR"
}
```

اختبار app_config:

```text
https://NEW-DOMAIN.com/attendance_app/mobile/app_config.php
```

لازم يرجع:

```json
{
  "base_url": "https://NEW-DOMAIN.com/attendance_app/mobile"
}
```

اختبار HRMS:

```text
https://NEW-DOMAIN.com/attendance_app/hrms/public/
```

اختبار الويب:

```text
https://NEW-DOMAIN.com/attendance_app/mobile/web/
```

## 12. هل لازم تبني APK جديد؟

نعم، لو غيرت:

```text
mobile/env.json
mobile/lib/config.dart
```

ابني APK جديد:

```powershell
cd C:\xampp\htdocs\attendance_app\mobile
C:\src\flutter\bin\flutter.bat clean
C:\src\flutter\bin\flutter.bat pub get
C:\src\flutter\bin\flutter.bat build apk --release
```

ثم ارفع:

```text
mobile/build/app/outputs/flutter-apk/app-release.apk
```

إلى:

```text
mobile/uploads/app_releases/app-release.apk
```

وحدّث رقم الإصدار من HRMS أو من جدول `app_settings`.

## 13. هل لازم تبني Web جديد؟

نعم، لو غيرت الدومين أو المسار:

```powershell
cd C:\xampp\htdocs\attendance_app\mobile
C:\src\flutter\bin\flutter.bat build web --release --base-href /attendance_app/mobile/web/
```

بعدها انسخ محتوى:

```text
mobile/build/web/
```

إلى:

```text
mobile/web/
```

## 14. ملخص سريع جدًا

لو هتنقل على دومين جديد وقاعدة جديدة، غالبًا ستعدل فقط:

```text
mobile/api/config.php
hrms/app/config.php
mobile/env.json
mobile/web/assets/env.json
mobile/web/index.html
mobile/lib/config.dart
```

ثم:

```text
استيراد قاعدة البيانات
رفع mobile/uploads
بناء APK جديد
بناء Web جديد
اختبار app_config.php و API و HRMS
```

## 15. النسخ الاحتياطي والاسترجاع

من HRMS افتح:

```text
إدارة النظام -> مسح كل بيانات ونسخ احتياطي
```

يوجد زر `إنشاء نسخة احتياطية` لإنشاء نسخة يدوية.

مهم:

```text
النسخة لا تأخذ المشروع كله.
النسخة تشمل قاعدة البيانات + صور وملفات الرفع فقط.
قبل إنشاء النسخة اكتب مجلد الحفظ الذي تريده من داخل HRMS.
لو المجلد خارج public سيظهر لك مسار الملف بدل رابط تحميل مباشر.
```

للنسخة اليومية التلقائية حدد مجلد الحفظ أولًا ثم شغّل:

```powershell
$env:FACETRACK_BACKUP_DIR="E:\facetrack_backups"
php scripts/daily_backup.php
```

لو مساحة `C:` قليلة، خزن النسخ على `E:` مثلًا:

```powershell
$env:FACETRACK_BACKUP_DIR="E:\facetrack_backups"
php scripts/daily_backup.php
```

على Windows Task Scheduler:

```text
Program: php
Arguments: scripts/daily_backup.php
Start in: C:\xampp\htdocs\attendance_app
```

ولو هتستخدم مسار خارجي في Task Scheduler، أضف Environment Variable باسم:

```text
FACETRACK_BACKUP_DIR=E:\facetrack_backups
```

لو لم تحدد `FACETRACK_BACKUP_DIR` فالافتراضي يكون:

```text
E:\facetrack_backups لو قرص E موجود
أو C:\xampp\htdocs\attendance_app\backups كبديل
```

للاسترجاع من HRMS:

```text
إدارة النظام -> مسح كل بيانات ونسخ احتياطي -> استرجاع نسخة SQL
```

اكتب عبارة التأكيد:

```text
استرجاع النسخة
```

> لو النسخة ZIP، فك الضغط أولًا وارفع ملف SQL الداخلي.

## 16. حد المستخدمين التجاري

حد المستخدمين مضبوط من HRMS:

```text
إدارة النظام -> إنشاء مستخدم
```

الإعداد الافتراضي:

```text
الحد: 30 مستخدم
كود اعتماد الحد: محفوظ داخل إعدادات النظام ولا يظهر للمستخدمين
```

عند وصول العدد إلى 30:

- HRMS يطلب كود الاعتماد عند إنشاء مستخدم جديد.
- تطبيق APK والويب يرسلان نفس كود الاعتماد من شاشة إنشاء الموظف.
- الـ API نفسه يمنع إنشاء المستخدم بدون كود الاعتماد، لذلك الحد فعلي وليس مجرد تنبيه في الواجهة.
