البنية التقنية
ماذا سنستخدم ولماذا — نظام واحد بلغة واحدة (TypeScript) من قاعدة البيانات حتى الهاتف
مخطط النظام
لوحة الإدارة (المتصفح)
مدير المشروع · المستودع · المراقب WFP
التطبيق الميداني PWA
المندوب · المسؤول الميداني — يعمل دون إنترنت
IndexedDB ← طابور مزامنة بـ op_id
Caddy — HTTPS
Next.js (Docker)
صفحات الإدارة (Server Components)
API: /api/sync · /api/shipments …
قواعد العمل: FEFO · حجز · تسوية
المصادقة + RBAC + Audit
PostgreSQL + Prisma
البيانات وسجل الحركات
تخزين S3 خاص
سندات وصور وتواقيع
نسخ احتياطي يومي
موقع منفصل مشفّر
التقنيات المقترحة
| الطبقة | التقنية | لماذا |
|---|---|---|
| لوحة الإدارة وواجهة الهاتف | Next.js 15 (App Router) + TypeScript + Tailwind | كود واحد للويب والهاتف، واجهة عربية RTL، مكوّنات خادم سريعة. |
| واجهات API وقواعد العمل | Next.js Route Handlers + Zod | نفس المشروع ونفس اللغة؛ التحقق من المدخلات والصلاحيات على الخادم. |
| قاعدة البيانات وسجل الحركات | PostgreSQL 16 + Prisma ORM | معاملات (Transactions) تضمن ألا يُصرف نفس الرصيد مرتين؛ Ledger غير قابل للتعديل. |
| الحفظ المحلي والمزامنة | PWA + Service Worker + Dexie.js (IndexedDB) | العمل دون إنترنت في الميدان، ومزامنة بمفتاح فريد لكل عملية. |
| سندات التسليم والمرفقات | تخزين خاص متوافق مع S3 (MinIO أو مزوّد سحابي) | صور السندات والتواقيع خارج قاعدة البيانات وبروابط مؤقتة. |
| المصادقة والصلاحيات | Auth.js (جلسات) + RBAC حسب الدور والموقع | كل مستخدم يرى مستودعه/مدارسه فقط. |
| التقارير والتصدير | ExcelJS + PDF (React-PDF / Playwright) | تقارير شهرية بنموذج WFP بالعربية. |
| تشغيل الخادم والاتصال المشفّر | Ubuntu LTS + Docker Compose + Caddy (HTTPS تلقائي) | نشر بسيط على خادم واحد باسم الجهة المنفّذة، ونسخ احتياطية يومية. |
نموذج البيانات (الكيانات الأساسية)
Warehouseالمستودع
id, name, keeper
Schoolالمدرسة
id, name, area, warehouseId
Enrollmentأعداد الطلاب
schoolId, grade, shift, count, period
Batchالتشغيلة
code, expiryDate, packsPerCarton
StockMovementحركة المخزون (Ledger)
type, locationId, batchId, qty, refId, userId
DistributionPlanخطة التوزيع
schoolId, month, days, packs, approvedBy
Shipmentأمر الشحن
warehouseId, vehicle, driver, agentId, status
ShipmentLineبند الشحنة
shipmentId, schoolId, batchId, qty (محجوز)
Deliveryإثبات الوصول
lineId, receivedQty, receiver, attachmentKey
Distributionتوزيع الطلاب
opId (unique), schoolId, grade, students, packs
Exceptionالاستثناء
type, reason, qty, status, resolvedBy
AuditLogسجل التدقيق
userId, action, entity, before, after
الرصيد لا يُخزّن كرقم يُعدّل — يُحسب من مجموع الحركات، فيبقى أثر كل عبوة قابلًا للتدقيق. المسودة في prisma/schema.prisma.
مسار عملية التوزيع من الهاتف
- 1الجهاز: يولّد op_id (UUID) ويحفظ العملية في IndexedDB
- 2Service Worker: عند عودة الاتصال يرسل الطابور إلى POST /api/sync
- 3الخادم: يتحقق من الجلسة والصلاحية: هل المدرسة مسندة لهذا المستخدم؟
- 4Transaction: INSERT Distribution … ON CONFLICT (op_id) DO NOTHING
- 5قواعد العمل: إن تجاوزت الكمية رصيد المدرسة ← Exception للمراجعة
- 6الرد: قائمة op_id المقبولة/المكررة/المحالة ← الجهاز يحدّث الحالة
الجدول الزمني — 8 أسابيع تطوير
- الأسبوع 1متطلبات معتمدة وتجربة حفظ ومزامنة على الهواتف
- الأسبوعان 2–3الإدارة والصلاحيات والمدارس والمخازن
- الأسبوعان 4–5الشحن والتطبيق الميداني والمزامنة
- الأسبوع 6التقارير واختبارات دورة العمل والأمان
- الأسبوع 7تجربة في مستودع ومدرستين ومعالجة الملاحظات
- الأسبوع 8التدريب والقبول والإطلاق
- الأشهر 1–10متابعة التشغيل والدعم والتقارير والإغلاق
الفريق
- قائد تقني ومطوّر خلفيالتحليل وقاعدة البيانات وواجهات API والنشر
- مطوّر واجهات وتطبيق ميدانيلوحة الإدارة وواجهة الهاتف والحفظ المحلي
- مسؤول جودة وتنسيق ميدانيسيناريوهات الاختبار والتجربة والتدريب
تكلفة النظام في المقترح: $7,500 تشمل 10 أشهر دعم واستضافة.