إثراء المصطلحات الطبية العالمية بالعربية: دليل CodeSystem Supplement في FHIR

By خبير FHIR والمصطلحات الطبية

ملاحظة تقنية: هذا المقال يستخدم أمثلة واقعية مختبرة على Ontoserver 6.21.1 مع تصنيف ATC من منظمة الصحة العالمية. جميع الأكواد قابلة للتنفيذ مباشرة.

المقدمة

في عالم الصحة الرقمية، نواجه تحديًا مستمرًا: كيف نوفر المعلومات الطبية بلغات متعددة دون تعديل المصطلحات الطبية العالمية؟

تصنيف ATC (Anatomical Therapeutic Chemical) من منظمة الصحة العالمية يحتوي على أكثر من 6000 دواء، لكنه متوفر فقط بالإنجليزية والفرنسية. ماذا لو أردنا توفيره بالعربية لملايين المرضى في العالم العربي؟

الحل الذكي: CodeSystem Supplement في معيار FHIR.


ما هو CodeSystem Supplement؟

التعريف

CodeSystem Supplement هو آلية في معيار FHIR تسمح لك بـ:

  • ✅ إضافة ترجمات (designations) لمصطلحات موجودة
  • ✅ إضافة خصائص مخصصة (properties) محلية أو مؤسسية
  • لا يمكن إضافة رموز جديدة (codes) — هذا يتطلب CodeSystem كامل

لماذا هو مهم؟

تخيل أنك تدير مستشفى في المغرب أو السعودية:

  • الأطباء يستخدمون تصنيف ATC بالفرنسية/الإنجليزية
  • المرضى يحتاجون المعلومات بالعربية
  • منظمة الصحة العالمية لن تضيف العربية قريبًا
  • لا تريد (ولا تملك صلاحية) تعديل التصنيف الأصلي

الحل: أنشئ Supplement بالترجمة العربية، واستخدمه مع ATC الأصلي دون أي تعديل على المصدر!


البنية الأساسية

{
  "resourceType": "CodeSystem",
  "content": "supplement",                           // النوع: supplement
  "supplements": "http://www.whocc.no/atc|02-2026", // النظام المُثرى مع الإصدار
  "concept": [
    {
      "code": "N02BE01",                            // رمز موجود في ATC
      "display": "باراسيتامول",                     // الاسم بالعربية
      "designation": [                              // ترجمات متعددة
        {
          "language": "ar",
          "use": {
            "system": "http://terminology.hl7.org/CodeSystem/designation-usage",
            "code": "consumer"
          },
          "value": "باراسيتامول (مسكن للألم وخافض للحرارة)"
        }
      ],
      "property": [                                 // خصائص مخصصة
        {
          "code": "notice-patient-ar",
          "valueString": "يؤخذ مع كوب من الماء. الحد الأقصى 4 غرام في اليوم."
        }
      ]
    }
  ],
  "property": [                                     // تعريف الخصائص المخصصة
    {
      "code": "notice-patient-ar",
      "uri": "http://example.org/fhir/property/notice-patient-ar",
      "description": "إرشادات للمريض بالعربية",
      "type": "string"
    }
  ]
}

العناصر الأساسية

العنصر الوصف إلزامي؟
content يجب أن يكون "supplement" ✅ نعم
supplements URL + إصدار النظام الأصلي ✅ نعم
concept[].code رمز موجود في النظام الأصلي ✅ نعم
concept[].display الاسم المعروض ✅ نعم (Ontoserver)
designation ترجمات إضافية ⚪ اختياري
property خصائص مخصصة ⚪ اختياري

حالة استخدام واقعية: مستشفى الأمل بالرياض

السياق

مستشفى الأمل بالرياض يريد نظام وصفات إلكتروني بالعربية للمرضى، بينما الأطباء والصيادلة يستخدمون تصنيف ATC القياسي.

المتطلبات:

  • عرض أسماء الأدوية بالعربية للمرضى
  • دعم أسماء مبسطة consumer-friendly
  • إضافة إرشادات الاستخدام بالعربية
  • ربط حالة الموافقة من هيئة الدواء والغذاء (DAAD)
  • دعم اللهجات المحلية (ar-SA)

الخطوة 1: إنشاء Supplement

{
  "resourceType": "CodeSystem",
  "id": "atc-supplement-ar-amal",
  "url": "http://hospital-amal.sa/fhir/CodeSystem/atc-ar",
  "version": "1.0.0",
  "name": "ATCSupplementArabic",
  "title": "ملحق تصنيف ATC بالعربية - مستشفى الأمل",
  "status": "active",
  "experimental": false,
  "date": "2025-05-20",
  "publisher": "مستشفى الأمل، الرياض",
  "description": "ملحق عربي لتصنيف ATC يضيف ترجمات وإرشادات للمرضى وحالة الموافقة من هيئة الدواء والغذاء السعودية",
  "content": "supplement",
  "supplements": "http://www.whocc.no/atc|02-2026",
  "concept": [
    {
      "code": "N02BE01",
      "display": "باراسيتامول",
      "designation": [
        {
          "language": "ar",
          "use": {
            "system": "http://snomed.info/sct",
            "code": "900000000000013009",
            "display": "Synonym"
          },
          "value": "باراسيتامول"
        },
        {
          "language": "ar",
          "use": {
            "system": "http://terminology.hl7.org/CodeSystem/designation-usage",
            "code": "consumer",
            "display": "Consumer-friendly"
          },
          "value": "باراسيتامول (مسكن للألم وخافض للحرارة)"
        },
        {
          "language": "ar-SA",
          "use": {
            "system": "http://snomed.info/sct",
            "code": "900000000000013009",
            "display": "Synonym"
          },
          "value": "بنادول",
          "extension": [{
            "url": "http://hospital-amal.sa/dialect",
            "valueString": "Saudi common name"
          }]
        }
      ],
      "property": [
        {
          "code": "notice-patient-ar",
          "valueString": "يؤخذ مع كوب من الماء. الحد الأقصى 4 غرام في اليوم."
        },
        {
          "code": "classe-therapeutique-ar",
          "valueString": "مسكن غير أفيوني"
        },
        {
          "code": "daad-status",
          "valueCode": "approved"
        },
        {
          "code": "daad-approval-date",
          "valueDate": "2020-01-15"
        }
      ]
    },
    {
      "code": "N02BA01",
      "display": "حمض أسيتيل الساليسيليك",
      "designation": [
        {
          "language": "ar",
          "use": {
            "system": "http://snomed.info/sct",
            "code": "900000000000013009",
            "display": "Synonym"
          },
          "value": "حمض أسيتيل الساليسيليك"
        },
        {
          "language": "ar",
          "use": {
            "system": "http://terminology.hl7.org/CodeSystem/designation-usage",
            "code": "consumer",
            "display": "Consumer-friendly"
          },
          "value": "أسبرين"
        }
      ],
      "property": [
        {
          "code": "notice-patient-ar",
          "valueString": "لا يستخدم للأطفال بدون استشارة طبية."
        },
        {
          "code": "contraindication-ar",
          "valueString": "قرحة المعدة، اضطرابات النزيف"
        },
        {
          "code": "red-classification",
          "valueString": "OTC"
        }
      ]
    },
    {
      "code": "C09AA01",
      "display": "كابتوبريل",
      "designation": [
        {
          "language": "ar",
          "use": {
            "system": "http://snomed.info/sct",
            "code": "900000000000013009",
            "display": "Synonym"
          },
          "value": "كابتوبريل"
        },
        {
          "language": "ar",
          "use": {
            "system": "http://terminology.hl7.org/CodeSystem/designation-usage",
            "code": "consumer",
            "display": "Consumer-friendly"
          },
          "value": "كابتوبريل (علاج ضغط الدم المرتفع)"
        }
      ],
      "property": [
        {
          "code": "notice-patient-ar",
          "valueString": "قد يسبب دوخة. يتطلب مراقبة منتظمة."
        },
        {
          "code": "classe-therapeutique-ar",
          "valueString": "مثبط الإنزيم المحول للأنجيوتنسين"
        }
      ]
    },
    {
      "code": "J01CA04",
      "display": "أموكسيسيلين",
      "designation": [
        {
          "language": "ar",
          "use": {
            "system": "http://snomed.info/sct",
            "code": "900000000000013009",
            "display": "Synonym"
          },
          "value": "أموكسيسيلين"
        },
        {
          "language": "ar",
          "use": {
            "system": "http://terminology.hl7.org/CodeSystem/designation-usage",
            "code": "consumer",
            "display": "Consumer-friendly"
          },
          "value": "أموكسيسيلين (مضاد حيوي)"
        }
      ],
      "property": [
        {
          "code": "notice-patient-ar",
          "valueString": "أكمل العلاج كاملاً حتى لو شعرت بتحسن."
        },
        {
          "code": "classe-therapeutique-ar",
          "valueString": "مضاد حيوي من عائلة البنسلين"
        }
      ]
    }
  ],
  "property": [
    {
      "code": "notice-patient-ar",
      "uri": "http://hospital-amal.sa/fhir/property/notice-patient-ar",
      "description": "إرشادات للمريض بالعربية",
      "type": "string"
    },
    {
      "code": "classe-therapeutique-ar",
      "uri": "http://hospital-amal.sa/fhir/property/classe-therapeutique-ar",
      "description": "الصنف العلاجي بالعربية",
      "type": "string"
    },
    {
      "code": "contraindication-ar",
      "uri": "http://hospital-amal.sa/fhir/property/contraindication-ar",
      "description": "موانع الاستعمال بالعربية",
      "type": "string"
    },
    {
      "code": "daad-status",
      "uri": "http://hospital-amal.sa/fhir/property/daad-status",
      "description": "حالة الموافقة من هيئة الدواء والغذاء السعودية (DAAD)",
      "type": "code"
    },
    {
      "code": "daad-approval-date",
      "uri": "http://hospital-amal.sa/fhir/property/daad-approval-date",
      "description": "تاريخ الموافقة من هيئة الدواء والغذاء السعودية",
      "type": "date"
    },
    {
      "code": "red-classification",
      "uri": "http://hospital-amal.sa/fhir/property/red-classification",
      "description": "التصنيف التنظيمي المحلي (OTC/Prescription)",
      "type": "string"
    }
  ]
}

الخطوة 2: رفع Supplement على Ontoserver

curl -X PUT \
  "https://fhir.hospital-amal.sa/fhir/CodeSystem/atc-supplement-ar-amal" \
  -H "Content-Type: application/fhir+json" \
  -d @atc-supplement-ar.json

النتيجة المتوقعة:

{
  "resourceType": "CodeSystem",
  "id": "atc-supplement-ar-amal",
  "meta": {
    "versionId": "1",
    "lastUpdated": "2025-05-20T10:30:00.000+00:00"
  },
  "url": "http://hospital-amal.sa/fhir/CodeSystem/atc-ar",
  "content": "supplement",
  "supplements": "http://www.whocc.no/atc|02-2026"
}

الخطوة 3: استخدام Supplement في $expand

⚠️ نقطة حرجة: يجب تمرير المعاملات في body بصيغة Parameters، وليس في query string!

curl -X POST \
  "https://fhir.hospital-amal.sa/fhir/ValueSet/\$expand" \
  -H "Content-Type: application/fhir+json" \
  -d '{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "valueSet",
      "resource": {
        "resourceType": "ValueSet",
        "url": "http://hospital-amal.sa/fhir/ValueSet/medications-ar",
        "status": "active",
        "compose": {
          "include": [{
            "system": "http://www.whocc.no/atc",
            "concept": [
              {"code": "N02BE01"},
              {"code": "N02BA01"},
              {"code": "C09AA01"},
              {"code": "J01CA04"}
            ]
          }]
        }
      }
    },
    {
      "name": "useSupplement",
      "valueCanonical": "http://hospital-amal.sa/fhir/CodeSystem/atc-ar"
    },
    {
      "name": "displayLanguage",
      "valueCode": "ar"
    },
    {
      "name": "includeDesignations",
      "valueBoolean": true
    }
  ]
}'

النتيجة: الترجمات العربية متاحة!

{
  "resourceType": "ValueSet",
  "expansion": {
    "parameter": [
      {
        "name": "used-codesystem",
        "valueUri": "http://hospital-amal.sa/fhir/CodeSystem/atc-ar|1.0.0"
      }
    ],
    "contains": [
      {
        "system": "http://www.whocc.no/atc",
        "code": "N02BE01",
        "display": "N02BE01 - PARACETAMOL",
        "designation": [
          {
            "language": "ar",
            "use": {
              "system": "http://snomed.info/sct",
              "code": "900000000000013009"
            },
            "value": "باراسيتامول"
          },
          {
            "language": "ar",
            "use": {
              "system": "http://terminology.hl7.org/CodeSystem/designation-usage",
              "code": "consumer"
            },
            "value": "باراسيتامول (مسكن للألم وخافض للحرارة)"
          },
          {
            "language": "ar-SA",
            "value": "بنادول"
          },
          {
            "use": {
              "system": "http://terminology.hl7.org/CodeSystem/designation-usage",
              "code": "display"
            },
            "value": "باراسيتامول"
          }
        ]
      }
    ]
  }
}

التطبيق: تطبيق المريض بالعربية

كود JavaScript لعرض الأدوية

/**
 * استخراج المعلومات بالعربية من النتيجة
 */
function getArabicMedicationInfo(concept) {
  // البحث عن الاسم بالعربية مع use.code = "display"
  const displayDesignation = concept.designation?.find(d => 
    d.use?.code === 'display' && /[\u0600-\u06FF]/.test(d.value)
  );
  
  const display = displayDesignation?.value || concept.display;
  
  // البحث عن الاسم المبسط للمريض
  const consumerDesignation = concept.designation?.find(d => 
    d.language === 'ar' && d.use?.code === 'consumer'
  );
  
  const consumerFriendly = consumerDesignation?.value;
  
  // البحث عن الاسم المحلي (اللهجة)
  const dialectDesignation = concept.designation?.find(d => 
    d.language?.startsWith('ar-') && d.use?.code === '900000000000013009'
  );
  
  const localName = dialectDesignation?.value;
  
  return {
    code: concept.code,
    display: display,
    patientName: consumerFriendly,
    localName: localName,
    system: concept.system
  };
}

/**
 * عرض قائمة الأدوية في واجهة المستخدم
 */
async function displayPatientMedications(patientId) {
  // جلب أدوية المريض من FHIR
  const medications = await fetchPatientMedications(patientId);
  
  // إنشاء ValueSet مع رموز ATC
  const valueSet = {
    resourceType: "ValueSet",
    status: "active",
    compose: {
      include: [{
        system: "http://www.whocc.no/atc",
        concept: medications.map(m => ({ code: m.atcCode }))
      }]
    }
  };
  
  // Expand مع Supplement
  const expansion = await fhirClient.request({
    url: '/ValueSet/$expand',
    method: 'POST',
    body: {
      resourceType: "Parameters",
      parameter: [
        { name: "valueSet", resource: valueSet },
        { 
          name: "useSupplement", 
          valueCanonical: "http://hospital-amal.sa/fhir/CodeSystem/atc-ar" 
        },
        { name: "displayLanguage", valueCode: "ar" },
        { name: "includeDesignations", valueBoolean: true }
      ]
    }
  });
  
  // عرض النتائج في الواجهة
  const medicationList = document.getElementById('medication-list');
  
  expansion.expansion.contains.forEach(concept => {
    const info = getArabicMedicationInfo(concept);
    
    const card = document.createElement('div');
    card.className = 'medication-card';
    card.setAttribute('dir', 'rtl');
    card.innerHTML = `
      <h3>${info.display}</h3>
      ${info.patientName ? `<p class="patient-name">${info.patientName}</p>` : ''}
      ${info.localName ? `<p class="local-name">الاسم الشائع: ${info.localName}</p>` : ''}
      <span class="code">الرمز: ${info.code}</span>
    `;
    
    medicationList.appendChild(card);
  });
}

الواجهة بالعربية

<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>أدويتي - مستشفى الأمل</title>
  <style>
    body {
      font-family: 'Segoe UI', Tahoma, Arial, sans-serif;
      direction: rtl;
      text-align: right;
      background: #f5f5f5;
      padding: 20px;
    }
    
    .container {
      max-width: 600px;
      margin: 0 auto;
    }
    
    h1 {
      color: #2c3e50;
      text-align: center;
      margin-bottom: 30px;
    }
    
    .medication-card {
      border: 1px solid #e0e0e0;
      border-radius: 12px;
      padding: 20px;
      margin: 16px 0;
      background: white;
      box-shadow: 0 2px 8px rgba(0,0,0,0.08);
      transition: transform 0.2s, box-shadow 0.2s;
    }
    
    .medication-card:hover {
      transform: translateY(-2px);
      box-shadow: 0 4px 12px rgba(0,0,0,0.12);
    }
    
    .medication-card h3 {
      margin: 0 0 10px 0;
      color: #2c3e50;
      font-size: 22px;
      font-weight: 600;
    }
    
    .patient-name {
      color: #7f8c8d;
      font-size: 15px;
      margin: 6px 0;
      line-height: 1.5;
    }
    
    .local-name {
      color: #3498db;
      font-size: 14px;
      margin: 6px 0;
      font-style: italic;
    }
    
    .code {
      display: inline-block;
      background: #ecf0f1;
      padding: 6px 12px;
      border-radius: 6px;
      font-size: 13px;
      color: #34495e;
      font-family: monospace;
      margin-top: 10px;
    }
    
    .loading {
      text-align: center;
      padding: 40px;
      color: #7f8c8d;
    }
  </style>
</head>
<body>
  <div class="container">
    <h1>🏥 أدويتي</h1>
    <div id="medication-list">
      <div class="loading">جاري تحميل الأدوية...</div>
    </div>
  </div>
  
  <script src="fhir-client.js"></script>
  <script src="medication-display.js"></script>
  <script>
    // تهيئة التطبيق
    document.addEventListener('DOMContentLoaded', async () => {
      const patientId = getPatientIdFromUrl();
      await displayPatientMedications(patientId);
    });
  </script>
</body>
</html>

النتيجة المعروضة للمريض

┌─────────────────────────────────────────────────┐
│ 🏥 أدويتي                                      │
├─────────────────────────────────────────────────┤
│                                                 │
│  باراسيتامول                                   │
│  باراسيتامول (مسكن للألم وخافض للحرارة)        │
│  الاسم الشائع: بنادول                          │
│  [ الرمز: N02BE01 ]                            │
│                                                 │
├─────────────────────────────────────────────────┤
│                                                 │
│  حمض أسيتيل الساليسيليك                        │
│  أسبرين                                        │
│  [ الرمز: N02BA01 ]                            │
│                                                 │
├─────────────────────────────────────────────────┤
│                                                 │
│  كابتوبريل                                     │
│  كابتوبريل (علاج ضغط الدم المرتفع)             │
│  [ الرمز: C09AA01 ]                            │
│                                                 │
└─────────────────────────────────────────────────┘

حالة استخدام متقدمة: دعم اللهجات المحلية

المشكلة

العربية لها لهجات متعددة ومصطلحات محلية:

  • دول الخليج تستخدم “بنادول” للباراسيتامول
  • المغرب العربي يستخدم “دوليبران”
  • بعض الأدوية لها أسماء تجارية محلية شائعة

الحل: Designations بلهجات مختلفة

{
  "code": "N02BE01",
  "display": "باراسيتامول",
  "designation": [
    {
      "language": "ar",
      "use": { "code": "900000000000013009" },
      "value": "باراسيتامول"
    },
    {
      "language": "ar-SA",
      "use": { "code": "consumer" },
      "value": "بنادول",
      "extension": [{
        "url": "http://hospital-amal.sa/fhir/StructureDefinition/dialect",
        "valueString": "Saudi common commercial name"
      }]
    },
    {
      "language": "ar-MA",
      "use": { "code": "consumer" },
      "value": "دوليبران",
      "extension": [{
        "url": "http://hospital-amal.sa/fhir/StructureDefinition/dialect",
        "valueString": "Moroccan common commercial name"
      }]
    },
    {
      "language": "ar-EG",
      "use": { "code": "consumer" },
      "value": "أدول",
      "extension": [{
        "url": "http://hospital-amal.sa/fhir/StructureDefinition/dialect",
        "valueString": "Egyptian common commercial name"
      }]
    }
  ]
}

كود لاستخراج الاسم المحلي

function getLocalizedMedicationName(concept, region = 'SA') {
  const dialectCode = `ar-${region}`;
  
  // 1. البحث عن اللهجة المحلية أولاً
  const dialectDesignation = concept.designation?.find(d => 
    d.language === dialectCode && d.use?.code === 'consumer'
  );
  
  if (dialectDesignation) {
    return {
      name: dialectDesignation.value,
      type: 'local',
      region: region
    };
  }
  
  // 2. Fallback للعربية الفصحى
  const standardArabic = concept.designation?.find(d => 
    d.language === 'ar' && d.use?.code === 'consumer'
  );
  
  if (standardArabic) {
    return {
      name: standardArabic.value,
      type: 'standard',
      region: 'standard'
    };
  }
  
  // 3. Fallback للـ display
  return {
    name: concept.display,
    type: 'fallback',
    region: 'none'
  };
}

// أمثلة الاستخدام
console.log(getLocalizedMedicationName(concept, 'SA'));
// { name: "بنادول", type: "local", region: "SA" }

console.log(getLocalizedMedicationName(concept, 'MA'));
// { name: "دوليبران", type: "local", region: "MA" }

console.log(getLocalizedMedicationName(concept, 'EG'));
// { name: "أدول", type: "local", region: "EG" }

التكامل مع الهيئات الرقابية

إضافة خصائص هيئة الدواء والغذاء السعودية (DAAD)

{
  "code": "N02BE01",
  "display": "باراسيتامول",
  "property": [
    {
      "code": "daad-approval-status",
      "valueCode": "approved"
    },
    {
      "code": "daad-approval-date",
      "valueDate": "2020-01-15"
    },
    {
      "code": "daad-registration-number",
      "valueString": "DAAD-2020-0156"
    },
    {
      "code": "daad-approval-authority",
      "valueString": "Saudi Food and Drug Authority"
    },
    {
      "code": "red-classification",
      "valueString": "OTC"
    },
    {
      "code": "prescription-required-ar",
      "valueBoolean": false
    },
    {
      "code": "local-warning-ar",
      "valueString": "تحذير: لا تتجاوز الجرعة المحددة. استشر الطبيب في حالة استمرار الأعراض."
    },
    {
      "code": "storage-conditions-ar",
      "valueString": "يحفظ في درجة حرارة أقل من 25 درجة مئوية"
    }
  ]
}

كود Python للتحقق من حالة الموافقة

def check_medication_regulatory_status(atc_code, country='SA'):
    """
    التحقق من حالة الموافقة التنظيمية للدواء
    
    Args:
        atc_code: رمز ATC للدواء
        country: رمز الدولة (SA, MA, EG...)
    
    Returns:
        dict: معلومات الموافقة والتصنيف
    """
    
    supplement_url = f"http://health.{country.lower()}/fhir/CodeSystem/atc-regulatory"
    
    params = {
        "resourceType": "Parameters",
        "parameter": [
            {
                "name": "system",
                "valueUri": "http://www.whocc.no/atc"
            },
            {
                "name": "code",
                "valueCode": atc_code
            },
            {
                "name": "useSupplement",
                "valueCanonical": supplement_url
            },
            {
                "name": "property",
                "valueString": "daad-approval-status"
            },
            {
                "name": "property",
                "valueString": "red-classification"
            },
            {
                "name": "property",
                "valueString": "prescription-required-ar"
            },
            {
                "name": "property",
                "valueString": "local-warning-ar"
            }
        ]
    }
    
    try:
        response = fhir_client.post('/CodeSystem/$lookup', json=params)
        
        # استخراج الخصائص من النتيجة
        properties = {}
        for param in response.get('parameter', []):
            if param['name'] == 'property':
                parts = {p['name']: p.get('valueCode') or p.get('valueString') or p.get('valueBoolean')
                        for p in param.get('part', [])}
                prop_code = parts.get('code')
                prop_value = parts.get('value')
                if prop_code:
                    properties[prop_code] = prop_value
        
        return {
            'approved': properties.get('daad-approval-status') == 'approved',
            'classification': properties.get('red-classification'),
            'prescription_required': properties.get('prescription-required-ar', True),
            'warning': properties.get('local-warning-ar'),
            'country': country
        }
        
    except Exception as e:
        print(f"خطأ في التحقق من الموافقة: {e}")
        return None

# استخدام
status = check_medication_regulatory_status('N02BE01', 'SA')
if status:
    print(f"حالة الموافقة: {'معتمد' if status['approved'] else 'غير معتمد'}")
    print(f"التصنيف: {status['classification']}")
    print(f"يحتاج وصفة: {'نعم' if status['prescription_required'] else 'لا'}")
    if status['warning']:
        print(f"تحذير: {status['warning']}")

واجهة عرض حالة الموافقة

<div class="medication-regulatory-info" dir="rtl">
  <h4>معلومات تنظيمية</h4>
  
  <div class="approval-status approved">
    <span class="icon"></span>
    <span class="text">معتمد من هيئة الدواء والغذاء السعودية</span>
  </div>
  
  <div class="classification">
    <strong>التصنيف:</strong> OTC (بدون وصفة طبية)
  </div>
  
  <div class="registration">
    <strong>رقم التسجيل:</strong> DAAD-2020-0156
  </div>
  
  <div class="approval-date">
    <strong>تاريخ الموافقة:</strong> 15 يناير 2020
  </div>
  
  <div class="warning">
    <span class="icon">⚠️</span>
    <span class="text">تحذير: لا تتجاوز الجرعة المحددة</span>
  </div>
</div>

مزايا استخدام CodeSystem Supplements

1. الحوكمة الموزعة (Distributed Governance)

┌──────────────────────────────────────────────────────┐
│  ATC - منظمة الصحة العالمية                         │
│  المحافظة: WHO                                      │
│  التحديث: سنوي                                      │
│  اللغات: EN, FR                                     │
└──────────────────────────────────────────────────────┘
                    ↓ supplements
┌──────────────────────────────────────────────────────┐
│  Supplement عربي - وزارة الصحة السعودية             │
│  المحافظة: MOH-SA                                   │
│  التحديث: شهري (مستقل)                             │
│  الإضافات: ترجمات + خصائص DAAD                     │
└──────────────────────────────────────────────────────┘
                    ↓ supplements
┌──────────────────────────────────────────────────────┐
│  Supplement محلي - مستشفى الأمل                     │
│  المحافظة: Hospital IT Team                        │
│  التحديث: حسب الحاجة                               │
│  الإضافات: لهجات محلية + إرشادات داخلية            │
└──────────────────────────────────────────────────────┘

الفوائد:

  • كل جهة تدير محتواها مستقلة
  • لا تعارض بين التحديثات
  • مرونة في الإضافة والتعديل
  • شفافية في المسؤوليات

2. التحديث المستقل

الجهة تردد التحديث المحتوى
WHO (ATC) سنوي رموز جديدة، تصنيفات
MOH شهري ترجمات، موافقات
المستشفى أسبوعي إرشادات داخلية

مثال عملي:

// تحديث الـ Supplement المحلي بدون انتظار WHO
const updatedSupplement = {
  ...existingSupplement,
  concept: [
    ...existingSupplement.concept,
    {
      code: "N05BA01", // إضافة دواء جديد تمت ترجمته
      display: "ديازيبام",
      designation: [...]
    }
  ]
};

// رفع التحديث فورًا
await updateSupplement(updatedSupplement);

3. إعادة الاستخدام وقابلية التوسع

// استخدام عدة Supplements معًا
const supplements = [
  "http://moh.sa/fhir/CodeSystem/atc-ar",              // الوزارة
  "http://hospital-amal.sa/fhir/CodeSystem/atc-ar",   // المستشفى
  "http://riyadh-region.sa/fhir/CodeSystem/atc-ar"    // المنطقة
];

// تطبيقهم جميعًا في $expand
const params = {
  resourceType: "Parameters",
  parameter: [
    { name: "valueSet", resource: myValueSet },
    ...supplements.map(url => ({
      name: "useSupplement",
      valueCanonical: url
    })),
    { name: "displayLanguage", valueCode: "ar" }
  ]
};

الأخطاء الشائعة وحلولها

❌ الخطأ 1: عدم تحديد الإصدار في supplements

// خطأ - سيؤدي لفشل أو سلوك غير متوقع
{
  "supplements": "http://www.whocc.no/atc"
}

// صحيح - دائماً حدد الإصدار
{
  "supplements": "http://www.whocc.no/atc|02-2026"
}

السبب: قد يكون لديك عدة إصدارات من ATC، والـ Supplement يجب أن يستهدف إصدارًا محددًا.

كيف تتحقق من الإصدارات المتاحة:

curl -k "https://your-fhir-server/fhir/CodeSystem?url=http://www.whocc.no/atc" \
  | jq '.entry[].resource | {id, version}'

❌ الخطأ 2: نسيان display في المفهوم

// خطأ - لن يعمل على Ontoserver
{
  "code": "N02BE01",
  "designation": [
    {"language": "ar", "value": "باراسيتامول"}
  ]
}

// صحيح - display مطلوب
{
  "code": "N02BE01",
  "display": "باراسيتامول",  //  إلزامي
  "designation": [...]
}

❌ الخطأ 3: استخدام query string بدلاً من Parameters body

# خطأ - لن يعمل
curl "https://fhir-server/ValueSet/\$expand?useSupplement=http://example.org/..."

# صحيح - Parameters في الـ body
curl -X POST "https://fhir-server/ValueSet/\$expand" \
  -H "Content-Type: application/fhir+json" \
  -d '{
    "resourceType": "Parameters",
    "parameter": [
      {
        "name": "useSupplement",
        "valueCanonical": "http://example.org/..."
      }
    ]
  }'

❌ الخطأ 4: محاولة استخدام $lookup مع Supplement

# لن يعمل - $lookup لا يدعم useSupplement على Ontoserver 6.x
curl "https://fhir-server/CodeSystem/\$lookup?\
system=http://www.whocc.no/atc&\
code=N02BE01&\
useSupplement=http://example.org/..."

الحل: استخدم $expand بدلاً من $lookup عند الحاجة لـ Supplements.

❌ الخطأ 5: خلط اللغات في الـ designations

// خطأ - تحديد language بدون محتوى عربي
{
  "language": "ar",
  "value": "Paracetamol"  //  باللاتينية!
}

// صحيح
{
  "language": "ar",
  "value": "باراسيتامول"  //  بالعربية
}

قياس الأداء والتأثير

مقارنة الحلول

الحل الحوكمة سرعة التحديث الأداء التعقيد التقني التكلفة
تعديل ATC الأصلي مستحيل مستحيل ⚡⚡⚡ 💰
CodeSystem جديد كامل صعبة جدًا مستقل ⚡⚡ ⭐⭐⭐⭐ 💰💰💰💰
CodeSystem Supplement موزعة ✓ مستقل ✓ ⚡⚡⚡ ⭐⭐ 💰💰
ترجمة يدوية في التطبيق لا يوجد يدوي 💰💰💰

إحصائيات مستشفى الأمل بعد 6 أشهر

قبل تطبيق Supplement:

  • ❌ 85٪ من الوصفات معروضة بالإنجليزية
  • ❌ 32٪ أخطاء فهم من المرضى
  • ❌ 120 ساعة عمل سنويًا للترجمة اليدوية
  • ❌ تحديثات الترجمة تأخذ 2-3 أسابيع

بعد تطبيق Supplement:

  • ✅ 100٪ من الوصفات معروضة بالعربية
  • ✅ 19٪ أخطاء فهم (انخفاض 40٪)
  • ✅ 3 ساعات فقط للإعداد الأولي
  • ✅ تحديثات فورية (في نفس اليوم)
  • ✅ دعم 4 لهجات محلية
  • ✅ تكامل مع هيئة الدواء والغذاء

توفير التكاليف السنوي:

  • 🏥 توفير 95٪ من وقت الترجمة اليدوية
  • 🔧 صيانة أسهل (فصل المسؤوليات)
  • 📱 تطبيقات مرضى أفضل (رضا +35٪)

أفضل الممارسات

1. تسمية Supplements

استخدم اصطلاحات واضحة:

{codesystem}-supplement-{language}-{organization}

أمثلة:
- atc-supplement-ar-sa-moh        (وزاري)
- atc-supplement-ar-amal          (مؤسسي)
- snomed-supplement-ar-gulf       (إقليمي)
- loinc-supplement-ar-lab-nejd    (قسم محدد)

2. إدارة الإصدارات (Versioning)

{
  "version": "2.1.0",  // Semantic Versioning
  "date": "2025-05-20",
  "meta": {
    "tag": [{
      "system": "http://hospital-amal.sa/version-control",
      "code": "stable"
    }]
  }
}

الدلالات:

  • 1.0.0 → إصدار أولي
  • 1.1.0 → إضافة مفاهيم جديدة
  • 1.1.1 → تصحيح ترجمات
  • 2.0.0 → تغيير جذري (breaking change)

3. التوثيق الجيد

{
  "description": "ملحق عربي لتصنيف ATC يتضمن:
    - ترجمات فصحى للأسماء العلمية
    - أسماء مبسطة للمرضى
    - أسماء تجارية محلية شائعة
    - إرشادات الاستخدام بالعربية
    - حالة الموافقة من DAAD
    - موانع الاستعمال والتحذيرات
    
    آخر تحديث: 2025-05-20
    المسؤول: قسم المعلوماتية الصحية، مستشفى الأمل
    البريد: health-it@hospital-amal.sa",
  
  "contact": [
    {
      "name": "قسم المعلوماتية الصحية",
      "telecom": [{
        "system": "email",
        "value": "health-it@hospital-amal.sa"
      }]
    }
  ],
  
  "useContext": [
    {
      "code": {
        "system": "http://terminology.hl7.org/CodeSystem/usage-context-type",
        "code": "venue"
      },
      "valueCodeableConcept": {
        "text": "المستشفيات السعودية"
      }
    }
  ]
}

4. اختبار الجودة

def validate_supplement_quality(supplement):
    """التحقق من جودة الـ Supplement"""
    
    issues = []
    
    # 1. التحقق من وجود display لكل concept
    for concept in supplement.get('concept', []):
        if not concept.get('display'):
            issues.append(f"Missing display for code: {concept.get('code')}")
    
    # 2. التحقق من اللغة العربية
    for concept in supplement.get('concept', []):
        for designation in concept.get('designation', []):
            if designation.get('language', '').startswith('ar'):
                value = designation.get('value', '')
                if not any('\u0600' <= c <= '\u06FF' for c in value):
                    issues.append(f"Non-Arabic text in ar designation: {value}")
    
    # 3. التحقق من تعريف الخصائص
    defined_properties = {p['code'] for p in supplement.get('property', [])}
    for concept in supplement.get('concept', []):
        for prop in concept.get('property', []):
            if prop['code'] not in defined_properties:
                issues.append(f"Undefined property used: {prop['code']}")
    
    return {
        'valid': len(issues) == 0,
        'issues': issues,
        'concept_count': len(supplement.get('concept', [])),
        'property_count': len(supplement.get('property', []))
    }

# استخدام
result = validate_supplement_quality(my_supplement)
if result['valid']:
    print("✓ Supplement صالح للنشر")
else:
    print("✗ توجد مشاكل:")
    for issue in result['issues']:
        print(f"  - {issue}")

الخلاصة والتوصيات

متى تستخدم CodeSystem Supplement؟

استخدمه عندما:

  • ✅ تريد ترجمة مصطلحات موجودة لأي لغة
  • ✅ تحتاج إضافة خصائص محلية/مؤسسية
  • ✅ لا تملك صلاحية تعديل CodeSystem الأصلي
  • ✅ تحتاج حوكمة موزعة بين عدة جهات
  • ✅ تريد تحديثات مستقلة عن المصدر الأصلي
  • ✅ تحتاج دعم لهجات/متغيرات إقليمية

لا تستخدمه عندما:

  • ❌ تريد إضافة رموز جديدة (استخدم CodeSystem كامل)
  • ❌ CodeSystem الأصلي غير موجود في خادمك
  • ❌ تحتاج تعديل معنى الرموز الموجودة
  • ❌ الترجمة اليدوية أبسط لحالتك (< 10 رموز)

الخطوات التالية المقترحة

  1. مرحلة التخطيط (أسبوع واحد)
    • حدد المصطلحات التي تحتاج ترجمة (ATC, SNOMED, LOINC؟)
    • حدد نطاق العمل (كم رمز؟ أي لغات؟)
    • اجمع فريق: مصطلحات + IT + سريري
  2. مرحلة النموذج الأولي (أسبوعان)
    • ابدأ بـ 10-20 رمز فقط (الأكثر شيوعًا)
    • أنشئ Supplement بسيط
    • اختبره على Ontoserver التجريبي
    • اجمع feedback من الأطباء والمرضى
  3. مرحلة التوسع (شهر)
    • أضف 100-200 رمز إضافي
    • أضف خصائص مخصصة (إرشادات، موافقات)
    • اختبر الأداء والحمل
    • وثق العملية
  4. مرحلة الإنتاج (مستمرة)
    • انشر على الإنتاج
    • راقب الاستخدام والأخطاء
    • حدّث شهريًا
    • شارك مع المجتمع

موارد إضافية

الملاحظات والمراجع


الكلمات المفتاحية: FHIR, CodeSystem Supplement, ATC, الترجمة الطبية, المصطلحات الصحية, Ontoserver, SNOMED CT, LOINC, اللغة العربية, الصحة الرقمية, معيار HL7, Terminology Services, هيئة الدواء والغذاء

التصنيفات: المعلوماتية الصحية, المعايير الطبية, البرمجيات الطبية, FHIR

تاريخ آخر تحديث: 2026-05-20
الترخيص: CC BY 4.0

Share: X (Twitter) Facebook LinkedIn