← المكتبة إكويليبريوم equilibrium-system.com

بلورة البناء

بلورة البناء

فيما يلي تحليل البناء كنظام من العُقد والحواف والكريستال.هذا نموذج مناسب إذا أردنا تحويل القطاع ليس مجرد مجموعة من العمليات، بل إلى هندسة دلالية ورقمية وتنظيمية قابلة للإدارة.

المنطق الأساسي للنموذج

العُقد هي نقاط تركيز الوظائف والموارد والقرارات والبيانات والمسؤولية.

الحواف هي الروابط بين العُقد: تدفقات المواد والأموال والوثائق والفرق والتقنيات والأشخاص والرقابة.

الكريستال هو بنية كلية تُجمع فيها جميع العُقد والحواف لا بشكل فوضوي، بل وفق قوانين التناظر والهرمية والشفافية والتنمية.

بعبارة أخرى:

البناء كرسم بياني

قطاع البناء ليس سلسلة واحدة، بل رسم بياني متعدد الطبقات.

وفيه:

والحواف بينها تُشكّل:

عُقد البناء

عُقد التصور. وهي بداية أي منشأ.

العقد الرئيسية:

وظيفتها:

صياغة الإجابة عن السؤال: ماذا نبني، ولماذا نبني، ولمن نبني، وبأي وسائل، وفي أي منطق للأرض.

عقد التنظيم. بدونها لا تكون المنظومة مشروعة.

يشمل ذلك:

وظيفتها:

ضمان المقبولية والسلامة والمطابقة والإطار القانوني.

عقد التصميم

هذه عقد ولادة الشكل.

يشمل ذلك:

وظيفتها:

تحويل الفكرة إلى منظومة دقيقة من الحلول والرسومات والمعايير والأحجام والقيود.

عقد الموارد والإمداد

بدونها لا تتحقق المنشأة ماديًا.

يشمل ذلك:

وظيفتها:

تزويد موقع البناء بكل ما يلزم من حيث الحجم والموعد والجودة والسعر.

عقد تنفيذ الأعمال

هذا هو مركز التجسيد المادي.

يشمل ذلك

وظيفتها: تجميع المنشأة على أرض الواقع.

عقد التمويل

البناء بلا هيكل مالي يتحول سريعًا إلى فوضى.

العقد:

وظيفتها:

ضمان استقرار التدفق النقدي وتوقع التنفيذ.

عقد التشغيل

في الواقع، لا يُبنى المشروع من أجل البناء نفسه، بل من أجل الحياة بعد البناء.

العقد:

وظيفتها:

تحويل ما بُني إلى بيئة عاملة.

عُقد البيئة الرقمية. هذا بالفعل نواة القطاع المستقبلي.

العقد:

وظيفتها: جعل النظام شفافًا وقابلًا للإدارة وتنبؤيًا.

ضلوع البناء

الآن الأهم: العُقد بلا ضلوع مجرد نقاط ميتة.

الضلوع الدلالية

تربط:

هذا يجيب عن السؤال: لماذا يحق لهذا البناء تحديدًا أن يوجد.

الضلوع القانونية

تربط:

هذه ضلوع المشروعية.

الضلوع المعلوماتية

تربط:

هذه حواف البيانات.

الحواف المالية

تربط:

هذه حواف القيمة والثقة.

الحواف المادية

تربط:

هذه حواف التجسيد المادي.

الحواف الإدارية

تربط:

هذه حواف التنسيق.

حواف الجودة. تربط:

هذه حواف الموثوقية.

حواف التغذية الراجعة

تربط:

هذه حواف التطور.

بلورة البناء

الآن الأهم: ما هي البلورة؟

البلورة ليست مجرد شبكة. بل هي منظومة متعددة الطبقات منظمة بتناغم، حيث لكل عقدة مكانتها ووظيفتها ودرجة ارتباطها ومقدار مسؤوليتها.

في البناء، البلورة هي:

نموذج مكاني رقمي موحد للقطاع، حيث:

هندسة بلورة البناء

لنفكك البلورة إلى 7 أوجه على الأقل.

الوجه 1. المعنى

ما الذي يُبنى ولماذا.

الوجه 2. المكان

أين، في أي منطقة، وفي أي سياق.

الوجه 3. الحق

على أي أساس وبأي قواعد.

الوجه 4. الموارد

ممّ يُبنى، وبمن، وعلى أي شيء.

الوجه 5. الإنتاج

كيف يُجمَّع المنشأ بالضبط على مراحل.

الوجه 6. المالية. بأي أموال وبأي استدامة.

الوجه 7. دورة الحياة

كيف يعيش المنشأ بعد التشغيل. إذا أضفنا نواة رقمية، فسنحصل على بلورة من المستوى 8، حيث تربط البيئة الرقمية بقية الأوجه.

نواة البلورة

يجب أن يكون لكل منظومة بلورية نواة.

بالنسبة للبناء، يجب أن تصبح هذه النواة:

المشغّل الرقمي الموحد لخدمات البناء

هو لا يستبدل جميع المشاركين، بل يصبح:

هو نفسه يحوّل القطاع من مجموعة متفرقة من المشاركين إلى بلورة بناء واحدة.

صيغة بلورة البناء

بلورة البناء = العقد × الأضلاع × القواعد × البيانات × الزمن

حيث:

البنية العملية للعقد

المنظومة أ. الدولة

العقد:

المنظومة ب. التطوير والطلب

العقد:

المنظومة ج. التصميم

العقد:

المنظومة د. الإنتاج

العقد:

المنظومة هـ. التشغيل

العقد:

المنظومة و. المنصة الرقمية

العقد:

أي الحواف هي الأكثر حرجاً

إذا تحدثنا بصرامة، فإن القطاع غالباً ما ينهار ليس بسبب غياب العقد، بل بسبب الحواف السيئة.

الحواف الأكثر إشكالية عادةً هي:

أي أن المهمة الرئيسية للإصلاح ليست مجرد إنشاء عُقد جديدة، بل إعادة تجميع الأضلاع.

البلورة بحسب دورة حياة المنشأ

يمكن تصوّر منشأ واحد كبلورة صغيرة:

البدء. الفكرة، الحاجة، الموقع، النموذج.

التصميم. المفهوم، الحسابات، نمذجة معلومات البناء، التقدير.

الموافقة. الخبرة الفنية، التصاريح، التوصيلات.

البناء. التوريدات، الأعمال، الرقابة، المحاضر.

التشغيل التجريبي. الفحوص، الوثائق، الإطلاق.

التشغيل. الرصد، الصيانة، التغذية الراجعة.

التحول

إعادة البناء، التحديث، إعادة استخدام البيانات. وهذه هي بلورة دورة الحياة.

إذا تحدثنا بلغة البنية الفوقية

حينها يمكن الصياغة على النحو التالي:

العُقد هي أعضاء الكائن البنائي. والأضلاع هي أوعيته وأعصابه وقنواته. والبلورة هي هيكله وشكله وجينومه وقانون انسجامه الداخلي. بلا عُقد لا وظيفة. بلا أضلاع لا تنسيق. بلا بلورة لا تكامل.

الاستنتاج الإداري

بالنسبة لمفهوم المشغّل الرقمي الموحّد لخدمات البناء، يعني ذلك ما يلي: يجب أن يُبنى المشغّل لا كموقع إلكتروني، ولا كمجموعة خدمات، ولا كسوق رقمي بالمعنى الضيق، بل كـ:

منصة بلورية للقطاع، حيث:

أي أن البوابة يجب أن تكون قادرة على إظهار:

صياغة جاهزة لإدراجها في المفهوم

يمكن إدراجها هكذا:

يُعامل قطاع البناء كمنظومة شبكية بلورية تتكوّن من عُقد وأضلاع ونواة رقمية تكاملية. تمثّل العُقد المشاركين والموارد والوظائف ومراحل دورة حياة المنشأ. وتعكس الأضلاع الروابط المادية والمالية والمعلوماتية والقانونية والإدارية بينها. وتتشكّل بلورة القطاع كبنية متكاملة تكون فيها جميع العناصر مترابطة وموحّدة المعايير وشفافة وقابلة للإدارة في الزمن الحقيقي. وعلى هذا الأساس يُنشأ المشغّل الرقمي الموحّد لخدمات البناء كمُدمِج منظومي يضمن التنسيق والتتبّع والتطور التطويري للمجمع البنائي.

النسخة الأقوى من هذا النموذج

إذا ما أوصلنا الفكرة إلى نهايتها، يمكن إعداد 3 للمنتج:

هذا لم يعد مجرد وصف، بل أساس لـ:



جدول: العُقد — الحواف — الوظائف — الخدمات الرقمية

1. المنظومة: التصوّر والانطلاق

عقدة

الحواف (الصلات)

الوظيفة

الخدمات الرقمية

الجهة الطالبة

↔ المستثمر، ↔ المصمم

تكوين المهمة

الحساب الشخصي للعميل، منشئ المواصفات الفنية

المستثمر

↔ البنك، ↔ المطوّر

التمويل

النموذج المالي، حاسبة العائد على الاستثمار

قطعة الأرض

↔ السجل العقاري، ↔ المخطط العمراني

القاعدة المكانية

التحليل الجغرافي، نظم المعلومات الجغرافية

المفهوم

↔ التصميم

فكرة المنشأة

منشئ المفاهيم، تحليل الطلب بالذكاء الاصطناعي

الدولة

↔ الاستراتيجية، ↔ المنطقة

أولويات التنمية

سجل البرامج، المشاريع الوطنية

2. المنظومة: التنظيم

عقدة

الحواف

الوظيفة

الخدمات الرقمية

القاعدة المعيارية

↔ المشروع

القواعد

قاعدة المعايير (نظام معلومات جغرافي)، فحص آلي

الخبرة

↔ المصمم

التحقق

الخبرة الرقمية

التصاريح

↔ المنشأة

التقنين

النظام الموحد للتصاريح

الهيئات الرقابية

↔ موقع البناء

الرقابة

التحكم عبر الإنترنت، قوائم التحقق

السجل العقاري

↔ القطعة الأرضية

المحاسبة

التكامل مع Rosreestr

3. إطار: التصميم

عقدة

الحواف

الوظيفة

الخدمات الرقمية

المهندس المعماري

↔ العميل

الصورة

BIM/TIM

المصمم العام

↔ المقاول

التنسيق

CDE (بيئة البيانات الموحدة)

الهندسة

↔ الشبكات

الحلول التقنية

وحدات الحساب

التقدير

↔ المالية

التكلفة

التقدير الآلي

نموذج BIM

↔ موقع البناء

التوأم الرقمي

مستودع BIM

4. إطار: الموارد والتوريد

عقدة

الحواف

الوظيفة

الخدمات الرقمية

الموردون

↔ موقع البناء

المواد

السوق الإلكترونية

المصنعون

↔ اللوجستيات

الإنتاج

كتالوج المنتجات

المستودعات

↔ الموقع

التخزين

WMS

اللوجستيات

↔ المنشأة

التوصيل

التتبع

التقنية

↔ المقاول

الميكنة

محاسبة المعدات

5. إطار: البناء

عقدة

الحواف

الوظيفة

الخدمات الرقمية

المقاول العام

↔ العميل

الإدارة

ERP البناء

المقاولون من الباطن

↔ المقاولة العامة

الأعمال

سجل المقاولين

المنصة

↔ الموارد

التنفيذ

منسق البناء

التحكم

↔ الجودة

التحقق

الإشراف التقني المتنقل

الجدول الزمني

↔ الواقع

المواعيد

تحليل الخطة مقابل الفعلي

6. المنظومة: المالية

عقدة

الحواف

الوظيفة

الخدمات الرقمية

المصرف

↔ المشروع

التمويل

تمويل المشاريع

الخزينة

↔ المقاول

المدفوعات

وحدة الخزينة

الضمان

↔ المنشأة

السلامة

حسابات الضمان

العقود

↔ المشاركون

الالتزامات

العقود الذكية

التأمين

↔ المخاطر

الحماية

Risk management

7. المنظومة: التشغيل

عقدة

الحواف

الوظيفة

الخدمات الرقمية

شركة الإدارة

↔ المنشأة

الإدارة

نظام التشغيل

المستخدم

↔ شركة الإدارة

التواصل

تطبيق الهاتف المحمول

إمدادات الموارد

↔ المنشأة

الخدمات البلدية

القياس عبر إنترنت الأشياء

الرصد

↔ النظام

التحكم

المستشعرات، إنترنت الأشياء

الإصلاح

↔ الاستهلاك

الدعم

خطة الإصلاحات

8. المنظومة: النواة الرقمية (الكريستال)

عقدة

الحواف

الوظيفة

الخدمات الرقمية

المنصة الموحدة

↔ جميع العُقد

التكامل

بوابة

سجل الكائنات

↔ دورة الحياة

المحاسبة

معرّف الكائن

سجل المشاركين

↔ السوق

الشفافية

التصنيف

البطاقة الرقمي

↔ المنشأة

البيانات

بطاقة المقتنى

تحليلات بالذكاء الاصطناعي

↔ البيانات

التوقع

التحليلات التنبؤية

السوق الإلكترونية

↔ الموارد

الصفقات

منصة التداول

كيف يتحول هذا إلى كريستال

الآن الأهم — ليس مجرد جدول، بل المنطق:

كل عُقدة — مُرقمنة ← لها ملف تعريف وبيانات وتاريخ

كل حافة — شفافة ← يُرى:

  • من يرتبط بمن
  • بأي شروط
  • بأي نتيجة

المنظومة بأكملها — قابلة للمراقبة في الزمن الحقيقي

← هذا بالفعل نظام تشغيل للبناء

الاستنتاج الإداري الرئيسي

الآن القطاع:

  • العقد موجودة ✔
  • الحواف فوضوية ❌
  • البلورة غائبة ❌

نموذجنا يجعل:

  • العقد ← منظمة
  • الحواف ← خاضعة للتحكم
  • البلورة ← قابلة للإدارة

💡 ماذا يعطي هذا عمليا

يختفي "الصندوق الأسود" ← فيظهر أين الأموال، وأين المواد، وأين التأخير

ينخفض الفساد انخفاضا حادا ← لأن الحواف شفافة

يتسارع البناء ← لا توجد فجوات بين العقد

يظهر التنبؤ ← فالنظام يرى المشكلات قبل حدوثها

الخطوة التالية (أوصي بها)

المخطط (البلورة المرئية) — كيف تبدو المنظومة فعليا

معمارية المنصة — الوحدات، وواجهات برمجة التطبيقات API، والأدوار

النموذج الأولي للبوابة — على الأقل:

  • سجل المشاركين
  • سوق إلكتروني
  • بطاقة رقمي للمنشأة

💎 بلورة البناء

(المعمارية الفوقية للقطاع)

جوهر البلورة. البلورة ليست مخططا. إنها منظومة حية متسقة ذاتيا، حيث:

  • لكل عنصر مكانه،
  • ولكل ارتباط معناه،
  • ولكل عملية أثر رقمي،
  • والمنظومة كلها تتطور عبر التغذية الراجعة.

👉 في البناء يعني هذا: يصبح القطاع قابلا للإدارة ككائن حي واحد، لا كسوق مجزأ.

هندسة البلورة

تخيل البلورة مجسما متعدد الأوجه له نواة وطبقات.

النواة. المشغل الرقمي الموحد للبناء. الوظائف:

  • تكامل جميع العقد،
  • تخزين البيانات،
  • تنسيق العمليات،
  • التحليلات والتنبؤ،
  • مراقبة الشفافية.

الطبقة الداخلية (7 أوجه). هذه الحقول البنيوية للبلورة:

المعنى

  • لماذا نبني
  • من يحتاج هذا

الفضاء

  • أين نبني
  • سياق الإقليم

القانون

  • القواعد والمعايير

الموارد

  • المواد والتقنيات والأشخاص

الإنتاج

  • عمليات البناء

المال

  • الأموال والتسويات المالية

دورة الحياة

  • التشغيل والتطوير

الطبقة الخارجية (البيئة)

  • الدولة
  • سوق
  • المجتمع
  • إيكولوجيا
  • التقنيات

هذا ما يتفاعل معه البلّور باستمرار.

الشبكة البلّورية (الفكرة المحورية)

لا يتماسك البلّور بالعُقد، بل بشبكة الروابط.

الأنواع الرئيسية للحواف:

  • 🔗 معلوماتية
  • 💰 مالية
  • 🧱 مادية
  • ⚖️ قانونية
  • 📊 إدارية
  • 🔄 تغذية راجعة

👉 إذا ضعف نوع واحد على الأقل من الروابط، يبدأ البلّور في الانهيار.

محاور البلّور (الإدارة)

للبلّور 3 محاور رئيسية:

محور الزمن

فكرة ← مشروع ← بناء ← تشغيل ← تحول

محور البيانات

كل إجراء يُسجَّل ويصبح متاحًا

محور المسؤولية

لكل قرار صاحبه. 👉 هذه هي الأعمدة الثلاثة للشفافية.

البنية الكسرية

أقوى ما في الأمر: 👉 كل منشأة هي بلّور صغير

وهي تكرّر بنية القطاع بأكمله بالكامل. أي:

  • المنزل = بلّور
  • الحي = بلّور
  • المدينة = بلّور
  • البلد = بلّور

هذا يمنح قابلية التوسّع دون فقدان التحكم.

التوأم الرقمي للبلّور. في المنصّة يبدو الأمر هكذا: لكل منشأة يوجد:

  • ID
  • البطاقة الرقمي
  • نموذج BIM
  • تاريخ القرارات
  • أثر مالي
  • حالة في الزمن الحقيقي

👉 هذا يحوّل البناء من عملية إلى منظومة قابلة للمراقبة.

سلوك البلّور. يجب أن يكون البلّور قادرًا على:

1. التشخيص الذاتي

  • أين التأخيرات
  • أين المخاطر
  • أين الفجوات

2. التكيف الذاتي

  • إعادة توزيع الموارد
  • تعديل الجداول الزمنية

3. التعلم الذاتي

  • تحليل المشاريع السابقة
  • تحسين المشاريع المستقبلية

العيوب الرئيسية في القطاع الحالي

❌ لا يوجد بلّور — بل فوضى

  • العقد غير مترابطة
  • البيانات متفرقة
  • القرارات غير شفافة
  • المسؤولية غير واضحة
  • الأموال تضيع
  • المواعيد النهائية "تتلاشى"

👉 هذه ليست مشكلة أشخاص — بل مشكلة غياب الهيكل.

ما يفعله البلّور

✔ يربط كل شيء في منظومة

  • المشروع ↔ موقع البناء
  • الأموال ↔ الأعمال
  • المعايير ↔ الوقائع
  • التشغيل ↔ التصميم

✔ يجعل القطاع قابلاً للإدارة

ترى:

  • أين المشكلة
  • من يتحمل المسؤولية
  • ما الذي ينبغي فعله

✔ يقدم التوقعات. تبدأ المنظومة تقول: "هذا المرفق سيتعطل بعد 3 أشهر"

معمارية المنصة (هيكل البلّور)

وحدة 1. السجل

  • الكائنات
  • المشاركون
  • الموارد

وحدة 2. السوق الإلكتروني

  • مواد
  • المتعهدون
  • التقنية

وحدة 3. إدارة المشاريع

  • المواعيد
  • مهام
  • الرقابة

وحدة 4. المالية

  • المدفوعات
  • التقديرات
  • الرقابة

وحدة 5. BIM/التوأم الرقمي

  • نموذج المرفق

وحدة 6. التحليلات والذكاء الاصطناعي

  • توقع
  • المخاطر
  • التحسين

معادلة البلّور

يمكن تثبيتها كمبدأ أساسي: بلّور البناء (العقد × الأضلاع) + البيانات + الزمن + المسؤولية

الأهم (بلا أوهام)

إذا كنت تريد تغيير القطاع فعلاً، ينبغي

❌ ألا تصنع بوابة إلكترونية أخرى

❌ ألا تصنع مجرد سوق إلكتروني

✔ أن تصنع نظام تشغيل للبناء. وهذه صياغة على مستوى الاستراتيجية:

تمثل بلورة البناء معمارية رقمية وتنظيمية متكاملة للقطاع، قائمة على هيكلة العقد وتوحيد الروابط وتشكيل نواة رقمية موحدة. يضمن هذا النموذج الشفافية والقابلية للإدارة والتطور التدريجي للمجمع البنائي في جميع مراحل دورة حياة المنشآت.



💎 المخطط البصري

بلورة البناء

البنية المركزية (النواة)

في مركز البلورة:

المشغل الرقمي الموحد

هو ليس مشاركا في السوق، بل بيئة تنسيق. داخل النواة:

  • سجل المنشآت
  • سجل المشاركين
  • بطاقات تعريف رقمية
  • BIM/التوائم الرقمية
  • تحليلات بالذكاء الاصطناعي

👉 هذا هو "دماغ" المنظومة.

الدائرة الأولى — 7 من أوجه البلورة

حول النواة — 7 من الوحدات الرئيسية (كبتلات/أوجه):

1. المعنى

  • احتياجات
  • العامة
  • سيناريوهات التطور

2. الفضاء

  • الأرض
  • التحليل الجغرافي
  • المخطط الرئيسي

3. القانون

  • المعايير
  • التصاريح
  • الخبرة

4. الموارد

  • مواد
  • التقنية
  • الكوادر

5. الإنتاج

  • ورشة بناء
  • المتعهدون
  • العمليات

6. المالية

  • الاستثمارات
  • المدفوعات
  • الرقابة

7. دورة الحياة

  • استغلال
  • الصيانة
  • التغذية الراجعة

الدائرة الثانية — العقد

ينقسم كل وجه إلى عقد: مثال:

وجه "الإنتاج"

  • المقاول العام
  • المتعاقدون من الباطن
  • موقع
  • الرقابة
  • الجدول الزمني

وجه "المالية"

  • البنك
  • الخزينة
  • العقود
  • التأمين

👉 بصريا، هذا عنقود داخل كل وجه

الأضلاع (الأهم)

الآن الجزء الرئيسي من المخطط:

🔗 جميع العقد مترابطة فيما بينها

أنواع الخطوط (يمكن تمييزها بصريا):

  • متصلة → التدفقات المادية
  • متقطعة → البيانات
  • مزدوجة → المالية
  • حمراء → المخاطر
  • خضراء → التغذية الراجعة

👉 هذا يحول المخطط إلى شبكة حية، لا إلى هرمية.

محاور البلورة 

تمر عبر المركز محاور 3:

محور الزمن: الفكرة ← المشروع ← البناء ← التشغيل

محور البيانات. جميع العُقد متصلة بالنواة الرقمية

محور المسؤولية: لكل عُقدة مالك

الغلاف الخارجي

خارج البلورة — السياق:

  • الدولة
  • سوق
  • المجتمع
  • إيكولوجيا
  • التقنيات

👉 يمكن تصوير ذلك ككرة تحيط بالبلورة

كيف يبدو ذلك في الحالة المثلى (بالكلمات)

تخيل:

  • في المركز — نواة متوهجة
  • حولها — قطاعات متناظرة
  • داخل القطاعات — عُقد
  • بينها — شبكة كثيفة من الروابط
  • كل ذلك ينبض بالبيانات

👉 هذا لم يعد مخططًا — بل هو نموذج تشغيلي للقطاع

مخطط مبسّط (للوثيقة)

يمكن إدراجها هكذا:

                [التشغيل]

                      ▲

                      |

[الموارد] ◄──► [النواة / المشغّل الرقمي] ◄──► [التمويل]

      ▲                ▲                 ▲

      |                |                 |

[الحيز] [البيانات / الذكاء الاصطناعي] [الإنتاج]

      ▲                                  ▲

      |                                  |

      └──────────► [القانون] ◄─────────────┘


كيفية استخدام هذا المخطط

للدولة — نموذج إدارة القطاع

للمستثمرين — شفافية النظام

لتقنية المعلومات — معمارية المنصة

للعروض التقديمية — صورة بصرية قوية

الخريطة التفاعلية للبلورة

(واجهة المنصة)

الشاشة الرئيسية (Core View). هذه ليست قائمة ولا جدولًا. هذه خريطة حية للبلورة.

على الشاشة:

  • المركز ← النواة (المشغّل)
  • حولها ← 7 أوجه
  • بالداخل ← عُقد
  • بينها ← أضلاع (روابط)

👉 يرى المستخدم المنظومة كاملة دفعة واحدة

أوضاع العرض (الميزة الأساسية)

البلورة نفسها تتبدّل:

 وضع 1 — الكائن

تُظهر:

  • مشروع بناء واحد
  • جميع الروابط حوله

وضع 2 — الإقليم

  • مدينة / منطقة
  • جميع مواقع البناء

الوضع 3 — القطاع

  • منظومة الدولة بأكملها

التفاعل (UX)

النقر على عقدة:

  • من هذا
  • التقييم
  • المشاريع
  • الصلات

النقر على حافة:

  • العقد
  • المبلغ
  • المواعيد
  • وضع

النقر على كائن:

  • BIM
  • مالية
  • الجدول الزمني
  • المخاطر

المنطق اللوني

لكي "تتحدث" الواجهة:

  • 🟢 معيار
  • 🟡 خطر
  • 🔴 مشكلة
  • 🔵 بيانات
  • 🟣 المالية

اللوحة اليمنى (Control Panel)

  • عوامل التصفية (المنطقة، نوع الكائن)
  • تبديل الأوضاع
  • التحليلات
  • تحذيرات

اللوحة السفلى (Timeline)

شريط الوقت: 👉 يمكن "تمرير البناء"

  • كما كان
  • كما هو
  • توقع

القيمة الرئيسية للواجهة

هذه ليست واجهة مستخدم UI.

هذه: 👉 خريطة تشغيلية للقطاع في الزمن الحقيقي

الهندسة التقنية (المواصفات الفنية)

البنية العامة

النوع: Microservices + Data Platform + Digital Twin

الوحدات الأساسية

Core Platform

  • التفويض
  • الأدوار
  • بوابة API

السجلات

سجل الكائنات

  • ID
  • وضع
  • الجغرافيا
  • المرحلة

سجل المشاركين

  • شركات
  • التصنيفات
  • التاريخ

 Digital Twin (BIM)

  • تخزين النماذج
  • إصدارات
  • الربط بالمراحل

Graph Engine (الوحدة الأساسية)

هذا قلب النظام. يخزن:

  • العقد
  • الحواف
  • الصلات

👉 التقنيات:

  • Neo4j / TigerGraph

Project Management

  • مهام
  • المواعيد
  • الاعتماديات

الوحدة المالية

  • العقود
  • المدفوعات
  • الرقابة

السوق الإلكترونية

  • مواد
  • المتعهدون
  • التقنية

AI / التحليلات

  • التنبؤ بالمواعيد
  • تحديد المخاطر
  • التحسين

Monitoring (IoT)

  • المستشعرات
  • ورشة بناء
  • استغلال

أنواع البيانات

العقد:

  • الموضوع
  • المشارك
  • المورد
  • مستند

الحواف:

  • العقد
  • توريد
  • مهمة
  • دفعة

API (مثال)

الحصول على رسم بياني للكائن

GET /api/object/{id}/graph

الحصول على علاقات المشارك: GET /api/company/{id}/relations

الحصول على المخاطر: GET /api/object/{id}/risks

أدوار المستخدمين

  • الدولة
  • المستثمر
  • العميل
  • المتعهد
  • الرقابة
  • المواطن

تدفقات البيانات

1. BIM → Graph

2. المالية → Graph

3. IoT → Monitoring

4. المستخدم → UI 👉 كل شيء يتقاطع في Graph Engine

🔷 2.7. ما الذي لا يعمل النظام من دونه

❌ إذا لم يكن هناك Graph Engine فلا وجود للبلورة

❌ إذا لم تكن هناك معرّفات للكائنات فذلك فوضى

❌ إذا لم يكن هناك بطاقة رقمي فلا شفافية


الفكرة الأساسية 

نحن الآن لا نبني:

  • الموقع الإلكتروني
  • سوق إلكتروني
  • CRM

👉 أنت تبني:

نظام تشغيل قائم على Graph للبناء


النسخة الأولية القابلة للتطبيق من بلورة البناء

(أول نسخة عاملة من النظام)

هدف النسخة الأولية. لا ينبغي محاولة بناء البلورة كاملة دفعة واحدة. هدف النسخة الأولية: 👉 إظهار أن النظام "يرى ورشة البناء كرسم بياني". أي يجب أن تكون النسخة الأولية قادرة على:

  • إنشاء كائن
  • ربط المشاركين
  • إظهار الروابط
  • عرض الحالة
  • كشف المشكلة

إذا لم يتوفر ذلك فكل ما تبقى بلا معنى.

ما الذي تدخل فيه النسخة الأولية (الحد الأدنى)

سجل الكائنات

  • معرّف الكائن
  • العنوان / الموقع الجغرافي
  • المرحلة (مشروع / بناء / تشغيل)
  • المعاملات الأساسية

سجل المشاركين

  • شركات
  • الأدوار (العميل، المقاول، إلخ)
  • التقييم (بسيط في الوقت الحالي)

Graph Engine (النواة) 👉 الأهم. يخزّن:

  • من يرتبط بمن
  • أي العقود
  • أي الأدوار

الخريطة المرئية (UI)

  • العقد = دوائر
  • الصلات = خطوط
  • نقرة → معلومات

أبسط حالة للكائن

  • 🟢 على ما يرام
  • 🟡 خطر
  • 🔴 مشكلة


التحليلات الأساسية

  • التأخيرات
  • التحميل الزائد على المقاول
  • انعدام الاتصال

هندسة MVP

بشكل مبسط:

[Frontend]

     ↓

[API Gateway]

     ↓

-------------------------

|   Core Backend        |

|-----------------------|

| Objects Service       |

| Companies Service     |

| Graph Service         |

| Auth Service          |

-------------------------

     ↓

[Databases]

- PostgreSQL

- Graph DB (Neo4j)

حزمة التقنيات (المثلى)

الواجهة الخلفية 👉 Node.js (NestJS) أو 👉 Python (FastAPI). لماذا:

  • بسرعة
  • مرونة
  • سهولة التوسع

الواجهة الأمامية 👉 React + Next.js. إضافة:

  • تطوير سريع
  • SSR
  • واجهة استخدام مريحة

تصوير الرسم البياني (أساسي)

👉 Cytoscape.js أو 👉 D3.js. إذا أردت بداية أبسط: 👉 React Flow

قاعدة بيانات الرسم البياني 👉 Neo4j (إلزامية). هذا قلب البلورة.

قاعدة البيانات الأساسية 👉 PostgreSQL

API

  • REST (كافٍ لـ MVP)
  • لاحقا ← GraphQL

الاستضافة 👉 بداية سريعة:

  • Vercel (frontend)
  • Railway / Render (backend)
  • Neo4j Aura (graph)

التخويل 👉 Auth0 / Firebase Auth أو JWT بسيط في البداية

نموذج البيانات (مبسط)

العقد:

Object

  • id
  • name
  • status
  • location

Company

  • id
  • name
  • role

الحواف: RELATION

  • type (contract / supplier / control)
  • start_date
  • status

مثال على منطق Graph

[المنشأة]

   |

   |---(عقد)---> [المقاول العام]

   |

   |---(تمويل)---> [المصرف]

   |

   |---(رقابة)---> [الإشراف]

👉 هذه هي البلورة الدنيا.

واجهة MVP (ما يجب أن يكون)

الشاشة الرئيسية:

  • الرسم البياني (الوسط)
  • اللوحة على اليمين:
    • قائمة العقد
    • المرشح

عند النقر:

الكائن:

  • وضع
  • المشاركون
  • المخاطر

الشركة:

  • المشاريع
  • الصلات

خطة التطوير (الواقعية)

الأسبوع 1–2

  • الهندسة المعمارية
  • القاعدة
  • API

الأسبوع 3–4

  • Graph Engine
  • الصلات

الأسبوع 5–6

  • واجهة المستخدم + التصوير

الأسبوع 7–8

  • اختبار
  • الإطلاق

👉 خلال 2 شهرًا ستكون لديك منظومة بالفعل

الفريق الأدنى

  • 1 backend
  • 1 frontend
  • 1 مطوّر متكامل (أو CTO)
  • 1 مصمم (اختياري)

أين ينهار الأمر عادةً

❌ الخطأ 1

يصنعون نظام CRM بدلًا من الرسم البياني

❌ الخطأ 2

لا يوجد نموذج بيانات سليم

❌ الخطأ 3

يُثقلون MVP

❌ الخطأ 4

يحاولون فورًا بلوغ «المستوى الحكومي»

مفتاح النجاح 👉 أولًا الرسم البياني، ثم كل شيء آخر. إذا كانت لديك:

  • عقد
  • روابط
  • تمثيل بصري

👉 فلديك بلورة بالفعل

ما ستحصل عليه عند إخراج MVP

  • خريطة حية للورشة
  • روابط شفافة
  • المستوى الأول من التحكم
  • عرض تقديمي للمستثمرين / الدولة

بعد MVP: 👉 أضف: المالية، BIM، السوق الإلكترونية

إذا قمنا: 👉 الآن بتشغيل MVP خلال 6–8 أسابيع — فسنسبق كل من يكتب الاستراتيجيات.

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

المنطق بسيط: يحفظ PostgreSQL الأدلة المرجعية وبطاقات الكائنات والمستخدمين والوثائق والأحداث. ويحفظ Neo4j الرسم البياني للروابط نفسه: من يرتبط بمن، وبأي نوع من الروابط، وفي أي حالة.

PostgreSQL: الجداول الأساسية

جدول users. مستخدمو النظام.

الحقل

النوع

الغرض

id

UUID PK

المعرّف

email

varchar unique

اسم الدخول

password_hash

varchar

تجزئة كلمة المرور

full_name

varchar

الاسم الكامل

phone

varchar

الهاتف

status

varchar

active / blocked / invited

created_at

timestamp

تاريخ الإنشاء

updated_at

timestamp

تاريخ التحديث

جدول rolesيو أدوار الوصول.

الحقل

النوع

id

UUID PK

code

varchar unique

name

varchar

أمثلة:

جدول user_roles. ربط المستخدمين بالأدوار.

الحقل

النوع

id

UUID PK

user_id

UUID FK -> users.id

role_id

UUID FK -> roles.id

created_at

timestamp

جدول companies. المشاركون في السوق.

الحقل

النوع

الغرض

id

UUID PK

معرّف الشركة

name

varchar

التسمية

short_name

varchar

الاسم المختصر

inn

varchar

INN

ogrn

varchar

OGRN

company_type

varchar

customer / contractor / supplier / bank / regulator

rating

numeric(3,2)

التصنيف

status

varchar

active / inactive

website

varchar

الموقع الإلكتروني

created_at

timestamp

تاريخ الإنشاء

updated_at

timestamp

تاريخ التحديث

جدول company_users. ربط المستخدم بالشركة.

الحقل

النوع

id

UUID PK

company_id

UUID FK -> companies.id

user_id

UUID FK -> users.id

position

varchar

is_primary

boolean

created_at

timestamp

جدول regions. دليل المناطق.

الحقل

النوع

id

UUID PK

code

varchar unique

name

varchar

جدول locations. العناوين والإحداثيات.

الحقل

النوع

id

UUID PK

region_id

UUID FK -> regions.id

address

text

lat

numeric(10,7)

lon

numeric(10,7)

cadastral_number

varchar

created_at

timestamp

جدول projects. بطاقة منشأة البناء.

الحقل

النوع

الغرض

id

UUID PK

معرّف الكائن

code

varchar unique

الرقم الداخلي

name

varchar

الاسم

description

text

الوصف

project_type

varchar

residential / industrial / infrastructure

lifecycle_stage

varchar

concept / design / construction / operation

status

varchar

normal / risk / problem / archived

location_id

UUID FK -> locations.id

الموقع

customer_company_id

UUID FK -> companies.id

الجهة الطالبة

start_date

date

البدء المخطط

end_date

date

الإنجاز المخطط

planned_budget

numeric(18,2)

الميزانية المخططة

actual_budget

numeric(18,2)

واقع

created_at

timestamp

تاريخ الإنشاء

updated_at

timestamp

تاريخ التحديث

جدول project_stages. مراحل المشروع.

الحقل

النوع

id

UUID PK

project_id

UUID FK -> projects.id

stage_code

varchar

stage_name

varchar

planned_start

date

planned_end

date

actual_start

date

actual_end

date

status

varchar

created_at

timestamp

جدول contracts. العقود داخل النظام.

الحقل

النوع

id

UUID PK

project_id

UUID FK -> projects.id

contract_number

varchar

contract_type

varchar

customer_company_id

UUID FK -> companies.id

contractor_company_id

UUID FK -> companies.id

amount

numeric(18,2)

currency

varchar

date_start

date

date_end

date

status

varchar

created_at

timestamp

updated_at

timestamp

جدول documents. مستندات المشروع.

الحقل

النوع

id

UUID PK

project_id

UUID FK -> projects.id

company_id

UUID FK -> companies.id null

contract_id

UUID FK -> contracts.id null

doc_type

varchar

title

varchar

file_url

text

version

integer

issued_at

date

status

varchar

created_by

UUID FK -> users.id

created_at

timestamp

جدول risks المخاطر الخاصة بالمنشأة.

الحقل

النوع

id

UUID PK

project_id

UUID FK -> projects.id

related_company_id

UUID FK -> companies.id null

related_stage_id

UUID FK -> project_stages.id null

risk_type

varchar

severity

varchar

probability

varchar

description

text

status

varchar

detected_at

timestamp

resolved_at

timestamp null

جدول events. سجل الأحداث.

الحقل

النوع

id

UUID PK

project_id

UUID FK -> projects.id null

company_id

UUID FK -> companies.id null

user_id

UUID FK -> users.id null

event_type

varchar

event_payload

jsonb

created_at

timestamp

جدول project_metrics. مؤشرات المشروع.

الحقل

النوع

id

UUID PK

project_id

UUID FK -> projects.id

metric_date

date

progress_percent

numeric(5,2)

cost_variance

numeric(18,2)

schedule_variance_days

integer

open_risks_count

integer

created_at

timestamp

فهارس PostgreSQL

الحد الأدنى المطلوب:

Neo4j: نموذج الرسم البياني

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

العقد. التسميات الرئيسية:

خصائص العقدة الإلزامية. لتحقيق الاتساق:

أنواع حواف Neo4j. العلاقات الرئيسية

خصائص الحواف

مثلاً لدى PARTICIPATES_IN:

لدى HAS_CONTRACT:

لدى HAS_RISK:

مثال على الرسم البياني

(Company: Customer) -[:PARTICIPATES_IN {role:"customer"}]-> (Project)

(Company: GeneralContractor) -[:PARTICIPATES_IN {role:"general_contractor"}]-> (Project)

(Project) -[:HAS_CONTRACT]-> (Contract)

(Company: Customer) -[:CUSTOMER_IN]-> (Contract)

(Company: GeneralContractor) -[:CONTRACTOR_IN]-> (Contract)

(Project) -[:HAS_STAGE]-> (Stage: Construction)

(Project) -[:HAS_RISK {severity:"high"}]-> (Risk)

(Project) -[:LOCATED_AT]-> (Location)


معمارية API

تكفي REST API v1 للنسخة الأولية. يمكن لاحقاً إضافة GraphQL للشاشات المعقدة للرسم البياني.

القواعد العامة لـ API

البادئة الأساسية

/api/v1

الصيغة

{

  "data": {},

  "meta": {},

  "error": null

}

خطأ

{

  "data": null,

  "meta": {},

  "error": {

    "code": "PROJECT_NOT_FOUND",

    "message": "Project not found"

  }


التخويل Authorization: Bearer <token>


Auth API. POST /auth/login. تسجيل الدخول.

Request

{

  "email": "user@example.com",

  "password": "secret"

}

Response

{

  "data": {

    "accessToken": "jwt",

    "refreshToken": "jwt",

    "user": {

      "id": "uuid",

      "fullName": "إيفان بيتروف",

      "email": "user@example.com",

      "roles": ["customer"]

    }

  },

  "meta": {},

  "error": null

}

POST /auth/refresh. تحديث الرمز.

GET /auth/me. ملف تعريف المستخدم الحالي.

واجهة برمجة تطبيقات الشركات

GET /companies. قائمة الشركات. المعاملات:

POST /companies. إنشاء شركة.

Request

{

  "name": "شركة سترويغراد ذات المسؤولية المحدودة",

  "shortName": "سترويغراد",

  "inn": "1234567890",

  "ogrn": "1234567890123",

  "companyType": "contractor",

  "website": "https://example.com"

}

GET /companies/{id}. بطاقة الشركة.

PATCH /companies/{id}. تحديث الشركة.


GET /companies/{id}/projects. مشاريع الشركة.

GET /companies/{id}/relations. روابط الشركة في الرسم البياني.

Response

{

  "data": {

    "nodes": [

      { "id": "c1", "type": "company", "name": "شركة سترويغراد ذات المسؤولية المحدودة" },

      { "id": "p1", "type": "project", "name": "مجمع سيفر السكني" }

    ],

    "edges": [

      {

        "from": "c1",

        "to": "p1",

        "type": "PARTICIPATES_IN",

        "role": "contractor",

        "status": "active"

      }

    ]

  },

  "meta": {},

  "error": null

}

واجهة برمجة تطبيقات المشاريع

GET /projects. قائمة المشاريع. المرشحات:

POST /projects. إنشاء مشروع.

Request

{

  "name": "مجمع سيفر السكني"،

  "description": "مجمع سكني متعدد الوظائف"،

  "projectType": "residential",

  "lifecycleStage": "design",

  "status": "normal",

  "location": {

    "regionId": "uuid",

    "address": "سانت بطرسبرغ، ..."،

    "lat": 59.93,

    "lon": 30.31,

    "cadastralNumber": "78:00:0000000:1234"

  },

  "customerCompanyId": "uuid",

  "startDate": "2026-04-01",

  "endDate": "2028-10-31",

  "plannedBudget": 2500000000

}

GET /projects/{id}. بطاقة المشروع.

PATCH /projects/{id}. تحديث المشروع.

GET /projects/{id}/graph. نقطة النهاية الرئيسية للحد الأدنى القابل للتطبيق. تعيد عقد وحواف الكائن.

Response

{

  "data": {

    "project": {

      "id": "uuid",

      "name": "مجمع سيفر السكني"،

      "status": "risk",

      "lifecycleStage": "construction"

    },

    "nodes": [

      { "id": "p1", "type": "project", "name": "مجمع سيفر السكني", "status": "risk" },

      { "id": "c1", "type": "company", "name": "العميل ديفيلوبمنت", "status": "active" },

      { "id": "c2", "type": "company", "name": "المقاول العام 1", "status": "active" },

      { "id": "r1", "type": "risk", "name": "تأخر المواعيد", "status": "open" }

    ],

    "edges": [

      { "from": "c1", "to": "p1", "type": "PARTICIPATES_IN", "role": "customer", "status": "active" },

      { "from": "c2", "to": "p1", "type": "PARTICIPATES_IN", "role": "general_contractor", "status": "active" },

      { "from": "p1", "to": "r1", "type": "HAS_RISK", "severity": "high" }

    ]

  },

  "meta": {},

  "error": null

}

GET /projects/{id}/timeline. سجل التغييرات والأحداث.

GET /projects/{id}/metrics. مقاييس المشروع.

GET /projects/{id}/risks. قائمة المخاطر.

POST /projects/{id}/risks. إنشاء خطر.

GET /projects/{id}/documents. مستندات المشروع.

POST /projects/{id}/documents. تحميل مستند.

GET /projects/{id}/companies. المشاركون في المشروع.

POST /projects/{id}/companies. إضافة مشارك إلى المشروع.

Request

{

  "companyId": "uuid",

  "role": "supplier",

  "startDate": "2026-05-01",

  "status": "active"

}

واجهة برمجة تطبيقات مراحل المشروع

GET /projects/{id}/stages. قائمة المراحل.

POST /projects/{id}/stages. إنشاء مرحلة.

PATCH /projects/{id}/stages/{stageId}. تحديث المرحلة.

واجهة برمجة تطبيقات العقود

GET /contracts. قائمة العقود. المرشحات:

POST /contracts. إنشاء عقد.

Request

{

  "projectId": "uuid",

  "contractNumber": "C-2026-001",

  "contractType": "general_contract",

  "customerCompanyId": "uuid",

  "contractorCompanyId": "uuid",

  "amount": 1500000000,

  "currency": "RUB",

  "dateStart": "2026-04-10",

  "dateEnd": "2027-12-20",

  "status": "active"

}

GET /contracts/{id}. بطاقة العقد.

PATCH /contracts/{id}. تحديث عقد.

واجهة برمجة تطبيقات المخاطر

GET /risks. القائمة العامة للمخاطر. المرشحات:

POST /risks. إنشاء خطر.

PATCH /risks/{id}. تعديل خطر.

POST /risks/{id}/resolve. إغلاق خطر.

واجهة برمجة تطبيقات المستندات

GET /documents/{id}. البيانات الوصفية للمستند.

GET /documents/{id}/download تنزيل الملف.

واجهة برمجة تطبيقات الرسم البياني. هذه خدمة منفصلة لأنها قلب النظام.

GET /graph/projects/{id}

الرسم البياني للمشروع.

GET /graph/companies/{id}

الرسم البياني للشركة.

POST /graph/query

استعلام بحثي أو تحليلي إلى الرسم البياني. بالنسبة إلى MVP من الأفضل الاقتصار على استعلامات قالبية بدلا من إتاحة Cypher حر.

Request

{

  "queryType": "project_neighbors",

  "entityId": "uuid",

  "depth": 2

}

GET /graph/search. البحث عن الكيانات في الرسم البياني:

واجهة برمجة تطبيقات التحليلات

GET /analytics/dashboard

المؤشرات المجمعة:

GET /analytics/projects/status-summary

ملخص حسب حالات المشاريع.

GET /analytics/companies/top-contractors

أفضل المتعاقدين حسب عدد المشاريع.

GET /analytics/risks/hotspots

أين تتركز أكبر قدر من المخاطر.

واجهة برمجة تطبيقات الأحداث

GET /events

سجل الأحداث. المرشحات:

التقسيم إلى خدمات. بالنسبة إلى MVP تكفي 5 خدمات.

auth-service

directory-service

project-service

graph-service

analytics-service

مزامنة PostgreSQL وNeo4j

هذه نقطة مهمة. مصدر الحقيقة للبطاقات هو PostgreSQL. مصدر الحقيقة للعلاقات والمسارات هو Neo4j.

النهج. بعد إنشاء الكيان أو تحديثه في PostgreSQL:

أمثلة على الأحداث:

أدنى حد من DTO

CreateProjectDto

{

  "name": "string",

  "description": "string",

  "projectType": "residential",

  "lifecycleStage": "design",

  "status": "normal",

  "customerCompanyId": "uuid",

  "startDate": "2026-04-01",

  "endDate": "2027-12-31",

  "plannedBudget": 1000000

}

AddCompanyToProjectDto

{

  "companyId": "uuid",

  "role": "contractor",

  "startDate": "2026-04-01",

  "endDate": null,

  "status": "active"

}

CreateRiskDto

{

  "projectId": "uuid",

  "relatedCompanyId": "uuid",

  "riskType": "deadline_delay",

  "severity": "high",

  "probability": "medium",

  "description": "تأخر عن الجدول الزمني بمقدار 21 يوم"

}

ما يجب إنجازه بالضرورة في الإصدار الأول

بدون هذا سيكون MVP فارغا:

إلزامي

يمكن تأجيله

الحزمة الموصى بها مباشرة لهذا المخطط

Backend

Frontend

Infra


هيكل المستودع

/crystal-construction

  /apps

    /api-gateway

    /auth-service

    /directory-service

    /project-service

    /graph-service

    /analytics-service

    /web-client

  /packages

    /shared-types

    /shared-utils

    /ui

  /infra

    /docker

    /nginx

    /db

  /docs

    openapi.yaml

    database-schema.md

    graph-model.md

الترتيب الأصح للبناء

يجب أن تجيب النسخة الأولية MVP على 4 سؤالاً:

إذا كانت واجهة API وقاعدة البيانات توفران ذلك، فلديك بالفعل نواة عاملة لبلورة البناء.





1. مسودة OpenAPI

فيما يلي هيكل مختصر لكنه عامل لمواصفة OpenAPI 3.1 للنسخة الأولية MVP.

openapi: 3.1.0

info:

  title: Crystal Construction API

  version: 1.0.0

  description: واجهة API للنسخة الأولية لمنصة "بلورة البناء"


servers:

  - url: https://api.crystal-construction.local/api/v1


tags:

  - name: Auth

  - name: Companies

  - name: Projects

  - name: Contracts

  - name: Risks

  - name: Graph

  - name: Analytics


paths:

  /auth/login:

    post:

      tags: [Auth]

      summary: دخول المستخدم

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/LoginRequest'

      responses:

        '200':

          description: دخول ناجح

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/AuthResponse'


  /auth/me:

    get:

      tags: [Auth]

      summary: الملف الشخصي للمستخدم الحالي

      security:

        - bearerAuth: []

      responses:

        '200':

          description: الملف الشخصي للمستخدم

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/UserProfileResponse'


  /companies:

    get:

      tags: [Companies]

      summary: قائمة الشركات

      security:

        - bearerAuth: []

      parameters:

        - in: query

          name: search

          schema: { type: string }

        - in: query

          name: companyType

          schema: { type: string }

        - in: query

          name: status

          schema: { type: string }

        - in: query

          name: page

          schema: { type: integer, minimum: 1, default: 1 }

        - in: query

          name: limit

          schema: { type: integer, minimum: 1, maximum: 100, default: 20 }

      responses:

        '200':

          description: قائمة الشركات

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/CompanyListResponse'


    post:

      tags: [Companies]

      summary: إنشاء شركة

      security:

        - bearerAuth: []

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/CreateCompanyRequest'

      responses:

        '201':

          description: تم إنشاء الشركة

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/CompanyResponse'


  /companies/{id}:

    get:

      tags: [Companies]

      summary: بطاقة الشركة

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      responses:

        '200':

          description: بيانات الشركة

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/CompanyResponse'


    patch:

      tags: [Companies]

      summary: تحديث الشركة

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/UpdateCompanyRequest'

      responses:

        '200':

          description: تم تحديث الشركة

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/CompanyResponse'


  /companies/{id}/relations:

    get:

      tags: [Graph]

      الملخص: مخطط علاقات الشركة

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

        - in: query

          name: depth

          schema: { type: integer, minimum: 1, maximum: 3, default: 1 }

      responses:

        '200':

          الوصف: مخطط الشركة

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/GraphResponse'


  /projects:

    get:

      tags: [Projects]

      الملخص: قائمة المشاريع

      security:

        - bearerAuth: []

      parameters:

        - in: query

          name: status

          schema: { type: string }

        - in: query

          name: lifecycleStage

          schema: { type: string }

        - in: query

          name: regionId

          schema: { type: string, format: uuid }

        - in: query

          name: customerCompanyId

          schema: { type: string, format: uuid }

        - in: query

          name: search

          schema: { type: string }

        - in: query

          name: page

          schema: { type: integer, default: 1 }

        - in: query

          name: limit

          schema: { type: integer, default: 20 }

      responses:

        '200':

          الوصف: قائمة المشاريع

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ProjectListResponse'


    post:

      tags: [Projects]

      الملخص: إنشاء مشروع

      security:

        - bearerAuth: []

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/CreateProjectRequest'

      responses:

        '201':

          الوصف: تم إنشاء المشروع

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ProjectResponse'


  /projects/{id}:

    get:

      tags: [Projects]

      الملخص: بطاقة المشروع

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      responses:

        '200':

          الوصف: بيانات المشروع

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ProjectResponse'


    patch:

      tags: [Projects]

      الملخص: تحديث المشروع

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/UpdateProjectRequest'

      responses:

        '200':

          الوصف: تم تحديث المشروع

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ProjectResponse'


  /projects/{id}/graph:

    get:

      tags: [Graph]

      الملخص: مخطط المشروع

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

        - in: query

          name: depth

          schema: { type: integer, minimum: 1, maximum: 3, default: 2 }

      responses:

        '200':

          الوصف: مخطط المشروع

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ProjectGraphResponse'


  /projects/{id}/companies:

    post:

      tags: [Projects]

      الملخص: إضافة مشارك إلى المشروع

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/AddCompanyToProjectRequest'

      responses:

        '201':

          الوصف: تمت إضافة المشارك

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/OperationResponse'


  /contracts:

    get:

      tags: [Contracts]

      الملخص: قائمة العقود

      security:

        - bearerAuth: []

      parameters:

        - in: query

          name: projectId

          schema: { type: string, format: uuid }

        - in: query

          name: customerCompanyId

          schema: { type: string, format: uuid }

        - in: query

          name: contractorCompanyId

          schema: { type: string, format: uuid }

        - in: query

          name: status

          schema: { type: string }

      responses:

        '200':

          الوصف: قائمة العقود

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ContractListResponse'


    post:

      tags: [Contracts]

      الملخص: إنشاء عقد

      security:

        - bearerAuth: []

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/CreateContractRequest'

      responses:

        '201':

          الوصف: تم إنشاء العقد

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ContractResponse'


  /risks:

    get:

      tags: [Risks]

      الملخص: قائمة المخاطر

      security:

        - bearerAuth: []

      parameters:

        - in: query

          name: projectId

          schema: { type: string, format: uuid }

        - in: query

          name: severity

          schema: { type: string }

        - in: query

          name: status

          schema: { type: string }

      responses:

        '200':

          الوصف: قائمة المخاطر

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/RiskListResponse'


    post:

      tags: [Risks]

      الملخص: إنشاء خطر

      security:

        - bearerAuth: []

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/CreateRiskRequest'

      responses:

        '201':

          الوصف: تم إنشاء الخطر

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/RiskResponse'


  /risks/{id}/resolve:

    post:

      tags: [Risks]

      الملخص: إغلاق الخطر

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      responses:

        '200':

          الوصف: تم إغلاق الخطر

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/RiskResponse'


  /analytics/dashboard:

    get:

      tags: [Analytics]

      الملخص: لوحة معلومات MVP

      security:

        - bearerAuth: []

      responses:

        '200':

          الوصف: تحليلات مجمعة

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/DashboardResponse'


components:

  securitySchemes:

    bearerAuth:

      type: http

      scheme: bearer

      bearerFormat: JWT


  parameters:

    IdPath:

      in: path

      name: id

      required: true

      schema:

        type: string

        format: uuid


  schemas:

    ApiError:

      type: object

      properties:

        code: { type: string }

        message: { type: string }

      required: [code, message]


    LoginRequest:

      type: object

      properties:

        email: { type: string, format: email }

        password: { type: string }

      required: [email, password]


    AuthUser:

      type: object

      properties:

        id: { type: string, format: uuid }

        fullName: { type: string }

        email: { type: string, format: email }

        roles:

          type: array

          items: { type: string }

      required: [id, fullName, email, roles]


    AuthResponse:

      type: object

      properties:

        data:

          type: object

          properties:

            accessToken: { type: string }

            refreshToken: { type: string }

            user:

              $ref: '#/components/schemas/AuthUser'

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    UserProfileResponse:

      type: object

      properties:

        data:

          $ref: '#/components/schemas/AuthUser'

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    Company:

      type: object

      properties:

        id: { type: string, format: uuid }

        name: { type: string }

        shortName: { type: string }

        inn: { type: string }

        ogrn: { type: string }

        companyType: { type: string }

        rating: { type: number }

        status: { type: string }

        website: { type: string, nullable: true }

      required: [id, name, companyType, status]


    CreateCompanyRequest:

      type: object

      properties:

        name: { type: string }

        shortName: { type: string }

        inn: { type: string }

        ogrn: { type: string }

        companyType: { type: string }

        website: { type: string }

      required: [name, inn, ogrn, companyType]


    UpdateCompanyRequest:

      type: object

      properties:

        name: { type: string }

        shortName: { type: string }

        companyType: { type: string }

        rating: { type: number }

        status: { type: string }

        website: { type: string }


    CompanyResponse:

      type: object

      properties:

        data:

          $ref: '#/components/schemas/Company'

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    CompanyListResponse:

      type: object

      properties:

        data:

          type: array

          items:

            $ref: '#/components/schemas/Company'

        meta:

          type: object

          properties:

            page: { type: integer }

            limit: { type: integer }

            total: { type: integer }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    LocationInput:

      type: object

      properties:

        regionId: { type: string, format: uuid }

        address: { type: string }

        lat: { type: number }

        lon: { type: number }

        cadastralNumber: { type: string }

      required: [regionId, address]


    Project:

      type: object

      properties:

        id: { type: string, format: uuid }

        code: { type: string }

        name: { type: string }

        description: { type: string, nullable: true }

        projectType: { type: string }

        lifecycleStage: { type: string }

        status: { type: string }

        customerCompanyId: { type: string, format: uuid }

        startDate: { type: string, format: date, nullable: true }

        endDate: { type: string, format: date, nullable: true }

        plannedBudget: { type: number, nullable: true }

        actualBudget: { type: number, nullable: true }

      required: [id, name, projectType, lifecycleStage, status]


    CreateProjectRequest:

      type: object

      properties:

        name: { type: string }

        description: { type: string }

        projectType: { type: string }

        lifecycleStage: { type: string }

        status: { type: string }

        location:

          $ref: '#/components/schemas/LocationInput'

        customerCompanyId: { type: string, format: uuid }

        startDate: { type: string, format: date }

        endDate: { type: string, format: date }

        plannedBudget: { type: number }

      required:

        - name

        - projectType

        - lifecycleStage

        - status

        - location

        - customerCompanyId


    UpdateProjectRequest:

      type: object

      properties:

        name: { type: string }

        description: { type: string }

        lifecycleStage: { type: string }

        status: { type: string }

        actualBudget: { type: number }

        endDate: { type: string, format: date }


    ProjectResponse:

      type: object

      properties:

        data:

          $ref: '#/components/schemas/Project'

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    ProjectListResponse:

      type: object

      properties:

        data:

          type: array

          items:

            $ref: '#/components/schemas/Project'

        meta:

          type: object

          properties:

            page: { type: integer }

            limit: { type: integer }

            total: { type: integer }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    GraphNode:

      type: object

      properties:

        id: { type: string }

        type: { type: string }

        name: { type: string }

        status: { type: string, nullable: true }

        metadata:

          type: object

          additionalProperties: true

      required: [id, type, name]


    GraphEdge:

      type: object

      properties:

        from: { type: string }

        to: { type: string }

        type: { type: string }

        role: { type: string, nullable: true }

        status: { type: string, nullable: true }

        metadata:

          type: object

          additionalProperties: true

      required: [from, to, type]


    GraphResponse:

      type: object

      properties:

        data:

          type: object

          properties:

            nodes:

              type: array

              items: { $ref: '#/components/schemas/GraphNode' }

            edges:

              type: array

              items: { $ref: '#/components/schemas/GraphEdge' }

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    ProjectGraphResponse:

      type: object

      properties:

        data:

          type: object

          properties:

            project:

              $ref: '#/components/schemas/Project'

            nodes:

              type: array

              items: { $ref: '#/components/schemas/GraphNode' }

            edges:

              type: array

              items: { $ref: '#/components/schemas/GraphEdge' }

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    CreateContractRequest:

      type: object

      properties:

        projectId: { type: string, format: uuid }

        contractNumber: { type: string }

        contractType: { type: string }

        customerCompanyId: { type: string, format: uuid }

        contractorCompanyId: { type: string, format: uuid }

        amount: { type: number }

        currency: { type: string }

        dateStart: { type: string, format: date }

        dateEnd: { type: string, format: date }

        status: { type: string }

      required:

        - projectId

        - contractNumber

        - contractType

        - customerCompanyId

        - contractorCompanyId

        - amount

        - currency

        - status


    Contract:

      type: object

      properties:

        id: { type: string, format: uuid }

        projectId: { type: string, format: uuid }

        contractNumber: { type: string }

        contractType: { type: string }

        customerCompanyId: { type: string, format: uuid }

        contractorCompanyId: { type: string, format: uuid }

        amount: { type: number }

        currency: { type: string }

        status: { type: string }

      required: [id, projectId, contractNumber, contractType, amount, currency, status]


    ContractResponse:

      type: object

      properties:

        data:

          $ref: '#/components/schemas/Contract'

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    ContractListResponse:

      type: object

      properties:

        data:

          type: array

          items: { $ref: '#/components/schemas/Contract' }

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    CreateRiskRequest:

      type: object

      properties:

        projectId: { type: string, format: uuid }

        relatedCompanyId: { type: string, format: uuid, nullable: true }

        riskType: { type: string }

        severity: { type: string }

        probability: { type: string }

        description: { type: string }

      required: [projectId, riskType, severity, probability, description]


    Risk:

      type: object

      properties:

        id: { type: string, format: uuid }

        projectId: { type: string, format: uuid }

        relatedCompanyId: { type: string, format