المحوّلات وواجهة البرمجة

يعمل مستقلاً اليوم، ويندمج داخل أي تطبيق غداً.


المحرك مستقل عن المجال. فهو يعتمد مرجعاً (targetType + targetId) ولا يحتوي أبداً منطق أعمال تطبيق آخر. ويتشارك وضعان نقطة تقديم واحدة.

الوضع المستقل (اليوم)

تستخدم النماذج المقدَّمة الهدف المدمج standalone.request: تصبح قيم النموذج بيانات الطلب، وتغذي البيانات القواعد الشرطية، ويُسجَّل القرار على الهدف.

POST /requests
{ "policyId": "…", "title": "Field team laptops",
  "payload": { "amount": 9200, "category": "it-equipment" } }

وضع المحوّل (عقد المنظومة)

يسجّل التطبيق المضيف محوّلاً واحداً ويسلّم كائناته الخاصة:

interface ApprovalTargetAdapter {
  targetType: string; // e.g. "document.transmittal"
  loadContext(orgId, targetId): Promise<{ code; title; href; snapshot }>;
  applyDecision(orgId, targetId, finalAction, comment?): Promise<void>;
}

تعطي loadContext المحرك حقول العرض ولقطة القواعد، وتُستدعى applyDecision مرة واحدة بالضبط عند القرار النهائي. هذه هي واجهة التكامل كلها: يحتفظ التطبيق المضيف بدورة عمله، ويفوّض فعل الاعتماد وحده.

نقاط الواجهة الأساسية

الطريقة والمسارالغرض
GET /policies · POST /policiesعرض السياسات وتعريفها
POST /requests · GET /requestsتقديم الطلبات وعرضها
GET /requests/:idالتفاصيل: مسار الموافقة والبيانات والسجل الزمني
GET /inbox · POST /assignments/:id/decideقائمتك وقرارك
POST /assignments/bulk-decideموافقة جماعية بضوابط
POST /external/decideقرارات الرابط السحري والرمز (عامة)
GET /activity · GET /analytics/summaryسجل التدقيق وملخص لوحة المعلومات

تنضم العملاء اللحظية إلى غرف المؤسسة والمستخدم عبر Socket.IO، وتتلقى إشارات inbox.changed وrequest.changed وnotifications.changed.