توثيق ERPOSالمرجع التنفيذي للمطورين
الرئيسية›فهرس الخوارزميات›خوارزمية فحص تعارض المصالح

خوارزمية فحص تعارض المصالحConflict of interest matching

خوارزميةمتطلب وارد في الملفات اقتراح هندسي يحتاج اعتمادًا قانونيًا

تطابق المعرفات الدقيقة بالبصمة، ثم الأسماء بعد التطبيع بمطابقة تقريبية موزونة، ثم شبكة العلاقات حتى قفزتين، وتعطي كل نتيجة سببًا ودرجة وخطورة مقترحة. لا تُصدر قرارًا.

الميزات التي تستخدمها: B16 فحص تعارض المصالح، B17 الزوار والاستقبال والمواعيد، B06 فريق الملف وحواجز المعلومات، B02 الموكّلون والأطراف والعلاقات

1الغرض والمصطلحات القانونية المرتبطة

دعم قرار بشري في تعارض المصالح. تشابه الاسم وحده معلومة لا رفض.

2المدخلات وأنواعها ومصادرها

3المخرجات والحالات

Conflict Hit لكل تطابق: الطرف، الملف، الصفة، سبب المطابقة، الدرجة 0–100، الخطورة المقترحة من Conflict Rule.

4خطوات المعالجة بالتسلسل

  1. طبّع الاسم تطبيع الأسماء والنصوص العربية.
  2. معرّف موجود ← بحث بالبصمة: تطابق = «مؤكد» 100.
  3. مفتاح حجب (blocking): أول حرفين من اسم العائلة الموحد لتقليل المرشحين اقتراح هندسي.
  4. لكل مرشح: درجة السلسلة الكاملة token_sort_ratio، ودرجة الأول+العائلة موزونة، والاسم اللاتيني.
  5. أعلى درجة ≥ العتبة ← تطابق.
  6. لكل تطابق: علاقاته حتى قفزتين ← تطابقات «علاقة».
  7. تصنيف الخطورة من نوع الصفة وجدول القواعد.

5الشروط والفروع والاستثناءات

ثلاثة مستويات في الوثيقة المعمارية: عالٍ، متوسط للمراجعة، منخفض كملاحظة (الوثيقة المعمارية). في هذا التوثيق: «عالٍ» يوقف التقدم حتى قرار بشري، ولا يرفض العميل آليًا.

6Pseudocode كامل

Pseudocode
function run_conflict_check(subject):
    hits = []
    for person in subject.names_and_ids:
        if person.id:
            for p in Party.where(id_hmac = hmac(person.id)):
                hits += Hit(p, reason="معرّف", score=100)
        n = normalize(person.name)
        for p in Party.candidates(block_key(n)):
            full  = rapidfuzz.token_sort_ratio(n, p.normalized_name)
            short = weighted(first_token(n) ~ first_token(p), last_token(n) ~ last_token(p), w_first, w_family)
            latin = rapidfuzz.ratio(person.name_en, p.name_en) if both else 0
            s = max(full, short, latin, max(alias scores))
            if s >= settings.threshold: hits += Hit(p, reason=best_reason, score=s)
    hits += expand_relations(hits, depth=2)
    for h in hits: h.severity = ConflictRule.lookup(h.role, h.reason)   # [legal] table
    return hits   # never a decision

RapidFuzz بدل كتابة Levenshtein من الصفر (قرار تقييم القرارات) (التقييم الهندسي).

7مثال اصطناعي خطوة بخطوة

المدخلالمخزنالنتيجة
مُحمّد بن عبدالله العتيبيمحمد عبد الله العتيبيبعد التطبيع متطابقان ← تطابق عالٍ (اسم)
أحمد بن محمد العنزيمحمد أحمد العنزيترتيب مختلف ← token_sort يرفع الدرجة؛ للمراجعة
أي اسم + هوية ١٠٠٠٠٠٠٠٠١هوية 1000000001 باسم مختلفمؤكد بالمعرّف

كل الأسماء والأرقام اصطناعية.

8حالات الفشل والتعامل معها

فهرس غير محدث ← إعادة فهرسة قبل الفحص. مهلة الفحص ← حالة «قيد الفحص» وإعادة في الطابور.

9منع التكرار والتزامن

الفحص في طابور short؛ قرار واحد لكل فحص (submittable).

10الصلاحيات والتدقيق والأمن

الطالب يرى الحالة فقط. البصمة لا تُكشف.

11اختبارات الوحدات والتكامل والقبول

المعرّفالنوعالسيناريوالنتيجة المتوقعة
ALG-CF-01وحدةأمثلة الجدولكما هو متوقع
ALG-CF-02وحدةالاسم وحده بدرجة 95لا قرار آلي
ALG-CF-03أداء50,000 طرفزمن ضمن حد معلن بعد القياس غير مثبت

12ما هو قاعدة تقنية وما هو قرار قانوني

قاعدة تقنية (ينفذها المطور)قرار قانوني (يعتمده مختص)
التطبيع، الدرجات، الحجب، العلاقاتجدول الخطورة ومدد التبريد
العتبات والأوزان (تُضبط على بيانات المكتب)القرار في كل حالة