تصميم الداتابيز — جدول جدول
الداتابيز متقسمة 12 مجموعة على حسب البيزنس. كل مجموعة ليها شرح وجداولها بالأعمدة والأنواع والملاحظات، وزرار موافقة. افتح أي جدول عشان تشوف أعمدته، أو دوّر على اسم جدول أو عمود.
القواعد العامة لكل الجداول
الحاجات دي موجودة في كل جدول ومش بتتكرر في الشرح تحت.
الأعمدة الأساسية
كل جدول فيه: Id (Guid v7 مرتب زمنياً)، CreatedAt، CreatedBy، LastModifiedAt، LastModifiedBy. الجداول الإلحاقية (الحركات، السجلات) bigint متسلسل وماليهاش تعديل.
الحذف
حذف ناعم (IsDeleted، DeletedAt، DeletedBy) بفلتر عام + صفحة «المحذوفات» للاسترجاع. الجداول الإلحاقية والمالية ماتتحذفش أصلاً.
اللغتين — عربي وإنجليزي
اللوحة والموقع والتطبيق بلغتين. كل نص بيظهر للعميل من نوع LocalizedText = عمود JSON فيه {ar, en}، بما فيه الألوان والمقاسات والروابط وSEO. لغة واحدة على الأقل إجبارية والناقصة بترجع للتانية (المنتجات الحالية إنجليزي بس — تعارض C16). العميل ليه PreferredLanguage لرسايله.
الفلوس والكميات
الأسعار decimal(12,2)، والتكلفة decimal(12,4) (كسور قسمة الشحنة)، والكميات int بالقطعة دايماً — الدستة مجرد «حجم عبوة» للعرض والاستلام.
التزامن
RowVersion على الأرصدة والطلبات والتحويلات عشان تعديلين في نفس اللحظة مايبوظوش بعض.
اللقطة (Snapshot)
الطلب بيحفظ نسخة من السعر والعنوان والتكلفة وقت الطلب — لو السعر اتغير بعدين، الطلب القديم مايتأثرش.
خريطة المجموعات
كل لون = مجموعة. المجموعات اللي في النص (الكتالوج، المخزون، الطلبات) هي القلب، والباقي بيتعلق بيهم.
أهم العلاقات
الخيوط اللي بتربط النظام ببعضه.
| من | العلاقة | إلى | المعنى |
|---|---|---|---|
Products | 1 ← N | ProductVariants | المنتج بكوده، والمتغير (لون/مقاس) بالـ SKU والباركود — المخزون والسعر على المتغير |
ProductVariants | 1 ← N | StockBalances | رصيد لكل (متغير × مخزن × مكان) |
StockBalances | محسوب من | StockMovements | كل تغيير في الرصيد ليه حركة بمستند |
StockMovements | N ← 1 | أي مستند | DocType + DocId: إذن استلام، تحويل، دفعة فحص، تالف، طلب، مرتجع، جرد |
CodeRanges | N ← 1 | CodePrefixes | النطاق المحجوز جوه بادئة؛ إنشاء منتج بكود جوه نطاق مقفول مرفوض |
PurchaseOrderLines | N ← 1 | ProductVariants | المنتج المتكوّد بدري من الصين بيدخل الإذن بكميته المتوقعة |
GoodsReceipts | N ← 1 | Shipments / PurchaseOrders | الاستلام بيسوّي الإذن ويحسب التكلفة الحقيقية |
QcBatches | N ← 1 | Transfers | دفعة الفحص بتبدأ من تحويل وصل لمخزن «انتظار الفحص» للبراند |
Orders | 1 ← N | OrderLines ← OrderLineUnitPhotos | صور لكل قطعة جوه السطر |
OrderLines | 1 ← 1 | StockReservations | الحجز من وقت الطلب، والاستهلاك عند التقفيل |
Orders | N ← N | HandoverBatches | الطلب بيتسكان في دفعة تسليم، والدفعة ليها مطابقة |
Customers | 1 ← 0..1 | MerchantProfiles | حساب التاجر = عميل نوعه «تاجر» + ملف فيه Prime ورقم العلامة المائية |
Customers | N ← 0..1 | VipLevels | المستوى بيتحسب من عدد الطلبات المستلمة |
Orders | 1 ← N | OrderAdjustments | تفصيل الخصومات: عرض، كوبون، نقاط، يدوي |
القوائم الثابتة (Enums)
دي منطق النظام نفسه — مش من اللوحة. النصوص اللي بتظهر للمستخدم بس هي اللي بتتعدّل.
| القائمة | القيم |
|---|
الجداول
الأعمدة بالبرتقالي = مفاتيح أو أعمدة فريدة. افتح أي جدول للتفاصيل.
الفهارس والأداء
الاستعلامات اللي بتتكرر طول اليوم لازم تبقى سريعة.
| الاستعلام | الفهرس |
|---|---|
| قوائم التجهيز (قسم + حالة + لمبة + عاجل + تاريخ) | Orders(Status, Section, IsUrgent DESC, AttentionLevel DESC, CreatedAt) |
| السكان بالباركود | ProductVariants(Barcode) فريد · Orders(Number) فريد |
| المتاح للموقع | StockBalances(VariantId, WarehouseId) + عمود محسوب Available |
| كتالوج الموقع | Products(Status, RetailVisible, CategoryId) · Products(WholesaleVisible, PrimeOnly) |
| تنبيهات الـ 24 ساعة | Orders(Status, ConfirmedAt) · Orders(Status, PreparingAt) |
| سجل حركات صنف | StockMovements(VariantId, At DESC) |
| طابور الرسائل | OutboundMessages(Status, ScheduledAt) |
| منع تكرار ردود الواتساب | InboundMessages(ProviderMessageId) فريد |
المبيعات والربح والتالف لكل براند وموظف بتتعمل بـ Dapper واستعلامات مكتوبة، ومع كاش 5 دقايق للفترات الطويلة — من غير ما تتقل على شاشات التشغيل.
الموافقة على الداتابيز
فيه زرار موافقة تحت كل مجموعة، والزرار ده للتصميم كله.