البنية التقنية

ماذا سنستخدم ولماذا — نظام واحد بلغة واحدة (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. 1
    الجهاز: يولّد op_id (UUID) ويحفظ العملية في IndexedDB
  2. 2
    Service Worker: عند عودة الاتصال يرسل الطابور إلى POST /api/sync
  3. 3
    الخادم: يتحقق من الجلسة والصلاحية: هل المدرسة مسندة لهذا المستخدم؟
  4. 4
    Transaction: INSERT Distribution … ON CONFLICT (op_id) DO NOTHING
  5. 5
    قواعد العمل: إن تجاوزت الكمية رصيد المدرسة ← Exception للمراجعة
  6. 6
    الرد: قائمة op_id المقبولة/المكررة/المحالة ← الجهاز يحدّث الحالة

الجدول الزمني — 8 أسابيع تطوير

  1. الأسبوع 1
    متطلبات معتمدة وتجربة حفظ ومزامنة على الهواتف
  2. الأسبوعان 2–3
    الإدارة والصلاحيات والمدارس والمخازن
  3. الأسبوعان 4–5
    الشحن والتطبيق الميداني والمزامنة
  4. الأسبوع 6
    التقارير واختبارات دورة العمل والأمان
  5. الأسبوع 7
    تجربة في مستودع ومدرستين ومعالجة الملاحظات
  6. الأسبوع 8
    التدريب والقبول والإطلاق
  7. الأشهر 1–10
    متابعة التشغيل والدعم والتقارير والإغلاق

الفريق

  • قائد تقني ومطوّر خلفي
    التحليل وقاعدة البيانات وواجهات API والنشر
  • مطوّر واجهات وتطبيق ميداني
    لوحة الإدارة وواجهة الهاتف والحفظ المحلي
  • مسؤول جودة وتنسيق ميداني
    سيناريوهات الاختبار والتجربة والتدريب
تكلفة النظام في المقترح: $7,500 تشمل 10 أشهر دعم واستضافة.