# نظام الخضار — أيمن مارك

نظام ويب خفيف ورسمي مبني بـ **HTML وCSS وJavaScript**، مع سيرفر **Node.js** وقاعدة بيانات **MySQL**. لا يحتوي على PHP.

## ما يحتويه النظام

- دخول مستخدم باسم مستخدم وكلمة مرور.
- أربع فئات ثابتة: محاسب، إداري، مشتريات، عامل.
- الفئة تعريف فقط، والصلاحيات تُختار لكل مستخدم بشكل مستقل:
  - أسعار الخضار.
  - تسجيل عهدة الخضار.
  - ملفات الخضار.
- جلسة المستخدم تبقى محفوظة على جهازه، ولا تُلغى من السيرفر إلا عند تسجيل الخروج أو حذف المستخدم من الأدمن. حذف المستخدم يلغي جميع جلساته فورًا.
- صفحة أدمن مستقلة باسم مستخدم وكلمة مرور.
- إضافة المستخدمين وتعديل فئتهم وقوائمهم وتغيير كلمة المرور وحذفهم.
- آخر عهدة تبقى ظاهرة في صفحة تسجيل العهدة حتى حفظ عهدة جديدة.
- جميع العهد محفوظة دائمًا في قاعدة البيانات، ولا يوجد في النظام زر لحذف العهد.
- صفحة أسعار الخضار تعرض فقط اسم الصنف وسعر البيع من آخر عهدة.
- فتح أي عهدة داخل الصفحة وتنزيلها كملف Excel.
- ملف Excel الناتج يحتوي نفس أعمدة الملف المرجعي ومعادلاته:
  - العدد = الكمية × الشد.
  - إجمالي التكلفة = الكمية × التكلفة.
  - سعر الكيلو = إجمالي التكلفة ÷ العدد.
- تم نقل 74 سطرًا من الملف المرفق كقالب أولي.
- مسودة العهدة تُحفظ تلقائيًا على الجهاز أثناء الكتابة لحمايتها من تحديث الصفحة أو إغلاقها بالخطأ.
- الحسابات تُعاد داخل السيرفر قبل الحفظ، ولا يعتمد النظام على حسابات المتصفح وحدها.
- الحفظ يتم داخل Transaction واحدة: إما تُحفظ العهدة كاملة أو لا يُحفظ منها شيء.
- نسخة احتياطية JSON تلقائية يومية داخل `storage/backups` مع الاحتفاظ الافتراضي لمدة 180 يومًا.

## المتطلبات

- Node.js 20 أو أحدث.
- MySQL 8 أو MariaDB حديثة.
- استضافة تدعم تشغيل Node.js بشكل مستمر.
- شهادة HTTPS على الدومين.

## التركيب

1. فك ضغط المشروع وارفعه إلى استضافة Node.js.
2. أنشئ قاعدة MySQL ومستخدمًا لها، وأعطه صلاحيات القاعدة.
3. انسخ الملف:

```bash
cp .env.example .env
```

4. عدّل بيانات MySQL داخل `.env`.
5. ثبّت المكتبات:

```bash
npm install
```

6. أنشئ الجداول وحساب الأدمن الأول:

```bash
npm run setup -- --admin-user=admin --admin-pass="كلمة-مرور-قوية"
```

7. شغّل النظام:

```bash
npm start
```

## الروابط

- دخول المستخدمين: `/login.html`
- دخول الأدمن: `/admin/login.html`

## الاستيراد الاختياري للبيانات الموجودة داخل الملف المرفق

النظام لا يضيف الورقة المعبأة كعهدة فعلية تلقائيًا حتى لا يخلط بيانات تجريبية مع السجل الحقيقي. لاستيرادها يدويًا بعد التأكد:

```bash
npm run import:reference -- --yes --date=2026-08-02
```

غيّر التاريخ إلى تاريخ العهدة الصحيح قبل التنفيذ.

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

إنشاء نسخة فورية:

```bash
npm run backup
```

استعادة نسخة إلى قاعدة فارغة:

```bash
npm run restore -- --file=/المسار/vegetable-backup-YYYY-MM-DD.json --yes
```

الاستعادة إلى قاعدة تحتوي بيانات تتطلب `--force`، ويجب أخذ نسخة حالية قبل ذلك.

## فحص المشروع

```bash
npm run check
npm test
```

## حماية البيانات

- كلمات المرور محفوظة كـ hash وليست نصًا واضحًا.
- جميع الاستعلامات تستخدم معاملات آمنة وقيمًا مربوطة.
- محاولات تسجيل الدخول محدودة.
- واجهات البيانات محمية بالصلاحيات من السيرفر، وليس فقط بإخفاء القوائم.
- ترويسات حماية وCSP مفعلة.
- مجلد النسخ الاحتياطية ليس داخل `public`.

لا يوجد نظام يمكن وصفه بأنه محمي 100% من كل الأعطال أو الاختراقات. للوصول لأعلى اعتمادية: استخدم HTTPS، كلمة مرور قوية لقاعدة البيانات، نسخة احتياطية يومية من شركة الاستضافة، ونسخة خارجية دورية من مجلد `storage/backups`.
