المحوّلات وواجهة البرمجة
يعمل مستقلاً اليوم، ويندمج داخل أي تطبيق غداً.
المحرك مستقل عن المجال. فهو يعتمد مرجعاً (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.