<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>أحمد شريف | أوراكل أبيكس والذكاء الاصطناعي · مقالات، شروحات، وحيل برمجية</title><description>مدونة أحمد شريف: مقالات متقدمة في أوراكل أبيكس، هندسة البرمجيات، ووكلاء الذكاء الاصطناعي.</description><link>https://ash2osh.github.io/</link><language>ar</language><atom:link href="https://ash2osh.github.io/arabic-blog/rss.xml" rel="self" type="application/rss+xml"/><item><title>حفظ الثيمات على مستوى المؤسسة في Oracle APEX: قاعدة البيانات، الملفات الشخصية، والوميض الصفري 🏨🔐</title><link>https://ash2osh.github.io/arabic-blog/posts/028_enterprise-theme-persistence-in-oracle-apex/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/028_enterprise-theme-persistence-in-oracle-apex/</guid><description>الجزء السادس (مسك الختام) من سلسلة APEX Theme Factory. إزاي نربط تفضيلات الثيم بحساب المستخدم (:APP_USER) في قاعدة البيانات، واستدعاءات Ajax، وحقن الكلاس في الصفحة الأولى بدون وميض.</description><pubDate>Sun, 08 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/enterprise-theme-persistence-in-oracle-apex&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;حفظ-الثيمات-على-مستوى-المؤسسة-في-oracle-apex-قاعدة-البيانات-الملفات-الشخصية-والوميض-الصفري-&quot;&gt;حفظ الثيمات على مستوى المؤسسة في Oracle APEX: قاعدة البيانات، الملفات الشخصية، والوميض الصفري 🏨🔐&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء السادس (مسك الختام) من السلسلة التقنية الشاملة: الربط مع قاعدة البيانات والمزامنة الفورية في Oracle APEX.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;تخيل نزلت في فندق خمس نجوم عالمي في طوكيو، وموظف الاستقبال سلمك كارت غرفة ذكي لونه أسود في دهبي. أول ما حطيت الكارت على باب جناحك، الجناح الذكي حس بملفك الشخصي فوراً: الستاير فتحت لوحدها، والإضاءة خفتت لدرجة كهرمانية دافية، والتكييف اتظبط على 20 درجة مئوية، وموسيقى الجاز اشتغلت بهدوء في الخلفية!&lt;/p&gt;
&lt;p&gt;بعدها بأسبوعين، سافرت لندن ونزلت في نفس سلسلة الفنادق. أول ما مررت نفس الكارت على باب غرفتك في لندن.. في نفس اللحظة الغرفة اتظبطت بنفس درجات الإضاءة والتكييف والمزيكا اللي بتفضلها قبل ما تحط شنطتك على الأرض! مكنتش محتاج تظبط أي زرار من أول وجديد.&lt;/p&gt;
&lt;p&gt;التجربة المتناسقة دي هي بالضبط اللي بيستناها مستخدمين أنظمة الشركات والمؤسسات. التخزين المحلي في المتصفح &lt;code&gt;localStorage&lt;/code&gt; ممتاز لجهاز واحد، بس موظف الشركة بيتنقل بين كمبيوتر المكتب، واللابتوب في الاجتماعات، والتابلت في المخازن. وعايز ثيمه المفضل يفضل متسجل في هويته المؤسسية (&lt;code&gt;:APP_USER&lt;/code&gt;) في كل حتة.&lt;/p&gt;
&lt;p&gt;في مسك الختام لسلسلتنا &lt;strong&gt;APEX Theme Factory&lt;/strong&gt;، هنربط واجهات المستخدم الحديثة مع هندسة قاعدة بيانات أوراكل العميقة. هنتعلم إزاي نخزن تفضيلات المستخدمين عبر حزمة &lt;code&gt;APEX_UTIL.SET_PREFERENCE&lt;/code&gt;، ونعمل مزامنة سريعة في الخلفية بتقنية Ajax، ونحقق المعجزة: &lt;strong&gt;حقن الثيم من السيرفر بدون أي وميض أبيض (Zero-FOUC Hydration)&lt;/strong&gt; باستخدام عناصر التطبيق (Application Items). 🚀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;📦 &lt;strong&gt;مستودع كود المشروع:&lt;/strong&gt; كود المحرك، وحزم الثيمات، وسكربتات التثبيت متاحة بالكامل على &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-واقع-بيئات-الشركات-ليه-التخزين-المحلي-لوحده-ميكفيش&quot;&gt;🌐 واقع بيئات الشركات: ليه التخزين المحلي لوحده ميكفيش؟&lt;/h2&gt;
&lt;p&gt;في الجزأين الثالث والخامس من السلسلة اعتمدنا على &lt;code&gt;localStorage&lt;/code&gt; في المتصفح. للتشغيل على جهاز واحد، الحل ده مثالي وسريع جداً: صفر استهلاك لقاعدة البيانات، وصفر زمن تأخير شبكة، وسرعة تشغيل في أقل من 2 ميلي ثانية.&lt;/p&gt;
&lt;p&gt;لكن في بيئات العمل الحقيقية للشركات:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;التنقل بين الأجهزة&lt;/strong&gt;: الممرض في المستشفى بيسجل دخول على شاشة الاستقبال في عنبر أ، وبعدها بنصف ساعة بيسجل دخول على تابلت في عنبر ب. كود المتصفح المحلي ملوش أي وسيلة ينقل التفضيل بين جهازين منفصلين.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;بيئات الأجهزة الافتراضية (Citrix / VDI)&lt;/strong&gt;: بنوك كتير ومؤسسات حكومية بتشغل أنظمة VDI بتمسح ذاكرة التخزين المؤقت للمتصفح (Cache) بالكامل مع كل تسجيل خروج يومي للموظف.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التحكم والامتثال للمسؤولين&lt;/strong&gt;: فرق الدعم الفني وتكنولوجيا المعلومات مش بيعرفوا يفحصوا أو يفرضوا ثيمات مريحة لمتحدي الإعاقة البصرية لو التفضيلات محبوسة جوه هارد ديسك المستخدم.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;عشان نعمل نظام ثيمات مؤسسي بجد، لازم نربط تفضيل الثيم &lt;strong&gt;بملف المستخدم جوه قاعدة بيانات أوراكل&lt;/strong&gt;، مع الحفاظ على سرعة الرسم اللحظية.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-المعمارية-الهندسية-الجسر-المؤسسي-في-4-مراحل&quot;&gt;🗄️ المعمارية الهندسية: الجسر المؤسسي في 4 مراحل&lt;/h2&gt;
&lt;p&gt;المخطط ده بيوضح إزاي Theme Factory بيربط شاشات المتصفح مع سطور قاعدة بيانات أوراكل:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 1. تسجيل دخول المستخدم (:APP_USER)                      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│    إجراء ما بعد المصادقة يقرا التفضيل ويحطه في         │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│    عنصر التطبيق العام: &amp;amp;F_USER_THEME.                  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└───────────────────────────┬────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 2. الحقن المسبق من السيرفر (Server-Side Hydration)     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│    كود التمهيد في Page 0 يستلم &amp;amp;F_USER_THEME!ATTR.     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│    الصفحة بتوصل للمتصفح وهي جاهزة بالثيم المظلم فورا!  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└───────────────────────────┬────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 3. تفاعل المستخدم (اختيار ثيم جديد من الشاشة)          │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│    استدعاء window.ApexThemeFactory.use(&apos;carbon-volt&apos;)  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│    تحديث التخزين المحلي للسرعة الفورية على الجهاز      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└───────────────────────────┬────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 4. مزامنة الخلفية غير المتزامنة (Ajax Callback)        │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│    إرسال طلب صامت لإجراء PL/SQL في الصفحة رقم 0        │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│    حفظ الاختيار في الداتابيز عبر APEX_UTIL.SET_PREFERENCE│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-الخطوة-1-تخزين-التفضيل-في-قاعدة-بيانات-أوراكل&quot;&gt;🛠️ الخطوة 1: تخزين التفضيل في قاعدة بيانات أوراكل&lt;/h2&gt;
&lt;p&gt;أوراكل أبيكس بتقدّم محرك تفضيلات جاهز وفائق الأداء ومفهرس داخلياً من خلال حزمة &lt;code&gt;APEX_UTIL&lt;/code&gt;. المحرك ده بيعزل التفضيلات تلقائياً لكل تطبيق ولكل مستخدم:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- تجربة حفظ وقراءة تفضيل الثيم في ورشة العمل كالتالي:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BEGIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  -- حفظ تفضيل الثيم للمستخدم المسجل حالياً&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  apex_util&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;set_preference&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    p_preference &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;USER_THEME&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    p_value      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;carbon-volt&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    p_user       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :APP_USER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  -- قراءة التفضيل المخزن&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  dbms_output&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;put_line&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;الثيم المخزن في الداتابيز: &apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; apex_util&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;get_preference&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;USER_THEME&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, :APP_USER)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;END&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(ملحوظة: لو نظام شركتك بيعتمد على جداول مخصصة لحسابات المستخدمين مع شاشات رقابة وتدقيق، تقدر ببساطة تستبدل حزمة &lt;code&gt;apex_util&lt;/code&gt; بأمر تحديث صريح: &lt;code&gt;UPDATE app_user_profiles SET theme = ...&lt;/code&gt;).&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخطوة-2-إجراء-الـ-ajax-الصامت-في-الصفحة-0&quot;&gt;⚡ الخطوة 2: إجراء الـ Ajax الصامت في الصفحة 0&lt;/h2&gt;
&lt;p&gt;لما المستخدم يغير الثيم من شاشة الإعدادات، مش عايزين نعمل إعادة إرسال كاملة للصفحة (Full Page Submit) تلخبط موضع التمرير أو تقفل حقول مفتوحة. إحنا بنبعت طلب Ajax خفيف في الخلفية.&lt;/p&gt;
&lt;h3 id=&quot;خطوات-الإعداد-جوه-page-designer-كالتالي&quot;&gt;خطوات الإعداد جوه Page Designer كالتالي:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;افتح &lt;strong&gt;الصفحة رقم 0 (Global Page)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;تحت قسم &lt;strong&gt;Processing&lt;/strong&gt;، اضغط كليك يمين على &lt;strong&gt;Ajax Callback&lt;/strong&gt; واختار &lt;strong&gt;Create Process&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;اضبط الإجراء كالتالي:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الاسم&lt;/strong&gt;: &lt;code&gt;SET_USER_THEME_AJAX&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;كود الـ PL/SQL&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DECLARE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l_theme &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;VARCHAR2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; apex_application&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;g_x01&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BEGIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  -- التحقق من القائمة المعتمدة لمنع أي حقن برمجي غير مصرح به&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  IF&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l_theme &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;IN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;carbon-volt&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;citrus-pop&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;cobalt-press&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                 &apos;estate-slate&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;estate-slate-dark&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;linen&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                 &apos;solarized-dark&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;velvet-signal&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;iris&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;THEN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                 &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- حفظ التفضيل الرسمي في قاعدة بيانات أوراكل أبيكس&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_util&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;set_preference&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      p_preference &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;USER_THEME&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      p_value      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l_theme,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      p_user       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :APP_USER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- تحديث عنصر الجلسة الحالي عشان يفضل متطابق&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    :F_USER_THEME :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l_theme;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- إرجاع رسالة نجاح بصيغة JSON&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;open_object&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;status&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;SUCCESS&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;theme&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, l_theme);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;close_object&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  ELSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;open_object&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;status&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;ERROR&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;message&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;اسم الثيم غير مصرح به.&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;close_object&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  END&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; IF&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;EXCEPTION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  WHEN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OTHERS &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;THEN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;open_object&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;status&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;ERROR&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;message&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, SQLERRM);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_json&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;close_object&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;END&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;كود-الربط-في-ملفات-الـ-javascript-كالتالي&quot;&gt;كود الربط في ملفات الـ JavaScript كالتالي:&lt;/h3&gt;
&lt;p&gt;دلوقتي بنربط أداة تبديل الثيمات بحيث أول ما المستخدم ينادي دالة &lt;code&gt;use&lt;/code&gt;، نبعت طلب الـ Ajax الصامت ده:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// مزامنة اختيار الثيم مع قاعدة البيانات بدون مقاطعة المستخدم&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; persistThemeToDatabase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;themeName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typeof&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;undefined&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;apex.server) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  apex.server.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &quot;SET_USER_THEME_AJAX&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      x01: themeName&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      dataType: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;json&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;      success&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (data.status &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;SUCCESS&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          console.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;[Theme Factory] تم حفظ التفضيل بنجاح في قاعدة البيانات:&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, data.theme);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;      error&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;jqXHR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;textStatus&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;errorThrown&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        console.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;warn&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;[Theme Factory] تعذر الاتصال بالسيرفر للحفظ:&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, errorThrown);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخطوة-3-تجهيز-الجلسة-لحظة-تسجيل-الدخول&quot;&gt;🔑 الخطوة 3: تجهيز الجلسة لحظة تسجيل الدخول&lt;/h2&gt;
&lt;p&gt;لما المستخدم يفتح التطبيق من جهاز كمبيوتر جديد خالص، بيكون التخزين المحلي في المتصفح فاضي تماماً. إزاي نضمن إنه ميرجعش يشوف الشاشة البيضاء في أول لقطة؟&lt;/p&gt;
&lt;p&gt;بنقرا تفضيله من الداتابيز ونحطه في &lt;strong&gt;عنصر تطبيق عام (Application Item)&lt;/strong&gt; أثناء عملية تسجيل الدخول:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;في المكونات المشتركة (Shared Components)، أنشئ عنصر تطبيق جديد:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الاسم&lt;/strong&gt;: &lt;code&gt;F_USER_THEME&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;النطاق&lt;/strong&gt;: Application&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;في مخططات المصادقة (Authentication Schemes)، افتح المخطط النشط:
&lt;ul&gt;
&lt;li&gt;في خانة &lt;strong&gt;Post-Authentication Procedure Name&lt;/strong&gt;، ضيف الكود التالي:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;PROCEDURE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; post_auth_load_theme &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;IS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l_pref &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;VARCHAR2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BEGIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  -- قراءة التفضيل المسجل للمستخدم في قاعدة البيانات&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  l_pref :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; apex_util&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;get_preference&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;USER_THEME&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, :APP_USER);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  -- لو المستخدم ملوش تفضيل سابق بنخليه يفتح على ثيم Linen الافتراضي&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  :F_USER_THEME :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; coalesce&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(l_pref, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;linen&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;END&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; post_auth_load_theme;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-اللمسة-السحرية-حقن-السيرفر-الخالي-من-الوميض-تماماً&quot;&gt;🌟 اللمسة السحرية: حقن السيرفر الخالي من الوميض تماماً&lt;/h2&gt;
&lt;p&gt;ودلوقتي مع الضربة القاضية اللي بتجمع السلسلة المكونة من 6 أجزاء في سيمفونية واحدة متكاملة.&lt;/p&gt;
&lt;p&gt;بناخد كود التمهيد في الصفحة 0 اللي شرحناه في &lt;strong&gt;الجزء الثالث&lt;/strong&gt;، ونخليه يقرا عنصر التطبيق مباشرة عبر علامات استبدال أبيكس:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;&amp;lt;!-- APEX_THEME_FACTORY_MANAGED:BEGIN:BOOTSTRAP --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;window.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;APEX_THEME_FACTORY_CONFIG&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  appId: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;102&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  /* السيرفر بيعوض بقيمة الداتابيز مباشرة جوه ملف الـ HTML الأول! */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  defaultTheme: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&amp;amp;F_USER_THEME!ATTR.&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  switcherEnabled: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  themes: __THEMES_JSON__&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;doc&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;use strict&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; root &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; doc.documentElement;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; key &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;apex.themeFactory.&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; config.appId;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 1. استخدام الثيم المعتمد من الداتابيز واللي واصل في أول بايت من السيرفر&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; selected &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; config.defaultTheme &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;linen&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 2. استخدام التخزين المحلي لو المستخدم عدل حاجة أوفلاين&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; stored &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; window.localStorage.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getItem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(key);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (stored) { selected &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; stored; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (e) {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 3. تركيب كلاس الثيم على &amp;lt;html&amp;gt; في أقل من 2 ميلي ثانية قبل الرسم&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (selected &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; selected &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!==&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;iris&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    root.classList.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app-theme-&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; selected);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  root.dataset.appThemeCurrent &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; selected;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}(document, window.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;APEX_THEME_FACTORY_CONFIG&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;&amp;lt;!-- APEX_THEME_FACTORY_MANAGED:END:BOOTSTRAP --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ليه-الحركة-دي-بتمثل-قمة-النضج-الهندسي&quot;&gt;ليه الحركة دي بتمثل قمة النضج الهندسي؟&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;صفر وميض في أول زيارة من أي جهاز&lt;/strong&gt;: لما المستخدم يفتح التطبيق من جهاز آيباد جديد، حزمة الـ HTML اللي بتتبعت من سيرفر ORDS واصلة ومكتوب جواها مسبقاً &lt;code&gt;defaultTheme: &quot;carbon-volt&quot;&lt;/code&gt;. المتصفح بيلحق يركب الكلاس على &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; قبل ما محرك التفسير يوصل حتى لوسم الـ &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;استقرار فوري بدون إنترنت&lt;/strong&gt;: لو الاتصال قطع أو الموظف شغال في بيئة معزولة، التخزين المحلي بيكمل المسيرة بسلاسة تامة.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;صفر تكلفة صيانة مستقبلية&lt;/strong&gt;: كل الشغل محطوط بأمان في الصفحة 0 وملفات الـ CSS. شاشاتك وتقاريرك وجداولك وبرمجياتك الأساسية بتفضل نظيفة وسليمة 100%!&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-ختام-السلسلة-الشاملة-وملخص-الرحلة&quot;&gt;🏁 ختام السلسلة الشاملة وملخص الرحلة&lt;/h2&gt;
&lt;p&gt;على مدار المقالات الستة دي، سافرنا سوا من عشوائية التنسيقات التقليدية الملحومة، لحد ما بنينا محرك تصميم عالمي يليق بكبرى الشركات:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الجزء 1: بدلة الحرباء&lt;/strong&gt; — الهروب من قيود Theme Roller وبناء حزم ثيمات مستقلة فوق Universal Theme 42.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الجزء 2: قلعة العزل الحصينة&lt;/strong&gt; — معمارية التوكنز ثلاثية الطبقات، حماية الحركة بأعلى أسبقية تنسيق، وإنقاذ أيقونات Font APEX.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الجزء 3: سر الوميض الصفري&lt;/strong&gt; — القضاء التام على وميض الشاشات المزعج في أقل من 2 ميلي ثانية وتغطية النوافذ المنبثقة.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الجزء 4: ماكينة الحزم المحمولة&lt;/strong&gt; — تجميع خطوط WOFF2 بدون اعتمادات خارجية، والترقيع الذري لملفات APEXLang مع أمان التراجع.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الجزء 5: بناء محول الثيمات&lt;/strong&gt; — اعتراض قائمة Navigation Bar، والتحكم في روابط الـ Hash، وتصميم أزرار Alpine.js العصرية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الجزء 6: حفظ الثيمات على مستوى المؤسسة&lt;/strong&gt; — ربط التفضيلات بحساب المستخدم في الداتابيز عبر &lt;code&gt;APEX_UTIL&lt;/code&gt; والحقن السحابي الخالي من الوميض.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;دلوقتي معاك الكتالوج الهندسي الكامل لبناء، ونشر، وصيانة أنظمة تصميم استثنائية في أوراكل أبيكس تدوم لسنين بدون تراكم أي ديون برمجية. انطلق وابنِ برمجيات مبهرة تسعد مستخدميك! 🚀&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;ابدأ مع APEX Theme Factory الآن:&lt;/strong&gt; تقدر تعمل Clone للمستودع، وتجرب الثيمات الجاهزة (&lt;code&gt;carbon-volt&lt;/code&gt;، &lt;code&gt;iris-dark&lt;/code&gt;، وغيرها)، وتستخدم أداة التثبيت الآلية:
🔗 &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;https://github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>أنظمة التصميم و APEX Theme Factory</category><category>oracle-apex</category><category>plsql</category><category>database</category><category>security</category><category>arabic</category></item><item><title>بناء أداة تبديل الثيمات المخصصة في Oracle APEX: ودجز الواجهة، Alpine.js، وعناصر النماذج 🎛️✨</title><link>https://ash2osh.github.io/arabic-blog/posts/027_building-a-custom-theme-switcher-in-oracle-apex/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/027_building-a-custom-theme-switcher-in-oracle-apex/</guid><description>الجزء الخامس من سلسلة APEX Theme Factory. إزاي نبني أداة تبديل ثيمات حديثة، واستخدام روابط الـ Hash لتفادي أخطاء الـ Checksum، وربط مكونات Alpine.js وعناصر نماذج أبيكس.</description><pubDate>Sat, 07 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/building-a-custom-theme-switcher-in-oracle-apex&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;بناء-أداة-تبديل-الثيمات-المخصصة-في-oracle-apex-ودجز-الواجهة-alpinejs-وعناصر-النماذج-️&quot;&gt;بناء أداة تبديل الثيمات المخصصة في Oracle APEX: ودجز الواجهة، Alpine.js، وعناصر النماذج 🎛️✨&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الخامس من السلسلة التقنية الشاملة: تصميم عناصر التحكم وتطوير واجهات المستخدم التفاعلية في Oracle APEX.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;تخيل راكب عربية كهربائية رياضية فخمة وسريعة جداً، وعايز تحول وضع القيادة من الوضع الاقتصادي الهادي لوضع الحلبات الرياضي فائق السرعة. بدل ما تلاقي شاشة لمس زجاجية مضيئة وشيك في التابلوه، لقيت صانع العربية حاطط لك بكرة راديو ترانزستور قديمة من بتوع التمانينات تحت درج التابلوه وبتزيق مع كل لفة!&lt;/p&gt;
&lt;p&gt;ده الإحساس اللي بيوصل لمستخدمين تطبيقات الشركات لما تحط لهم أداة تبديل ثيمات عشوائية. القائمة المنسدلة في شريط التنقل العلوي (Navigation Bar) كويسة وشغالة، بس المستخدمين دلوقتي مستنيين عناصر تحكم بصرية حديثة ومريحة: بطاقات ملونة في صفحة الملف الشخصي، وأزرار كبسولات تفاعلية (Pills)، وعناصر نماذج قياسية جوه شاشات الإعدادات.&lt;/p&gt;
&lt;p&gt;في الجزء الخامس من سلسلتنا &lt;strong&gt;APEX Theme Factory&lt;/strong&gt;، هنستلم قمرة القيادة في واجهة المستخدم. هنشرح بالتفصيل محرك الجافاسكريبت &lt;code&gt;window.ApexThemeFactory&lt;/code&gt;، ونكتشف إزاي روابط الـ Hash بتحمينا من أخطاء الـ Checksum في روابط أبيكس الذكية (Friendly URLs)، ونعترض ودجت القوائم الرسمية في أبيكس، ونبني أزرار حديثة باستخدام &lt;strong&gt;Alpine.js 3.x&lt;/strong&gt; وعناصر نماذج أبيكس القياسية. 🚀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;📦 &lt;strong&gt;مستودع كود المشروع:&lt;/strong&gt; كود المحرك، وحزم الثيمات، وسكربتات التثبيت متاحة بالكامل على &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-استكشاف-كود-windowapexthemefactory&quot;&gt;🕹️ استكشاف كود &lt;code&gt;window.ApexThemeFactory&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;لما كود التمهيد بيشتغل في الصفحة رقم 0، بيثبت كائن تحكم برمجي خفيف ومحمي على الكائن العام &lt;code&gt;window&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* واجهة التحكم البرمجية في المتصفح */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;window.ApexThemeFactory &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Object.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;freeze&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // بيرجع اسم الثيم النشط حالياً (زي &apos;carbon-volt&apos; أو &apos;linen&apos;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  current&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; () { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // بيرجع مصفوفة بكل الثيمات المثبتة في التطبيق مع عناوينها&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  choices&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; () { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // بيفعل الثيم المطلوب ويحدث التخزين المحلي وينضف رابط الصفحة ويعيد التحميل&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  use&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;تقدر تفتح نافذة المطورين في المتصفح وتجرب الأوامر دي بنفسك:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 1. شوف إيه الثيم النشط دلوقتي&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;console.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(window.ApexThemeFactory.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;current&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// النتيجة: &quot;linen&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 2. اعرض كل الثيمات المتاحة في جدول منظم&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;console.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;table&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(window.ApexThemeFactory.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;choices&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 3. بدل لثيم Carbon Volt بلمسة واحدة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;window.ApexThemeFactory.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;carbon-volt&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;لما بتنادي الدالة &lt;code&gt;window.ApexThemeFactory.use(&apos;carbon-volt&apos;)&lt;/code&gt;، المحرك بينفذ الخطوات التالية:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;بيتحقق إن اسم الثيم موجود فعلاً في قائمة الثيمات المصرح بها في التطبيق.&lt;/li&gt;
&lt;li&gt;بيسجل الاختيار في التخزين المحلي: &lt;code&gt;localStorage.setItem(&apos;apex.themeFactory.102&apos;, &apos;carbon-volt&apos;)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;لو المستخدم اختار الثيم الافتراضي للنظام (زي &lt;code&gt;linen&lt;/code&gt;)، الكود &lt;strong&gt;بيمسح المفتاح&lt;/strong&gt; من الـ &lt;code&gt;localStorage&lt;/code&gt;، عشان لو مدير النظام غير الثيم الافتراضي بعد أسبوع، المستخدم ياخد التحديث الجديد فوراً!&lt;/li&gt;
&lt;li&gt;بينضف أي زوائد &lt;code&gt;#theme=&lt;/code&gt; من رابط المتصفح ويعيد تحميل الصفحة بنعومة.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-سر-روابط-الـ-hash-والحماية-من-أخطاء-الـ-checksum&quot;&gt;🛡️ سر روابط الـ Hash والحماية من أخطاء الـ Checksum&lt;/h2&gt;
&lt;p&gt;ليه Theme Factory بيدعم تبديل الثيمات عبر الهاش &lt;code&gt;#theme=carbon-volt&lt;/code&gt; بدل استخدام المعاملات العادية زي &lt;code&gt;?theme=carbon-volt&lt;/code&gt;؟&lt;/p&gt;
&lt;p&gt;أي مطور اشتغل مع روابط أبيكس الذكية الحديثة (Friendly URLs) عارف شاشة الخطأ الشهيرة دي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;HTTP 400 Bad Request&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&quot;The request could not be processed because the checksum is invalid.&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;في أوراكل أبيكس، خاصية &lt;strong&gt;حماية حالة الجلسة (Session State Protection - SSP)&lt;/strong&gt; بتنشئ توقيع تشفيري (Checksum) لكل المعاملات اللي بتتبعت في الرابط. لو ضفت معامل جديد زي &lt;code&gt;?theme=dark&lt;/code&gt; من غير ما تكون مشفره من السيرفر، محرك أبيكس بيرفض الطلب فوراً باعتباره محاولة اختراق أمني!&lt;/p&gt;
&lt;h3 id=&quot;حل-الهاش-السحري-في-جهة-العميل&quot;&gt;حل الهاش السحري في جهة العميل:&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;https://mycorp.com/ords/r/demo/ut/dashboard#theme=carbon-volt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                            ▲&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                            └── هاش محلي جوه المتصفح فقط&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;أجزاء الـ Hash في الرابط (أي حاجة بعد علامة &lt;code&gt;#&lt;/code&gt;) &lt;strong&gt;مبتتبعتش للسيرفر أو قاعدة البيانات إطلاقاً&lt;/strong&gt;! المتصفح بيحتفظ بيها جواه فقط.&lt;/p&gt;
&lt;p&gt;كود التمهيد في الصفحة رقم 0 بيقرا الهاش ده محلياً قبل ما يقرا التخزين المحلي. بكده فرق الدعم والمبيعات والتسويق يقدروا يبعتوا روابط مباشرة بتفتح شاشات معينة بثيم محدد وبدون أي خطأ Checksum على الإطلاق!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-اعتراض-قائمة-الـ-navigation-bar-الأصلية-في-أبيكس&quot;&gt;🪄 اعتراض قائمة الـ Navigation Bar الأصلية في أبيكس&lt;/h2&gt;
&lt;p&gt;لو ثبت حزم الثيمات بخيار &lt;code&gt;--with-switcher&lt;/code&gt;، إزاي Theme Factory بيحول عنصر شريط التنقل لقائمة راديو متفاعلة؟&lt;/p&gt;
&lt;p&gt;الكود بيستمع لحدث رسمي بيطلقه الثيم الموحد لما يجهز اسمه &lt;code&gt;theme42ready.apexThemeFactory&lt;/code&gt;. ولما الحدث ده يحصل، بيعترض القائمة الداخلية ويحولها لقائمة خيارات راديو (Radio Group) متصلة بواجهة الـ API كالآتي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* كود اعتراض القائمة من الملف theme-factory-runtime.js */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;apex.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;jQuery&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(window)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  .&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;off&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;theme42ready.apexThemeFactory&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  .&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;theme42ready.apexThemeFactory&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $ &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex.jQuery;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; button &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;.t-NavigationBar-item.theme-factory-managed-switcher [data-menu]&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;first&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; menu &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; button.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; button.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;attr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;data-menu&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;menu.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // حقن مجموعة راديو تفاعلية جوه ودجت قائمة أبيكس الرسمية!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    menu.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;menu&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;option&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;items&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      type: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;radioGroup&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      get: window.ApexThemeFactory.current,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      set: window.ApexThemeFactory.use,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      choices: window.ApexThemeFactory.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;choices&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;الحركة دي بتحول القائمة العادية لقائمة راديو ذكية، عليها علامة صح جنب الثيم المختار حالياً، ومتوافقة 100% مع لوحة المفاتيح ومعايير إمكانية الوصول لذوي الاحتياجات الخاصة!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-النمط-الأول-أزرار-كبسولات-حديثة-باستخدام-alpinejs-3x&quot;&gt;🎨 النمط الأول: أزرار كبسولات حديثة باستخدام Alpine.js 3.x&lt;/h2&gt;
&lt;p&gt;عايز تبني واجهة شيك وعصرية جوه شاشة الملف الشخصي للمستخدم؟ تقدر تعمل أزرار كبسولات (Pills) تفاعلية باستخدام مكتبة &lt;strong&gt;Alpine.js 3.x&lt;/strong&gt; جوه منطقة محتوى ثابت في أبيكس:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;&amp;lt;!-- حط الكود ده جوه Static Content Region في شاشة إعدادات المستخدم أو الملف الشخصي --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; x-data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;themePicker()&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app-theme-picker&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app-theme-picker__label&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;تخصيص المظهر البصري:&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app-theme-picker__group&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;template&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; x-for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;theme in themes&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; :key&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;theme.value&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;button&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app-theme-picker__pill&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        :class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;{ &apos;is-active&apos;: currentTheme === theme.value }&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        @click&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;switchTheme(theme.value)&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app-theme-picker__indicator&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; :data-theme&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;theme.value&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; x-text&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;theme.label&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;template&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; themePicker&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    currentTheme: window.ApexThemeFactory &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; window.ApexThemeFactory.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;current&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;iris&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    themes: window.ApexThemeFactory &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; window.ApexThemeFactory.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;choices&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    switchTheme&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;themeName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.currentTheme &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; themeName) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      this&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.currentTheme &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; themeName;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      window.ApexThemeFactory.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(themeName);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;وحط كود الـ CSS المنسق ده في خانة &lt;strong&gt;Inline CSS&lt;/strong&gt; الخاصة بالصفحة:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-picker&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  padding&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;rem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  background&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-surface-card&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border-radius&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-radius-md&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-picker__label&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  display&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;block&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-font-weight-semibold&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  margin-bottom&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.75&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;rem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-text-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-picker__group&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  display&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;flex&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  flex-wrap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wrap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  gap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;rem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-picker__pill&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  display&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;inline-flex&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  align-items&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  gap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;rem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  padding&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;rem&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;rem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  background&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-surface-input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-text-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border-radius&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;9999&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  cursor&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;pointer&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  transition&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;all&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-motion-duration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ease&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-picker__pill:hover&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-hover-transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-border-strong&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-picker__pill.is-active&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-color-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  background&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-surface-selected&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-font-weight-semibold&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-picker__indicator&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  width&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  height&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border-radius&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  background&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-color-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-النمط-الثاني-عناصر-نماذج-أبيكس-الرسمية-والأوامر-الديناميكية&quot;&gt;📋 النمط الثاني: عناصر نماذج أبيكس الرسمية والأوامر الديناميكية&lt;/h2&gt;
&lt;p&gt;لو بتفضل مكونات أوراكل أبيكس القياسية من غير مكتبات إضافية، تقدر تبرمج قائمة منسدلة أو مجموعة أزرار راديو في &lt;strong&gt;3 خطوات سهلة&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الخطوة 1: أنشئ عنصر جديد جوه الصفحة:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - الاسم: P10_THEME_SELECTOR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - النوع: Select List (أو Radio Group)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - نوع القيم: Static Values&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - كود القيم الثابتة:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;           STATIC:Carbon Volt;carbon-volt,Citrus Pop;citrus-pop,Solarized Dark;solarized-dark,Linen;linen,Iris;iris&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الخطوة 2: اضبط القيمة الافتراضية (Default Value) كالتالي:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - النوع: JavaScript Expression&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - الكود: window.ApexThemeFactory ? window.ApexThemeFactory.current() : &apos;iris&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الخطوة 3: أضف أمر ديناميكي (Dynamic Action) عند التغيير:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - الحدث: Change&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - الإجراء: Execute JavaScript Code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - الكود:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;           window.ApexThemeFactory.use(this.data);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;أول ما المستخدم يختار أي قيمة، الأمر الديناميكي بينادي دالة &lt;code&gt;use&lt;/code&gt; تلقائياً بدون ما تشغل بالك بتفاصيل التخزين!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-المقال-القادم-حفظ-الثيمات-على-مستوى-قاعدة-البيانات&quot;&gt;⏭️ المقال القادم: حفظ الثيمات على مستوى قاعدة البيانات&lt;/h2&gt;
&lt;p&gt;التخزين في المتصفح &lt;code&gt;localStorage&lt;/code&gt; حل ممتاز وسريع جداً. بس في أنظمة الشركات الضخمة، الموظف بيتنقل طول اليوم بين كمبيوتر المكتب، واللابتوب في الاجتماع، والتابلت في المخزن. ومستني إن التطبيق يفتكر ثيمه المفضل وراه في كل جهاز يسجل دخول منه!&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء السادس والأخير من السلسلة&lt;/strong&gt; (مسك الختام!)، هنتعلم &lt;strong&gt;حفظ الثيمات على مستوى المؤسسة&lt;/strong&gt;: ربط التفضيلات بحساب المستخدم (&lt;code&gt;:APP_USER&lt;/code&gt;) في قاعدة البيانات، واستدعاءات Ajax المباشرة، وحقن الكلاس في الصفحة الأولى بدون وميض وبسرعة البرق! 🏨🔐🚀&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;ابدأ مع APEX Theme Factory الآن:&lt;/strong&gt; تقدر تعمل Clone للمستودع، وتجرب الثيمات الجاهزة (&lt;code&gt;carbon-volt&lt;/code&gt;، &lt;code&gt;iris-dark&lt;/code&gt;، وغيرها)، وتستخدم أداة التثبيت الآلية:
🔗 &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;https://github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>أنظمة التصميم و APEX Theme Factory</category><category>oracle-apex</category><category>javascript</category><category>alpinejs</category><category>ui-design</category><category>arabic</category></item><item><title>ماكينة الحزم المحمولة: ملفات الـ ZIP المعزولة وترقيع APEXLang التلقائي 📦⚙️</title><link>https://ash2osh.github.io/arabic-blog/posts/026_the-portable-package-machine-apexlang-theme-installer/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/026_the-portable-package-machine-apexlang-theme-installer/</guid><description>الجزء الرابع من سلسلة APEX Theme Factory. إزاي بنجمع الثيمات في حزم ZIP معزولة مع دعم كامل لـ PowerShell وإصداري أوراكل أبيكس 26.1 و 26.2، وترقيع APEXLang بدقة ذرية، وضمانات التراجع التلقائي بدون فقدان البيانات.</description><pubDate>Fri, 06 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-portable-package-machine-apexlang-theme-installer&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;ماكينة-الحزم-المحمولة-ملفات-الـ-zip-المعزولة-وترقيع-apexlang-التلقائي-️&quot;&gt;ماكينة الحزم المحمولة: ملفات الـ ZIP المعزولة وترقيع APEXLang التلقائي 📦⚙️&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الرابع من السلسلة التقنية الشاملة: أتمتة التوزيع، حزم الـ ZIP، والترقيع الذري في Oracle APEX.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;تخيل طلبت مكتب خشب زان مريح ومتحرك من إيكيا السويد، والكرتونة وصلت لحد باب بيتك في كرتونة مضغوطة مقفولة بإحكام. فتحت العلبة: لقيت ألواح الخشب متخرمة بالليزر، وكل مسمار معدني له رقم، ومعاهم مفتاح ألن خاص، وكتالوج التركيب عليه استيكر أمان فسفوري ضد التلاعب!&lt;/p&gt;
&lt;p&gt;مش محتاج تنزل تشتري مسامير ناقصة من السبتية، ومش محتاج تفتح يوتيوب عشان تدور على فيديو هندي بيشرح التركيب. كل حاجة محتاجها عشان تركب المكتب—أو تفكه كله وترجعه في الكرتونة لو مطلعش على مقاس أوضتك—موجودة جوه نفس الصندوق المقفول.&lt;/p&gt;
&lt;p&gt;ده الإحساس اللي المفروض تحسه لما توزع نظام تصميم في بيئات الشركات. لكن في تطوير أوراكل أبيكس التقليدي، لما تحب تنقل ثيم بين 10 تطبيقات، بتلاقي نفسك بتنقل أكواد عشوائية من ملفات وورد، وبترفع ملفات CSS يدوي، وتدعي ربنا إن مفيش حد نسي رابط الخطوط، وتفضل مرعوب من اليوم اللي هتطلب منك فيه الإدارة تشيل الثيم ده!&lt;/p&gt;
&lt;p&gt;في الجزء الرابع من سلسلتنا &lt;strong&gt;APEX Theme Factory&lt;/strong&gt;، هندخل مصنع التجميع: &lt;strong&gt;ماكينة الحزم المحمولة&lt;/strong&gt;. هنتعلم إزاي الثيمات بتتحول لملفات ZIP معزولة بالكامل، وإزاي بايثون وتنسيق &lt;strong&gt;APEXLang&lt;/strong&gt; بيعدلوا ملفات تصدير APEX 26.1 بنعومة بدون لمس كود البزنس، وإزاي صممنا شبكة أمان تكشف أي تضارب وتعمل تراجع كامل وفوري بضغطة زر واحدة. 🚀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;📦 &lt;strong&gt;مستودع كود المشروع:&lt;/strong&gt; كود المحرك، وحزم الثيمات، وسكربتات التثبيت متاحة بالكامل على &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-تشريح-حزمة-الثيم-المحمولة&quot;&gt;📦 تشريح حزمة الثيم المحمولة&lt;/h2&gt;
&lt;p&gt;جوه مشروع &lt;code&gt;APEX_THEME_FACTORY&lt;/code&gt;، كل ثيم بيتجمع في ملف أرشيف مضغوط ومستقل بذاته تماماً:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dist/carbon-volt/carbon-volt-1.1.0.zip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── install.sh                  # سكريبت التثبيت لأنظمة لينكس وماك (بايثون 3.10+)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── install.ps1                 # سكريبت التثبيت لأنظمة ويندوز (PowerShell) مع كشف بايثون&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── uninstall.sh                # سكريبت الحذف الذاتي لأنظمة لينكس وماك مع التحقق من السلامة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── uninstall.ps1               # سكريبت الحذف الذاتي لأنظمة ويندوز (PowerShell)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── restore.sh                  # سكريبت استرجاع الطوارئ بضغطة واحدة (لينكس وماك)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── restore.ps1                 # سكريبت استرجاع الطوارئ لأنظمة ويندوز (PowerShell)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── theme.json                  # بيانات وهوية الثيم الرسمية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── theme.recipe.json           # وصفة القياسات والحركات من الإصدار v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── MANUAL-INSTALL.md           # دليل التثبيت اليدوي في Page Designer لو معندكش شل&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── css/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── theme.css               # نقطة الدخول المجمعة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── tokens.css              # المتغيرات المعزولة (html.app-theme-carbon-volt)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── apex/                   # ملفات المكونات (الأزرار، الحقول، النوافذ)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── fonts/                      # خطوط WOFF2 ذاتية الاستضافة بالكامل&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── licenses/                   # الرخص القانونية للخطوط ورخصة المشروع (MIT)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── preview/cover.jpg           # صورة المعاينة بدقة 960 بكسل&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── lib/theme_factory/          # محرك APEXLang الداخلي (بدون pip install خالص!)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;الضمانات-الثلاث-الأساسية-للحزمة&quot;&gt;الضمانات الثلاث الأساسية للحزمة:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;صفر اعتماد على شبكات الإنترنت الخارجية (Zero CDN)&lt;/strong&gt;:
كتير من أنظمة الشركات والبنوك والمؤسسات الحكومية شغالة على شبكات داخلية معزولة تماماً عن الإنترنت (Air-gapped Networks). لو ربطت خطوط Google Fonts أو سيرفر خارجي، الشاشات هتعلق وتفتح ببطء شديد. كل حزمة عندنا بتحتوي على خطوط WOFF2 الأصلية بتاعتها، وتم التحقق من سلامتها بتوقيع بايتات &lt;code&gt;wOF2&lt;/code&gt; الرسمي.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;محرك تشغيل مدمج بالكامل&lt;/strong&gt;:
المجلد المضغوط جواه مكتبة البايثون المساعدة الخاصة بيه في مجلد &lt;code&gt;lib/&lt;/code&gt;. مش هتحتاج تسطب بايثون فيرتشوال إنفيرومنت، ولا هتحتاج تعمل &lt;code&gt;pip install&lt;/code&gt; لأي مكتبة على سيرفر الداتابيز.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;بصمات تشفير SHA-256 لمنع التلاعب&lt;/strong&gt;:
كل ملف جوه الحزمة بيتحسب له كود هاش تشفيري. لو ملف اتقطع أثناء التحميل أو اتعدل بالغلط، أداة التثبيت بتكشف ده فوراً وترفض تلمس قاعدة البيانات.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الترقيع-التلقائي-لملفات-apexlang-بدون-تخريب&quot;&gt;🤖 الترقيع التلقائي لملفات APEXLang بدون تخريب&lt;/h2&gt;
&lt;p&gt;إزاي أداة التثبيت بتعدل تطبيق أوراكل أبيكس من غير ما تلخبط الشاشات أو تعطل كود البزنس؟&lt;/p&gt;
&lt;p&gt;في إصداري &lt;strong&gt;Oracle APEX 26.1&lt;/strong&gt; و &lt;strong&gt;26.2&lt;/strong&gt;، أصبح تصدير التطبيقات بيتم بتنسيق جديد اسمه &lt;strong&gt;APEXLang&lt;/strong&gt;—وده تنسيق تركيبي واضح بيحول ملف الـ SQL القديم لملفات هيكلية منظمة شبه الـ YAML (&lt;code&gt;application.apx&lt;/code&gt;, &lt;code&gt;theme.apx&lt;/code&gt;, &lt;code&gt;pages/page_00000.apx&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;أداة التثبيت بتنفذ مسار عمل جراحي دقيق بيتكون من &lt;strong&gt;6 مراحل في خط التثبيت&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│                        مسار التثبيت المحمي بالكامل                     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└──────────────────────────────────┬─────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 1. فحص المتطلبات: إصدار APEX 26.1 أو 26.2 وثيم 42 ونمط Iris (رمز خروج 3)│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└──────────────────────────────────┬─────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 2. التصدير والتجهيز: تصدير التطبيق لمجلد مؤقت بتنسيق APEXLang           │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└──────────────────────────────────┬─────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 3. الترقيع الهيكلي: إضافة مسارات الـ CSS ومنطقتي التمهيد في Page 0      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└──────────────────────────────────┬─────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 4. فحص الانحراف (Drift): التأكد إن مفيش مطور عدل التطبيق في نفس اللحظة  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└──────────────────────────────────┬─────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 5. النسخ الاحتياطي الذري: حفظ نسخة كاملة جوه theme-factory-backups/    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└──────────────────────────────────┬─────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                   ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 6. الاستيراد والتحقق: استيراد التطبيق والتحقق من كلاسات الـ DOM المباشرة│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└────────────────────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;الأماكن-اللي-الأداة-بتعدلها-تحديداً&quot;&gt;الأماكن اللي الأداة بتعدلها تحديداً:&lt;/h3&gt;
&lt;p&gt;التعديل دقيق ومحدود ومحسوب بالمسطرة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الملفات الثابتة للتطبيق (Static Files)&lt;/strong&gt;: بيتم رفع الملفات تحت مسار منظم &lt;code&gt;#APP_FILES#theme-factory/packages/&amp;lt;name&amp;gt;/&amp;lt;version&amp;gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;روابط ملفات الـ CSS&lt;/strong&gt;: بيتم حقن رابط ملف الـ &lt;code&gt;theme.css&lt;/code&gt; جوه خصائص واجهة المستخدم في &lt;code&gt;application.apx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;مناطق الصفحة 0 (Page 0 Regions)&lt;/strong&gt;: بيتم حقن المنطقتين بتوع التمهيد (&lt;code&gt;theme_factory_bootstrap&lt;/code&gt; و &lt;code&gt;theme_factory_bootstrap_dialog&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;شريط التنقل (Navigation Bar)&lt;/strong&gt;: لو اخترت خيار &lt;code&gt;--with-switcher&lt;/code&gt;، بيتم إضافة عناصر قائمة ثابتة للتبديل.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;الأداة &lt;strong&gt;لا تلمس إطلاقاً&lt;/strong&gt; جداولك، ولا استعلامات الـ SQL، ولا إجراءات الـ PL/SQL، ولا صلاحيات الأمان الخاصة بنظامك!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-شبكة-الأمان-وأكواد-الخروج-exit-codes&quot;&gt;🛡️ شبكة الأمان وأكواد الخروج (Exit Codes)&lt;/h2&gt;
&lt;p&gt;الأداة مصممة بنظام أمان صارم مستوحى من أنظمة التشغيل الحرجة:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;كود الخروج&lt;/th&gt;
&lt;th&gt;سبب التوقف&lt;/th&gt;
&lt;th&gt;رد فعل الأداة&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;نجاح تام&lt;/td&gt;
&lt;td&gt;تمت العملية بنجاح (أو انتهت التجربة الجافة بدون أخطاء).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;عدم تطابق المتطلبات&lt;/td&gt;
&lt;td&gt;بتوقف فوراً لو إصدار أبيكس مش 26.1 أو 26.2 أو الثيم مش Iris.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;انحراف الداتابيز (Drift)&lt;/td&gt;
&lt;td&gt;بتوقف لو مطور تاني عدل في التطبيق أثناء تجهيز التثبيت.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;فشل التحقق في SQLcl&lt;/td&gt;
&lt;td&gt;خطأ في تجميع ملفات التصدير، وقاعدة البيانات بتفضل سليمة.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;عدم تطابق ما بعد الاستيراد&lt;/td&gt;
&lt;td&gt;التحقق النهائي أثبت إن النتيجة مش مطابقة لما تم تجهيزه.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;إلغاء المستخدم&lt;/td&gt;
&lt;td&gt;المستخدم كتب رقم تطبيق غلط وقت التأكيد اليدوي.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;درع-أمان-التطبيقات-متعددة-اللغات---discard-translations&quot;&gt;درع أمان التطبيقات متعددة اللغات (&lt;code&gt;--discard-translations&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;معلومة تقنية دقيقة ومهمة جداً لبيئات الشركات الكبيرة: استيراد تطبيقات أوراكل أبيكس القياسي عبر &lt;code&gt;SQLcl&lt;/code&gt; بيمسح النصوص المترجمة (Translated Application Strings) لو التطبيق متعدد اللغات. عشان كدة أداة التثبيت بتفحص التطبيق المستهدف بدقة وقت الفحص المبدئي (Preflight).&lt;/p&gt;
&lt;p&gt;لو لقت التطبيق فيه نصوص مترجمة، الأداة &lt;strong&gt;بترفض تكمل فوراً&lt;/strong&gt; وبتقفل كإجراء أمان صارم لحماية بياناتك، إلا لو المطور حدد خيار &lt;code&gt;--discard-translations&lt;/code&gt; صراحة. والتطبيقات اللي محتاجة تحافظ على ترجماتها كاملة بدون فقدان بتتبع خطوات التثبيت اليدوي المشروحة في ملف &lt;code&gt;MANUAL-INSTALL.md&lt;/code&gt;. بالإضافة لكدة، ولأن أداة &lt;code&gt;SQLcl&lt;/code&gt; تاريخياً بتُرجع أحياناً كود خروج &lt;code&gt;0&lt;/code&gt; حتى لو حصل خطأ داخلي في الاستيراد، أداة التثبيت بتتحقق بنفسها من رمز النجاح الرسمي الصادر من أوراكل قبل ما تعتمد أي تسجيل!&lt;/p&gt;
&lt;h3 id=&quot;تشغيل-التجربة-الجافة-الآمنة-dry-run&quot;&gt;تشغيل التجربة الجافة الآمنة (Dry Run):&lt;/h3&gt;
&lt;p&gt;بشكل افتراضي، تشغيل أمر &lt;code&gt;./install.sh&lt;/code&gt; (أو &lt;code&gt;.\install.ps1&lt;/code&gt; على أنظمة ويندوز) من غير ما تديله خيار &lt;code&gt;--apply&lt;/code&gt; بيعمل تجربة جافة 100%:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# تشغيل تجربة جافة على لينكس / ماك (مش بيكتب ولا بايت واحد جوه الداتابيز)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;./install.sh&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --connection&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker-demo&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --workspace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DEMO&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --app-id&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 102&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;powershell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# تشغيل تجربة جافة على ويندوز عبر PowerShell&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.\install.ps1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Connection docker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;demo &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Workspace DEMO &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;AppId &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;102&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;الأداة بتصدر التطبيق في الذاكرة، وتركب التعديلات، وتعمل تحقق كامل في SQLcl، وتطبع لك تقرير مفصل بكل حاجة كانت هتحصل:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[Dry-Run] Target APEX Application: 102 (Universal Theme 26.1 Reference)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[Dry-Run] Verified: APEX 26.1.4, Theme 42, Style Iris&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[Dry-Run] Static files to register: 8 files (theme.css, tokens.css, fonts...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[Dry-Run] Page 0 Regions to inject: 2 regions (Standard Banner + Modal Position 01)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[Dry-Run] Backup destination: ./theme-factory-backups/DEMO-102/20261103T120000Z/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[Dry-Run] Result: All validations PASSED. Re-run with --apply to commit.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;وفقط لما تكتب خيار &lt;code&gt;--apply&lt;/code&gt; صراحة، الأداة بتطلب منك تكتب رقم التطبيق للتأكيد، وبتاخد نسخة احتياطية غير قابلة للتعديل قبل ما تعمل الاستيراد النهائي.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-التراجع-التام-بدون-بقايا-أمر-الاسترجاع-الذري&quot;&gt;🔄 التراجع التام بدون بقايا: أمر الاسترجاع الذري&lt;/h2&gt;
&lt;p&gt;لو في أي وقت قررت تحذف ثيم، مش هتحتاج تدور على الملفات يدوي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# حذف آمن ومعتمد على سجل التثبيت التشفيري (لينكس / ماك)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;./uninstall.sh&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --connection&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker-demo&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --workspace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DEMO&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --app-id&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 102&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --apply&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;powershell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# حذف آمن عبر PowerShell على ويندوز&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.\uninstall.ps1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Connection docker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;demo &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Workspace DEMO &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;AppId &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;102&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Apply&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;سكريبت الحذف بيقرا ملف &lt;code&gt;registry.json&lt;/code&gt;، ويتحقق من كود الـ SHA-256 لكل ملف. لو لقى مطور عدل في ملف بإيده جوه أبيكس، &lt;strong&gt;بيرفض يحذفه&lt;/strong&gt; عشان ميضيعش مجهوده!&lt;/p&gt;
&lt;p&gt;وعندك كمان زرار الطوارئ الكامل لاسترجاع التطبيق بضغطة واحدة لأقرب نسخة احتياطية زي ما كان قبل التثبيت بالثانية:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# استرجاع فوري بضغطة واحدة على لينكس / ماك&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;./restore.sh&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --connection&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker-demo&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --workspace&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DEMO&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --app-id&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 102&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --backup&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ./theme-factory-backups/DEMO-102/20261103T120000Z&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --apply&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --discard-later-changes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;powershell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# استرجاع فوري بضغطة واحدة على ويندوز عبر PowerShell&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.\restore.ps1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Connection docker&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;demo &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Workspace DEMO &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;AppId &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;102&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; `&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Backup .\theme&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;factory&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;backups\DEMO&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;102&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;\20261103T120000Z &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Apply &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;DiscardLaterChanges&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-بيئات-العمل-المعزولة-دليل-manual-installmd&quot;&gt;🏢 بيئات العمل المعزولة؟ دليل &lt;code&gt;MANUAL-INSTALL.md&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;لو شغال في بنك أو جهة حكومية بتمنع تشغيل سكريبتات بايثون أو استخدام SQLcl من أجهزة المطورين:
كل حزمة بتيجي مع ملف اسمه &lt;strong&gt;&lt;code&gt;MANUAL-INSTALL.md&lt;/code&gt;&lt;/strong&gt; جواه &lt;strong&gt;3 خطوات بسيطة&lt;/strong&gt; من شاشة الـ App Builder في المتصفح:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الخطوة 1: ارفع ملفات الثيم الثابتة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         ادخل على Shared Components -&amp;gt; Static Application Files.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         اضغط Upload Files وارفع محتويات مجلدي /css و /fonts.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الخطوة 2: ضيف رابط ملف الـ CSS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         ادخل على Shared Components -&amp;gt; User Interface Attributes.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         في خانة CSS File URLs ضيف:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         #APP_FILES#theme-factory/packages/carbon-volt/1.1.0/theme.css&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الخطوة 3: أنشئ منطقة تمهيد في الصفحة 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         افتح Page 0 واعمل Static Content Region في موضع #BANNER#.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         وحط كود التمهيد المتزامن من ملف bootstrap.html.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;سواء اخترت الأتمتة الكاملة بالـ CLI أو الشغل اليدوي بالماوس في المتصفح، النتيجة النهائية واحدة وشغالة بنفس الكفاءة!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-المقال-القادم-بناء-أداة-تبديل-الثيمات-المخصصة&quot;&gt;⏭️ المقال القادم: بناء أداة تبديل الثيمات المخصصة&lt;/h2&gt;
&lt;p&gt;دلوقتي الثيمات بقت متثبتة بنجاح جوه التطبيق. بس المستخدمين إزاي هيبدلوا بين الثيمات دي في واجهة الاستخدام؟&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الخامس من السلسلة&lt;/strong&gt;، هنتعلم &lt;strong&gt;بناء أداة تبديل الثيمات المخصصة&lt;/strong&gt;: هنغوص جوه واجهة برمجة &lt;code&gt;window.ApexThemeFactory&lt;/code&gt;، ونعترض قائمة Navigation Bar الرسمية في أبيكس، ونتعلم إزاي روابط Hash بتحمينا من أخطاء الـ Friendly URLs، ونبني أزرار حديثة باستخدام Alpine.js! 🎛️🚀&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;ابدأ مع APEX Theme Factory الآن:&lt;/strong&gt; تقدر تعمل Clone للمستودع، وتجرب الثيمات الجاهزة (&lt;code&gt;carbon-volt&lt;/code&gt;، &lt;code&gt;iris-dark&lt;/code&gt;، وغيرها)، وتستخدم أداة التثبيت الآلية:
🔗 &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;https://github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>أنظمة التصميم و APEX Theme Factory</category><category>oracle-apex</category><category>devops</category><category>automation</category><category>python</category><category>arabic</category></item><item><title>سر الوميض الصفري: القضاء على الفلاش الأبيض بتمهيد Page 0 في Oracle APEX ⚡🎭</title><link>https://ash2osh.github.io/arabic-blog/posts/025_the-zero-flicker-secret-apex-pre-paint-bootstrap/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/025_the-zero-flicker-secret-apex-pre-paint-bootstrap/</guid><description>الجزء الثالث من سلسلة APEX Theme Factory. إزاي نقضي تماماً على الوميض الأبيض المزعج في النمط المظلم باستخدام كود تمهيد متزامن في Page 0 وحل لغز النوافذ المنبثقة.</description><pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-zero-flicker-secret-apex-pre-paint-bootstrap&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;سر-الوميض-الصفري-القضاء-على-الفلاش-الأبيض-بتمهيد-page-0-في-oracle-apex-&quot;&gt;سر الوميض الصفري: القضاء على الفلاش الأبيض بتمهيد Page 0 في Oracle APEX ⚡🎭&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الثالث من السلسلة التقنية الشاملة: تسريع الأداء ومنع وميض الشاشات المزعج في Oracle APEX.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;تخيل رايح تحضر العرض الأول لمسرحية غامضة ومرعبة في دار الأوبرا، والجمهور قاعد في الصالة في هدوء وظلام تام مستني العرض يبدأ. فجأة، عامل المسرح يشد الستارة المخملية التقيلة قبل ما يظبط الإضاءة.. والمسرح كان كحل!&lt;/p&gt;
&lt;p&gt;بعدها بثانيتين، يقوم طاقم العمال ضارب كشافات نيون بيضاء عملاقة بقوة 50,000 شمعة في وشوش الجمهور مباشرة، وبعدين يجروا يركبوا جيلاتين أزرق وداكن على الكشافات عشان يعملوا الجو المرعب! الصدمة دي بتعمي عيون الجمهور وتجيب لهم صداع نصفي قبل ما الممثلين ينطقوا كلمة واحدة!&lt;/p&gt;
&lt;p&gt;الصدمة البصرية دي هي بالظبط اللي بيعاني منها مستخدمين نظامك لما تعمل ثيم داكن باستخدام الأوامر الديناميكية (Dynamic Actions) أو أكواد &lt;code&gt;$(document).ready()&lt;/code&gt;. المتصفح بيرسم خلفية نمط Iris البيضاء الناصعة الأول، ويستنى الصفحة تخلص تحميل، وبعدين يشغل كود الجافاسكريبت عشان يقلب الصفحة سودة! النتيجة؟ وميض أبيض مؤلم للعين لمدة 200 ميلي ثانية مع كل دوسة ماوس!&lt;/p&gt;
&lt;p&gt;في الجزء التالت من سلسلتنا &lt;strong&gt;APEX Theme Factory&lt;/strong&gt;، هنقضي على الوميض المزعج (FOUC) للأبد. هنتعلم &lt;strong&gt;سر الوميض الصفري&lt;/strong&gt;: إزاي بنحقن سطر كود متزامن فائق الخفة في &lt;strong&gt;الصفحة 0 (Page 0)&lt;/strong&gt; بيظبط إضاءة المشهد في أقل من 2 ميلي ثانية قبل ما المتصفح يرسم أول بكسل على الشاشة، ومع تغطية كاملة للصفحات العادية والنوافذ المنبثقة (Modal Dialogs) معاً. 🚀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;📦 &lt;strong&gt;مستودع كود المشروع:&lt;/strong&gt; كود المحرك، وحزم الثيمات، وسكربتات التثبيت متاحة بالكامل على &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-التشريح-الدقيق-للوميض-المزعج-fouc&quot;&gt;⚡ التشريح الدقيق للوميض المزعج (FOUC)&lt;/h2&gt;
&lt;p&gt;عشان نفهم ليه أساليب التبديل التقليدية بتعمل فلاش ووميض مزعج، لازم نبص على مسار المعالجة والرسم جوه المتصفح (Critical Rendering Path):&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;❌ كابوس الوميض غير المتزامن (Dynamic Actions / document.ready)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;───────────────────────────────────────────────────────────────────────────&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. طلب الصفحة GET /ords/r/demo/ut/dashboard&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. استلام ملف الـ HTML وتطبيق الـ CSS الافتراضي (خلفية Iris فاتحة #fbf9f8)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3. 💥 الرسم الأول (First Paint): المتصفح يرسم الشاشة باللون الأبيض الناصع!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4. اكتمال بناء شجرة الصفحة (DOMContentLoaded)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5. تشغيل كود JavaScript: قراءة التفضيل وإضافة كلاس .app-theme-carbon-volt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;6. 🔄 إعادة الرسم (Second Paint): المتصفح يعيد الحسابات ويقلب الشاشة داكنة (#12151c)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;── المدة الإجمالية للوميض: من 150 لـ 350 ميلي ثانية بتخطف البصر ──────────&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✅ سر الوميض الصفري في Theme Factory (تشغيل متزامن في Page 0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;───────────────────────────────────────────────────────────────────────────&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. طلب الصفحة GET /ords/r/demo/ut/dashboard&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. المتصفح يقابل كود التمهيد المتزامن فوراً في Page 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3. ⚡ كود سريع في أقل من 2 ميلي ثانية يقرا التفضيل ويحط الكلاس على &amp;lt;html&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4. المتصفح يكمل قراءة باقي الصفحة والكلاس الداكن راكب بالفعل&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5. 🎨 الرسم الأول (First Paint): المتصفح يرسم النمط المظلم مباشرة من أول فريم!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;لما بتعتمد على إعداد &lt;strong&gt;Execute when Page Loads&lt;/strong&gt; أو الأوامر الديناميكية في Page Designer، كودك بيتنفذ في الخطوة رقم 5، بعد ما المتصفح يكون رسم الشاشة بالكامل باللون الأبيض في الخطوة 3!&lt;/p&gt;
&lt;p&gt;عشان نمنع الوميض ده بدون ما نحمل على السيرفر، لازم الكود بتاعنا يتنفذ &lt;strong&gt;بشكل متزامن (Synchronously)&lt;/strong&gt; أثناء قراءة الـ HTML وقبل أول لقطة رسم للمتصفح.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-محرك-التمهيد-السريع-2-ميلي-ثانية&quot;&gt;📜 محرك التمهيد السريع (2 ميلي ثانية)&lt;/h2&gt;
&lt;p&gt;في Theme Factory بنستخدم سطر تمهيد خفيف ومجرب وموجود جوه القالب الرسمي للمشروع في الملف &lt;code&gt;installer/templates/bootstrap.html.tmpl&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;&amp;lt;!-- APEX_THEME_FACTORY_MANAGED:BEGIN:BOOTSTRAP --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;window.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;APEX_THEME_FACTORY_CONFIG&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  appId: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;102&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  defaultTheme: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;linen&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  switcherEnabled: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  themes: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;carbon-volt&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Carbon Volt&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;citrus-pop&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Citrus Pop&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;solarized-dark&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Solarized Dark&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;linen&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Linen&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;doc&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  &quot;use strict&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; root &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; doc.documentElement;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; key &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;apex.themeFactory.&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; config.appId;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; allowed &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;iris&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;concat&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(config.themes.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;theme&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; theme.name; }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; selected &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; config.defaultTheme;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (config.switcherEnabled) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    try&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      selected &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; window.localStorage.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getItem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(key) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; selected;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      /* مسح أي قيم قديمة أو محذوفة من التخزين المحلي */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (allowed.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;indexOf&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(selected) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        window.localStorage.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;removeItem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(key);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        selected &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; config.defaultTheme;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (e) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      /* معالجة وضع التصفح الخفي في سفاري */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      selected &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; config.defaultTheme;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  /* إزالة أي كلاس ثيم قديم وإضافة الكلاس المعتمد الحالي */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  Array&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;prototype&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.slice.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(root.classList).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (name.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;indexOf&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app-theme-&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) { root.classList.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;remove&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(name); }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (selected &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!==&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;iris&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    root.classList.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app-theme-&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; selected); &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  root.dataset.appThemeDefault &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; config.defaultTheme;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  root.dataset.appThemeCurrent &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; selected;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}(document, window.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;APEX_THEME_FACTORY_CONFIG&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;&amp;lt;!-- APEX_THEME_FACTORY_MANAGED:END:BOOTSTRAP --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ليه-السطر-ده-خارق-ومحصن-من-الأخطاء&quot;&gt;ليه السطر ده خارق ومحصن من الأخطاء؟&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;بدون أي مكتبات خارجية&lt;/strong&gt;: بيعتمد على جافاسكريبت أصلي خام (Pure Vanilla ES5). مش بيستنى jQuery ولا دوال أبيكس ولا ملفات الخطوط.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;سرعة التنفيذ&lt;/strong&gt;: في كل الاختبارات القياسية على كروم وفايرفوكس وسفاري، زمن تشغيل الكود ده بيتراوح بين &lt;strong&gt;0.8 ميلي ثانية إلى 1.8 ميلي ثانية&lt;/strong&gt; فقط!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تنظيف التخزين التلقائي&lt;/strong&gt;: لو المستخدم كان مخزن ثيم قديم تم حذفه من التطبيق، الكود بيمسح المفتاح التالف تلقائياً ويرجع للثيم الافتراضي &lt;code&gt;config.defaultTheme&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;حماية وضع التصفح الخفي (Safari Private Browsing)&lt;/strong&gt;: في متصفح سفاري بالوضع الخاص، محاولة الوصول لـ &lt;code&gt;localStorage&lt;/code&gt; أحياناً بترمي خطأ أمني (&lt;code&gt;QUOTA_EXCEEDED_ERR&lt;/code&gt;). كود الـ &lt;code&gt;try/catch&lt;/code&gt; بيعالج ده بسلاسة ويشغل الثيم الافتراضي بدون أي توقف.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الفخ-الخفي-في-النوافذ-المنبثقة-modal-dialogs&quot;&gt;🎭 الفخ الخفي في النوافذ المنبثقة (Modal Dialogs)&lt;/h2&gt;
&lt;p&gt;ودلوقتي مع اللغز اللي بيوقع 99% من مطوري أبيكس لما يركبوا كود تمهيد في الشاشات.&lt;/p&gt;
&lt;p&gt;المطور بيفتح &lt;strong&gt;Page 0 (Global Page)&lt;/strong&gt; ويعمل منطقة محتوى ثابت (Static Content Region) ويحط فيها الكود، ويختار موضع القالب:
&lt;code&gt;#BANNER#&lt;/code&gt; (أو رأس الصفحة Top of Page).&lt;/p&gt;
&lt;p&gt;يجرب الشاشات والتقارير الرئيسية العادية.. يلاقي النمط المظلم شغال بدون وميض وبسرعة الصاروخ، ويفرح جداً!&lt;/p&gt;
&lt;p&gt;وفجأة، مستخدم يدوس على زرار يفتح &lt;strong&gt;نافذة منبثقة (Modal Dialog)&lt;/strong&gt; عشان يعدل بيانات عميل..&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;بوم!&lt;/strong&gt; 💥 شاشة بيضاء بتنفجر في وشه كأن فلاش كاميرا ضرب في عينيه!&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  قالب الصفحات العادية في Universal Theme 42            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  [#HEADER#]                                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  [#BANNER#]  &amp;lt;-- الكود بيتنفذ بنجاح والصفحة بتتلون     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  [#BODY#]                                              │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  قالب النوافذ المنبثقة (Modal Dialog Page)             │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  [#HEADER#]                                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  منفذ #BANNER# غير موجود أصلاً في قالب النوافذ!        │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  [#BODY#]                                              │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  النتيجة: الكود مش بيتنفذ خالص والنافذة بتفضل بيضاء!   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;السر في Universal Theme 42 هو إن &lt;strong&gt;قوالب النوافذ المنبثقة (Modal Dialogs) لا تحتوي على الموضع &lt;code&gt;#BANNER#&lt;/code&gt; إطلاقاً!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;وبما إن النافذة المنبثقة بتشتغل جوه إطار مستقل (&lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;) وله جذر وثيقة خاص بيه، لو الكود محطوط في &lt;code&gt;#BANNER#&lt;/code&gt; بس، النافذة مش هتاخد كلاس الثيم أبداً وهتفتح بيضاء زي اللوح!&lt;/p&gt;
&lt;h3 id=&quot;الحل-الهندسي-حقن-متزامن-في-موضعين-مكملين&quot;&gt;الحل الهندسي: حقن متزامن في موضعين مكملين&lt;/h3&gt;
&lt;p&gt;في Theme Factory بنحل المعضلة دي بإنشاء &lt;strong&gt;منطقتين في الصفحة 0&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;معرف المنطقة&lt;/th&gt;
&lt;th&gt;موضع القالب المختار&lt;/th&gt;
&lt;th&gt;نوع القالب المستهدف&lt;/th&gt;
&lt;th&gt;الدور والغرض&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;theme_factory_bootstrap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#BANNER#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;قوالب الصفحات العادية&lt;/td&gt;
&lt;td&gt;يغطي الشاشات والتقارير الرئيسية&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;theme_factory_bootstrap_dialog&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#REGION_POSITION_01#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;قوالب النوافذ المنبثقة&lt;/td&gt;
&lt;td&gt;يغطي كل النوافذ المنبثقة والـ Wizards&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;المنطقتين شايلين نفس كود التمهيد. لما الصفحة ترن:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;لو صفحة عادية: موضع &lt;code&gt;#BANNER#&lt;/code&gt; بيتنفذ وموضع الحوار بيكون خامل.&lt;/li&gt;
&lt;li&gt;لو نافذة منبثقة: موضع &lt;code&gt;#REGION_POSITION_01#&lt;/code&gt; بيتنفذ فوراً جوه الـ iframe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;تغطية شاملة بنسبة 100%، وبدون أي وميض أبيض في أي بكسل في التطبيق!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-طريقة-التركيب-اليدوي-جوه-page-designer&quot;&gt;🛡️ طريقة التركيب اليدوي جوه Page Designer&lt;/h2&gt;
&lt;p&gt;لو عايز تركب الكود ده يدوي جوه شاشة تصميم الصفحات في أوراكل أبيكس:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الخطوة 1: افتح الصفحة رقم 0 (Shared Components -&amp;gt; Global Page).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الخطوة 2: أنشئ منطقة جديدة (Create Region):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - العنوان: Theme Factory Bootstrap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - النوع: Static Content&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - القالب: Blank with Attributes (بدون قالب خارجي)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - موضع التخطيط: Region Position 01 (أو Banner حسب الصفحة)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الخطوة 3: حط كود الـ &amp;lt;script&amp;gt; في مربع Source HTML.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الخطوة 4: في خانة شروط السيرفر (Server-side Condition) كالتالي:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - خليها None (يعني المنطقة تشتغل دايماً في كل الصفحات).&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(ملحوظة: لو بتستخدم أداة التثبيت الآلية بالأوامر اللي هنشرحها في &lt;strong&gt;الجزء الرابع&lt;/strong&gt;، الأداة بتبرمج المنطقتين تلقائياً وبدون أي تدخل يدوي منك!)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-المقال-القادم-ماكينة-الحزم-المحمولة&quot;&gt;⏭️ المقال القادم: ماكينة الحزم المحمولة&lt;/h2&gt;
&lt;p&gt;دلوقتي عندنا قلعة CSS حصينة، وتمهيد فوري بيقضي على الوميض في أقل من 2 ميلي ثانية. بس السؤال: إزاي نجمع الكلام ده كله في حزمة واحدة يقدر أي مطور يثبتها بضغطة زر في 50 تطبيق في ثواني؟&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الرابع من السلسلة&lt;/strong&gt;، هنشرح &lt;strong&gt;ماكينة الحزم المحمولة&lt;/strong&gt;: ملفات ZIP المعزولة، وإدارة خطوط WOFF2 بدون اعتمادات خارجية، وتعديل ملفات APEXLang بضمانات التراجع الذري! 📦🚀&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;ابدأ مع APEX Theme Factory الآن:&lt;/strong&gt; تقدر تعمل Clone للمستودع، وتجرب الثيمات الجاهزة (&lt;code&gt;carbon-volt&lt;/code&gt;، &lt;code&gt;iris-dark&lt;/code&gt;، وغيرها)، وتستخدم أداة التثبيت الآلية:
🔗 &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;https://github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>أنظمة التصميم و APEX Theme Factory</category><category>oracle-apex</category><category>javascript</category><category>performance</category><category>webdev</category><category>arabic</category></item><item><title>قلعة العزل الحصينة: إزاي html.app-theme-* بيقضي على فوضى الـ CSS في Oracle APEX 🏰🛡️</title><link>https://ash2osh.github.io/arabic-blog/posts/024_the-scoping-fortress-eliminating-apex-css-collisions/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/024_the-scoping-fortress-eliminating-apex-css-collisions/</guid><description>الجزء الثاني من سلسلة APEX Theme Factory. إزاي نبني قلعة عزل محكمة باستخدام كلاسات html.app-theme-* ونتحكم في المتغيرات بدون !important ونتجنب فخ مسح أيقونات Font APEX.</description><pubDate>Wed, 04 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-scoping-fortress-eliminating-apex-css-collisions&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;قلعة-العزل-الحصينة-إزاي-htmlapp-theme--بيقضي-على-فوضى-الـ-css-في-oracle-apex-️&quot;&gt;قلعة العزل الحصينة: إزاي html.app-theme-* بيقضي على فوضى الـ CSS في Oracle APEX 🏰🛡️&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الثاني من السلسلة التقنية الشاملة: هندسة متغيرات الـ CSS وعزل النطاق في Oracle APEX.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;تخيل عمارة سكنية فخمة فيها 100 شقة، والمهندس العبقري اللي بناها قرر يوفر تكاليف الأسلاك، فعمل مفتاح كهرباء عمومي واحد كبير في مدخل العمارة تحت! جه الساكن اللي في شقة 4B حب يقرا كتاب الساعة 2 بعد منتصف الليل، فنزل داس على المفتاح العمومي.. وفجأة: أنوار الديسكو ولعت، وخلاطات المطابخ اشتغلت، ورشاشات الحريق رشت مياه على كل السكان في الـ 100 شقة في نفس اللحظة!&lt;/p&gt;
&lt;p&gt;دي بالضبط المأساة اللي بتحصل لما تكتب أكواد CSS عامة أو تعدل متغيرات الـ &lt;code&gt;:root&lt;/code&gt; في &lt;strong&gt;Oracle APEX&lt;/strong&gt;. بتكون فاكر إنك بتعدل حواف جدول تقارير تفاعلي في شاشة جدول التقارير التفاعلي، فتتفاجئ إنك بوظت ألوان النوافذ المنبثقة (Modal Dialogs) وقوائم التنقل في الشاشة الرئيسية!&lt;/p&gt;
&lt;p&gt;في الجزء التاني من سلسلتنا &lt;strong&gt;APEX Theme Factory&lt;/strong&gt;، هنبني &lt;strong&gt;قلعة العزل الحصينة&lt;/strong&gt;. هنتعلم إزاي نبني هيكل متغيرات CSS ثلاثي الطبقات معزول تماماً تحت كلاس &lt;code&gt;html.app-theme-&amp;lt;name&amp;gt;&lt;/code&gt;، ونتحكم في أسبقية التنسيق (Specificity) من غير ولا علامة &lt;code&gt;!important&lt;/code&gt; واحدة، ونحمي تجربة الاستخدام بحاجز تقليل الحركة، ونتفادى الفخ القاتل اللي بيمسح أيقونات Font APEX ويحولها لمربعات مكسورة. 🚀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;📦 &lt;strong&gt;مستودع كود المشروع:&lt;/strong&gt; كود المحرك، وحزم الثيمات، وسكربتات التثبيت متاحة بالكامل على &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-كارت-الشقة-الذكي-ليه-الـ-css-العام-بيخرب-أنظمة-الشركات&quot;&gt;🏢 كارت الشقة الذكي: ليه الـ CSS العام بيخرب أنظمة الشركات؟&lt;/h2&gt;
&lt;p&gt;في بيئات عمل أوراكل أبيكس، المطورين كتير بيقعوا في فخ كتابة أكواد زي دي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* ❌ مفتاح المدخل العمومي: الكود اللي بيدمر نظامك بالبطيء */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;:root&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-body-background-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#12151c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* بيبوظ النوافذ المنبثقة */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Inter&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !important&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* بيمسح أيقونات Font APEX تماماً */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.t-Button&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border-radius&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;9999&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !important&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* بيكسر الأزرار الصغيرة ومجموعات الأزرار */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;أول ما الكود ده يوصل لسيرفر الإنتاج (Production)، بتحصل كوارث فورية:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;النوافذ المنبثقة بتبقى غير مقروءة&lt;/strong&gt;: النافذة بتاخد خلفية داكنة من الـ &lt;code&gt;:root&lt;/code&gt;، بس النصوص والأزرار بتفضل بلونها الافتراضي، فتلاقي خطوط بيضاء أو رصاصي فاتح على أسطح رمادية وتختفي القراءة تماماً.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;أيقونات Font APEX بتتبخر&lt;/strong&gt;: لأن النجمة &lt;code&gt;*&lt;/code&gt; بتستهدف كل عنصر في الصفحة مع &lt;code&gt;!important&lt;/code&gt;، خط الأيقونات بيتغير لخط الكتابة العادي، وتتحول كل أيقونات البحث والحذف لمربعات Unicode فارغة ومكسورة!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;كوابيس الترقية&lt;/strong&gt;: لما أوراكل تنزل إصدار جديد، أكواد &lt;code&gt;!important&lt;/code&gt; بتاعتك بتصطدم مع الهيكل الجديد، وتضيع أيام طويلة في ترقيع الشاشات.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;تعالوا نشوف إزاي بنهندس قلعة العزل الذكية بدون أي تضارب.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-معمارية-التوكنز-ثلاثية-الطبقات&quot;&gt;🪜 معمارية التوكنز ثلاثية الطبقات&lt;/h2&gt;
&lt;p&gt;في Theme Factory بنقسم متغيرات الـ CSS لـ 3 طبقات أساسية ومستقلة:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  الطبقة 1: الذرات الأصلية لنمط Iris (--ut-*, --a-*)    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  (الأساس المتين والقابل للقراءة من Universal Theme 42) │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└───────────────────────────┬────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            │ يتم تغليفه بواسطة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  الطبقة 2: متغيرات التطبيق الدلالية (--app-*)          │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  (أدوار مجردة: أسطح، نصوص، حواف، إطارات التركيز)      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└───────────────────────────┬────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            │ يتم استهلاكه بواسطة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  الطبقة 3: حزم الثيمات المعزولة (html.app-theme-&amp;lt;name&amp;gt;)│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│  (ألوان محددة: Carbon Volt، Citrus Pop، Linen)         │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;1-المتغيرات-الأساسية-foundationtokenscss&quot;&gt;1. المتغيرات الأساسية (&lt;code&gt;foundation/tokens.css&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;في ملف الأساس، بنعلن عن كل أدوار الـ &lt;code&gt;--app-*&lt;/code&gt; على مستوى الـ &lt;code&gt;:root&lt;/code&gt; عبر ربطها بمتغيرات Iris الأصلية:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* ملف الأساس: الربط مع قيم Iris الافتراضية */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;:root&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-color-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:     &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--ut-palette-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-surface-page&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:      &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--ut-body-background-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-surface-card&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:      &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--ut-component-background-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-surface-chrome&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:    &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--ut-header-background-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-text-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:      &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--ut-body-text-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-text-secondary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:    &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--ut-component-text-muted-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:      &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--ut-component-border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-radius-md&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:         &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--ut-border-radius-md&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-control-h&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:         &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;rem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-motion-duration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:   &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ms&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-hover-transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:   &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;translateY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-فروقات-حزمة-الثيم-sample-themescarbon-voltcsstokenscss&quot;&gt;2. فروقات حزمة الثيم (&lt;code&gt;sample-themes/carbon-volt/css/tokens.css&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;لما ثيم زي &lt;strong&gt;Carbon Volt&lt;/strong&gt; يشتغل، هو بيغير بس قيم &lt;code&gt;--app-*&lt;/code&gt; تحت الكلاس الخاص بيه فقط:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* حزمة الثيم المعزولة: ثيم Carbon Volt */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  color-scheme&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;dark&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  /* مساحات وأسطح الشاشات */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-surface-page&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:      &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#12151c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-surface-card&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:      &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#1a1e28&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-surface-chrome&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:    &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#0d0f14&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-surface-input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:     &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#141720&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-surface-hover&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:     &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#222735&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-surface-selected&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:  &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#2a3142&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  /* النصوص وألوان التمييز */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-text-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:      &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#f0f2f5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-text-secondary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:    &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#8e96a4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-color-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:     &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#c4f042&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* أخضر ليموني كهربائي */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-color-info&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:        &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#00d4ff&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* أزرق سماوي للبيانات */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  /* الحواف والإطارات */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:      &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;rgba&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;255&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;255&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;255&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.08&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-border-strong&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:     &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;rgba&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;255&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;255&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;255&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.22&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-radius-sm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:         &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-radius-md&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:         &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;لاحظ وجود السطر &lt;code&gt;color-scheme: dark;&lt;/code&gt;. السطر ده سحري لأنه بيدي إشارة لمحرك المتصفح إنه يقلب أشرطة التمرير (Scrollbars)، وتحديدات حقول الإدخال، وتقويمات التواريخ للوضع المظلم تلقائياً بدون أي أكواد إضافية.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إعادة-تعيين-ذرات-iris-الأصلية-بدون-important&quot;&gt;🎯 إعادة تعيين ذرات Iris الأصلية بدون &lt;code&gt;!important&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;إزاي نخلي مكونات أبيكس القياسية (زي البطاقات والجداول والحاويات) تاخد المتغيرات دي بنعومة ومن غير خناقات الـ &lt;code&gt;!important&lt;/code&gt;؟&lt;/p&gt;
&lt;p&gt;الثيم الموحد Universal Theme 42 بيعتمد على المتغيرات. لما بنعيد ربط المتغيرات دي على محدد &lt;code&gt;body.apex-theme-iris&lt;/code&gt; جوه نطاق الثيم بتاعنا، بنغير القيم الأساسية ونسمح لكلاسات أبيكس الجاهزة (&lt;code&gt;.t-Button--hot&lt;/code&gt;, &lt;code&gt;.u-color-1&lt;/code&gt;) إنها تفضل شغالة بأولويتها الطبيعية:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* إعادة توجيه متغيرات مكونات Iris بأمان جوه ثيم Carbon Volt */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt; body&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.apex-theme-iris&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  /* مساحات الحاويات والصفحات */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-body-background-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:       &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-surface-page&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-component-background-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:  &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-surface-card&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-component-border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:      &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  /* ألوان النصوص */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-body-text-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:             &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-text-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-component-text-title-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:  &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-text-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-component-text-muted-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:  &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-text-secondary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  /* اللون الأساسي وإطار التركيز */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-palette-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:             &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-color-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-focus-outline-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:         &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-color-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-درع-إمكانية-الوصول-حماية-تقليل-الحركة-بأعلى-أسبقية-تنسيق&quot;&gt;♿ درع إمكانية الوصول: حماية تقليل الحركة بأعلى أسبقية تنسيق&lt;/h2&gt;
&lt;p&gt;في أنظمة الشركات الكبرى، معايير إمكانية الوصول (Accessibility) إلزامية قانونياً وتقنياً. المستخدمين اللي بيعانوا من حساسية الحركة أو مشاكل التوازن ممكن يتعبوا جداً من الحركات والتأثيرات الانتقالية السريعة.&lt;/p&gt;
&lt;p&gt;إزاي نجبر كل الثيمات إنها تحترم إعداد تقليل الحركة &lt;code&gt;prefers-reduced-motion&lt;/code&gt; من غير ما نعتمد على ضمير مصمم الثيم؟&lt;/p&gt;
&lt;p&gt;بنستخدم محدد CSS مضاعف الفئات (:root:root) عشان نضمن أسبقية تنسيق قاطعة:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* درع الأساس: يتفوق حسابياً على أي كلاس فرعي للثيمات */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@media&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (prefers-reduced-motion: reduce) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  :root:root&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;app-theme-&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    --app-motion-duration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ms&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !important&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    --app-hover-transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !important&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    --app-hover-shadow&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:    &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !important&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;لأن كل مكونات Theme Factory بتتحرك حصرياً من خلال المتغيرين &lt;code&gt;--app-motion-duration&lt;/code&gt; و &lt;code&gt;--app-hover-transform&lt;/code&gt;، السطر ده بيجمد أي حركة في الشاشة فوراً ويحولها لثبات تام ومريح للمستخدم.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الفخ-القاتل-إزاي-الخطوط-المخصصة-بتمسح-أيقونات-font-apex&quot;&gt;🚫 الفخ القاتل: إزاي الخطوط المخصصة بتمسح أيقونات Font APEX؟&lt;/h2&gt;
&lt;p&gt;أشهر فخ بيقع فيه مطوري أبيكس لما يركبوا خط عربي أو إنجليزي جديد:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* ❌ مدمر الأيقونات الأوتوماتيكي */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Noto Kufi Arabic&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;في أوراكل أبيكس، الأيقونات مش ملفات صور ولا SVG—دي رموز خطية بتعتمد على خط &lt;strong&gt;Font APEX&lt;/strong&gt; من خلال كلاسات زي &lt;code&gt;.fa&lt;/code&gt; و &lt;code&gt;.t-Icon&lt;/code&gt;. لما بتطبق الخط بالنجمة &lt;code&gt;*&lt;/code&gt;، المتصفح بيمسح جدول رموز الأيقونات ويحط مكانه خط النصوص، فتتحول علامة العدسة وسلة المهملات لمربعات بيضاء ممسوحة!&lt;/p&gt;
&lt;h3 id=&quot;الحل-في-theme-factory-تحديد-أدوار-الخطوط-بدقة&quot;&gt;الحل في Theme Factory: تحديد أدوار الخطوط بدقة&lt;/h3&gt;
&lt;p&gt;بنفصل الخطوط لـ 3 أدوار رئيسية: خط النصوص، وخط العناوين، وخط الأكواد البرمجية:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* ✅ استهداف آمن للخطوط مع عزل أيقونات Font APEX */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-font-family-body&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:    &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Noto Kufi Arabic&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-apple-system&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-font-family-heading&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Noto Kufi Arabic&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-apple-system&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --app-font-family-mono&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:    &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;SFMono-Regular&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, Consolas, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;monospace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* تطبيق الخط على عناصر النصوص فقط، وممنوع استخدام النجمة * */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt; body&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-font-family-body&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt; h1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt; h2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt; h3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; .t-Region-title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-font-family-heading&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* حماية صريحة لأيقونات أبيكس الرسمية */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; .apex-icons-fontapex&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; .fa&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; .t-Icon&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Font APEX 2.5.1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;FontAPEX&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !important&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-تطبيق-عملي-تلوين-البطاقات-والحقول-العائمة&quot;&gt;📦 تطبيق عملي: تلوين البطاقات والحقول العائمة&lt;/h2&gt;
&lt;p&gt;تعالوا نشوف كود واقعي من داخل ثيم &lt;strong&gt;Carbon Volt&lt;/strong&gt; بيوضح إزاي بنلون بطاقات الـ Cards وحقول الإدخال ذات العناوين العائمة (Floating Labels):&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* تلوين بطاقات الـ Cards جوه النطاق المعزول */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; .t-Card&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  background-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-surface-card&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border-radius&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-radius-md&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  transition&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: transform &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-motion-duration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ease&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;              box-shadow &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-motion-duration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ease&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; .t-Card:hover&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-hover-transform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  border-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-border-strong&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  box-shadow&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 8&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 24&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -8&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; rgba&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* ضبط العناوين العائمة لحقول الإدخال عند التنشيط */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.app-theme-carbon-volt&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; .t-Form-fieldContainer--floatingLabel.is-active&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; .t-Form-label&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-color-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  background-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--app-surface-card&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;كل سطر تنسيق بيبدأ صراحة بـ &lt;code&gt;html.app-theme-carbon-volt&lt;/code&gt;. لو المستخدم حب يغير الثيم أو يرجع للشكل الافتراضي، كل الأسطر دي بتصبح غير فعالة وكأنها غير موجودة بالمرة!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-المقال-القادم-القضاء-على-الوميض-الأبيض-المزعج&quot;&gt;⏭️ المقال القادم: القضاء على الوميض الأبيض المزعج!&lt;/h2&gt;
&lt;p&gt;دلوقتي ملفات الـ CSS بتاعتنا بقت محصنة جوه قلعة منيعة. بس بيظهر تحدي جديد وخطير: &lt;strong&gt;المتصفح إمتى هيضيف الكلاس ده على الصفحة؟&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;لو استنيت لما الصفحة تخلص تحميل وشغلت كود JavaScript عشان يضيف الكلاس، المستخدم هيشوف وميض أبيض يخطف البصر لمدة 200 ميلي ثانية مع كل كليك ينقله لصفحة جديدة!&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الثالث من السلسلة&lt;/strong&gt;، هنكشف &lt;strong&gt;سر الوميض الصفري&lt;/strong&gt;: إزاي سطر كود بسيط ومتزامن في Page 0 بيغير شكل الصفحة في أقل من 2 ميلي ثانية قبل ما ستارة المسرح تفتح! تابعوا معانا! 🚀&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;ابدأ مع APEX Theme Factory الآن:&lt;/strong&gt; تقدر تعمل Clone للمستودع، وتجرب الثيمات الجاهزة (&lt;code&gt;carbon-volt&lt;/code&gt;، &lt;code&gt;iris-dark&lt;/code&gt;، وغيرها)، وتستخدم أداة التثبيت الآلية:
🔗 &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;https://github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>أنظمة التصميم و APEX Theme Factory</category><category>oracle-apex</category><category>css</category><category>webdev</category><category>design-system</category><category>arabic</category></item><item><title>بدلة الحرباء: ليه تخصيص الثيمات التقليدي في Oracle APEX بيحبسك؟ (وإزاي تفلت منه) 🦎👔</title><link>https://ash2osh.github.io/arabic-blog/posts/023_the-chameleon-suit-why-traditional-apex-theming-traps-you/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/023_the-chameleon-suit-why-traditional-apex-theming-traps-you/</guid><description>الجزء الأول من سلسلة APEX Theme Factory. إزاي نتحرر من فخ الـ Theme Roller ونبني أنظمة تصميم معيارية قابلة للتبديل الفوري وبدون كسر قوالب Universal Theme 42.</description><pubDate>Tue, 03 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-chameleon-suit-why-traditional-oracle-apex-theming-traps-you-and-how-to-break-free&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;بدلة-الحرباء-ليه-تخصيص-الثيمات-التقليدي-في-oracle-apex-بيحبسك-وإزاي-تفلت-منه-&quot;&gt;بدلة الحرباء: ليه تخصيص الثيمات التقليدي في Oracle APEX بيحبسك؟ (وإزاي تفلت منه) 🦎👔&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الأول من السلسلة التقنية الشاملة: بناء وإدارة أنظمة التصميم المتقدمة في Oracle APEX.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;تخيل رحت اشتريت بدلة توكسيدو إيطالي فاخرة بـ 3,000 دولار. أول يوم في الفرح شكلها يجنن ومضبوطة بالمللي. بس المفاجأة إن الترزي بعد ما لبسهالك، راح لاحم الجاكيت والصديري والبنطلون في جلد جسمك بـ “سوبر جلو” حديدي دائم!&lt;/p&gt;
&lt;p&gt;حبيت تروح تجري على البحر الصبح؟ هتجري بالتوكسيدو. نزلت تغير زيت عربيتك في ورشة الحرفيين؟ هتغير الزيت بالتوكسيدو والبيبيون. معزوم على شواء في عز أغسطس؟ مبروك عليك صوف صامد في حرارة 42 درجة مئوية!&lt;/p&gt;
&lt;p&gt;ده بالضبط اللي بيحصل لما تقرر تعدل وتعمل تخصيص لمظهر تطبيقاتك في &lt;strong&gt;Oracle APEX&lt;/strong&gt; باستخدام أداة &lt;strong&gt;Theme Roller&lt;/strong&gt; التقليدية. بتلاقي نفسك حابس كل الشاشات، وكل المستخدمين، وكل النوافذ المنبثقة (Modal Dialogs) جوه ملف CSS ضخم ملحوم في التطبيق للأبد.&lt;/p&gt;
&lt;p&gt;في أول مقال من سلسلتنا الجديدة &lt;strong&gt;APEX Theme Factory&lt;/strong&gt;، هنكسر قيد “البدلة الملحومة”. هنتعلم إزاي نحول الثيمات من مجرد وشم دائم ملوش حل لـ &lt;strong&gt;بدلة فضاء معيارية سريعة التبديل&lt;/strong&gt; مبنية فوق &lt;strong&gt;Universal Theme 42&lt;/strong&gt; بنمط &lt;strong&gt;Iris&lt;/strong&gt;—بدون تعديل سطر كود واحد، وبدون ما نكسر اشتراك الثيم الأصلي، ومع إمكانية التراجع الكامل بضغطة زر واحدة. 🚀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;📦 &lt;strong&gt;مستودع كود المشروع:&lt;/strong&gt; كود المحرك، وحزم الثيمات، وسكربتات التثبيت متاحة بالكامل على &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-فزورة-الحرباء-حكاية-دولابين-ملابس&quot;&gt;🦎 فزورة الحرباء: حكاية دولابين ملابس&lt;/h2&gt;
&lt;p&gt;كل مطور في بيئات الشركات بيصطدم في مرحلة ما بـ “فخ دولاب الملابس”:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────┐       ┌────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│      التخصيص التقليدي في أبيكس         │       │          محرك APEX Theme Factory       │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│         (البدلة الملحومة بالأمير)      │       │        (بدلة الفضاء المعيارية)         │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├────────────────────────────────────────┤       ├────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ • ملف CSS متضخم جوه Theme Roller       │       │ • حزم معزولة بنطاق محدد على &amp;lt;html&amp;gt;     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ • تلوث عشوائي لعناصر :root عالمياً     │       │ • متغيرات تصميم مخصصة (--app-*)        │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ • شكل واحد إجباري لكل المستخدمين       │       │ • تبديل فوري لكل مستخدم وجهاز          │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ • رعب من كسر اشتراك Universal Theme    │       │ • احتفاظ كامل باشتراك الثيم 42         │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ • الحذف محتاج دعاء وستر ربنا           │       │ • تجربة جافة (Dry-Run) وحذف ذري آمن    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└────────────────────────────────────────┘       └────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;في الواقع العملي للشركات، مستخدمين نظامك مش شغالين في نفس الظروف:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;مشرف المخازن في الوردية الليلية&lt;/strong&gt;: محتاج نمط مظلم فائق التباين (Dark Mode) عشان شاشات التابلت ماتعميش عينيه في عتمة المستودع.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;محاسب التكاليف والمراجعة&lt;/strong&gt;: محتاج واجهة ناصعة وهادية شبه الورق (Linen)، مع خطوط جداول دقيقة تسهل مطابقة آلاف الفواتير في شاشات التقارير التفاعلية (Interactive Grids).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الإدارة التنفيذية ومجلس الإدارة&lt;/strong&gt;: محتاجين واجهة كحلي مع بطاقات مؤشرات أداء لامعة (Telemetry Cards) تناسب شاشات العرض الكبيرة في غرف الاجتماعات.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;تاريخياً، عشان تعمل كده في أوراكل أبيكس كنت بتضطر تعمل كذا نسخة من نفس التطبيق، أو تحشر تعديلات CSS بتعمل تضارب عنيف مع كل ترقية جديدة لنظام أبيكس.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الأفخاخ-التلاتة-في-تلوين-أبيكس-التقليدي&quot;&gt;🪤 الأفخاخ التلاتة في تلوين أبيكس التقليدي&lt;/h2&gt;
&lt;h3 id=&quot;1-كتلة-الـ-theme-roller-الصامتة&quot;&gt;1. كتلة الـ Theme Roller الصامتة&lt;/h3&gt;
&lt;p&gt;أداة Theme Roller لما بتغير فيها ألوان أو حواف بيتم تجميع ملف CSS ضخم وربطه بالتطبيق. ولو حبيت تعمل تعديل إضافي، بتضطر تفتح صندوق الـ Custom CSS وتحط أكوادك هناك.&lt;/p&gt;
&lt;p&gt;في ظرف شهور، الصندوق ده بيتحول لـ “مقبرة برمجية” فيها أكتر من 2,000 سطر مليانين علامات &lt;code&gt;!important&lt;/code&gt;، ومحددات عناصر قديمة، وألوان Hex صلبة. وأول ما أوراكل تنزل ترقية جديدة لأبيكس، المحددات دي بتفرقع وتخرب تنسيق الأزرار والقوائم.&lt;/p&gt;
&lt;h3 id=&quot;2-معضلة-اشتراك-الـ-universal-theme-42&quot;&gt;2. معضلة اشتراك الـ Universal Theme 42&lt;/h3&gt;
&lt;p&gt;الثيم الموحد Universal Theme 42 هو أحد أعظم مزايا أوراكل أبيكس. الاشتراك فيه (Subscription) بيضمن إن شاشاتك تاخد أحدث تحسينات الأمان، وسرعة الأداء، وإمكانية الوصول لمتحدي الإعاقة (Accessibility - a11y) مع كل تحديث جديد.&lt;/p&gt;
&lt;p&gt;لكن المطور اللي بيحاول يغير القوالب (Templates) بنفسه بيكسر الاشتراك ده فجأة، وساعتها بيبقى معزول في جزيرة فنية لوحده ومضطر يصين كل قوالب الـ HTML والـ JavaScript بإيديه.&lt;/p&gt;
&lt;h3 id=&quot;3-صدمة-نمط-iris-في-apex-261&quot;&gt;3. صدمة نمط Iris في APEX 26.1&lt;/h3&gt;
&lt;p&gt;مع إصدار &lt;strong&gt;Oracle APEX 26.1&lt;/strong&gt;، ظهر النمط الأحدث &lt;strong&gt;Iris&lt;/strong&gt;. نمط متطور جداً وجديد هندسياً، وبيعتمد على مئات المتغيرات البرمجية من الـ CSS Tokens كالتالي:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;أكتر من 1,000 ذرة داخلية للمكونات (&lt;code&gt;--a-*&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;أكتر من 400 توكن أساسي لألوان ومسافات الثيم (&lt;code&gt;--ut-*&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;أكتر من 100 توكن للأدوات المساعدة (&lt;code&gt;--u-*&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* قراءة المتغيرات البرمجية المباشرة من نمط Iris في APEX 26.1 */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;:root&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-color-scheme&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;light&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-palette-primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#00688c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-body-background-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#fbf9f8&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --ut-component-background-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;#fff&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --a-base-font-weight-semibold&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;المفاجأة هنا إن &lt;strong&gt;Iris بينزل بنمط فاتح فقط (Light-Only)&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;مفيش أي سطر للنمط المظلم (Dark Mode) جوه ملف &lt;code&gt;Iris.min.css&lt;/code&gt;. ولو حاولت تعمل ثيم مظلم عبر تغيير &lt;code&gt;--ut-body-background-color&lt;/code&gt; على مستوى الـ &lt;code&gt;:root&lt;/code&gt;، هتلاقي النوافذ المنبثقة وشاشات الـ Popup LOV باظت وبقى الكلام فيها غير مقروء تماماً!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-الحل-محرك-apex-theme-factory&quot;&gt;🛡️ الحل: محرك APEX Theme Factory&lt;/h2&gt;
&lt;p&gt;فكرة &lt;strong&gt;APEX Theme Factory&lt;/strong&gt; بتعتمد على فلسفة هندسية بسيطة ولكنها عبقرية:
بدل ما تلمس الـ Theme Roller أو تبوظ جداول قاعدة البيانات، إحنا بنعامل الثيمات كـ &lt;strong&gt;حزم برمجية مستقلة ومحمولة (Portable Packages)&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;sample-themes/carbon-volt/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── theme.json          # مواصفات الحزمة والمعلومات الأساسية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── theme.recipe.json   # وصفة التصميم وقواعد القياسات التفاعلية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── css/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── theme.css       # نقطة الدخول المعزولة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── tokens.css      # خرائط المتغيرات المخصصة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── apex/           # قواعد المكونات (العناوين، الحقول، النوافذ)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── fonts/              # خطوط WOFF2 ذاتية الاستضافة بالكامل&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── preview/cover.jpg   # صورة المعاينة بدقة 960 بكسل&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;الأركان-الأربعة-للهيكل-المعماري-الجديد&quot;&gt;الأركان الأربعة للهيكل المعماري الجديد:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;عزل النطاق الصارم (&lt;code&gt;html.app-theme-&amp;lt;name&amp;gt;&lt;/code&gt;)&lt;/strong&gt;:
الثيم مش بيشتغل إلا لما الكلاس الخاص بيه يتضاف على مستوى جذر الصفحة (&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;). لو شلت الكلاس، التطبيق بيرجع لـ Iris الأصلي 100% في نفس اللحظة بدون أي شوائب في ملفات الـ CSS العامة.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;التمهيد الفوري بدون وميض (Zero-Flicker Pre-Paint Bootstrap)&lt;/strong&gt;:
بدل ما نستنى الصفحة تخلص تحميل وبعدين ننادي كود JavaScript يغير الألوان فيحصل وميض أبيض يخطف العين، بنحط سطر تمهيد متزامن في &lt;strong&gt;Page 0&lt;/strong&gt; بيقرا التفضيل ويحط كلاس الثيم في أقل من 2 ميلي ثانية قبل ما المتصفح يرسم أول بكسل على الشاشة.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;حزم ذاتية الاحتواء بدون اعتماد على سيرفرات خارجية&lt;/strong&gt;:
كل ثيم بيطلع في ملف ZIP مقفول تماماً. جواه خطوط الـ WOFF2 الخاصة بيه، فمفيش أي طلبات بتروح لـ Google Fonts أو CDNs خارجية. وتقدر تثبته أو تحذفه بأمر سطر أوامر آمن، أو من خلال 3 خطوات يدوية جوه Page Designer لو معندكش صلاحيات شل.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;حماية اشتراك الـ Universal Theme 42 بنسبة 100%&lt;/strong&gt;:
لأن الشغل كله بيتم على طبقة الـ CSS و Page 0 فقط، تطبيقك بيفضل محتفظ باشتراكه الرسمي في Universal Theme بدون أي مساس.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-استكشف-الثيمات-التمانية-الجاهزة-في-المشروع&quot;&gt;🎨 استكشف الثيمات التمانية الجاهزة في المشروع&lt;/h2&gt;
&lt;p&gt;المشروع بييجي مع &lt;strong&gt;8 ثيمات جاهزة ومجربة إنتاجياً&lt;/strong&gt; بتغطي كل الأذواق الهندسية:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;اسم حزمة الثيم&lt;/th&gt;
&lt;th&gt;الاتجاه الفني&lt;/th&gt;
&lt;th&gt;خطوط الطباعة&lt;/th&gt;
&lt;th&gt;طبيعة السطح والتباين&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Carbon Volt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;جرافيت تقني داكن مع لمسات ليموني فسفوري وسماوي&lt;/td&gt;
&lt;td&gt;Noto Kufi / Mono&lt;/td&gt;
&lt;td&gt;داكن عالي التباين (&lt;code&gt;#12151c&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Citrus Pop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;مساحات مائية مبهجة مع بطاقات عائمة ولمسات برتقالي يوسفي&lt;/td&gt;
&lt;td&gt;Tajawal&lt;/td&gt;
&lt;td&gt;فاتح منعش (&lt;code&gt;#f0fbf9&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cobalt Press&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ملمس ورق صحفي دافئ مع خطوط كحلي كلاسيكية وعناوين قرمزية&lt;/td&gt;
&lt;td&gt;Cairo&lt;/td&gt;
&lt;td&gt;فاتح هادئ (&lt;code&gt;#faf8f5&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Estate Slate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;رمادي مؤسسي دقيق للأعمال الإدارية مع لمسات كهرمانية خافتة&lt;/td&gt;
&lt;td&gt;IBM Plex Sans Arabic&lt;/td&gt;
&lt;td&gt;فاتح دقيق (&lt;code&gt;#f8f9fa&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Estate Slate Dark&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;رمادي صخري مظلم للأنظمة الحساسة مع لمسات زمردية باردة&lt;/td&gt;
&lt;td&gt;IBM Plex Sans Arabic&lt;/td&gt;
&lt;td&gt;داكن مؤسسي (&lt;code&gt;#161a22&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;بساطة مطلقة مع إطارات فائقة النعومة وتناسق تام مع منتجات أبل&lt;/td&gt;
&lt;td&gt;System UI / Iris&lt;/td&gt;
&lt;td&gt;فاتح ناصع (&lt;code&gt;#ffffff&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Solarized Dark&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;عمق تقني مستوحى من شاشات الـ Terminal الاحترافية&lt;/td&gt;
&lt;td&gt;IBM Plex Mono&lt;/td&gt;
&lt;td&gt;داكن مريح للعين (&lt;code&gt;#002b36&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Velvet Signal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;أسطح باذنجانية فاخرة مع حواف دائرية وإشارات بنفسجية متوهجة&lt;/td&gt;
&lt;td&gt;Alexandria&lt;/td&gt;
&lt;td&gt;داكن عصري (&lt;code&gt;#1b1622&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-خطتنا-في-المقالات-القادمة&quot;&gt;🛠️ خطتنا في المقالات القادمة&lt;/h2&gt;
&lt;p&gt;في المقالات الخمسة الجاية من السلسلة دي، هنفكك كل جزء في المحرك ده بالتفصيل العملي:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;الجزء الثاني (المقال الثاني)&lt;/strong&gt;: قلعة عزل الـ CSS — إزاي نتحكم في متغيرات &lt;code&gt;--app-*&lt;/code&gt; ونتفادى كارثة مسح أيقونات Font APEX.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الجزء الثالث (المقال الثالث)&lt;/strong&gt;: سر الوميض الصفري — إزاي بنمنع الوميض الأبيض المزعج من خلال حقن كود سريع في Page 0.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الجزء الرابع (المقال الرابع)&lt;/strong&gt;: ماكينة الحزم المحمولة — أرشفة ملفات الـ ZIP، وحقن قوالب الـ APEXLang مع أمان التراجع التلقائي.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الجزء الخامس (المقال الخامس)&lt;/strong&gt;: بناء أداة تبديل الثيمات المخصصة — اعتراض قائمة Navigation Bar، والتعامل مع روابط Hash في الـ Friendly URLs، وربط مكونات Alpine.js.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الجزء السادس (مسك الختام)&lt;/strong&gt;: حفظ الثيمات على مستوى المؤسسة — ربط تفضيلات المستخدم مع قاعدة البيانات (&lt;code&gt;:APP_USER&lt;/code&gt;) واستدعاءات Ajax المباشرة.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;جاهز تقلع بدلة التوكسيدو الملحومة وتلبس بدلة فضاء خارقة سريعة التبديل؟ نتقابل في المقال الجاي عشان نبني قلعة الـ CSS الحصينة! 🚀&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;ابدأ مع APEX Theme Factory الآن:&lt;/strong&gt; تقدر تعمل Clone للمستودع، وتجرب الثيمات الجاهزة (&lt;code&gt;carbon-volt&lt;/code&gt;، &lt;code&gt;iris-dark&lt;/code&gt;، وغيرها)، وتستخدم أداة التثبيت الآلية:
🔗 &lt;a href=&quot;https://github.com/ash2osh/APEX_THEME_FACTORY&quot;&gt;https://github.com/ash2osh/APEX_THEME_FACTORY&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>أنظمة التصميم و APEX Theme Factory</category><category>oracle-apex</category><category>css</category><category>design-system</category><category>webdev</category><category>arabic</category></item><item><title>حملة تنظيف الربيع في APEX 26.1: أرشفة المهام التاريخية بدون كسر التدقيق 🗄️🧹</title><link>https://ash2osh.github.io/arabic-blog/posts/021_spring-cleaning-in-apex-26-archiving-historical-tasks-without-breaking-audits/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/021_spring-cleaning-in-apex-26-archiving-historical-tasks-without-breaking-audits/</guid><description>الجزء السابع (مسك الختام) من سلسلة &quot;إدارة الـ Workflows الضخمة في أوراكل أبيكس&quot;. إزاي تنضف جداول التشغيل من ملايين المهام المنتهية وتحافظ على سجلات الرقابة القانونية بأعلى أداء!</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/spring-cleaning-in-apex-26-archiving-historical-tasks-without-breaking-audits&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;حملة-تنظيف-الربيع-في-apex-261--أرشفة-المهام-التاريخية-بدون-كسر-التدقيق-️&quot;&gt;حملة تنظيف الربيع في APEX 26.1 — أرشفة المهام التاريخية بدون كسر التدقيق 🗄️🧹&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء السابع (مسك الختام) من سلسلة “إدارة الـ Workflows الضخمة في أوراكل أبيكس”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;لو فضلت محتفظ بكل فاتورة كهرباء، وكل إيصال فيزا، وكل إقرار ضريبي من آخر 12 سنة متكومين جوه درج مكتبك اللي بتفتحه كل يوم، في الآخر مش هتعرف تشد الدرج 2 سم عشان تطلع قلم تكتب بيه!&lt;/p&gt;
&lt;p&gt;في ختام السلسلة دي، هنتعلم إزاي ندمج &lt;strong&gt;الـ Human Task Archiving APIs الجديدة في Oracle APEX 26.1&lt;/strong&gt; مع &lt;strong&gt;استراتيجيات تقسيم الجداول الشهرية (Interval Range Partitioning)&lt;/strong&gt; في قاعدة بيانات أوراكل.&lt;/p&gt;
&lt;p&gt;ده بيحافظ على جداول التشغيل اليومية خفيفة، وصاروخية، ومضغوطة الحجم—وفي نفس الوقت بيضمن إن سجلات التدقيق التاريخية تفضل متاحة 100% لمفتشي الامتثال والرقابة القانونية للشركة.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-درج-المكتب-الشغال-ضد-الخزنة-المحصنة-المكيفة&quot;&gt;🗄️ درج المكتب الشغال ضد الخزنة المحصنة المكيفة&lt;/h2&gt;
&lt;p&gt;كل نظام Workflows وموافقات في الشركات بيصطدم في النهاية بـ &lt;strong&gt;قانون تراكم البيانات (Law of Data Accumulation)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;السنة الأولى (مرحلة العسل)&lt;/strong&gt;: النظام بتاعك بيدير 500 مهمة وموافقة نشطة بس. الجداول صغيرة جداً، وفهارس الـ B-Tree كلها مرتاحة جوه رامات الداتابيز (Buffer Cache)، وكل استعلام بيفتح في أقل من 10 ميلي ثانية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;السنة الثالثة (مرحلة الغرز في الطين)&lt;/strong&gt;: شركتك نفذت &lt;strong&gt;أكتر من 3,500,000 مسار عمل منتهي&lt;/strong&gt;. الجداول بقى حجمها 45 جيجابايت! صيانة الفهارس مع كل عملية Insert بدأت تسبب بطء ملحوظ في الـ I/O، والنسخ الاحتياطي اليومي بقى يمتد لبعد الفجر، وبحث المدراء في الشاشات بقى يجر الداتابيز كلها لتحت!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ليه-مستحيل-تقول-يا-عم-نشغل-أمر-delete-وخلاص&quot;&gt;ليه مستحيل تقول “يا عم نشغل أمر &lt;code&gt;DELETE&lt;/code&gt; وخلاص”؟!&lt;/h3&gt;
&lt;p&gt;في أنظمة الشركات الكبرى، مينفعش تدخل تضرب &lt;code&gt;DELETE FROM wf_requests WHERE status = &apos;COMPLETED&apos;&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;المتطلبات القانونية والضريبية&lt;/strong&gt;: مصلحة الضرائب، ومفتشو الأيزو، والرقابة المالية بيلزموا الشركات بالاحتفاظ بسجلات الموافقات وتفاصيل القرارات لمدد من 7 لـ 10 سنين!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;نزاهة التدقيق والمراجعة (Audit Integrity)&lt;/strong&gt;: كل كومنت، وكل توقيع إلكتروني، وكل تاريخ تفويض لازم يفضل موجود ومحفوظ بحالته الأصلية.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;الحل مش الحذف؛ الحل هو &lt;strong&gt;أرشفة دورة الحياة (Lifecycle Archival)&lt;/strong&gt;. جداول التشغيل اليومية تشيل بس الشغل الحي، والأرشيف التاريخي يروح لخزنة الأرشيف المحمية.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-الجديد-في-أرشفة-oracle-apex-261&quot;&gt;✨ إيه الجديد في أرشفة Oracle APEX 26.1؟&lt;/h2&gt;
&lt;p&gt;بداية من إصدار Oracle APEX 26.1، أوراكل أدركت عنق الزجاجة ده وقدمت دوال رسمية ومدمجة لإدارة دورة حياة الـ Human Tasks والـ Workflows كالآتي:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;apex_task.archive&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apex_workflow.archive&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- تشغيل الأرشفة البرمجية في APEX 26.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    apex_task&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;archive&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_task_id      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 108429&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_archive_type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; apex_task&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;c_archive_completed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;المزايا-اللي-بتقدمها-أرشفة-apex-261-الرسمية&quot;&gt;المزايا اللي بتقدمها أرشفة APEX 26.1 الرسمية:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;النقل لمخزن الأرشيف البارد (Cold Storage)&lt;/strong&gt;: بتنقل المهام المقفولة برة طوابير التشغيل النشطة لمخازن أرشيف داخلية معزولة.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Views مخصصة للأرشيف التاريخي&lt;/strong&gt;: المهام المؤرشفة بتفضل متاحة للاستعلام عبر &lt;code&gt;APEX_TASK_ARCHIVE&lt;/code&gt; و &lt;code&gt;APEX_WORKFLOW_ARCHIVE&lt;/code&gt;. شاشات التقارير التاريخية تقدر تستعلم منها براحتها بدون ما تلمس شاشة المهام النشطة أو تأثر على سرعتها!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;استعادة رشاقة الفهارس&lt;/strong&gt;: الفهارس النشطة على جداول أبيكس بترجع صغيرة وخفيفة وشايلة بس الطلبات المفتوحة.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-على-مستوى-الداتابيز-التقسيم-الشهري-الآلي-interval-partitioning&quot;&gt;🏗️ على مستوى الداتابيز: التقسيم الشهري الآلي (Interval Partitioning)&lt;/h2&gt;
&lt;p&gt;لسجلات العمليات الكبيرة (زي جدول &lt;code&gt;app_data.wf_task_event_log&lt;/code&gt;)، بندمج أرشفة أبيكس مع &lt;strong&gt;تقسيم الجداول الشهري الآلي&lt;/strong&gt; في أوراكل:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- جدول: app_data.wf_task_event_log (مقسم شهرياً بالـ Interval)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; table&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.wf_task_event_log (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    event_id         &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; generated&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; always&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; identity&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    request_id       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    task_id          &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    action_type      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    previous_status  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    new_status       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    action_user      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    action_comments  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    event_timestamp  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; local&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; time&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; zone&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; current_timestamp &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;partition&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; by&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (event_timestamp) &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;interval (numtoyminterval(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;month&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    partition&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_initial &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;values&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; less than (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;2025-01-01 00:00:00&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- فهارس محلية معزولة لكل بارتشن&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; index&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.wf_task_event_req_lidx &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_event_log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(request_id) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;local&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-القوى-الخارقة-لتقسيم-الـ-interval-partitioning&quot;&gt;🚀 القوى الخارقة لتقسيم الـ Interval Partitioning&lt;/h2&gt;
&lt;p&gt;ليه التقسيم ده يعتبر سلاح سري في قواعد بيانات المؤسسات؟&lt;/p&gt;
&lt;h3 id=&quot;1-ضغط-البارتشنات-القديمة-بدون-أي-توقف-zero-downtime-compression&quot;&gt;1. ضغط البارتشنات القديمة بدون أي توقف (Zero-Downtime Compression)&lt;/h3&gt;
&lt;p&gt;في نهاية كل ربع سنة، سكربت صيانة آلي يقدر يضغط شهور السنة اللي فاتت اللي محدش بيعدل فيها:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ضغط بارتشن قديم لتوفير لحد 80% من مساحة الهارد ديسك&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;alter&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; table&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_event_log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    move&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; partition&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sys_p12849 compress &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; oltp;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ده بيوفر مساحات هائلة في الهارد ديسك وفي نفس الوقت الداتا بتفضل مقروءة ومتاحة بالكامل للمراجعين!&lt;/p&gt;
&lt;h3 id=&quot;2-حذف-البارتشن-المنتهي-في-أقل-من-100-ميلي-ثانية&quot;&gt;2. حذف البارتشن المنتهي في أقل من 100 ميلي ثانية&lt;/h3&gt;
&lt;p&gt;لما البيانات التاريخية تخلص مدتها القانونية (مثلاً بعد مرور 7 سنين)، مش بتشغل أمر &lt;code&gt;DELETE&lt;/code&gt; عملاق يولد جيجابايت من ملفات الـ Redo والـ Undo.&lt;/p&gt;
&lt;p&gt;أنت بتطير البارتشن بالكامل في &lt;strong&gt;أقل من 100 ميلي ثانية&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;alter&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; table&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_event_log&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; drop&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; partition&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sys_p00481;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-حزمة-الصيانة-التلقائية-pkg_wf_maintenance&quot;&gt;🤖 حزمة الصيانة التلقائية: &lt;code&gt;pkg_wf_maintenance&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;دي Package صيانة احترافية ومجدولة تشتغل يوم 1 في كل شهر عبر &lt;code&gt;DBMS_SCHEDULER&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;pkg_wf_maintenance&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    procedure&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; archive_closed_tasks(p_days_old &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pkg_wf_maintenance;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package body &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;pkg_wf_maintenance&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    procedure&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; archive_closed_tasks(p_days_old &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;is&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        cursor&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c_expired_tasks &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;is&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            select&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; task_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;              from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex_tasks&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;             where&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;COMPLETED&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;CANCELED&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;TERMINATED&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;               and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; completed_on &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; trunc(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;sysdate&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_days_old;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;               &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t_id_list &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; table&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; of &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;apex_tasks&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        v_ids t_id_list;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        v_archived_cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        open&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c_expired_tasks;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        loop&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            fetch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c_expired_tasks bulk collect &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;into&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_ids &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;limit&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 500&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            exit &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;when&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; v_ids&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; .. &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_ids&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; loop&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                    -- استدعاء دالة الأرشفة الرسمية في APEX 26.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                    apex_task&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;archive&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                        p_task_id      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_ids(i),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                        p_archive_type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; apex_task&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;c_archive_completed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    v_archived_cnt :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_archived_cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                exception&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    when&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; others &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                        null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- تسجيل الخطأ والاستمرار في باقي المهام&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            end&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; loop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            commit&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        end&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; loop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        close&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c_expired_tasks;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        dbms_output&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;put_line&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;تمت أرشفة &apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_archived_cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos; مهمة بنجاح.&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; archive_closed_tasks;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pkg_wf_maintenance;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-مسك-الختام-الأعمدة-السبعة-لإدارة-الـ-workflows-الضخمة&quot;&gt;🏁 مسك الختام: الأعمدة السبعة لإدارة الـ Workflows الضخمة&lt;/h2&gt;
&lt;p&gt;على مدار السلسلة دي المكونة من 7 أجزاء، حولنا نظام موافقات تقيل ومخنوق لمنظومة مؤسسية صاروخية تنافس كبرى البنوك والشركات العالمية:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;معمارية الـ APEX Workflows عالية الأداء:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 7. أرشفة دورة الحياة والتقسيم الشهري (APEX 26.1 + أوراكل) │  ← توسع مستدام للأبد&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 6. الاعتماد الجماعي بضغطة واحدة (Savepoints في الـ Grid)   │  ← سرعة قياسية للمدراء&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 5. شاشة الحرباء الذكية (أشرطة أدوات ديناميكية بـ PL/SQL)    │  ← صفحة تفاصيل واحدة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 4. تخزين الأكشنز في الميتاداتا (جدول wf_action_config)     │  ← صفر زراير ثابتة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 3. التزامن الفوري بالأحداث (تريجرات خفيفة بدون كرون)      │  ← لحظي بدون تأخير&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 2. كاش بونات المطبخ السريع (جدول wf_task_cache)            │  ← استعلامات تحت 50ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 1. فك الارتباط المعماري عن استعلامات APEX_TASKS الجاهزة    │  ← حل زحمة الـ 30k&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└────────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;كشفنا سر زحمة الـ 30 ألف مهمة&lt;/strong&gt;: وعرفنا ليه الاستعلام المباشر من &lt;code&gt;APEX_TASKS&lt;/code&gt; بيخنق الداتابيز في الشركات.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;بنينا حامل بونات المطبخ&lt;/strong&gt;: جدول &lt;code&gt;wf_task_cache&lt;/code&gt; اللي حول استعلامات الـ 15 ثانية لبحث فهارس في 20 ميلي ثانية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;زامنّا الكاش في اللحظة نفسها&lt;/strong&gt;: بتريجرات خفيفة قضت على لاج الـ Polling بدون أي قفل للجداول.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ودعنا رص الزراير الثابتة&lt;/strong&gt;: ونقلنا تعريفات الأكشنز لجدول ميتاداتا مرن وشيك (&lt;code&gt;wf_action_config&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;صممنا شاشة الحرباء&lt;/strong&gt;: صفحة تفاصيل واحدة بتتلون وتتكيف مع صلاحيات كل موظف على الطاير.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;فعلنا الاعتماد الجماعي بضغطة واحدة&lt;/strong&gt;: مكنّا المدراء من اعتماد 50 طلب في ثانيتين بحماية الـ Savepoints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;أتقنا الأرشفة المستدامة&lt;/strong&gt;: بدمج ميزات APEX 26.1 مع تقسيم الجداول الشهري عشان يفضل أداء النظام طيارة لسنين قدام!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;مبروك عليك امتلاك المعمارية دي كاملة، وبرمجة ممتعة وناجحة للجميع! 🚀🎉✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>إدارة الـ Workflows الضخمة</category><category>oracle-apex</category><category>workflows</category><category>database</category><category>data-archiving</category><category>dba</category><category>arabic</category></item><item><title>الختم السريع: الاعتماد الجماعي بضغطة واحدة جوه الـ Interactive Grid 📑🖊️</title><link>https://ash2osh.github.io/arabic-blog/posts/020_the-rubber-stamp-1-click-batch-approvals-in-interactive-grids/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/020_the-rubber-stamp-1-click-batch-approvals-in-interactive-grids/</guid><description>الجزء السادس من سلسلة &quot;إدارة الـ Workflows الضخمة في أوراكل أبيكس&quot;. معالجة 50 إجراء وموافقة في نفس اللحظة بحماية الـ Savepoints لعزل الأخطاء!</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-rubber-stamp-1-click-batch-approvals-in-interactive-grids&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;الختم-السريع-الاعتماد-الجماعي-بضغطة-واحدة-جوه-الـ-interactive-grid-️&quot;&gt;الختم السريع: الاعتماد الجماعي بضغطة واحدة جوه الـ Interactive Grid 📑🖊️&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء السادس من سلسلة “إدارة الـ Workflows الضخمة في أوراكل أبيكس”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;لو اديت مدير تنفيذي كبير قلم حبر جاف، وطلبت منه يقرا ويمضي 50 طلب شراء روتيني بسيط واحد ورا التاني، هيمضي أول أربعة، يجيله تليفون مهم، ويسيب الـ 46 التانيين مركونين في مكتبه لمدة أسبوعين!&lt;/p&gt;
&lt;p&gt;بتزويد شاشة الـ Interactive Grid في Oracle APEX بروتين معالجة جماعي سريع (&lt;strong&gt;&lt;code&gt;pkg_workflow_actions.ig_batch_action&lt;/code&gt;&lt;/strong&gt;)، المدراء يقدروا يحددوا الـ 50 سطر بالـ Checkbox، ويدوسوا “اعتماد المحدد”، والـ 50 طلب يتنفذوا كلهم في ثانيتين اتنين بس!&lt;/p&gt;
&lt;p&gt;هنا هنتعلم إزاي نبني محرك موافقات جماعية صلب ومحمي بـ &lt;strong&gt;Savepoints على مستوى كل سطر&lt;/strong&gt;، وبـ &lt;strong&gt;حماية القفل التفاؤلي (Optimistic Locking)&lt;/strong&gt; عشان لو سطر واحد فشل، ميبوظش باقي الدفعة كلها.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-قلم-الحبر-البطيء-ضد-ختم-المصنع-السريع&quot;&gt;🖋️ قلم الحبر البطيء ضد ختم المصنع السريع&lt;/h2&gt;
&lt;p&gt;لما نيجي نصمم مسارات الموافقات في أبيكس، تفكيرنا التلقائي بيروح لشاشة تفاصيل الطلب المفردة. للقرارات الضخمة—زي شراء أصل رأسمالي بـ 250 ألف دولار—شاشة التفاصيل الكاملة إلزامية ومهمة جداً.&lt;/p&gt;
&lt;p&gt;لكن في أي شركة كبيرة، 80% من حجم الشغل اليومي عبارة عن طلبات روتينية ومخاطرها شبه منعدمة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;طلبات شراء أدوات مكتبية بسيطة تحت 100 دولار.&lt;/li&gt;
&lt;li&gt;اعتمادات صيانة دورية مجدولة.&lt;/li&gt;
&lt;li&gt;بدلات سفر وإقامة متراجعة ومرفق فواتيرها مسبقاً.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;قارن-بين-التجربتين&quot;&gt;قارن بين التجربتين:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;تجربة قلم الحبر (الاعتماد الفردي صفحة بصفحة)&lt;/strong&gt;:
افتح الطلب $\rightarrow$ استنى ثانيتين $\rightarrow$ انزل لتحت $\rightarrow$ دوس موافق $\rightarrow$ أكد الرسالة $\rightarrow$ ارجع للشاشة الرئيسية $\rightarrow$ كرر نفس المأساة 50 مرة!&lt;br&gt;
&lt;em&gt;الوقت المستغرق&lt;/em&gt;: &lt;strong&gt;من 12 لـ 15 دقيقة&lt;/strong&gt; من الضغطات المتكررة وتحميل الصفحات والإرهاق الذهني.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تجربة ختم المصنع (الاعتماد الجماعي السريع)&lt;/strong&gt;:
فلتر الـ Grid على “مشتريات دورية” $\rightarrow$ دوس “تحديد الكل” $\rightarrow$ دوس “اعتماد المحدد”.&lt;br&gt;
&lt;em&gt;الوقت المستغرق&lt;/em&gt;: &lt;strong&gt;أقل من 5 ثواني&lt;/strong&gt;!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-معضلة-الحبة-المسمومة-في-المعالجة-الجماعية-the-poison-pill&quot;&gt;🛑 معضلة “الحبة المسمومة” في المعالجة الجماعية (The Poison Pill)&lt;/h2&gt;
&lt;p&gt;قبل ما نبص على الكود، لازم نفهم الخطر الأكبر في العمليات الجماعية: &lt;strong&gt;الحبة المسمومة&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;تخيل مدير علم على 50 طلب وداس “اعتماد الكل”:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;الطلبات من 1 لـ 24 اعتمدت بسلام.&lt;/li&gt;
&lt;li&gt;الطلب رقم 25 ضرب إيرور لأن ميزانية القسم ده خلصت من 10 دقايق.&lt;/li&gt;
&lt;li&gt;في كود PL/SQL عادي مفهوش عزل للأخطاء، الإيرور غير المعالج على سطر 25 هيعمل Rollback لـ &lt;strong&gt;المعاملة كلها بالكامل&lt;/strong&gt;! الـ 50 طلب هيفضلوا معلقين ومفيش حاجة هتعتمد!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;المدير هيتجنن: &lt;em&gt;“هو إيه اللي اتوافق عليه وإيه اللي فشل؟! ليه مفيش حاجة اتغيرت؟!”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;عشان نحل المأساة دي، محركنا بيستخدم &lt;strong&gt;نقاط الحفظ الفردية (Row-Level Savepoints)&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;savepoint sp_single_record;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;لو السطر رقم 25 فشل، بنعمل تراجع &lt;strong&gt;فقط لنقطة حفظ السطر ده لوحده&lt;/strong&gt;، ونسجل سبب الفشل في اللوج، ونكمل عادي جداً وبدون أي توقف في معالجة السطور من 26 لـ 50!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-محرك-المعالجة-الخلفي-pkg_workflow_actionsig_batch_action&quot;&gt;⚙️ محرك المعالجة الخلفي: &lt;code&gt;pkg_workflow_actions.ig_batch_action&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;ده كود الـ Package الاحترافي في سكيما البرمجة (&lt;code&gt;app_code&lt;/code&gt;) كالآتي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;pkg_workflow_actions&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    procedure&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ig_batch_action(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_request_ids &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex_t_varchar2,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_action_type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- &apos;APPROVE&apos;, &apos;REJECT&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_comments    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        o_success_cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;out&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        o_failure_cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;out&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        o_error_log   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;out&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex_t_varchar2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pkg_workflow_actions;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package body &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;pkg_workflow_actions&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    procedure&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ig_batch_action(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_request_ids &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex_t_varchar2,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_action_type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_comments    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        o_success_cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;out&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        o_failure_cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;out&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        o_error_log   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;out&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex_t_varchar2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;is&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        v_req_id     &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        v_curr_user  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; coalesce&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(sys_context(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;APEX$SESSION&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;APP_USER&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), user);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        o_success_cnt :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        o_failure_cnt :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        o_error_log   :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex_t_varchar2();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; .. &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;p_request_ids&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; loop&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            v_req_id :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; to_number(p_request_ids(i));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;            -- 1. نقطة حفظ معزولة لكل سطر منفرد&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            savepoint sp_single_record;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                -- 2. فحص القفل التفاؤلي والتزامن (Lock Row Nowait)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                declare&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    v_status &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    select&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; status&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                      into&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_status&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                      from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                     where&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; request_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_req_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                       for&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; of &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; nowait&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_status &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;PENDING&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                        raise_application_error(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;20010&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;الطلب لم يعد معلقاً للمراجعة.&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    end&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                -- 3. تنفيذ التعديل ونقل الحالة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                update&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                   set&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; status&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; case&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_action_type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;when&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;APPROVE&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; then&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;APPROVED&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;REJECTED&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                       resolved_by &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_curr_user,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                       resolved_at &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; current_timestamp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                 where&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; request_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_req_id;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                -- 4. تسجيل الحدث في سجل التدقيق (بيشغل تزامن الكاش تلقائياً)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                insert into&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_event_log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    request_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    action_type,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    previous_status,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    new_status,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    action_user,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    action_comments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                ) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;values&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    v_req_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    p_action_type,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                    &apos;PENDING&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    case&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_action_type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;when&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;APPROVE&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; then&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;APPROVED&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;REJECTED&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    v_curr_user,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    p_comments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                o_success_cnt :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; o_success_cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            exception&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                when&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; others &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                    -- 5. تراجع فقط للسطر ده بالذات!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    rollback&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sp_single_record;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    o_failure_cnt :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; o_failure_cnt &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                    apex_string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(o_error_log, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;طلب رقم #&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_req_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;: &apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sqlerrm);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        end&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; loop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ig_batch_action;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pkg_workflow_actions;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-ربط-الـ-interactive-grid-في-شاشة-apex&quot;&gt;🖥️ ربط الـ Interactive Grid في شاشة APEX&lt;/h2&gt;
&lt;p&gt;عشان تشغل ده جوه الـ Interactive Grid كالآتي:&lt;/p&gt;
&lt;h3 id=&quot;1-تفعيل-اختيار-السطور-المتعددة&quot;&gt;1. تفعيل اختيار السطور المتعددة&lt;/h3&gt;
&lt;p&gt;في خصائص الـ Interactive Grid كالآتي:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Row Selection&lt;/strong&gt;: Multiple&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selection Checkbox&lt;/strong&gt;: Enabled&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-إضافة-زرار-toolbar-مخصص-بكود-الجافاسكريبت&quot;&gt;2. إضافة زرار Toolbar مخصص بكود الجافاسكريبت&lt;/h3&gt;
&lt;p&gt;في إعدادات الـ Grid: &lt;strong&gt;Attributes $\rightarrow$ Advanced $\rightarrow$ JavaScript Initialization Code&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $ &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex.jQuery;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; toolbarData &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $.apex.interactiveGrid.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;copyDefaultToolbar&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; actionsGroup &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; toolbarData.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toolbarFind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;actions1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    actionsGroup.controls.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        type: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;BUTTON&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        id: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;btn_batch_approve&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        label: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;اعتماد المحدد&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        icon: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;fa fa-check&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        hot: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        action: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;batch-approve&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    config.toolbarData &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; toolbarData;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    config.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;initActions&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;actions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        actions.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            name: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;batch-approve&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;            action&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;focusElement&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; grid &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;region&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;tasks_ig&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;widget&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;interactiveGrid&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;getViews&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).grid;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; selectedRecords &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; grid.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getSelectedRecords&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (selectedRecords.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    apex.message.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;alert&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;برجاء اختيار طلب واحد على الأقل للاعتماد.&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; model &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; grid.model;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; requestIds &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; selectedRecords.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    requestIds.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(model.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getValue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(selectedRecords[i], &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;REQUEST_ID&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                apex.message.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;confirm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                    &quot;هل أنت متأكد من اعتماد جميع الطلبات المحددة (&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; requestIds.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot; طلب)؟&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;okPressed&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (okPressed) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                            apex.server.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                                &quot;PROCESS_BATCH_APPROVAL&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                    f01: requestIds,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                    x01: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;APPROVE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;                                    success&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                        apex.message.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;showPageSuccess&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                                            &quot;تمت العملية: تم اعتماد &quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; data.success_count &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot; بنجاح، وفشل &quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                            data.failure_count &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                        );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                        apex.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;region&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;tasks_ig&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;refresh&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                            );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; config;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-صمامين-الأمان-ضد-التضارب-والتزامن&quot;&gt;🔒 صمامين الأمان ضد التضارب والتزامن&lt;/h2&gt;
&lt;p&gt;لاحظ صمامي الأمان اللي جوه كود الـ PL/SQL هنا:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;for update nowait&lt;/code&gt;&lt;/strong&gt;: لو فيه مدير تاني (أو سكالر آلي) بيعدل في طلب رقم 14 في نفس اللحظة، أوراكل هترمي خطأ فوري بدل ما تعلق الجلسة في الانتظار. المعالج هيلقط الخطأ، ويكتب “الطلب 14 مشغول حالياً بعملية أخرى”، ويكمل في باقي الطلبات.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التحقق من حالة الطلب الحالية&lt;/strong&gt;: قبل ما ينفذ الاعتماد، الكود بيتأكد إن &lt;code&gt;status = &apos;PENDING&apos;&lt;/code&gt;. لو حد اعتمده قبله بثانيتين، السطر بيتفوت بأمان وبدون أي تكرار.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-مسك-الختام-الجزء-السابع&quot;&gt;🧹 إيه اللي مستنينا في مسك الختام (الجزء السابع)؟&lt;/h2&gt;
&lt;p&gt;نظام الـ Workflows بتاعك في أبيكس دلوقتي طيارة وصاروخي: الكويريز بتفتح في 20 ميلي ثانية، والشاشات بتتأقلم ديناميكياً، والمدراء يقدروا يوافقوا على 50 طلب في ضغطة واحدة.&lt;/p&gt;
&lt;p&gt;قدم الشريط 18 شهر لقدام في المستقبل.. شركتك نفذت &lt;strong&gt;أكتر من 2,500,000 مسار عمل منتهي&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;جداول الداتابيز بتكبر جداً، صيانة الفهارس بدأت تتقل، وتكاليف التخزين بتزيد. إزاي تنضف البيت من الكراكيب القديمة من غير ما تمسح سجلات التدقيق والرقابة القانونية للشركة؟&lt;/p&gt;
&lt;p&gt;في ختام السلسلة، &lt;strong&gt;الجزء السابع (“حملة تنظيف الربيع في APEX 26.1 — أرشفة المهام التاريخية بدون كسر التدقيق”)&lt;/strong&gt;، هنتعلم أسرار الـ Archiving APIs الجديدة في APEX 26.1 واستراتيجيات تقسيم الجداول (Table Partitioning)!&lt;/p&gt;
&lt;p&gt;نشوفكم في الحلقة الأخيرة الكبيرة! 🗄️🧹✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>إدارة الـ Workflows الضخمة</category><category>oracle-apex</category><category>interactive-grid</category><category>batch-processing</category><category>plsql</category><category>arabic</category></item><item><title>شاشة الحرباء: الرسم الديناميكي لأشرطة الأكشنز في Oracle APEX 🦎🎚️</title><link>https://ash2osh.github.io/arabic-blog/posts/019_the-chameleon-cockpit-dynamically-rendering-action-bars-on-page-8/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/019_the-chameleon-cockpit-dynamically-rendering-action-bars-on-page-8/</guid><description>الجزء الخامس من سلسلة &quot;إدارة الـ Workflows الضخمة في أوراكل أبيكس&quot;. إزاي تحول صفحة تفاصيل واحدة لشاشة ذكية بتغير زرايرها وصلاحياتها تلقائياً لكل خطوة!</description><pubDate>Sun, 18 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-chameleon-cockpit-dynamically-rendering-action-bars-in-oracle-apex&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;شاشة-الحرباء-الرسم-الديناميكي-لأشرطة-الأكشنز-في-oracle-apex-️&quot;&gt;شاشة الحرباء: الرسم الديناميكي لأشرطة الأكشنز في Oracle APEX 🦎🎚️&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الخامس من سلسلة “إدارة الـ Workflows الضخمة في أوراكل أبيكس”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;تخيل لوحة مفاتيح لخزنة إلكترونية فائقة الأمان، الأرقام والزراير فيها مبتنورش ومبتظهرش أصلاً إلا لو كارت الأمان بتاعك معاه الصلاحية إنه يدوس عليها! بالنسبة لأي شخص مش مصرح له، الزراير كأنها مش موجودة في الكون أصلاً!&lt;/p&gt;
&lt;p&gt;في الدليل ده، هنربط جدول الميتاداتا الوصفي بتاعنا (&lt;strong&gt;&lt;code&gt;wf_action_config&lt;/code&gt;&lt;/strong&gt;) مع مصفوفة صلاحيات المستخدمين (&lt;strong&gt;&lt;code&gt;wf_user_permissions&lt;/code&gt;&lt;/strong&gt;) جوه &lt;strong&gt;منطقة PL/SQL Dynamic Content واحدة&lt;/strong&gt; على صفحة تفاصيل الطلب في أبيكس.&lt;/p&gt;
&lt;p&gt;ده بيحول صفحة أبيكس يتيمة لواجهة “حرباء (Chameleon)” متعددة الأشكال، بتغير زرايرها وألوانها وأيقوناتها ورسائل التأكيد المنبثقة لكل خطوة workflow—ومدعومة بحماية سيرفر صارمة لا يمكن اختراقها.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-تأثير-الحرباء-صفحة-واحدة-تدير-المنظومة-كلها&quot;&gt;🦎 تأثير الحرباء: صفحة واحدة تدير المنظومة كلها&lt;/h2&gt;
&lt;p&gt;في المعماريات البدائية لأوراكل أبيكس، كتير من المطورين بيعملوا صفحة تفاصيل مستقلة لكل نوع طلب:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;صفحة 10 لأوامر الشراء (Purchase Orders)&lt;/li&gt;
&lt;li&gt;صفحة 11 للمصروفات الرأسمالية (CAPEX)&lt;/li&gt;
&lt;li&gt;صفحة 12 لفواتير الموردين (Vendor Invoices)&lt;/li&gt;
&lt;li&gt;صفحة 13 لطلبات العهد والأجهزة&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;الطريقة دي بتتحول بسرعة لكابوس صيانة مرعب:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;لو الفريق حب يحدث التصميم العام، أو شريط التنقل (Breadcrumbs)، أو شاشة سجل الحركات، مضطر يكرر التعديل يدوياً في 4 صفحات مختلفة!&lt;/li&gt;
&lt;li&gt;لو عندك 30 مسار عمل في الشركة، صيانة 30 صفحة مختلفة بتبقى جحيم هندسي.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;في المعمارية الاحترافية للشركات، بنستخدم &lt;strong&gt;صفحة تفاصيل واحدة فقط&lt;/strong&gt; بتتصرف زي الحرباء بالظبط!&lt;/p&gt;
&lt;p&gt;أول ما بتفتح، الصفحة بتبص على رقم الطلب ورقم الخطوة، وتقرا الميتاداتا من الداتابيز، وتفحص صلاحيات اليوزر المسجل، وفي غمضة عين بتغير شريط الأكشنز بتاعها عشان تعرض بس الزراير المسموح له بيها!&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Req&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;رقم الطلب والخطوة&amp;lt;br/&amp;gt;(:P10_REQUEST_ID, :P10_STEP_ID)&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Config&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;قراءة الميتاداتا&amp;lt;br/&amp;gt;app_data.wf_action_config&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    User&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;اليوزر المتصل&amp;lt;br/&amp;gt;(:APP_USER)&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Perms&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;مصفوفة الصلاحيات&amp;lt;br/&amp;gt;app_security.wf_user_permissions&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Config &lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Perms &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Engine&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;منطقة PL/SQL Dynamic Content&amp;lt;br/&amp;gt;(توليد زراير الـ HTML)&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Engine &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; UI&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;شريط زراير الحرباء&amp;lt;br/&amp;gt;(موافق، مرفوض، طلب استيضاح)&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    UI &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;دوسة مع شاشة تأكيد&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; AJAX&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;عملية APEX AJAX بالخلفية&amp;lt;br/&amp;gt;(فحص صلاحيات السيرفر)&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    AJAX &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Core&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;pkg_workflow_actions.execute_action&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-محرك-الرسم-منطقة-plsql-dynamic-content&quot;&gt;💻 محرك الرسم: منطقة PL/SQL Dynamic Content&lt;/h2&gt;
&lt;p&gt;على صفحة تفاصيل الطلب (مثلاً صفحة 10)، بنعمل Region من نوع &lt;strong&gt;PL/SQL Dynamic Content&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;declare&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    v_step_cfg   &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_action_config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;%rowtype;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    v_can_btn1   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    v_can_btn2   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    v_can_btn3   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    v_can_btn4   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    v_tokens     apex_t_varchar2;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    procedure&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; render_button(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_enabled      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_authorized   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_config_str   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_action_code  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_slot_num     &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;is&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        v_parts apex_t_varchar2;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_enabled &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_authorized &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_config_str &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;is not null&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            v_parts :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; apex_string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(p_config_str, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;            -- v_parts(1) = النص، (2) = كلاس اللون، (3) = الأيقونة، (4) = فلاج التأكيد&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;            sys&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;htp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.p(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;apex_string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &apos;&amp;lt;button type=&quot;button&quot; class=&quot;t-Button %s&quot; &apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &apos;onclick=&quot;handleWorkflowAction(%s, &apos;&apos;%s&apos;&apos;, %s)&quot;&amp;gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &apos;&amp;lt;span class=&quot;t-Icon fa %s&quot; aria-hidden=&quot;true&quot;&amp;gt;&amp;lt;/span&amp;gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &apos;&amp;lt;span class=&quot;t-Button-label&quot;&amp;gt;%s&amp;lt;/span&amp;gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                &apos;&amp;lt;/button&amp;gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                v_parts(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),       &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مثلاً: &apos;u-success&apos; أو &apos;u-danger&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                p_slot_num,       &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- رقم الزرار (1..4)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                p_action_code,    &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- كود الأكشن: &apos;APPROVE&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                v_parts(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),       &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 1 (محتاج تأكيد) أو 0 (فوري)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                v_parts(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),       &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مثلاً: &apos;fa-check&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                apex_escape&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(v_parts(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مثلاً: &apos;Approve Order&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            ));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        end&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; render_button;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- 1. قراءة إعدادات أكشنز الخطوة الحالية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    select&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; into&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_step_cfg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_action_config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;     where&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; step_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :P10_CURRENT_STEP_ID;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- 2. التحقق من مصفوفة صلاحيات اليوزر المتصل&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    select&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; coalesce&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(can_action1), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           coalesce&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(can_action2), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           coalesce&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(can_action3), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           coalesce&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(can_action4), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      into&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_can_btn1, v_can_btn2, v_can_btn3, v_can_btn4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_security&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_user_permissions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;     where&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; step_id   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :P10_CURRENT_STEP_ID&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;       and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; user_name &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :APP_USER;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- 3. رسم حاوية زراير الـ HTML&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    sys&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;htp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.p(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;&amp;lt;div class=&quot;t-ButtonRegion-wrap&quot;&amp;gt;&amp;lt;div class=&quot;t-ButtonRegion-col t-ButtonRegion-col--right&quot;&amp;gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- رسم الزراير الأربعة حسب الصلاحية والإعدادات&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    render_button(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;has_btn1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, v_can_btn1, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;btn1_config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;btn1_action_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    render_button(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;has_btn2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, v_can_btn2, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;btn2_config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;btn2_action_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    render_button(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;has_btn3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, v_can_btn3, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;btn3_config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;btn3_action_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    render_button(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;has_btn4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, v_can_btn4, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;btn4_config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_step_cfg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;btn4_action_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    sys&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;htp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.p(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;exception&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    when&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; no_data_found &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        sys&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;htp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.p(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;&amp;lt;span class=&quot;u-warning-text&quot;&amp;gt;لا توجد إجراءات متاحة لهذه المرحلة من الطلب.&amp;lt;/span&amp;gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-معالج-الجافاسكريبت-شاشات-تأكيد-أنيقة-وسلسة&quot;&gt;🖱️ معالج الجافاسكريبت: شاشات تأكيد أنيقة وسلسة&lt;/h2&gt;
&lt;p&gt;لاحظ إن الزراير اللي اترسمت بتنادي دالة اسمها &lt;code&gt;handleWorkflowAction(...)&lt;/code&gt;. بنضيف الدالة دي في إعدادات الجافاسكريبت بالصفحة:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; handleWorkflowAction&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;slotNumber&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;actionCode&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;requiresConfirm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; doSubmit&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        apex.server.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &quot;EXECUTE_WORKFLOW_ACTION&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                x01: actionCode,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                pageItems: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;#P10_REQUEST_ID,#P10_CURRENT_STEP_ID,#P10_ACTION_COMMENTS&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;                success&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (data.status &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;SUCCESS&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                        apex.message.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;showPageSuccess&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(data.message &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;تم تنفيذ الإجراء بنجاح.&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                        apex.navigation.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;redirect&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(data.redirect_url &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;f?p=&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex.env.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;APP_ID&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;:100:&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex.env.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;APP_SESSION&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                        apex.message.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;clearErrors&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                        apex.message.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;showErrors&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;([{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                            type: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                            location: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;page&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                            message: data.message &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;فشل تنفيذ الإجراء.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                        }]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (requiresConfirm &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        apex.message.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;confirm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &quot;هل أنت متأكد من رغبتك في اتخاذ هذا الإجراء؟&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;okPressed&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (okPressed) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;                    doSubmit&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        doSubmit&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-أمان-دفاعي-متعدد-الطبقات-إياك-تثق-في-متصفح-العميل&quot;&gt;🔒 أمان دفاعي متعدد الطبقات: إياك تثق في متصفح العميل!&lt;/h2&gt;
&lt;p&gt;قاعدة أمنية ذهبية في هندسة البرمجيات: &lt;strong&gt;إخفاء الزرار عن الشاشة لا يعتبر أماناً!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;مجرد إن الزرار مش مرسوم في صفحة المتصفح، ده ميمنعش مستخدم خبيث أو فضولي إنه يفتح الـ Browser Console ويجرب ينادي &lt;code&gt;apex.server.process(&quot;EXECUTE_WORKFLOW_ACTION&quot;)&lt;/code&gt; بإيده!&lt;/p&gt;
&lt;p&gt;عشان نقفل الباب ده بالضبة والمفتاح، عملية الـ AJAX في السيرفر بتفوض التنفيذ لـ Package الباك إند (&lt;code&gt;app_code.pkg_workflow_actions.execute_action&lt;/code&gt;) واللي بتفرض &lt;strong&gt;3 فحوصات سيرفر إلزامية&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;فحص الصلاحيات الصريح&lt;/strong&gt;: بتسأل جدول &lt;code&gt;wf_user_permissions&lt;/code&gt; بشكل مستقل للتأكد إن &lt;code&gt;:APP_USER&lt;/code&gt; معاه تصريح صريح للأكشن ده في الخطوة دي بالتحديد.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;فحص التزامن وحالة الطلب&lt;/strong&gt;: بتتأكد إن الطلب لسه في حالته المتوقعة، ومفيش مدير تاني سبقه واعتمد أو رفض الطلب قبله بلحظات.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تسجيل الحركة في سجل الأحداث&lt;/strong&gt;: لو الفحوصات نجحت، بتسجل الحركة في &lt;code&gt;wf_task_event_log&lt;/code&gt; وتنقل حالة الـ Workflow.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;لو أي فحص فشل، السيرفر بيرمي خطأ غير معالج ويلغي المعاملة فوراً، واليوزر يستلم رسالة خطأ أمنية واضحة.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-الجزء-السادس&quot;&gt;🚀 إيه اللي مستنينا في الجزء السادس؟&lt;/h2&gt;
&lt;p&gt;مراجعة كل طلب لوحده في شاشة الحرباء دي حاجة شيك جداً للقرارات الكبيرة زي المصروفات الرأسمالية والصفقات الضخمة.&lt;/p&gt;
&lt;p&gt;لكن مدراء الإدارات غالباً بيدخلوا صباح يوم الإثنين يلاقوا &lt;strong&gt;50 طلب روتيني متراكم&lt;/strong&gt; في صندوق الوارد. فكرة إنه يفتح 50 صفحة ورا بعض، ويدوس موافق 50 مرة، ويأكد 50 شاشة منبثقة دي وصفة مؤكدة للإرهاق وتطفيش المستخدمين!&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء السادس (“الختم السريع: الاعتماد الجماعي بضغطة واحدة جوه الـ Interactive Grid”)&lt;/strong&gt;، هنبني محرك موافقات جماعية عالي السرعة مزود بحماية الـ Savepoints لعزل الأخطاء وحماية القفل التفاؤلي (Optimistic Locking)!&lt;/p&gt;
&lt;p&gt;استنونا في الجزء السادس! 📑🖊️✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>إدارة الـ Workflows الضخمة</category><category>oracle-apex</category><category>plsql</category><category>ui-rendering</category><category>security</category><category>arabic</category></item><item><title>وداعاً للزراير الثابتة: تخزين أكشنز الشاشات في سطور الداتابيز 🎛️📋</title><link>https://ash2osh.github.io/arabic-blog/posts/018_goodbye-hardcoded-buttons-storing-ui-actions-in-database-rows/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/018_goodbye-hardcoded-buttons-storing-ui-actions-in-database-rows/</guid><description>الجزء الرابع من سلسلة &quot;إدارة الـ Workflows الضخمة في أوراكل أبيكس&quot;. ليه رص 40 زرار بشروط معقدة في Page Designer يعتبر ديون تقنية قاتلة—وإزاي جدول ميتاداتا بيحلها في ثواني!</description><pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/goodbye-hardcoded-buttons-storing-ui-actions-in-database-rows&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;وداعاً-للزراير-الثابتة-تخزين-أكشنز-الشاشات-في-سطور-الداتابيز-️&quot;&gt;وداعاً للزراير الثابتة: تخزين أكشنز الشاشات في سطور الداتابيز 🎛️📋&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الرابع من سلسلة “إدارة الـ Workflows الضخمة في أوراكل أبيكس”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;لو فتحت قبل كده Oracle APEX Page Designer واتصدمت بمنظر 40 زرار مرصوصين جنب بعض في الهيدر—وكل زرار فيهم وراه مكرونة من الـ Server-Side Conditions زي &lt;em&gt;“يظهر بس لو الخطوة هي FINANCE_AUDIT، والأولوية HIGH، واليوزر معاه ROLE_CONTROLLER”&lt;/em&gt;—فأنت عشت قمة الديون التقنية (Technical Debt) بعينك!&lt;/p&gt;
&lt;p&gt;بنقل تعريفات وتنسيقات الزراير لجدول ميتاداتا علائقي (&lt;strong&gt;&lt;code&gt;wf_action_config&lt;/code&gt;&lt;/strong&gt;)، بنحول شاشة أبيكس لوحدة تحكم برمجية ديناميكية بترسم الزراير، والألوان، والأيقونات، ورسائل التأكيد المظبوطة لكل خطوة من مئات خطوات الـ Workflows من غير ما تفتح Page Designer مرة تانية في حياتك!&lt;/p&gt;
&lt;p&gt;هنا هنتعلم إزاي نستبدل زحمة الزراير دي ببيانات وصفية شيك ومحترمة.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-ذراع-الألعاب-القديم-الملحوم-ضد-الدراع-الذكي-القابل-للبرمجة&quot;&gt;🎮 ذراع الألعاب القديم الملحوم ضد الدراع الذكي القابل للبرمجة&lt;/h2&gt;
&lt;p&gt;تخيل عالم أذرع ألعاب الفيديو (Controllers) كالمثال التالي:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;كابوس الدراع القديم الملحوم بـ كاوية اللحام&lt;/strong&gt;: كل ما تنزل لعبة جديدة في السوق، تجيب كاوية القصدير، وتسيح خرم جديد في البلاستيك بتاع الدراع، وتلحم زرار أحمر في لوحة الدوائر الإلكترونية، وتكتب عليه بقلم فلوماستر “تعويذة سحرية”! بعد 6 شهور، شكل الدراع بتاعك هيبقى شبه القنفذ المشوه بـ 50 زرار بارزين في كل اتجاه!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الدراع الذكي الحديث&lt;/strong&gt;: الدراع فيه شريط أنيق من الزراير المزودة بشاشات OLED صغيرة. لما تشغل لعبة سباق عربيات، زرار 1 ينور بالأخضر ويكتب “نيترو”. ولما تشغل لعبة ألغاز، نفس الزرار يتحول للأزرق ويكتب “تدوير القطعة”. عتاد الهاردوير ثابت مبيتغيرش؛ اللعبة هي اللي بتبعت له ملف الإعدادات بس!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;في تطبيقات Oracle APEX للمؤسسات، تثبيت عشرات الزراير يدوي في Page Designer هو بالظبط كاوية اللحام في البلاستيك. بيطلع نظام هش، معقد، وصيانته كابوس.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-عذاب-صفحة-الـ-40-زرار-في-أبيكس&quot;&gt;💥 عذاب صفحة الـ 40 زرار في أبيكس&lt;/h2&gt;
&lt;p&gt;لما تبني مسارات عمل وموافقات معقدة متعددة المراحل، كل مرحلة بتتطلب زراير وإجراءات مختلفة تماماً:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;خطوة &lt;strong&gt;مراجعة المدير&lt;/strong&gt;: محتاجة زراير &lt;code&gt;Approve&lt;/code&gt;، و &lt;code&gt;Reject&lt;/code&gt;، و &lt;code&gt;Request Info&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;خطوة &lt;strong&gt;مراجعة الحسابات والمالية&lt;/strong&gt;: محتاجة &lt;code&gt;Verify Budget&lt;/code&gt;، و &lt;code&gt;Authorize Payment&lt;/code&gt;، و &lt;code&gt;Return to Requester&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;خطوة &lt;strong&gt;المراجعة القانونية&lt;/strong&gt;: محتاجة &lt;code&gt;Upload Addendum&lt;/code&gt;، و &lt;code&gt;Flag Clause&lt;/code&gt;، و &lt;code&gt;Approve Terms&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;لو بنيت ده بالطريقة التقليدية جوه شاشة أبيكس:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;الـ Page Designer بيبقى مستحيل استخدامه&lt;/strong&gt;: شجرة المكونات (Component Tree) بتتحول لحائط سد فيه 45 زرار!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الشروط بتبقى مكرونة اسباجيتي&lt;/strong&gt;: بتنتهي بـ 45 شرط PL/SQL معقد بيفحص الـ Session State والـ Roles والمبالغ.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;كوارث تضارب الـ Merge في Git&lt;/strong&gt;: لو مطورين عدلوا في زرارين مختلفين على نفس الصفحة، ملف الـ SQL المصدر بيطلع فيه مئات سطور التضارب غير القابلة للحل!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;انعدام المرونة&lt;/strong&gt;: مجرد تغيير كلمة على زرار من &lt;em&gt;“Reject”&lt;/em&gt; لـ &lt;em&gt;“Return for Revisions”&lt;/em&gt; بيتطلب دورة سوفتوير كاملة: تذكرة شغل، وتعديل، وتصدير، وتيست، ونشر على السيرفر!&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الحل-الذكي-جدول-الميتاداتا-wf_action_config&quot;&gt;📋 الحل الذكي: جدول الميتاداتا &lt;code&gt;wf_action_config&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;في المعمارية القابلة للتوسع، أكشنز الشاشات بتتعامل كـ &lt;strong&gt;سطور بيانات في جدول&lt;/strong&gt;. بنعرف جدول لإعدادات الأكشنز في سكيما الداتا (&lt;code&gt;app_data&lt;/code&gt;) كالآتي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- جدول: app_data.wf_action_config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- الهدف: ميتاداتا وصفية بتعرف زراير الأكشنز لكل خطوة في الـ Workflow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; table&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.wf_action_config (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    step_id          &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;primary key&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مثلاً: &apos;PO_MANAGER_REVIEW&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    step_name        &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    module_code      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,   &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مثلاً: &apos;PROCUREMENT&apos;, &apos;CAPEX&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- مكان الزرار الأول&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn1         &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; check&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (has_btn1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    btn1_config      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- التنسيق: النص,كلاس_CSS,كلاس_الأيقونة,رسالة_تأكيد&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    btn1_action_code &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مثلاً: &apos;APPROVE&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- مكان الزرار الثاني&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn2         &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; check&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (has_btn2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    btn2_config      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    btn2_action_code &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مثلاً: &apos;REJECT&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- مكان الزرار الثالث&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn3         &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; check&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (has_btn3 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    btn3_config      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    btn3_action_code &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مثلاً: &apos;REQUEST_INFO&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- مكان الزرار الرابع&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn4         &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; check&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (has_btn4 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    btn4_config      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    btn4_action_code &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    created_at       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; local&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; time&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; zone&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; current_timestamp,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    updated_at       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; local&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; time&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; zone&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; current_timestamp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-تعريف-الزراير-في-سطور-داتا-سهلة-ومباشرة&quot;&gt;🎨 تعريف الزراير في سطور داتا سهلة ومباشرة&lt;/h2&gt;
&lt;p&gt;بصوا بقى على السهولة والجمال لما نحدد إعدادات الشاشات كسطور داتا عادية:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 1. خطوة مراجعة مدير الإدارة لأمر الشراء&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;insert into&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_action_config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    step_id, step_name, module_code,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn1, btn1_config, btn1_action_code,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn2, btn2_config, btn2_action_code,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn3, btn3_config, btn3_action_code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;values&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;PO_MANAGER_REVIEW&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Department Manager PO Review&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;PROCUREMENT&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Approve Order,u-success,fa-check,1&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,            &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;APPROVE&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Reject Order,u-danger,fa-times,1&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,             &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;REJECT&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Request Clarification,u-warning,fa-comment,0&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;REQUEST_INFO&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 2. خطوة المراجعة المالية للمصروفات الرأسمالية (CAPEX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;insert into&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_action_config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    step_id, step_name, module_code,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn1, btn1_config, btn1_action_code,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn2, btn2_config, btn2_action_code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;values&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;CAPEX_FINANCE_AUDIT&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Capital Expenditure Executive Audit&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;CAPEX&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Authorize Expenditure,u-success,fa-check-circle,1&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;APPROVE&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Return for Budget Revision,u-danger,fa-undo,1&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,     &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;REJECT&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 3. مطابقة فواتير الموردين في الحسابات&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;insert into&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_action_config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    step_id, step_name, module_code,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn1, btn1_config, btn1_action_code,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn2, btn2_config, btn2_action_code,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    has_btn3, btn3_config, btn3_action_code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;values&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;AP_INVOICE_MATCH&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Accounts Payable 3-Way Match&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;INVOICING&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Confirm Match &amp;amp; Release,u-primary,fa-link,1&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,   &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;MATCH_RELEASE&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Flag Discrepancy,u-danger,fa-flag,1&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,           &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;FLAG_ERROR&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Y&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Upload Supporting Dockets,u-info,fa-upload,0&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,  &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;UPLOAD_ATTACHMENT&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;فك-تشفير-نص-إعدادات-الزرار-btn_config&quot;&gt;فك تشفير نص إعدادات الزرار (&lt;code&gt;btn_config&lt;/code&gt;):&lt;/h3&gt;
&lt;p&gt;لاحظ النص المكون من 4 أجزاء مفصولين بفواصل:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&apos;Approve Order,u-success,fa-check,1&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       │          │          │   └── شاشة التأكيد المنبثقة: 1=اطلب تأكيد، 0=تنفيذ فوري&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       │          │          └────── أيقونة Font Awesome: fa-check&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       │          └───────────────── كلاس ألوان ثيم أبيكس Universal Theme: u-success (أخضر)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       └──────────────────────────── النص المكتوب على الزرار: &quot;Approve Order&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-ليه-الطريقة-دي-بتكسب-الزراير-الثابتة-بالضربة-القاضية&quot;&gt;🌟 ليه الطريقة دي بتكسب الزراير الثابتة بالضربة القاضية؟&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الميزة&lt;/th&gt;
&lt;th&gt;زراير Page Designer الثابتة&lt;/th&gt;
&lt;th&gt;جدول الميتاداتا &lt;code&gt;wf_action_config&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;عدد الزراير على الصفحة&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30 – 50 مكون مرصوصين&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;صفر زراير ثابتة&lt;/strong&gt; (حاوية واحدة ديناميكية)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;إضافة خطوة موافقة جديدة&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ضيف زراير، واكتب شروط، وصدر الكود، واعمل Deploy&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ضيف سطر واحد&lt;/strong&gt; في جدول الداتابيز&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;تغيير اسم أو لون زرار&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;تعديل كود + Pull Request + Deployment&lt;/td&gt;
&lt;td&gt;أمر &lt;code&gt;UPDATE&lt;/code&gt; بسيط في ثانيتين بس!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;رسائل التأكيد (Confirmations)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;كود جافاسكريبت مخصص لكل زرار&lt;/td&gt;
&lt;td&gt;فلاج جاهز (&lt;code&gt;1&lt;/code&gt; أو &lt;code&gt;0&lt;/code&gt;) بيتعالج تلقائياً&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;تناسق الألوان والمظهر&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;سهل المطورين يلخبطوا في الألوان&lt;/td&gt;
&lt;td&gt;معايير مفروضة من الداتابيز (&lt;code&gt;u-success&lt;/code&gt;, &lt;code&gt;u-danger&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;تضارب الـ Git&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;خناقات وتضارب مستمر في ملفات الصفحات&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;صفر تضارب&lt;/strong&gt; على صفحة الـ UI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-الجزء-الخامس&quot;&gt;🦎 إيه اللي مستنينا في الجزء الخامس؟&lt;/h2&gt;
&lt;p&gt;الميتاداتا دلوقتي متخزنة بأمان في جداول الداتابيز. لكن إزاي Oracle APEX بتاخد السطور دي وتحولها لزراير HTML تفاعلية وشيك جداً على شاشة المستخدم وقت التشغيل؟&lt;/p&gt;
&lt;p&gt;والأهم من كده: إزاي نتأكد إن الموظفين اللي معاهم صلاحية بس هما اللي يقدروا يشوفوا ويدوسوا على الزراير دي؟&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الخامس (“شاشة الحرباء: الرسم الديناميكي لأشرطة الأكشنز في صفحة 8”)&lt;/strong&gt;، هنبني منطقة PL/SQL ديناميكية على صفحة تفاصيل الطلب، بتغير شكل شريط الأدوات تلقائياً في لمح البصر مع تطبيق أمان سيرفر صارم لا يمكن اختراقه!&lt;/p&gt;
&lt;p&gt;استنونا في الجزء الخامس! 🦎🎚️✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>إدارة الـ Workflows الضخمة</category><category>oracle-apex</category><category>lowcode</category><category>ui-design</category><category>architecture</category><category>database-design</category><category>arabic</category></item><item><title>تزامن الكاش بالأحداث: تحديث كاش المهام بنسبة 100% فورياً بالـ Triggers 🔄🔔</title><link>https://ash2osh.github.io/arabic-blog/posts/017_event-driven-cache-sync-keeping-your-task-cache-fresh-with-triggers/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/017_event-driven-cache-sync-keeping-your-task-cache-fresh-with-triggers/</guid><description>الجزء الثالث من سلسلة &quot;إدارة الـ Workflows الضخمة في أوراكل أبيكس&quot;. إزاي تحافظ على تزامن فوري في شاشات أبيكس بدون Cron Jobs ولا هدر في الـ I/O ولا قفل للجداول!</description><pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/event-driven-cache-sync-keeping-your-task-cache-100-fresh&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;تزامن-الكاش-بالأحداث-تحديث-كاش-المهام-بنسبة-100-فورياً-بالـ-triggers-&quot;&gt;تزامن الكاش بالأحداث: تحديث كاش المهام بنسبة 100% فورياً بالـ Triggers 🔄🔔&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الثالث من سلسلة “إدارة الـ Workflows الضخمة في أوراكل أبيكس”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;فيه طريقتين عشان تعرف إن فنجان القهوة بتاعك جهز في كافيه زحمة الصبح: يا إما تفضل واقف قدام الباريستا وكل 15 ثانية تهتف بصوت عالي: &lt;em&gt;“القهوة بتاعتي خلصت ولا لسه؟!”&lt;/em&gt; (طريقة الـ Polling)، أو إن الباريستا يرن جرس التنبيه الصغير في نفس اللحظة اللي فنجانك بينزل فيها على الرخامة (طريقة الـ Event-Driven Notification).&lt;/p&gt;
&lt;p&gt;عشان نحافظ على تزامن جدول الكاش السريع (&lt;strong&gt;&lt;code&gt;wf_task_cache&lt;/code&gt;&lt;/strong&gt;) مع تنقلات مهام Oracle APEX، بنبعد تماماً عن وظائف الجدولة الدورية التقيلة (Scheduler Jobs). وبدل كدة، بنستخدم تريجرات داتابيز ذكية معتمدة على الأحداث، مربوطة بـ Packages محكمة لتحديث الكاش فورياً.&lt;/p&gt;
&lt;p&gt;ده بيحقق دقة وتزامن بنسبة 100% في واجهات أبيكس مع صفر وظائف مجدولة، وصفر تأخير، وصفر قفل أو تضارب على الجداول (Lock Contention).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-فخ-الـ-polling-ضد-نمط-جرس-الخدمة-service-bell-pattern&quot;&gt;☕ فخ الـ Polling ضد نمط جرس الخدمة (Service Bell Pattern)&lt;/h2&gt;
&lt;p&gt;في معماريات الكاش، كتير من المطورين اللي مبيحبوش يوجعوا دماغهم بتزامن البيانات بيستسهلوا: يروح يعمل وظيفة &lt;code&gt;DBMS_SCHEDULER&lt;/code&gt; تشتغل كل 5 دقائق عشان تعيد بناء جدول الكاش بالكامل من الصفر.&lt;/p&gt;
&lt;p&gt;في بيئات الشركات الكبيرة والزحمة، الجدولة الدورية دي بتعمل مصيبتين كبار:&lt;/p&gt;
&lt;h3 id=&quot;1-لاج-الموافقة-الشبح-ghost-approval-lag&quot;&gt;1. لاج “الموافقة الشبح” (Ghost Approval Lag)&lt;/h3&gt;
&lt;p&gt;مدير إدارة يفتح شاشة أبيكس، يراجع طلب شراء مهم بـ 50 ألف دولار، ويدوس &lt;strong&gt;موافق (Approve)&lt;/strong&gt;.
الصفحة تعمل Refresh—ولأن وظيفة الكاش لسه ميعادها مجاش، الطلب يفضل ظاهر قدامه على الشاشة بحالة &lt;code&gt;PENDING&lt;/code&gt;! المدير يتلخبط ويدوس &lt;strong&gt;Approve&lt;/strong&gt; تاني، فيطلع له إيرور أو تتكرر أوامر الشراء في السيستم!&lt;/p&gt;
&lt;h3 id=&quot;2-حرق-الـ-io-والـ-cpu-على-الفاضي&quot;&gt;2. حرق الـ I/O والـ CPU على الفاضي&lt;/h3&gt;
&lt;p&gt;وظيفة شغالة كل 60 ثانية بتحرق في معالج وسيرفر الداتابيز 24 ساعة في اليوم، 7 أيام في الأسبوع—حتى الساعة 3 الفجر يوم الأحد والشركة كلها في إجازة ومفيش طلب واحد اتبعت من 8 ساعات!&lt;/p&gt;
&lt;p&gt;بدل الـ Polling المرهق، بنستخدم &lt;strong&gt;نمط جرس الخدمة (Service Bell Pattern)&lt;/strong&gt;:
أول ما أي إجراء بيحصل على الـ Workflow، الداتابيز بتحدث سطر الكاش في &lt;strong&gt;نفس المعاملة (Database Transaction)&lt;/strong&gt;. ولما صفحة أبيكس تفتح في متصفح المدير، بيكون جدول الكاش اتحدث وجاهز 100%!&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    autonumber&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    actor&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; User&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; المعتمد / المدير&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    participant&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; UI&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; صفحة أبيكس&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    participant&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; WF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; محرك APEX Workflow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    participant&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Log&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; سجل الأحداث wf_task_event_log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    participant&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Trg&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; تريجر trg_wf_task_log_cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    participant&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Cache&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; كاش المهام wf_task_cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    User&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;UI&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; بيدوس &quot;موافق&quot; (Approve)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    UI&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;WF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; تنفيذ خطوة الـ Workflow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    WF&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Log&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; كتابة سطر الحدث في السجل&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Log&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Trg&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; التريجر بيشتغل فورياً&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Trg&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Cache&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; تحديث الحالة لـ &apos;APPROVED&apos; (أو حذفه)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Cache&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;UI&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; الصفحة بتفتح في 20ms بالقائمة المحدثة&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-دفتر-سجل-الأحداث-جدول-wf_task_event_log&quot;&gt;🏗️ دفتر سجل الأحداث: جدول &lt;code&gt;wf_task_event_log&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;عشان نفصل العمليات بنظافة، بنسجل كل حركة بتحصل في جدول أحداث تاريخي ثابت في الـ Schema المخصصة للداتا (&lt;code&gt;app_data&lt;/code&gt;) كالآتي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- جدول: app_data.wf_task_event_log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- الهدف: دفتر أستاذ تاريخي ثابت بيسجل كل حركة وانتقال في الـ Workflow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; table&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.wf_task_event_log (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    event_id         &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; generated&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; always&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; identity&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; primary key&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    request_id       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    task_id          &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    action_type      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- &apos;CREATE&apos;, &apos;APPROVE&apos;, &apos;REJECT&apos;, &apos;REASSIGN&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    previous_status  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    new_status       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- &apos;PENDING&apos;, &apos;APPROVED&apos;, &apos;REJECTED&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    action_user      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; coalesce&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(sys_context(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;APEX$SESSION&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;APP_USER&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), user) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    action_comments  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    event_timestamp  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; local&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; time&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; zone&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; current_timestamp &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; index&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.wf_task_event_req_idx &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_event_log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(request_id, event_timestamp &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;كل تغيير في الحالة—سواء اتعمل بمحرك أبيكس التلقائي، أو بانتهاء المهلة (Timeout)، أو بضغطة زرار من موظف—بيسجل سطر في الدفتر ده.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-التريجر-الخفيف-دور-الجرس-فقط&quot;&gt;🔔 التريجر الخفيف: دور الجرس فقط&lt;/h2&gt;
&lt;p&gt;تريجرات الداتابيز المفروض متكونش مليانة لوجيك بيزنس ولا استدعاءات تقيلة. التريجر الصح بيعمل حاجة واحدة بس: &lt;strong&gt;بيرن الجرس ويسلم المفاتيح لـ PL/SQL Package جاهزة ومتجمعة&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- تريجر: app_data.trg_wf_task_log_cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create or replace&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; trigger&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.trg_wf_task_log_cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;after&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; insert&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_event_log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; each &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;row&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- تفويض فوري للـ Package المركزية لمزامنة الكاش&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;pkg_task_cache&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.sync_task_cache(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_request_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;request_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_task_id    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_action     &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;action_type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_new_status &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;new_status&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_user       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;action_user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-منسق-الكاش-package-الـ-pkg_task_cache&quot;&gt;⚙️ منسق الكاش: Package الـ &lt;code&gt;pkg_task_cache&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;تعالوا نشوف كود الـ Package اللي في سكيما البرمجة (&lt;code&gt;app_code&lt;/code&gt;). لاحظ إزاي بتتعامل بذكاء مع الحالات المستمرة والحالات النهائية:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;pkg_task_cache&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    procedure&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sync_task_cache(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_request_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_task_id    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_action     &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_new_status &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_user       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pkg_task_cache;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package body &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;pkg_task_cache&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    procedure&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sync_task_cache(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_request_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_task_id    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_action     &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_new_status &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        p_user       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; varchar2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;is&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        -- السيناريو (أ): الوصول لحالة نهائية (انتهت المهمة)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        -- لما المهمة تعتمد أو تترفض أو تتلغي، مبقتش شغل نشط.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        -- بنمسحها فوراً من جدول الكاش السريع!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_new_status &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;APPROVED&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;REJECTED&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;CANCELLED&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;EXPIRED&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            delete&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;             where&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; request_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_request_id;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;             &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        -- السيناريو (ب): انتقال لحالة نشطة جديدة (استلام، قيد التنفيذ، إعادة توجيه)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            update&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;               set&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; status&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;     =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_new_status,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                   task_id    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; coalesce&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(p_task_id, task_id),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                   updated_at &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; current_timestamp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;             where&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; request_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_request_id;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;            -- لو السطر مكنش لسه موجود في الكاش (مثلاً مهمة جديدة لسه متكريتة حالا)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            if&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; sql&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;%rowcount &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                insert into&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_cache&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    request_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    task_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    task_group,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    task_type,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    status&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    title,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    priority,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    requester_name,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    potential_owners,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    created_at,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    updated_at&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                select&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;request_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                       p_task_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                       r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;request_group&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                       r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;request_type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                       p_new_status,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                       r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                       r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;priority&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                       r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;requester_name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                       r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;potential_owners&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                       current_timestamp,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                       current_timestamp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                  from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_requests&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                 where&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;request_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p_request_id;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            end&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        end&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sync_task_cache;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pkg_task_cache;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-القواعد-الذهبية-التلاتة-لتريجرات-بدون-أي-بطء-أو-قفل-جداول&quot;&gt;🛡️ القواعد الذهبية التلاتة لتريجرات بدون أي بطء أو قفل جداول&lt;/h2&gt;
&lt;p&gt;عشان تضمن إن التزامن ده يشتغل مع آلاف العمليات المتزامنة في نفس اللحظة:&lt;/p&gt;
&lt;h3 id=&quot;1-التعديل-المستهدف-لسطر-واحد-بمفتاح-فريد-targeted-single-row-writes&quot;&gt;1. التعديل المستهدف لسطر واحد بمفتاح فريد (Targeted Single-Row Writes)&lt;/h3&gt;
&lt;p&gt;لاحظ إن جمل الـ UPDATE والـ DELETE بتفلتر بـ &lt;code&gt;where request_id = p_request_id&lt;/code&gt;. ولأن &lt;code&gt;request_id&lt;/code&gt; عليه B-Tree Index، أوراكل بتقفل بس السطر ده بالذات لأجزاء من الميلي ثانية وتسيبه فوراً.&lt;/p&gt;
&lt;h3 id=&quot;2-إياك-تستخدم-autonomous_transaction-في-تحديث-الكاش&quot;&gt;2. إياك تستخدم &lt;code&gt;AUTONOMOUS_TRANSACTION&lt;/code&gt; في تحديث الكاش!&lt;/h3&gt;
&lt;p&gt;بعض المطورين بيحاولوا يخلوا كود التريجر ده معزول بـ &lt;code&gt;PRAGMA AUTONOMOUS_TRANSACTION&lt;/code&gt;. غلط كبير! لو المعاملة الرئيسية اتلغت (Rollback) بسبب قيد في الداتابيز، كود الكاش هيفضل محفوظ—وهتسيب مهمة “شبح” يتيمة في الكاش! وجودهم في نفس المعاملة بيضمن تكامل بيانات ACID بنسبة 100%.&lt;/p&gt;
&lt;h3 id=&quot;3-الحذف-الفوري-للطلبات-المنتهية&quot;&gt;3. الحذف الفوري للطلبات المنتهية&lt;/h3&gt;
&lt;p&gt;جدول كاش العمليات معمول عشان يشيل &lt;strong&gt;الشغل الشغال بس&lt;/strong&gt;. أول ما المهمة تنتهي بموافقة أو رفض، طيرها من &lt;code&gt;wf_task_cache&lt;/code&gt;. تاريخها المحفوظ متسجل للأبد في جدول الأحداث &lt;code&gt;wf_task_event_log&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-الجزء-الرابع&quot;&gt;🚀 إيه اللي مستنينا في الجزء الرابع؟&lt;/h2&gt;
&lt;p&gt;الباك إند دلوقتي طيارة ومتزامن في اللحظة نفسها. بس ماذا عن تجربة المستخدم في الشاشات؟&lt;/p&gt;
&lt;p&gt;لما المعتمد يفتح مهمة معينة، كل خطوة في الـ Workflow بتتطلب زراير مختلفة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;خطوة 1 محتاجة زراير: &lt;em&gt;موافق&lt;/em&gt;، &lt;em&gt;مرفوض&lt;/em&gt;، &lt;em&gt;طلب معلومات إضافية&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;خطوة 2 محتاجة زراير: &lt;em&gt;تأكيد الميزانية&lt;/em&gt;، &lt;em&gt;رفع الفاتورة&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;خطوة 3 محتاجة زرار: &lt;em&gt;صرف المستحقات&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الرابع (“وداعاً للزراير الثابتة: تخزين أكشنز الشاشات في سطور الداتابيز”)&lt;/strong&gt;، هنشوف إزاي تخزين إعدادات الزراير في جدول ميتاداتا بيقضي تماماً على كابوس إدارة 40 زرار بشروط معقدة جوه APEX Page Designer!&lt;/p&gt;
&lt;p&gt;استنونا في الجزء الرابع! 🎛️📋✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>إدارة الـ Workflows الضخمة</category><category>oracle-apex</category><category>workflows</category><category>database</category><category>triggers</category><category>plsql</category><category>arabic</category></item><item><title>حامل بونات المطبخ: تصميم كاش العمليات عالي السرعة 🎫⚡</title><link>https://ash2osh.github.io/arabic-blog/posts/016_the-kitchen-ticket-carousel-designing-a-high-speed-workflow-cache/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/016_the-kitchen-ticket-carousel-designing-a-high-speed-workflow-cache/</guid><description>الجزء الثاني من سلسلة &quot;إدارة الـ Workflows الضخمة في أوراكل أبيكس&quot;. إزاي جدول كاش خفيف يحول استعلامات الشاشات من 15 ثانية انتظار لـ 20 ميلي ثانية وبسرعة 600 ضعف!</description><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-kitchen-ticket-carousel-designing-a-high-speed-workflow-cache&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;حامل-بونات-المطبخ-تصميم-كاش-العمليات-عالي-السرعة-&quot;&gt;حامل بونات المطبخ: تصميم كاش العمليات عالي السرعة 🎫⚡&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الثاني من سلسلة “إدارة الـ Workflows الضخمة في أوراكل أبيكس”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;لما الأوردرات تهجم على مطعم زحمة ليلة السبت، شيفات خط الطبخ مستحيل يسيبوا الشواية ويدخلوا مخزن البضاعة يعدوا كراتين الصلصة ويراجعوا فواتير الموردين عشان يعرفوا إيه المطلوب يطبخوه! هما بيبصوا قدامهم مباشرة على “حامل البونات الدوار” اللي متعلق فوق الشواية.&lt;/p&gt;
&lt;p&gt;ببناء جدول كاش عمليات مخصص (&lt;strong&gt;&lt;code&gt;wf_task_cache&lt;/code&gt;&lt;/strong&gt;)، بنفرز ونخزن بس البيانات اللي شاشات المهام محتاجاها بالضبط—وبنحول استعلامات بطيئة بتاخد 15 ثانية على الـ Views الرسمية لعملية بحث فوري في الفهارس بتاخد 20 ميلي ثانية بس!&lt;/p&gt;
&lt;p&gt;هنا هنتعلم إزاي نبني، ونفهرس، ونستعلم من جدول كاش فائق السرعة للـ Workflows جوه Oracle Database.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-مخزن-البضائع-الخلفي-ضد-حامل-البونات-السريع&quot;&gt;🍳 مخزن البضائع الخلفي ضد حامل البونات السريع&lt;/h2&gt;
&lt;p&gt;في &lt;a href=&quot;./015_the-30000-task-traffic-jam-why-native-apex-workflow-views-hit-a-wall.md&quot;&gt;الجزء الأول&lt;/a&gt;، شرحنا ليه الاستعلام المباشر من &lt;code&gt;APEX_TASKS&lt;/code&gt; في الأعداد الكبيرة بيهد حيل الداتابيز، لأنه بيجبرها تحسب شجرة الصلاحيات وتفك الـ JSON لكل سطر في النظام.&lt;/p&gt;
&lt;p&gt;تخيل معايا إدارة مطعم كبير:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;طريقة مخزن البضائع (الاستعلام المباشر من &lt;code&gt;APEX_TASKS&lt;/code&gt;)&lt;/strong&gt;: كل ما ترابيزة 7 تطلب ستيك مشوي، الشيف يسيب ماسك الشواء، ويدخل المكتب ورا، ويفتح درج الأرشيف بالمفتاح، ويقرا بوليصة شحن اللحمة، ويفحص شهادة الصحة، ويحسب هامش الربح! المطبخ في نص ساعة هيتأخر 3 ساعات عن الزباين!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;طريقة حامل بونات المطبخ (جدول كاش العمليات &lt;code&gt;wf_task_cache&lt;/code&gt;)&lt;/strong&gt;: الويتر بيكتب الطلب على التابلت. طابعة البونات فوق الشواية تطلع كارت صغير 5 سم يتعلق في الحامل الدوار. الكارت فيه 4 معلومات واضحة وصريحة: &lt;strong&gt;ترابيزة 7&lt;/strong&gt;، &lt;strong&gt;ستيك ريب آي (وسط)&lt;/strong&gt;، &lt;strong&gt;الساعة 7:42 م&lt;/strong&gt;، &lt;strong&gt;الويتر: ماركوس&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;الشيف بيبص للبونة، يسوي الستيك في 6 دقايق، يطلعه على الطبق، ويشك البونة في مسمار الأوردرات المخلصة!&lt;/p&gt;
&lt;p&gt;في معمارية Oracle APEX بتاعتنا، جدول &lt;strong&gt;&lt;code&gt;wf_task_cache&lt;/code&gt;&lt;/strong&gt; هو بالظبط حامل البونات السريع ده.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-التصميم-الهندسي-لجدول-wf_task_cache&quot;&gt;🏗️ التصميم الهندسي لجدول &lt;code&gt;wf_task_cache&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;بدل ما نخلي تقارير أبيكس تغوص في جداول الداتابيز الداخلية المعقدة (&lt;code&gt;WWV_FLOW_TASKS$&lt;/code&gt;)، بنعمل جدول بسيط ونظيف في الـ Schema المخصصة للداتا (&lt;code&gt;app_data&lt;/code&gt;) كالآتي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- جدول: app_data.wf_task_cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- الهدف: كاش عمليات عالي السرعة لمهام الـ Workflow النشطة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; table&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.wf_task_cache (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cache_id         &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; generated&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; always&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; identity&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; primary key&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    request_id       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    task_id          &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    task_group       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مثلاً: &apos;PURCHASE_REQUESTS&apos;, &apos;INVOICES&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    task_type        &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مثلاً: &apos;PO_FINANCE_APPROVAL&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    status&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- &apos;PENDING&apos;, &apos;ASSIGNED&apos;, &apos;IN_PROGRESS&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    priority         &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 1=طارئ، 2=عالي، 3=عادي&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    requester_id     &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    requester_name   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;250&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    title            &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    amount           &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),           &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- مؤشر مالي مهم للفلترة السريعة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    potential_owners &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),         &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- لستة مسبقة الحساب باليوزرات والأدوار المسموح لها بالاعتماد&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    created_at       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; local&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; time&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; zone&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; current_timestamp &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    updated_at       &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; local&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; time&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; zone&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; current_timestamp &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;not null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- فهارس الأداء الحاسمة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; index&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.wf_task_cache_grp_st_idx &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_cache&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(task_group, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, priority, created_at);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; index&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.wf_task_cache_req_idx &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_cache&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(request_id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; index&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.wf_task_cache_task_idx &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_cache&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(task_id);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-السلاح-السري-حساب-الصلاحيات-مسبقاً-pre-aggregated-security&quot;&gt;🧠 السلاح السري: حساب الصلاحيات مسبقاً (Pre-Aggregated Security)&lt;/h2&gt;
&lt;p&gt;أكبر سبب لبطء استعلامات المهام في أبيكس هو &lt;strong&gt;حساب المشاركين لحظة القراءة (Runtime Participant Calculation)&lt;/strong&gt;. لو مهمة متخصصة لجروب مدراء الحسابات &lt;code&gt;FINANCE_MANAGERS&lt;/code&gt;، الداتابيز بتضطر تفحص جداول الأمان لكل سطر عشان تشوف هل &lt;code&gt;:APP_USER&lt;/code&gt; عضو في الجروب ده حالياً ولا لأ!&lt;/p&gt;
&lt;p&gt;في جدول الكاش بتاعنا، نقلنا الحسبة دي من &lt;strong&gt;وقت القراءة (Read Time)&lt;/strong&gt; لـ &lt;strong&gt;وقت الكتابة (Write Time)&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;أول ما المهمة بتتكريت، كود الـ Workflow بيحسب لستة الناس المسموح لهم بالموافقة وبيخزنها في نص موحد ومفصول بفواصل:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;,ADMIN,FINANCE_MANAGERS,SARAH_CONNOR,JOHN_DOE,&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;لاحظ الفواصل اللي في الأول وفي الآخر. بفضل الفواصل دي، نقدر نعمل بحث مطابقة دقيق في جملة الـ SQL بدون أي لخبطة بين الأسماء المتشابهة (مثلاً مطابقة &lt;code&gt;JOHN&lt;/code&gt; جوه &lt;code&gt;JOHN_DOE&lt;/code&gt;) كالتالي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- فحص أمان صاروخي ومضمون في الـ SQL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; instr(potential_owners, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :APP_USER &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;h3 id=&quot;-اكتب-مرة-واحدة-واقرأ-آلاف-المرات&quot;&gt;⚡ اكتب مرة واحدة، واقرأ آلاف المرات!&lt;/h3&gt;
&lt;p&gt;في أنظمة الشركات، المهمة بتتكريت أو تتعدل مرة أو مرتين في حياتها. لكنها بتتقري وتتفلتر وتترتب من عشرات المدراء مئات المرات في اليوم! نقل التعقيد الحسابي لمرحلة الكتابة بيحول كل استعلام قراءة لعملية Index Scan رخيصة جداً على السيرفر!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-استعلام-شاشة-المهام-في-apex&quot;&gt;⚡ استعلام شاشة المهام في APEX&lt;/h2&gt;
&lt;p&gt;مع وجود جدول الكاش، بنعمل View نظيفة في الـ Schema المخصصة للبرمجة (&lt;code&gt;app_code&lt;/code&gt;) كالآتي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;create or replace&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; view&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.v_pending_tasks &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;select&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;cache_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;       c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;request_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;       c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;       c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_group&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;       c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;       c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;       c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;priority&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;       c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;amount&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;       c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;requester_name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;       c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;potential_owners&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;       c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;created_at&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_cache&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt; where&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;PENDING&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;ASSIGNED&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;شوف بقى كويري الـ APEX Interactive Report بقى نظيف وسريع إزاي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- استعلام شاشة المهام في أبيكس&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;select&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; request_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       task_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       task_type,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       title,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       priority,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       amount,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       requester_name,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       created_at&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;v_pending_tasks&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt; where&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; task_group &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :P100_TASK_GROUP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       instr(potential_owners, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :APP_USER &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;       or&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; exists&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;           select&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;             from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_security&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;user_roles&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            where&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;user_name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :APP_USER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;              and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; instr(potential_owners, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;role_name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;   );&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-مقارنة-الأداء-بالأرقام-الـ-view-الجاهزة-ضد-جدول-الكاش&quot;&gt;📊 مقارنة الأداء بالأرقام: الـ View الجاهزة ضد جدول الكاش&lt;/h2&gt;
&lt;p&gt;دي أرقام حقيقية اتسجلت على داتابيز أوراكل شغالة فيها 35,000 مهمة ومسار موافقات نشط:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المقياس&lt;/th&gt;
&lt;th&gt;الـ View الجاهزة &lt;code&gt;APEX_TASKS&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;جدول الكاش السريع (&lt;code&gt;wf_task_cache&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;نسبة التحسن&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;وقت استجابة الشاشة&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;14.8 ثانية انتظار&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.024 ثانية (24 ميلي ثانية بس!)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;أسرع 600 ضعف&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;قراءات الذاكرة (Buffer Gets)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~340,000 قراءة&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;45 قراءة بس&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;توفير 99.98% من استهلاك الـ I/O&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;خطة التنفيذ (Execution Plan)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full scan + nested loops&lt;/td&gt;
&lt;td&gt;B-Tree Index Range Seek&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;أفضل خطة بحث في الفهارس&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;استهلاك الـ CPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;بيطير لـ 90%+&lt;/td&gt;
&lt;td&gt;مسطح تحت 2%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;تأثير شبه منعدم على السيرفر&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;تجربة المستخدم&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;الصفحة بتهنج والدايرة بتلف&lt;/td&gt;
&lt;td&gt;الشاشة بتفتح في غمضة عين&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;سلسة وسريعة جداً&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-سؤال-التحديث-إزاي-بنضمن-إن-الكاش-طازة-دايماً&quot;&gt;🔄 سؤال التحديث: إزاي بنضمن إن الكاش طازة دايماً؟&lt;/h2&gt;
&lt;p&gt;أي كاش في الدنيا قوته بتعتمد على طريقة مزامنته:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;لما موظف يقدم طلب شراء جديد، إزاي بينزل فوراً على حامل البونات؟&lt;/li&gt;
&lt;li&gt;ولما المدير يدوس “موافق”، إزاي المهمة بتختفي فوراً من غير ما تسيب أشباح وراها؟&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الثالث (“تزامن الكاش بالأحداث: تحديث كاش المهام بنسبة 100% فورياً”)&lt;/strong&gt;، هنبني Triggers خفيفة في الداتابيز وحزم مزامنة بتخلي &lt;code&gt;wf_task_cache&lt;/code&gt; متزامن بالمللي مع أحداث الـ Workflow في اللحظة نفسها—بدون أي Cron Jobs ولا Polling دوري متعب!&lt;/p&gt;
&lt;p&gt;استنونا في الجزء الثالث! 🔄🔔&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>إدارة الـ Workflows الضخمة</category><category>oracle-apex</category><category>workflows</category><category>performance</category><category>caching</category><category>sql</category><category>arabic</category></item><item><title>زحمة الـ 30 ألف مهمة: ليه استعلامات APEX Workflow الجاهزة بتخبط في الحيطة؟ 🚦🐌</title><link>https://ash2osh.github.io/arabic-blog/posts/015_the-30000-task-traffic-jam-why-native-apex-workflow-views-hit-a-wall/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/015_the-30000-task-traffic-jam-why-native-apex-workflow-views-hit-a-wall/</guid><description>الجزء الأول من سلسلة &quot;إدارة الـ Workflows الضخمة في أوراكل أبيكس&quot;. إيه اللي بيحصل في كواليس الداتابيز لما 500 مدير يفتحوا شاشة الموافقات في نفس اللحظة!</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-30-000-task-traffic-jam-why-native-apex-workflow-views-hit-a-wall&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;زحمة-الـ-30-ألف-مهمة-ليه-استعلامات-apex-workflow-الجاهزة-بتخبط-في-الحيطة-&quot;&gt;زحمة الـ 30 ألف مهمة: ليه استعلامات APEX Workflow الجاهزة بتخبط في الحيطة؟ 🚦🐌&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الأول من سلسلة “إدارة الـ Workflows الضخمة في أوراكل أبيكس”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;لما تكون شركتك بتمشي كام طلب إداري بسيط في اليوم، محرك الـ Workflows والـ Human Tasks في Oracle APEX بيشتغل زي الفراشة وبمنتهى الخفة والجمال. لكن أول ما 500 مدير إدارة يدخلوا مع بعض صباح يوم الإثنين عشان يراجعوا طابور متراكم فيه 30,000 مهمة وموافقة مستنية، الـ CPU بتاع الداتابيز بينط فجأة لـ 100%، وشاشة المهام بتاخد من 15 لـ 30 ثانية عشان تفتح!&lt;/p&gt;
&lt;p&gt;والسبب مش ضعف إمكانيات السيرفر ولا بطء شبكة الإنترنت. السبب الحقيقي هو “التكلفة المعمارية الباهظة” لكيفية معالجة الـ Views الرسمية الجاهزة (&lt;code&gt;APEX_TASKS&lt;/code&gt; و &lt;code&gt;APEX_TASK_PARTICIPANTS&lt;/code&gt;) لحسابات صلاحيات الأمان، وشجرة أدوار الموظفين، وفك تشفير معطيات الـ JSON لكل سطر في اللحظة نفسها (On the Fly).&lt;/p&gt;
&lt;p&gt;في الدليل ده، هنشرح بالتفصيل ليه الـ Views الجاهزة دي بتخبط في حيطة سد في الشركات الضخمة—وإزاي فصل عرض الشاشات (UI Rendering) عن محرك الـ Workflow بيحل الأزمة دي للأبد.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-دفتر-نزلاء-الفندق-تشبيه-في-غاية-البساطة&quot;&gt;🏨 دفتر نزلاء الفندق: تشبيه في غاية البساطة&lt;/h2&gt;
&lt;p&gt;عشان نتخيل اللي بيحصل جوه خوادم الداتابيز، تعالوا نقارن بين فندقين مختلفين تماماً:&lt;/p&gt;
&lt;h3 id=&quot;1-بنسيون-العجمي-الصغير-حجم-بيئات-التطوير-المحلية&quot;&gt;1. بنسيون العجمي الصغير (حجم بيئات التطوير المحلية)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;أنت صاحب بنسيون ريفي جميل فيه 6 أوض بس. لما يوصل نزيل جديد، موظف الاستقبال بيبص في كشكول ورقي من صفحة واحدة محطوط على المكتب.&lt;/li&gt;
&lt;li&gt;الموظف بيلاقي اسم النزيل في ثانيتين، يديله مفتاح أوضة 3 ويبتسم في وشه. الوقت الإجمالي: &lt;strong&gt;3 ثواني بس&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;ده بالظبط حالك في بيئة التجارب والـ Staging — عندك 50 مهمة و 3 يوزرات بتجرب بيهم، ومفيش أي بطء ملحوظ على الإطلاق.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-منتجع-لاس-فيجاس-العملاق-ليلة-رأس-السنة-حجم-المؤسسات-الضخمة&quot;&gt;2. منتجع لاس فيجاس العملاق ليلة رأس السنة (حجم المؤسسات الضخمة)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;تخيل بقى منتجع وكازينو ضخم فيه 5,000 جناح فندقي فاخر في ليلة رأس السنة، ومئات النزلاء بيوصلوا في كل دقيقة!&lt;/li&gt;
&lt;li&gt;تخيل لو موظف الاستقبال معندوش كمبيوتر ولا قاعدة بيانات، وبدل كدة مضطر يقلب في مجلد يدوي من 3,000 صفحة لكل نزيل لوحده! ومع كل اسم، لازم يقوم يفتح دولاب أرشيف في أوضة تانية يتأكد النزيل ده واخد كارت VIP ولا لأ، ويكلم قسم الحسابات بالتليفون يفحص الحد الائتماني، ويكلم أمن الفندق يراجع أختام الباسبور!&lt;/li&gt;
&lt;li&gt;طابور النزلاء هيمتد لبرة الفندق ويسد الشارع، الموظفين هينهاروا من التعب، والنزلاء هيتخانقوا واللوبي كله هيقف تماماً!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ده بالظبط اللي بيحصل لما شاشة المهام في نظام APEX بتاعك تقرر تستعلم من &lt;code&gt;APEX_TASKS&lt;/code&gt; مباشرة على داتابيز حية فيها عشرات الآلاف من المهام!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-تشريح-apex_tasks-إيه-اللي-بيحصل-وراء-الكواليس&quot;&gt;🔬 تشريح &lt;code&gt;APEX_TASKS&lt;/code&gt;: إيه اللي بيحصل وراء الكواليس؟&lt;/h2&gt;
&lt;p&gt;من أول إصدارات Oracle APEX الحديثة في 26.1 و 26.2، وفرت أوراكل محرك Workflows و Human Tasks استثنائي لإدارة مسارات الموافقات، والـ Escalations، والتفريعات المعقدة.&lt;/p&gt;
&lt;p&gt;وعشان تعرض المهام دي للمطورين، وفرت أبيكس Views جاهزة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;APEX_TASKS&lt;/code&gt;: بتمثل المهام النشطة والمحجوزة والمنتهية.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APEX_TASK_PARTICIPANTS&lt;/code&gt;: لستة اليوزرات والمجموعات المرشحة للموافقة.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APEX_WORKFLOWS&lt;/code&gt;: لتتبع مسارات الـ Workflows بالكامل.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;الـ Views دي اتصممت عشان تكون مرنة مع أي سيناريو في العالم. لكن المرونة المطلقة دي بتيجي على حساب تكلفة معالجة مرعبة! لما تستعلم من &lt;code&gt;APEX_TASKS&lt;/code&gt;، الداتابيز مش مجرد بتقرأ جدول عادي، هي مجبرة تحسب 3 طبقات تقيلة جداً ديناميكياً:&lt;/p&gt;
&lt;h3 id=&quot;الطبقة-1-فحص-الصلاحيات-والأطراف-المشاركة-dynamic-participant-resolution&quot;&gt;الطبقة 1: فحص الصلاحيات والأطراف المشاركة (Dynamic Participant Resolution)&lt;/h3&gt;
&lt;p&gt;مين مسموح له يعتمد أو يستلم المهمة دي حالياً؟&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;هل هي متخصصة مباشرة لليوزر المتصل &lt;code&gt;:APP_USER&lt;/code&gt;؟&lt;/li&gt;
&lt;li&gt;ولا اليوزر بينتمي لجروب موافقات (زي &lt;code&gt;FINANCE_CONTROLLERS&lt;/code&gt;)؟&lt;/li&gt;
&lt;li&gt;ولا المدير الأساسي فوض صلاحياته لمساعده في الفترة الزمنية دي؟&lt;/li&gt;
&lt;li&gt;وهل الهيكل الإداري بيسمح للمدير الأكبر إنه يتدخل؟&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;تقييم المنطق ده بيتطلب Subqueries متداخلة، و Join مع جداول الأمان الداخلية (&lt;code&gt;WWV_FLOW_TASK_PARTICIPANTS$&lt;/code&gt;)، وفحص ديناميكي لعضويات الجروبات &lt;strong&gt;لكل سطر من سطور المهام المرشحة&lt;/strong&gt;!&lt;/p&gt;
&lt;h3 id=&quot;الطبقة-2-فك-تشفير-محتوى-المعطيات-context-payload-extraction&quot;&gt;الطبقة 2: فك تشفير محتوى المعطيات (Context Payload Extraction)&lt;/h3&gt;
&lt;p&gt;المهام غالباً بتخزن بيانات البيزنس (زي إجمالي أمر الشراء، واسم الموظف، وبنود الفاتورة) جوه حقول JSON أو XML داخلية. فك تشفير الـ JSON المعقد ده لبيانات علائقية على آلاف السطور بيحرق الـ CPU حرق!&lt;/p&gt;
&lt;h3 id=&quot;الطبقة-3-التحقق-من-ماكينة-الحالات-state-machine-validation&quot;&gt;الطبقة 3: التحقق من ماكينة الحالات (State Machine Validation)&lt;/h3&gt;
&lt;p&gt;المحرك بيفحص باستمرار هل المهمة دي انتهت مهلتها (Timeouts) أو معادها عدا، وبيعيد حساب الأولويات والحالات على الطاير.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الاستعلام-اللي-بيولع-في-سيرفرات-الـ-production&quot;&gt;🐌 الاستعلام اللي بيولع في سيرفرات الـ Production&lt;/h2&gt;
&lt;p&gt;في مشروعات المؤسسات والشركات الكبيرة، مفيش حاجة اسمها شاشة مهام بكويري بسيط من 5 سطور زي بتاعة كتب التدريب.&lt;/p&gt;
&lt;p&gt;في الحقيقة، بناء الـ Interactive Grid الشامل ده مكنش مجرد رفاهية من المطورين أو خيار تجميلي—&lt;strong&gt;ده كان متطلب إجباري وقاطع من الإدارة العليا ورؤساء القطاعات!&lt;/strong&gt; القيادات ومدراء العموم رفضوا رفضاً باتاً إنهم يقعدوا يتنقلوا بين 5 شاشات مختلفة أو يكتفوا ببطاقات مهام عامة ومختصرة عشان يراجعوا طلب واحد. كان المطلب الحاسم هو وجود “لوحة قيادة مركزية ومكتظة بالبيانات (High-Density Operational Cockpit)” تفتح للمدير الصورة كاملة من شاشة واحدة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;بيانات مقدم الطلب بالكامل وإدارته،&lt;/li&gt;
&lt;li&gt;حالة الـ Workflow والمدراء اللي لسه معتمدوش،&lt;/li&gt;
&lt;li&gt;تفاصيل البيزنس المعقدة المتخزنة جوه باراميترات الـ Workflow،&lt;/li&gt;
&lt;li&gt;زراير لفتح شاشات منبثقة (Modals) للكومنتات والمرفقات،&lt;/li&gt;
&lt;li&gt;أيقونات ملونة بتحدد هل مسموح للمدير ده يلغي أو يمسح الطلب ده ولا لأ،&lt;/li&gt;
&lt;li&gt;إمكانية البحث الجماعي الضخم (زي إنه ينسخ 50 رقم قومي أو كود موظف من الإكسيل ويلزقهم في شاشة البحث مرة واحدة!).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ولأن الـ Human Tasks الرسمية في أبيكس مبتحطش بيانات البيزنس دي في أعمدة صريحة وجاهزة، المطورين اتزنقوا واضطروا يربطوا كل الخيوط دي ببعضها جوه نفس استعلام الـ Grid على الطاير!&lt;/p&gt;
&lt;p&gt;بصوا على الكود الواقعي اللي الفرق بتبنيه في بيئات العمل الحقيقية لتنفيذ متطلبات الإدارة—قبل ما يكتشفوا إنهم بالغلط ولعوا في الداتابيز:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ==============================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- نمط استعلام &quot;كل شيء في شاشة واحدة&quot; الشهير&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- تحذير: إياك تشغل ده على 30,000 مهمة حقيقية في الـ Production!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ==============================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;with&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; emp_data &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- 1. البحث في بيانات الموظفين&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    select&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_number&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;           nvl(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_name_ar&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_name_en&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; emp_name,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_status&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;category_type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;national_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;employment_start_date&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_pkg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.get_department_name(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; department_name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;employees&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; e&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;task_payload_data &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- 2. استخراج وفك بيانات الـ JSON لباراميترات المهام لكل سطر&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    select&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; tl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; tsk_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           tl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;workflow_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           json_value&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;tl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_parameters_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;$[*]?(@.param_static_id==&quot;REQ_ID&quot;).param_value&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; returning &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; req_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           json_value&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;tl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_parameters_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;$[*]?(@.param_static_id==&quot;EMP_NO&quot;).param_value&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; returning &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; emp_no,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           json_value&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;tl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_parameters_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;$[*]?(@.param_static_id==&quot;MASTER_PK_ID&quot;).param_value&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; returning &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; master_pk_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           al&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;main_action_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;           decode(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;tl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;state_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;COMPLETED&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;pending_approvers&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pending_approvers,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           ra&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;action_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; action_id_raw,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;           nvl(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_pkg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.get_action_desc(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ra&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;action_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ra&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;action_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; action_desc,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           ra&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;           ra&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sub_status&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_task_log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; tl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      left join&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_action_log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; al &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; al&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; tl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;workflow_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      join&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex_task_parameters atp &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; atp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; tl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;       and&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; atp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;param_static_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;P_ACTION_ID&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      left join&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wf_action_sub_log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sl &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; tl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; sl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;       and&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; al&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;current_sub_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; sl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;sub_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      left join&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;request_actions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ra &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; ra&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;action_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; al&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;main_action_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;     where&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :P100_ACTION_ID &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; atp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;param_value&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-------------------------- الاستعلام الرئيسي للـ INTERACTIVE GRID --------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;select&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; e.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       tasks.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       td.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;       -- 3. نداءات دوال PL/SQL سكلر لكل سطر عشان لينكات الكومنتات والمرفقات&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       decode(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;main_action_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;#&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;              app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;doc_pkg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.get_comments_url(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_doc_type    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;REQUEST_ACTION&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_doc_id      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; td&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;main_action_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_emp_id      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_action_id   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; td&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;main_action_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_from_page   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_app_session &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :APP_SESSION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;              )) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; comment_url,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       decode(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;main_action_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;#&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;              app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;doc_pkg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.get_attach_url(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_doc_type    &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;REQUEST_ACTION&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_doc_id      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; td&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;main_action_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_app_session &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :APP_SESSION,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_emp_id      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                  p_from_page   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 312&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;              )) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; attach_url,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;       case&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;         when&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_security&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;auth_pkg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.user_can_follow_action(:APP_USER, :P100_ACTION_ID) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;YES&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;         then&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;&amp;lt;span class=&quot;fa fa-times-circle u-danger-text&quot; aria-hidden=&quot;true&quot;&amp;gt;&amp;lt;/span&amp;gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;         else&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;       end&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; delete_icon&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;       -- 4. استدعاء دالة المهام الرسمية Pipelined Table Function&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;       select&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t1.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; join_dummy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;         from&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; table&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;apex_approval&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;get_tasks&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                      p_context            &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;MY_TASKS&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                      p_show_expired_tasks &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;Y&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    )) t1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       ) tasks&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  left join&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; task_payload_data td &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; td&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;tsk_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; tasks&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  -- 5. الربط مع جداول الموظفين بتعبيرات Regex الشرطية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  left join&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; emp_data e &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    on&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_number&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; case&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                        when&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; regexp_like(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_no&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;^[0-9]+$&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;then&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; td&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_no&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                        else&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                      end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt; where&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (:P100_TASK_DEF_STATIC_ID &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; tasks&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;task_def_static_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nvl(:P100_REQ_ID, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;-&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nvl(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;req_id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;-&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   -- 6. الفحص متعدد المستويات لصلاحيات الفئات&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;         e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;category_type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;         or&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;              e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;category_type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nvl(:SESSION_CATEGORY, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;ALL&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;              or&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                   nvl(:SESSION_CATEGORY, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;ALL&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;ALL&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                   and&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;category_type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                       select&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; category_type&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                         from&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_security&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;user_permitted_categories&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                        where&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; user_name &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; :APP_USER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                          and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; category_type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;ALL&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                   )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;              )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;         )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   -- 7. البحث الجماعي بلستة أرقام موظفين ملزوقة في الشاشة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;   and&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;         :P100_SEARCH_VALUES &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;         or&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;              :P100_SEARCH_TYPE &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;EMP_NUMBERS&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;              and&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;emp_number&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                  select&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; column_value &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; id_num&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; the (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                        select&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; cast&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;string_utils_pkg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.split_ids(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                                      rtrim&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(:P100_SEARCH_VALUES, chr(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;13&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), chr(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                    ) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;id_table_t&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                          from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dual&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;              )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;         )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;         or&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;              :P100_SEARCH_TYPE &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;NATIONAL_ID&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;              and&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;national_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                  select&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; column_value &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; id_num&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; the (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                        select&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; cast&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;string_utils_pkg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.split_ids(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                                      rtrim&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(:P100_SEARCH_VALUES, chr(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;13&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), chr(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;,&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                                    ) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; app_code&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;id_table_t&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                          from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dual&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;              )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;         )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;       );&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ليه-الاستعلام-ده-بينهار-تماماً-عند-30-ألف-مهمة&quot;&gt;ليه الاستعلام ده بينهار تماماً عند 30 ألف مهمة؟&lt;/h3&gt;
&lt;p&gt;لما تجربه في بيئة التجارب بـ 20 مهمة، بيخلص في 120 ميلي ثانية وتفرح بيه! لكن أول ما يروح للـ Production مع 30,000 مهمة ومئات المدراء المتزامنين، ست اختناقات معمارية بيتجمعوا مع بعض عشان يسببوا كارثة أداء حتمية:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;الصندوق الأسود لدوال الـ Pipelined Table (&lt;code&gt;TABLE(apex_approval.get_tasks(...))&lt;/code&gt;):&lt;/strong&gt;
محرك تحسين الاستعلامات (CBO) مبيقدرش يشوف اللي جوه دوال الـ Pipelined في PL/SQL. مبيقدرش يحسب إحصائيات الداتا ولا توزيعها، فبيفترض أرقام افتراضية عشوائية. والأخطر من كده، شروط الـ &lt;code&gt;WHERE&lt;/code&gt; الخارجية مستحيل تنزل جوه استعلام المحرك الداخلي (No Predicate Pushdown)!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;فك الـ JSON على الطاير لكل سطر (&lt;code&gt;JSON_VALUE&lt;/code&gt;):&lt;/strong&gt;
لأن باراميترات المهام (&lt;code&gt;REQ_ID&lt;/code&gt;, &lt;code&gt;EMP_NO&lt;/code&gt;, &lt;code&gt;MASTER_PK_ID&lt;/code&gt;) متسلسلة جوه نصوص JSON، الكويري مضطر يحلل نصوص JSON لآلاف السطور في كل فتحة شاشة. بنتكلم في أكتر من 90,000 عملية فك JSON مع كل ريفريش!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الربط مع الجداول بتعبيرات الـ Regex (&lt;code&gt;REGEXP_LIKE&lt;/code&gt;):&lt;/strong&gt;
لأن بيانات الـ JSON المستخرجة مجرد نصوص غير مفحوصة، الربط مع جدول &lt;code&gt;employees&lt;/code&gt; بيتطلب فحوصات Regex وتحويل أنواع. ده بيلغي تماماً استخدام فهارس الـ B-Tree العادية، ويجبر الداتابيز تعمل Full Table Scans مدمرة!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التبديل بين المحركات سطر بسطر (Scalar PL/SQL Context-Switching):&lt;/strong&gt;
استدعاء دوال الـ PL/SQL في جملة الـ &lt;code&gt;SELECT&lt;/code&gt; بيسبب آلاف التبديلات المتكررة (Context Switches) بين محرك الـ SQL ومحرك الـ PL/SQL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الضربة القاضية: فخ التقسيم والترتيب في الـ Interactive Grid:&lt;/strong&gt;
في أبيكس، شاشات الـ Interactive Grid بتغلف أي استعلام بمنطق ترقيم الصفحات (&lt;code&gt;Pagination&lt;/code&gt;). أول ما مدير يدوس على رأس أي عمود عشان يرتب المهام (مثلاً بتاريخ الإنشاء أو اسم الموظف)، الداتابيز &lt;strong&gt;متقدرش&lt;/strong&gt; تستخدم اختصارات الـ Pagination. لازم تشغل كل دوال الـ Table functions، وتفك كل نصوص الـ JSON، وتعمل كل الـ Joins، وتنفذ دوال الـ PL/SQL، وترتب الـ 30,000 سطر كلهم في الـ &lt;code&gt;TEMP&lt;/code&gt; Tablespace—وبعدين ترمي 29,950 سطر في الزبالة عشان تعرض للمدير أول 50 بس!&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-أعراض-زحمة-الـ-30-ألف-مهمة&quot;&gt;🎯 أعراض زحمة الـ 30 ألف مهمة&lt;/h2&gt;
&lt;p&gt;لو بيئة عملك بتعاني من المشكلة دي، هتلاحظ العلامات الحمراء دي فوراً:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;العَرَض&lt;/th&gt;
&lt;th&gt;اللي بتشوفه بعينك&lt;/th&gt;
&lt;th&gt;السبب الجوهري الحقيقي&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;شاشات مهام تقيلة ومهنجة&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;صفحة المهام بتفضل تلف من 12 لـ 25 ثانية قبل ما تفتح.&lt;/td&gt;
&lt;td&gt;حسابات الأمان الديناميكية لكل سطر من آلاف المهام غير المفهرسة.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ارتفاع جنوني في الـ CPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;الـ CPU بتاع سيرفر الداتابيز بيوصل 95–100% صباح الإثنين.&lt;/td&gt;
&lt;td&gt;مئات المدراء بيشغلوا استعلامات متزامنة بتعمل Joins معقدة مع جداول أبيكس الداخلية.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;هنجة وتجميد عند البحث والترتيب&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;الفلترة برقم الموظف أو الترتيب بالتاريخ بيطلع Gateway Timeout.&lt;/td&gt;
&lt;td&gt;عجز محرك التحسين عن دفع شروط البحث داخل دوال الـ Table.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;تطفيش المستخدمين&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;المدراء بيبطلوا يفتحوا شاشة أبيكس ويطالبوا بموافقات يدوي بالإيميل!&lt;/td&gt;
&lt;td&gt;بطء وتجربة استخدام مستحيلة في الواجهة.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الحل-المعماري-فصل-العرض-عن-ماكينة-الحالات-decoupling&quot;&gt;💡 الحل المعماري: فصل العرض عن ماكينة الحالات (Decoupling)&lt;/h2&gt;
&lt;p&gt;هل ده معناه إن محرك الـ Workflows في Oracle APEX فيه عيب؟ &lt;strong&gt;أبداً على الإطلاق!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;محرك أبيكس للـ Workflows عبقري وممتاز جداً في الحاجة اللي اتصمم عشانها: &lt;strong&gt;إدارة دورة حياة الحالات، وفرض شروط الموافقات، وحساب مدد الانتهاء والـ Escalations، وتشغيل الخطوات الآلية&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;الغلطة كلها كانت في إننا طلبنا من المحرك ده إنه يشتغل كمان كمحرك بحث سريع وفوري لشاشات العرض والـ Grids!&lt;/p&gt;
&lt;p&gt;الحل الهندسي المعتمد عالمياً هو &lt;strong&gt;الفصل المعماري (Architectural Decoupling)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;خلي &lt;strong&gt;محرك APEX Workflows&lt;/strong&gt; يدير العمليات، وتنقل الحالات، وشروط البيزنس في الخلفية.&lt;/li&gt;
&lt;li&gt;أنشئ &lt;strong&gt;جدول كاش عمليات خفيف ومفهرس بالمللي&lt;/strong&gt; (&lt;code&gt;wf_task_cache&lt;/code&gt;) معمول مخصوص عشان يغذي شاشات الـ UI في أقل من 50 ميلي ثانية!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Engine&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;محرك Oracle APEX Workflow&amp;lt;br/&amp;gt;(إدارة الحالات والخطوات والشروط)&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    --&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Trigger معتمد على الأحداث&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Cache&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;جدول كاش العمليات السريع&amp;lt;br/&amp;gt;(wf_task_cache)&amp;lt;br/&amp;gt;مفهرس وجاهز للعرض&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Cache &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    --&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;استعلام فهارس في أقل من 50ms&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Cockpit&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;شاشة مهام أبيكس التفاعلية&amp;lt;br/&amp;gt;(Interactive Grid / Report)&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-الجزء-الثاني&quot;&gt;🚀 إيه اللي مستنينا في الجزء الثاني؟&lt;/h2&gt;
&lt;p&gt;إزاي نصمم جدول كاش العمليات ده عشان يستوعب ملايين المهام بكل سلاسة ويخلي استعلامات شاشات أبيكس تفتح في غمضة عين وبأقل من 50 ميلي ثانية؟&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الثاني (“حامل بونات المطبخ: تصميم كاش العمليات عالي السرعة”)&lt;/strong&gt;، هنبني هيكل جدول &lt;code&gt;wf_task_cache&lt;/code&gt; بالكامل، وهندرس استراتيجية الفهارس الذكية، وهنشوف إزاي نكتب استعلامات شاشات بتفتح في فمتو ثانية!&lt;/p&gt;
&lt;p&gt;استنونا في الجزء الثاني! 🎫⚡&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>إدارة الـ Workflows الضخمة</category><category>oracle-apex</category><category>workflows</category><category>performance</category><category>database</category><category>human-tasks</category><category>arabic</category></item><item><title>رقم الشقة الناقص: ليه لازم تحدد الـ Workspace صراحةً في الـ APEX Deployments؟ 🏢📦</title><link>https://ash2osh.github.io/arabic-blog/posts/014_the-missing-apartment-number-why-your-apex-deployments-need-an-explicit-workspace/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/014_the-missing-apartment-number-why-your-apex-deployments-need-an-explicit-workspace/</guid><description>لما كابتن الدليفري يوصل بعربيتك عند عمارة السيرفر، يهرش في شعره ويقولك: &quot;هو أنا هسلم App 101 لـ أنهي شقة بالظبط؟!&quot;</description><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-missing-apartment-number-why-your-apex-deployments-need-an-explicit-workspace&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;رقم-الشقة-الناقص-ليه-لازم-تحدد-الـ-workspace-صراحةً-في-الـ-apex-deployments-&quot;&gt;رقم الشقة الناقص: ليه لازم تحدد الـ Workspace صراحةً في الـ APEX Deployments؟ 🏢📦&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;لما كابتن الدليفري يوصل بعربيتك عند عمارة السيرفر، يهرش في شعره ويقولك: “هو أنا هسلم App 101 لـ أنهي شقة بالظبط؟!”&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;تخيل طلبت ركنة أو صالون جديد أونلاين، وكتبت في العنوان: &lt;em&gt;“برج الصفوة، الدور الخامس، شقة 502”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;للوهلة الأولى العنوان يبدو كامل ومفهوم.. لحد ما كابتن الدليفري يوصل الموقع ويكتشف إن الكومباوند فيه &lt;strong&gt;3 أبراج توأم&lt;/strong&gt; بنفس الاسم والتصميم، وكل برج فيهم فيه دور خامس وشقة 502! وطبعاً مفيش رقم أو حرف للبرج على البوليصة. الكابتن هيرفع إيده، مستحيل يجازف ويخمن، وهيختم الشحنة فوراً: &lt;strong&gt;“تعذر التسليم: العنوان غير محدد بدقة”&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;في عالم Oracle APEX والـ split-source deployments، أداة SQLcl بتعمل معاك نفس الموقف بالظبط لما تسيب الـ Target Workspace عايم من غير تحديد. ورغم إنك ممكن تتغر وتجري ورا حلول سريعة بـ PL/SQL (واللي ممكن تشتغل على جهازك الشخصي بس تفرقع وش في السيرفرات الحقيقية!)، الحل الجذري والاحترافي أبسط بكتير: اعمل ملفات إعدادات منفصلة لكل بيئة عمل (&lt;code&gt;dev.json&lt;/code&gt;, &lt;code&gt;staging.json&lt;/code&gt;, &lt;code&gt;prod.json&lt;/code&gt;) محدد فيها اسم الـ Workspace صراحةً، وارفعها على Git مباشرة.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-ورطة-كابتن-الدليفري-the-delivery-driver-dilemma&quot;&gt;🚚 ورطة كابتن الدليفري (The Delivery Driver Dilemma)&lt;/h2&gt;
&lt;p&gt;في شغل Oracle APEX الحديث، كلنا بنحب نعمل export للتطبيقات بصيغة الـ Source Code المقسم (&lt;code&gt;.apx&lt;/code&gt; files) عن طريق SQLcl أو إضافة VS Code الرسمية. الطريقة دي بتخلي الـ Git diffs نظيفة وسهلة، وتتبع التعديلات طبيعي، وبتخلي أتمتة الـ CI/CD متعة حقيقية.&lt;/p&gt;
&lt;p&gt;أول ما بتعمل export للتطبيق، SQLcl بتنشئ لك ملف إعدادات deployment افتراضي داخل مشروعك اسمه &lt;code&gt;deployments/default.json&lt;/code&gt;. في أغلب الأوقات بيكون شكله بسيط جداً زي كده:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;app&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;101&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;databaseSession&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;parsingSchema&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;APP_SCHEMA&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;تبص للملف تقول: “عظمة أوي! إيه المشكلة يعني؟ ما أنا مديله كل حاجة:”&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Application ID&lt;/strong&gt;: &lt;code&gt;101&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parsing Schema&lt;/strong&gt;: &lt;code&gt;APP_SCHEMA&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;وعلى داتابيز التطوير المحلية (Local Sandbox) اللي مفيهاش غير Workspace واحدة يتيمة، كل حاجة بتشتغل زي الفل والـ deployment بيمر بنجاح باهر.&lt;/p&gt;
&lt;p&gt;لكن الصدمة بتبدأ أول ما تترقى وتتصل بداتابيز الـ Development المشتركة للشركة أو سيرفر الـ Staging، وتيجي تنفذ أمر الاستيراد &lt;code&gt;apex import&lt;/code&gt;، وفجأة… &lt;strong&gt;بوووووم!&lt;/strong&gt; 💥&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[APEXLangCommandHandlers] [ERROR] &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Multiple workspaces available, use the workspaceId or the workspace option.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;الـ CI/CD Pipeline يقف فجأة، و“بوت الدليفري” يرفض إنه يرمي الكود في أي مكان بالبركة!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️️-وراء-الكواليس-ليه-sqlcl-رفعت-إيديها-ووقفت&quot;&gt;🕵️‍♂️ وراء الكواليس: ليه SQLcl رفعت إيديها ووقفت؟&lt;/h2&gt;
&lt;p&gt;ليه SQLcl ضربت إيرور ومكملتش تثبيت التطبيق؟&lt;/p&gt;
&lt;p&gt;لما SQLcl بتيجي تستورد تطبيق APEX من ملفات مجزأة (Split files)، بتحتاج في أول خطوة تثبت حاجة اسمها &lt;strong&gt;APEX Workspace Context&lt;/strong&gt; (معرف الأمان الداخلي للـ Workspace أو الـ Security Group ID)، وده بيحصل قبل ما تنشئ أو تعدل أي صفحة من صفحات التطبيق.&lt;/p&gt;
&lt;p&gt;لو ملف الـ &lt;code&gt;deployments/default.json&lt;/code&gt; مش محدد فيه اسم الـ Workspace بشكل صريح، SQLcl بتحاول تعمل فيها ذكية وتكتشفه تلقائياً. في الخلفية، بتروح تنفذ استعلام بسيط على جداول الداتابيز:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;SELECT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; workspace &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apex_workspaces;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;في أي داتابيز حقيقية لشركة أو مؤسسة، مستحيل يوزر المطورين يكون مربوط بـ Workspace واحدة بس. غالباً الاستعلام هيرجع لستة محترمة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DEV_WORKSPACE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FINANCE_WORKSPACE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HR_WORKSPACE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INTERNAL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;لما الـ query يرجع &lt;strong&gt;أكتر من سطر&lt;/strong&gt;، SQLcl بترفض التخمين تماماً. لأنها لو خمّنت ونزلت التطبيق في الـ Workspace الغلط، ممكن تمسح شغل زميلك أو تكسر صلاحيات أمان حساسة.&lt;/p&gt;
&lt;p&gt;عشان كده بتقفلها في وشك بأمان تام وتقولك:
&lt;code&gt;Multiple workspaces available, use the workspaceId or the workspace option.&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-الفخ-المغري-حل-الـ-plsql-السريع-بيشتغل-عندك-ويفرقع-في-السيرفر&quot;&gt;⚠️ الفخ المغري: حل الـ PL/SQL السريع (بيشتغل عندك ويفرقع في السيرفر!)&lt;/h2&gt;
&lt;p&gt;كتير من المطورين لما بيقابلوا الإيرور ده، أول فكرة بتيجي في بالهم هي “الترقيع” السريع عن طريق تشغيل كود PL/SQL قبل عملية الاستيراد (Import) كالآتي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;BEGIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  -- &quot;يا عم أنا هثبت له الـ Workspace ID بإيدي وخلاص!&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  APEX_UTIL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;SET_SECURITY_GROUP_ID&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1234567890123456&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;END&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;هل-الحل-ده-بيشتغل-أيوه-بس-في-بيئات-معينة-جداً&quot;&gt;هل الحل ده بيشتغل؟ أيوه.. بس في بيئات معينة جداً!&lt;/h3&gt;
&lt;p&gt;لو جربت الترقيعة دي على جهازك جوه Docker Container محلي، أو داتابيز تجارب داخل فيها بيوزر الـ DBA الخارق (&lt;code&gt;ADMIN&lt;/code&gt; أو &lt;code&gt;SYS&lt;/code&gt;)، هتحس إنك عبقري والمشكلة اتحلت في ثواني.&lt;/p&gt;
&lt;p&gt;بس تعالى نفهم ليه هو اشتغل في بيئتك المحلية:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;صلاحيات السوبر مان&lt;/strong&gt;: الحساب اللي أنت داخل بيه واخد صلاحية &lt;strong&gt;&lt;code&gt;APEX_ADMINISTRATOR_ROLE&lt;/code&gt;&lt;/strong&gt;، ودي بتديه الحق إنه يغير ويدخل أي Workspace على مزاجه.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الربط المباشر موجود&lt;/strong&gt;: يوزر السيشن بتاع الداتابيز (&lt;code&gt;USERENV(&apos;SESSION_USER&apos;)&lt;/code&gt;) متعرف ومربوط مسبقاً كـ schema مسموح بيها في جدول &lt;code&gt;APEX_WORKSPACE_SCHEMAS&lt;/code&gt; لنفس الـ Workspace.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;وليه-نفس-الحل-ده-بيفرقع-في-وشك-فوراً-في-بيئات-الـ-cicd-المشتركة-&quot;&gt;وليه نفس الحل ده بيفرقع في وشك فوراً في بيئات الـ CI/CD المشتركة 💥&lt;/h3&gt;
&lt;p&gt;أول ما الكود ده يخرج من جهازك ويروح لداتابيز تانية، أو سيرفر Staging مقفول بصلاحيات محدودة، أو أوتوميشن Pipeline، هتخبط في الحيطة دي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ORA-20987: APEX - Security Group ID (your workspace identity) is invalid.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ORA-06512: at &quot;APEX_260100.WWV_FLOW_SECURITY&quot;, line 3145&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;والسبب بسيط جداً:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الأمان المشدد (Strict Security)&lt;/strong&gt;: في بيئات التيست والإنتاج (Production)، يوزرات الـ Deployment المخصصة للـ CI/CD (زي &lt;code&gt;CI_DEPLOYER&lt;/code&gt;) بتكون محدودة الصلاحيات ومش واخدة &lt;code&gt;APEX_ADMINISTRATOR_ROLE&lt;/code&gt;. نظام الأمان الداخلي في APEX (&lt;code&gt;WWV_FLOW_SECURITY&lt;/code&gt;) بيكتشف المحاولة دي وبيعتبرها اختراق وبيوقف العملية فوراً.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الأرقام دي مش محمولة (Non-Portable IDs)&lt;/strong&gt;: رقم الـ Workspace ID ده مش رقم ثابت، ده مجرد Database Sequence رقمي. يعني الـ Workspace اللي اسمها &lt;code&gt;DEV_WORKSPACE&lt;/code&gt; ممكن يكون الـ ID بتاعها &lt;code&gt;1234567890123456&lt;/code&gt; في بيئة الـ DEV، لكن في الـ STAGING أو الـ PROD هيكون رقم عشوائي تاني خالص! فكرة إنك تكتب أرقام IDs ثابتة (Hardcoded) جوه السكربتات دي أسرع وصفة لخراب أي Pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;عشان كده، الاعتماد على &lt;code&gt;SET_SECURITY_GROUP_ID&lt;/code&gt; اليدوي هو مجرد “مسكن مؤقت” مش حل DevOps احترافي.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الحل-الصح-والمحترم-ملفات-deployment-مستقلة-في-git-لكل-بيئة&quot;&gt;🔑 الحل الصح والمحترم: ملفات Deployment مستقلة في Git لكل بيئة&lt;/h2&gt;
&lt;p&gt;بدل ما نعتمد على ملف &lt;code&gt;default.json&lt;/code&gt; واحد كل شوية حد يعدل فيه، أو نجري ورا سكربتات PL/SQL هشة بتتغير من سيرفر لسيرفر، الحل الأفضل والمعتمد عالمياً هو: &lt;strong&gt;إنشاء ملف إعدادات deployment مستقل لكل بيئة عمل، ورفعه على Git مع الكود&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;هيكل-المشروع-لكل-البيئات-multi-environment-structure&quot;&gt;هيكل المشروع لكل البيئات (Multi-Environment Structure)&lt;/h3&gt;
&lt;p&gt;داخل مشروع الـ APEX split-source، أداة SQLcl بتتعرف تلقائياً على فولدر اسمه &lt;code&gt;deployments/&lt;/code&gt;. بجانب ملف &lt;code&gt;default.json&lt;/code&gt;، تقدر تنشئ ملفات واضحة وصريحة لكل سيرفر هترفع عليه:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;my-apex-project/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── src/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── ... (ملفات السورس كود النظيفة .apx)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── deployments/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── dev.json         ──► بيئة التطوير والـ Dev Schema&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── staging.json     ──► بيئة الاختبار والـ QA Schema&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    └── prod.json        ──► بيئة الإنتاج والـ Live Schema&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;كل بيئة هيكون ليها “عقد” واضح ومحفوظ في الـ Version Control.&lt;/p&gt;
&lt;h4 id=&quot;1-ملف-deploymentsdevjson-بيئة-التطوير&quot;&gt;1. ملف &lt;code&gt;deployments/dev.json&lt;/code&gt; (بيئة التطوير)&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;workspace&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;DEV_WORKSPACE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;app&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;101&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;databaseSession&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;parsingSchema&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;APP_DEV&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;2-ملف-deploymentsstagingjson-بيئة-الاختبار-والتجهيز&quot;&gt;2. ملف &lt;code&gt;deployments/staging.json&lt;/code&gt; (بيئة الاختبار والتجهيز)&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;workspace&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;STAGE_WORKSPACE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;app&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;201&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;databaseSession&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;parsingSchema&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;APP_STAGE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;3-ملف-deploymentsprodjson-بيئة-الإنتاج-الحية&quot;&gt;3. ملف &lt;code&gt;deployments/prod.json&lt;/code&gt; (بيئة الإنتاج الحية)&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;workspace&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;PROD_WORKSPACE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;app&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;databaseSession&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;parsingSchema&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;APP_DATA&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ┌─────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  │                 DEPLOYMENTS / &amp;lt;ENV&amp;gt;.JSON                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ├─────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  │  🏢 workspace.name    ──► اسم الـ Workspace الصريح للبيئة دي │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  │  📦 app.id            ──► رقم التطبيق المستهدف              │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  │  ⚙️ parsingSchema     ──► الـ Schema المالكة للداتا هنا     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  └─────────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ليه-الحل-ده-بيكسب-دايماً-&quot;&gt;ليه الحل ده بيكسب دايماً؟ 🏆&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;حاسم ومفيهوش أي لبس (Zero Ambiguity)&lt;/strong&gt;: لأنك حددت &lt;code&gt;&quot;workspace&quot;: { &quot;name&quot;: &quot;...&quot; }&lt;/code&gt; بالاسم الصريح، SQLcl عمرها ما هتحتاج تسأل الداتابيز ولا تخمن. ودعنا للأبد مشهد “مندوب الدليفري الحيران في الباركينج”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تتبع كامل ومراجعة كود (Auditability &amp;amp; PRs)&lt;/strong&gt;: إعدادات الـ deployment بقت كود عايش جوه Git جنب السورس كود. أي تغيير في اسم Schema أو Workspace هيتراجع في Pull Request ويتسجل مين اللي عمله وليه.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;مش محتاج صلاحيات DBA خطيرة&lt;/strong&gt;: لأن SQLcl بتستخدم دوال الـ APEX Deployment الرسمية بالاسم الصريح، حساب الـ CI/CD مش محتاج &lt;code&gt;APEX_ADMINISTRATOR_ROLE&lt;/code&gt; ولا محتاج يوجع دماغه بأرقام الـ IDs المتغيرة.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;أتمتة سهلة وسلسة في الـ CI/CD&lt;/strong&gt;: في أي Pipeline آلي (GitHub Actions, GitLab CI, Azure Pipelines, Jenkins)، اختيار البيئة بيبقى سطر واحد في غاية السهولة:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# في خطوة الـ Deployment في الـ CI/CD Pipeline:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 1. تفعيل ملف البيئة المستهدفة واستبداله كـ default.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; deployments/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;${TARGET_ENV}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.json&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; deployments/default.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 2. تشغيل الـ Deployment فوراً وبدون أي مشاكل عبر SQLcl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sql&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; user/password@target_db&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;apex import&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;exit;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-شيك-ليست-checklist-ذهبية-لـ-apex-deployments-سالكة&quot;&gt;🛡️ شيك ليست (Checklist) ذهبية لـ APEX Deployments سالكة&lt;/h2&gt;
&lt;p&gt;في المرة الجاية وأنت بتبني أو بتعدل مشروع APEX، اتأكد من النقط دي:&lt;/p&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; &lt;strong&gt;إنشاء ملفات مخصصة لكل بيئة في Git&lt;/strong&gt;: احفظ &lt;code&gt;dev.json&lt;/code&gt; و &lt;code&gt;staging.json&lt;/code&gt; و &lt;code&gt;prod.json&lt;/code&gt; جوه فولدر &lt;code&gt;deployments/&lt;/code&gt; في الـ Repo.&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; &lt;strong&gt;كتابة &lt;code&gt;workspace.name&lt;/code&gt; صراحةً دايماً&lt;/strong&gt;: اذكر اسم الـ Workspace بالاسم في كل ملف عشان SQLcl متضطرش تخمن أبداً.&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; &lt;strong&gt;ضبط الـ &lt;code&gt;parsingSchema&lt;/code&gt; الصحيحة&lt;/strong&gt;: اتأكد إن الـ Schema المكتوبة بتطابق اليوزر المخصص للداتا في البيئة دي (&lt;code&gt;APP_DEV&lt;/code&gt;, &lt;code&gt;APP_STAGE&lt;/code&gt;, &lt;code&gt;APP_DATA&lt;/code&gt;).&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; &lt;strong&gt;التحقق من صلاحية يوزر الـ Deployer&lt;/strong&gt;: اتأكد إن يوزر الـ Deployment مصرح له بالتعامل مع الـ Workspace Schema من خلال إدارة APEX العادية ومن غير ما تديله أدوار DBA مفتوحة.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-ملخص-الكلام&quot;&gt;🎯 ملخص الكلام&lt;/h2&gt;
&lt;p&gt;زي ما كابتن الدليفري محتاج اسم الشارع ورقم البرج ورقم الشقة عشان يسلمك العفش بأمان، أداة SQLcl محتاجة &lt;strong&gt;رقم التطبيق (App ID)&lt;/strong&gt; ومعاه &lt;strong&gt;اسم الـ Workspace&lt;/strong&gt; عشان تنزل كود الـ APEX بتاعك في مكانه الصح والمظبوط.&lt;/p&gt;
&lt;p&gt;بلاش الاعتماد على حيل PL/SQL المؤقتة اللي بتشتغل على جهازك وتخذلك في السيرفرات الحقيقية. ثبت ملفات الـ deployment لكل بيئة في الـ Git، وهتضمن إن الـ CI/CD Pipelines بتاعتك تكون صلبة، مستقرة، وشغالة من أول مرة وبدون أي مفاجآت! 🚀✨&lt;/p&gt;
</content:encoded><category>نشر التطبيقات والـ DevOps</category><category>oracle-apex</category><category>database</category><category>devops</category><category>arabic</category><category>sqlcl</category></item><item><title>إطلاق الصاروخ بالمفتاحين: حراس أمان SQLcl المحكمة للـ Deployments 🔑🚀</title><link>https://ash2osh.github.io/arabic-blog/posts/013_the-two-key-missile-launch-foolproof-sqlcl-deployment-guards/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/013_the-two-key-missile-launch-foolproof-sqlcl-deployment-guards/</guid><description>الجزء السابع (مسك الختام) من سلسلة &quot;مطور APEX المدعوم بالذكاء الاصطناعي&quot;. إزاي تبني خط دفاع مستوحى من غواصات الصواريخ يمنع الـ AI من لمس الـ Production نهائياً!</description><pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-two-key-missile-launch-foolproof-sqlcl-deployment-guards&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;إطلاق-الصاروخ-بالمفتاحين-حراس-أمان-sqlcl-المحكمة-للـ-deployments-&quot;&gt;إطلاق الصاروخ بالمفتاحين: حراس أمان SQLcl المحكمة للـ Deployments 🔑🚀&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء السابع (مسك الختام) من سلسلة “مطور APEX المدعوم بالذكاء الاصطناعي”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;إنك تدي لـ AI Coding Assistant أو لسكربت آلي اتصال داتابيز مفتوح بصلاحيات DBA خارقة، ده بالظبط زي ما تدي طفل صغير في إيده منشار خشب كهربائي شغال وتقوله “قصقص لنا شوية ورد من الجنينة”! مجرد سوء فهم بسيط، وهتلاقي شجرة الـ Production اتقصت من قاعها ومبقاش ليها أثر!&lt;/p&gt;
&lt;p&gt;في ختام السلسلة دي، هنشوف إزاي نبني شبكة أمان لا تخترق عن طريق دمج &lt;strong&gt;3 اتصالات SQLcl معزولة الصلاحيات&lt;/strong&gt; مع &lt;strong&gt;فحوصات تأكيد هوية البيئة والـ Schema قبل تشغيل أي سطر كود&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;المعمارية دي مستوحاة من غرف تحكم الغواصات الحربية، حيث إطلاق الصاروخ بيتطلب مفتاحين منفصلين بيلفهم ضابطين في نفس اللحظة—عشان نضمن إن لا AI شارد ولا مطور مرهق الساعة 3 الفجر يقدر ينفذ سكربت بالغلط على الداتابيز الحية!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-ورطة-المنشار-الكهربائي-الصلاحيات-في-عصر-الذكاء-الاصطناعي&quot;&gt;💥 ورطة المنشار الكهربائي: الصلاحيات في عصر الذكاء الاصطناعي&lt;/h2&gt;
&lt;p&gt;في شغل قواعد البيانات القديم، كتير من الفرق كانت بتستسهل في موضوع الصلاحيات. المطور تلاقيه داخل بحساب واحد سوبر (أحياناً يوزر DBA كامل الصلاحيات) بيعمل بيه كل حاجة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;الصبح بيشوف إحصائيات الجداول.&lt;/li&gt;
&lt;li&gt;الظهر بيجرب استعلام &lt;code&gt;SELECT&lt;/code&gt; سريع.&lt;/li&gt;
&lt;li&gt;العصر بيشغل سكربت &lt;code&gt;ALTER TABLE&lt;/code&gt; تجريبي.&lt;/li&gt;
&lt;li&gt;وبالليل بيصلح Bug طارئة في السيرفر!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;لو إنسان غلط بالاتصال ده، ممكن في أسوأ الظروف يمسح جدول بالغلط.&lt;/p&gt;
&lt;p&gt;لكن تخيل بقى لما تحط في المعادلة AI Agent ذاتي التوجيه بيكتب وينفذ أكواد بسرعة 100 سطر في الثانية! لو الـ Agent ده شغال بيوزر DBA مفتوح وهبد أمر &lt;code&gt;DROP TABLE ORDERS CASCADE CONSTRAINTS PURGE&lt;/code&gt;، &lt;strong&gt;خطة طوارئ الكوارث (Disaster Recovery) هتشتغل قبل ما تلحق تمد إيدك وتدوس &lt;code&gt;Ctrl+C&lt;/code&gt;&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;وكلاء الذكاء الاصطناعي أدوات تسريع مذهلة، بس بيشتغلوا بنظام احتمالي (Probabilistic). وحسب &lt;strong&gt;مبدأ أقل صلاحيات ممكنة (Principle of Least Privilege)&lt;/strong&gt;، مستحيل الـ Agent ياخد صلاحية أكبر من الحد الأدنى الصارم للمهمة اللي رايح يعملها حالا.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-مبدأ-كروت-الأمان-الثلاثة-the-3-keycards&quot;&gt;🔑 مبدأ كروت الأمان الثلاثة (The 3 Keycards)&lt;/h2&gt;
&lt;p&gt;عشان نخلي عمليات الداتابيز آمنة بنسبة 100%، استبدلنا المفتاح السحري الواحد بـ &lt;strong&gt;3 اتصالات مسماة ومعزولة الصلاحيات جوه SQLcl&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1. READER_SQLCL_CONNECTION   → 🔍 كارت القراءة فقط (للبحث والاستعلامات)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2. DEPLOYER_SQLCL_CONNECTION → 🛠️ كارت المطور المحدود (DDL/DML جوه DEV بس)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3. METADATA_SQLCL_CONNECTION → 🪞 كارت المراية (لتشغيل DBMS_METADATA فقط)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;تعالوا نشوف حدود كل كارت فيهم:&lt;/p&gt;
&lt;h3 id=&quot;الكارت-1-القارئ-reader_sqlcl_connection&quot;&gt;الكارت 1: القارئ (&lt;code&gt;READER_SQLCL_CONNECTION&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الصلاحية&lt;/strong&gt;: واخد صلاحية &lt;code&gt;SELECT&lt;/code&gt; &lt;em&gt;فقط&lt;/em&gt; على جداول التطبيق وقواميس الداتابيز (&lt;code&gt;ALL_TABLES&lt;/code&gt;, &lt;code&gt;ALL_DEPENDENCIES&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;عمليات الـ DDL والـ DML&lt;/strong&gt;: &lt;strong&gt;ممنوعة منعاً باتاً&lt;/strong&gt;. مستحيل يعمل &lt;code&gt;INSERT&lt;/code&gt; أو &lt;code&gt;UPDATE&lt;/code&gt; أو &lt;code&gt;DROP&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;بيشتغل إمتى&lt;/strong&gt;: لما الـ AI بيحقق في bug، أو بيفحص العلاقات، أو بيتأكد من أنواع الأعمدة. حتى لو الـ AI اتجنن وطلع أمر مسح، محرك أوراكل هيرميه في وشه بإيرور &lt;code&gt;ORA-01031: insufficient privileges&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;الكارت-2-الناشر-deployer_sqlcl_connection&quot;&gt;الكارت 2: الناشر (&lt;code&gt;DEPLOYER_SQLCL_CONNECTION&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الصلاحية&lt;/strong&gt;: واخد صلاحيات كتابة مقفولة بالمللي جوه سكيما التطوير فقط (زي &lt;code&gt;APP_CODE&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;بيشتغل إمتى&lt;/strong&gt;: لما توافق على السكربتات المجهزة في &lt;code&gt;ai_generate/YYYY-MM-DD/&lt;/code&gt; وتشغلها على جهازك أو سيرفر الـ Dev. معندوش أي وصول لسيرفرات الـ Production أو الـ Staging.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;الكارت-3-مراية-الميتاداتا-metadata_sqlcl_connection&quot;&gt;الكارت 3: مراية الميتاداتا (&lt;code&gt;METADATA_SQLCL_CONNECTION&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الصلاحية&lt;/strong&gt;: يوزر مخصص ومقيد لتشغيل حزم &lt;code&gt;DBMS_METADATA&lt;/code&gt; وسحب ملفات التصدير عبر SQLcl.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;بيشتغل إمتى&lt;/strong&gt;: بيشتغل أوتوماتيكياً في خلفية سكربتات المزامنة لتحديث فاترينة &lt;code&gt;database/&amp;lt;schema&amp;gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;بحفظ الاتصالات دي في مخزن SQLcl المشفر (&lt;code&gt;conn -save &amp;lt;name&amp;gt;&lt;/code&gt;)، السكربتات بتتنقل بين الاتصالات بالأسماء المستعارة من غير ما تعرض باسووردات على المكشوف في الشات:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sql&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /nolog&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;conn&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -save&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DEV_READER&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my_reader_user/secret_pass@dev_db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;conn&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -save&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DEV_DEPLOYER&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my_code_user/secret_pass@dev_db&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-كونسول-الغواصة-المزدوج-فحوصات-تأكيد-السكيما-قبل-التنفيذ&quot;&gt;🚀 كونسول الغواصة المزدوج: فحوصات تأكيد السكيما قبل التنفيذ&lt;/h2&gt;
&lt;p&gt;إنك تعمل اتصالات بأسماء مستعارة ده شيء عظيم، بس إيه اللي يضمن إن سكربت مخصص لداتابيز &lt;code&gt;APP_DEV&lt;/code&gt; ميروحش يتنفذ بالغلط على &lt;code&gt;APP_PROD&lt;/code&gt;؟&lt;/p&gt;
&lt;p&gt;في الغواصات الحربية، إطلاق الصاروخ بيتطلب إن اتنين ضباط يلفوا مفتاحين فيزيائيين بعيد عن بعض في نفس الوقت. ولا واحد فيهم يقدر يضرب لوحده.&lt;/p&gt;
&lt;p&gt;في الـ Pipeline بتاعنا، بنطبق نفس الأمان الصارم ده بإضافة &lt;strong&gt;بلوك فحص واختبار أمان إجباري (Pre-Flight Assertion Guard)&lt;/strong&gt; في أول كل سكربت Migration بيتولد في &lt;code&gt;ai_generate/&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- سكربت: ai_generate/2026-09-05/01_deploy_customer_loyalty.sql&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- بلوك اختبار وتأكيد الأمان قبل تنفيذ أي سطر&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- 1. لو حصل أي خطأ.. اخرج فوراً واعمل Rollback لكل حاجة!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;whenever sqlerror exit failure &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;rollback&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; serveroutput &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;declare&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    c_expected_schema constant &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;APP_CODE&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    c_forbidden_db    constant &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) :&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;PROD_DB&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    v_current_schema  &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    v_current_db      &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;varchar2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- استخراج بيانات السيشن النشطة حالياً&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    select&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sys_context(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;USERENV&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;CURRENT_SCHEMA&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;           sys_context(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;USERENV&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;DB_NAME&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      into&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_current_schema,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;           v_current_db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dual;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- الفحص 1: رفض قاطع لو الداتابيز هي الـ Production المحمية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; upper&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(v_current_db) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c_forbidden_db &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        raise_application_error(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;20001&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &apos;🚨 إنذار أحمر! محاولة تنفيذ سكربت على داتابيز الـ Production المحمية: &apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            v_current_db &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;. تم إيقاف العملية فوراً!&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    end&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    -- الفحص 2: التأكد من مطابقة السكيما المتصلة بالسكيما المستهدفة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; upper&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(v_current_schema) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c_expected_schema &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        raise_application_error(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;20002&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &apos;⚠️ تضارب في السكيما! السكربت مصمم لـ [&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c_expected_schema &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &apos;] وأنت متصل حالياً بـ [&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_current_schema &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;]. تم إلغاء العملية.&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    end&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    dbms_output&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;put_line&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;====================================================&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    dbms_output&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;put_line&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;✓ فحص الأمان نجح: متصل بـ &apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_current_schema &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos; على داتابيز &apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v_current_db);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    dbms_output&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;put_line&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;====================================================&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- كود الـ DDL أو الـ DML الحقيقي بيبدأ هنا بعد نجاح الفحص&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;-- ====================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ALTER&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; TABLE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; CUSTOMERS &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ADD&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    LOYALTY_POINTS &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;NUMBER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DEFAULT&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; NOT NULL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    LOYALTY_TIER   &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;VARCHAR2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;DEFAULT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;BRONZE&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; NOT NULL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;إيه-اللي-بيحصل-لما-يقع-خطأ&quot;&gt;إيه اللي بيحصل لما يقع خطأ؟&lt;/h3&gt;
&lt;p&gt;لو حد بالغلط شغل السكربت ده وهو متصل بداتابيز تانية:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;كشف فوري في أجزاء من الثانية&lt;/strong&gt;: الأسطر الأولى بتفحص &lt;code&gt;CURRENT_SCHEMA&lt;/code&gt; و &lt;code&gt;DB_NAME&lt;/code&gt;. لو مفيش تطابق، كود الـ PL/SQL بيرمي خطأ غير معالج (&lt;code&gt;ORA-20001&lt;/code&gt; أو &lt;code&gt;ORA-20002&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تراجع فوري وخروج آمن (Instant Rollback &amp;amp; Exit)&lt;/strong&gt;: لأن أول سطر في الملف مكتوب فيه &lt;code&gt;whenever sqlerror exit failure rollback&lt;/code&gt;، أداة SQLcl بتلقط الخطأ فوراً، وتلغي أي تعديل معلق، وتقفل الجلسة وتخرج بكود فشل.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ولا سطر كود بيتنفذ&lt;/strong&gt;: أمر الـ &lt;code&gt;ALTER TABLE&lt;/code&gt; اللي مكتوب تحت مستحيل يتقرأ أو يدخل محرك الداتابيز أصلاً!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;داتابيز الإنتاج بتاعتك محمية ومستحيل تنضرب بالخطأ! 🛡️&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الأعمدة-السبعة-لمطور-oracle-apex-المدعوم-بالذكاء-الاصطناعي&quot;&gt;🏁 الأعمدة السبعة لمطور Oracle APEX المدعوم بالذكاء الاصطناعي&lt;/h2&gt;
&lt;p&gt;على مدار السلسلة دي المكونة من 7 أجزاء، بنينا نموذج عمل هندسي متكامل للمؤسسات:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;معمارية مطور APEX الحديث:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;┌──────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 7. حراس الـ Deployments بالمفتاحين وفحوصات SQLcl         │  ← أمان حديدي&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├──────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 6. جلسة التعارف والذاكرة الدائمة بفولدر app_context/    │  ← صفر زهايمر&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├──────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 5. تقسيم المعمل النظيف لـ 4 مناطق (Apps / Mirror / Stage)│  ← مفيش خلط&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├──────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 4. استعلامات الجراف بدون هدر عبر Graphify CLI            │  ← توفير 90% توكنز&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├──────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 3. الـ AST Architectural Knowledge Graph                 │  ← الحقيقة المعمارية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├──────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 2. التقسيم الذكي بلغة APEXlang (.apx)                    │  ← Git Diffs نظيفة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├──────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│ 1. الهروب من فخ ملفات الـ SQL الضخمة والتوكنز            │  ← سرعة وتوفير&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└──────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;هربنا من فخ التوكنز&lt;/strong&gt;: بطلنا نرمي 150 ألف سطر للـ AI ووفرنا فواتير الـ API من الجذور.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;اتعلمنا APEXlang (&lt;code&gt;.apx&lt;/code&gt;)&lt;/strong&gt;: فككنا التطبيقات لملفات مقروءة وواضحة للبشر والذكاء الاصطناعي.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;بنينا الـ Knowledge Graph&lt;/strong&gt;: رسمنا شاشاتنا وزرايرنا وجداولنا في شبكة علاقات هندسية قطعية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;استعلمنا بدون هدر&lt;/strong&gt;: استخدمنا Graphify عشان نسحب الـ 10 نود المطلوبين بالمللي لكل ميزة.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;فرضنا معمارية المعمل النظيف&lt;/strong&gt;: 4 فولدرات فيزيائية بتمنع خلط الكود الحي بمرايات الداتابيز وتجارب الـ AI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;قضينا على زهايمر الـ LLMs&lt;/strong&gt;: فولدر &lt;code&gt;app_context/&lt;/code&gt; وأمر &lt;code&gt;/init&lt;/code&gt; بيخلوا الـ AI جاهز في 30 ثانية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;حمينا الـ Deployments&lt;/strong&gt;: بنينا حراس الأمان المزدوجة في SQLcl لمنع أي أخطاء في الـ Production.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-ابنيها-بنفسك-أو-انطلق-بالقالب-الجاهز&quot;&gt;🛠️ ابنيها بنفسك، أو انطلق بالقالب الجاهز&lt;/h2&gt;
&lt;p&gt;كل تقنية ومعمارية اتشرحت في السلسلة دي هي &lt;strong&gt;مبادئ هندسية مفتوحة (Open Engineering Principles)&lt;/strong&gt;. تقدر تطبقها فوراً في مشروعاتك القائمة، سواء شغال بـ Git أو Jenkins أو GitLab CI أو Cursor أو غيرهم.&lt;/p&gt;
&lt;p&gt;لكن لو عايز تنطلق بنموذج مجرب وناجح الأعمدة السبعة فيه متظبطة وشغالة وجاهزة للانطلاق فوراً:&lt;/p&gt;
&lt;p&gt;👉 &lt;strong&gt;شوف &lt;a href=&quot;https://github.com/ash2osh/APEX_PROJECT_TEMPLATE&quot;&gt;APEX Project Template&lt;/a&gt; المفتوح المصدر على GitHub!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;جواه هتلاقي:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;تقسيم المعمل النظيف لـ 4 فولدرات جاهز.&lt;/li&gt;
&lt;li&gt;سكربتات استخراج الـ AST والـ Graphify جاهزة (&lt;code&gt;setup_graphify_apx.py&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;قوالب &lt;code&gt;app_context/&amp;lt;app-id&amp;gt;/&lt;/code&gt; وأمر التهيئة السريع &lt;code&gt;/init&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;حراس الأمان لـ SQLcl والاتصالات المعزولة مسبقاً.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;سواء عملت Clone للقالب أو اقتبست منه أفكار لمشروعك، دلوقتي بقى معاك الأدوات الحقيقية عشان تبني تطبيقات Oracle APEX أسرع، وأنظف، وأكثر استقراراً من أي وقت مضى.&lt;/p&gt;
&lt;p&gt;برمجة ممتعة للجميع، ومرحباً بكم في مستقبل تطوير Oracle APEX مع الذكاء الاصطناعي! 🚀✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>مطور أبيكس المعزز بالذكاء الاصطناعي</category><category>oracle-apex</category><category>sqlcl</category><category>security</category><category>devops</category><category>ci-cd</category><category>arabic</category></item><item><title>جلسة التعارف من أول يوم: إزاي تدي الـ AI ذاكرة دائمة بفولدر app_context/ 📓🧠</title><link>https://ash2osh.github.io/arabic-blog/posts/012_the-day-one-briefing-giving-your-ai-permanent-memory-with-app-context/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/012_the-day-one-briefing-giving-your-ai-permanent-memory-with-app-context/</guid><description>الجزء السادس من سلسلة &quot;مطور APEX المدعوم بالذكاء الاصطناعي&quot;. إزاي تقضي على زهايمر الـ LLMs اليومي بأمر init/ وملفات توثيق سريعة تؤهل الـ AI والبشر في 30 ثانية!</description><pubDate>Sun, 20 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-day-one-briefing-giving-your-ai-permanent-memory-with-app-context&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;جلسة-التعارف-من-أول-يوم-إزاي-تدي-الـ-ai-ذاكرة-دائمة-بفولدر-app_context-&quot;&gt;جلسة التعارف من أول يوم: إزاي تدي الـ AI ذاكرة دائمة بفولدر app_context/ 📓🧠&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء السادس من سلسلة “مطور APEX المدعوم بالذكاء الاصطناعي”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;الشغل مع مساعد ذكاء اصطناعي معندوش سياق دائم للمشروع، عامل بالظبط زي ما تعين استشاري كبير عبقري بس بيصحى كل يوم الصبح ناسي كل حاجة حصلت في حياته! كل يوم محتاج تشرح له من الصفر مكنة القهوة فين، وأنهي Schema اللي فيها بيانات العملاء، وليه أسامي الجداول في شركتنا لازم تبدأ بـ &lt;code&gt;HR_&lt;/code&gt;!&lt;/p&gt;
&lt;p&gt;بدل ما تقعد تنسخ وتلزق ديباجة برومبت طويلة ومملة في بداية كل شات جديد، تقدر تنشئ فولدر &lt;strong&gt;&lt;code&gt;app_context/&amp;lt;app-id&amp;gt;/&lt;/code&gt;&lt;/strong&gt; وتربطه بـ &lt;strong&gt;طقس تهيئة سريع عبر أمر &lt;code&gt;/init&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;الحركة دي بتسلم الـ Agent بتاعك “دوسيه ترحيب وذاكرة مؤسسية” بتحول أي جلسة شات فاضية لشريك برمجة فاهم كل تكة في معمارية نظامك في أقل من 30 ثانية!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-يوم-اليرموك-اليومي-مع-مساعدي-الذكاء-الاصطناعي&quot;&gt;🤯 يوم اليرموك اليومي مع مساعدي الذكاء الاصطناعي&lt;/h2&gt;
&lt;p&gt;لو قضيت أكتر من أسبوعين بتبرمج بمساعدة أدوات الـ AI، فأنت أكيد حافظ الحوار اليومي السخيف ده:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;جلسة رقم 1 (يوم الإثنين):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;أنت: &quot;اعمل لي شاشة طلب كارت موظف جديد في صفحة 20.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الـ Agent: &quot;من عينيّا! هعمل جدول T_BADGES بعمود Identity بيزيد تلقائي...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;أنت: &quot;لأ يا عم الحج! حسب معايير شركتنا، كل جداول الـ HR بتستخدم Sequence اسمه HR_SEQ_، &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ولازم أعمدة التدقيق الإلزامية (CREATED_BY, CREATED_ON)، &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      وتسمية الـ Packages بنظام PKG_HR_&amp;lt;MODULE&amp;gt;_API!&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الـ Agent: &quot;أعتذر جداً عن الخطأ! هعيد كتابة الكود حسب معاييركم...&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(تقفل الشات، تنام، وتفتح شات جديد خالص صباح يوم الثلاثاء)&lt;/em&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;جلسة رقم 2 (يوم الثلاثاء):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;أنت: &quot;دلوقتي اعمل لي شاشة الموافقات المنبثقة في صفحة 21.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الـ Agent: &quot;تمام جداً! هعمل جدول T_APPROVALS بعمود Identity بيزيد تلقائي...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;أنت: &quot;🤦‍♂️ هو إحنا هنعيد نفس الموشح كل يوم الصبح؟!&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;التكرار اللانهائي ده بيحرق أعصابك، وبيشتت تركيزك، وبيحرق رصيد التوكنز. نموذج الذكاء الاصطناعي مش قاصد يعاندك ولا كسلان—هو ببساطة شغال بنظام (Stateless)؛ كل جلسة جديدة بتبدأ بصفحة بيضاء تماماً وميعرفش أي حاجة عن ماضيك معاه.&lt;/p&gt;
&lt;p&gt;قوالب الـ System Prompts في واجهات الشات بتساعد شوية، بس بتقدم بسرعة، وبتتوه بين فروع الـ Git، ومبتتشاركش بين أعضاء الفريق.&lt;/p&gt;
&lt;p&gt;عشان نحل المشكلة دي للأبد، بنتعامل مع &lt;strong&gt;السياق كأنه كود برمجي (Context as Code)&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-دوسيه-الترحيب-فولدر-app_contextapp-id&quot;&gt;📓 دوسيه الترحيب: فولدر &lt;code&gt;app_context/&amp;lt;app-id&amp;gt;/&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;في شغل السوفتوير الحديث المدعوم بالذكاء الاصطناعي، كل تطبيق في مستودعك لازم يحتفظ بـ “دوسيه توثيق حي” جوه فولدر &lt;code&gt;app_context/&amp;lt;app-id&amp;gt;/&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;my-apex-project/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── app_context/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    └── 100/                          ← رقم تطبيق أبيكس (نظام الـ ERP أو الـ HR)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ├── APP_ARCHITECTURE.md      ← المعمارية العامة ونظام الأمان والصلاحيات&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ├── DATABASE_MODEL.md        ← الـ Schemas، معايير التسمية، والجداول&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ├── BUSINESS_RULES.md        ← قيود البيزنس والحدود المالية الثابتة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        └── CONVENTIONS.md           ← معايير كتابة الكود وتسمية عناصر أبيكس&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;دي مش مواصفات ميتة من 500 صفحة؛ دي ملفات Markdown مركزة جداً ومكتوبة بنقاط سريعة بتحدد &lt;strong&gt;قواعد اللعبة&lt;/strong&gt; للتطبيق ده تحديداً.&lt;/p&gt;
&lt;p&gt;تعالوا نشوف كل ملف فيهم بيشيل إيه:&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-ملف-app_architecturemd-الرسم-المعماري&quot;&gt;1. ملف &lt;code&gt;APP_ARCHITECTURE.md&lt;/code&gt; (الرسم المعماري)&lt;/h3&gt;
&lt;p&gt;بيحدد التطبيق مبني إزاي، نظام الأمان، وشجرة القوائم:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF;font-weight:bold&quot;&gt;# تطبيق 100: بوابة إدارة الطلبات والمبيعات&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **إصدار أبيكس المستهدف**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: APEX 26.1 (Universal Theme)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **المصادقة الأساسية**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: نظام مصادقة مخصص (&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`PKG_AUTH.AUTHENTICATE`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **خطط الصلاحيات (Authorization Schemes)**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; `AUTH_ADMIN`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: بيتطلب دور &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`ROLE_ADMIN`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; في جدول &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`APP_USERS`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; `AUTH_SALES_REP`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: الدور الافتراضي لكل الموظفين&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **مكونات عامة في التطبيق**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; صفحة 0 (Global Page): فيها شريط التنبيهات الموحد للرسائل الإدارية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; قائمة التنقل: قائمة ديناميكية معتمدة على &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`USER_PERMISSIONS_V`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;2-ملف-database_modelmd-معايير-الداتابيز&quot;&gt;2. ملف &lt;code&gt;DATABASE_MODEL.md&lt;/code&gt; (معايير الداتابيز)&lt;/h3&gt;
&lt;p&gt;بيثبت حدود الـ Schemas، ملكية الجداول، وطريقة توليد المفاتيح:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF;font-weight:bold&quot;&gt;# معايير قاعدة البيانات والـ Schemas&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **معمارية الـ Dual-Schema المزدوجة**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; `APP_CODE`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: مالك كود البرمجة (الـ Packages، والـ Views، ويوزر الـ Deployer)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; `APP_DATA`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: مالك البيانات والجداول (Tables، Indexes، Sequences)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **معيار المفتاح الأساسي (PK)**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: عمود &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`NUMBER(18,0)`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; بيتغذى من Sequence صريح عبر Trigger (&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`SEQ_&amp;lt;TABLE_NAME&amp;gt;`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **أعمدة التدقيق الإلزامية في كل الجداول بدون استثناء**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; `CREATED_ON DATE DEFAULT SYSDATE NOT NULL`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; `CREATED_BY VARCHAR2(100) DEFAULT NVL(V(&apos;APP_USER&apos;), USER) NOT NULL`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; `UPDATED_ON DATE`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; `UPDATED_BY VARCHAR2(100)`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **قاعدة الحذف المنطقي (Soft-Delete)**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: الجداول الحساسة بتستخدم &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`IS_DELETED CHAR(1) DEFAULT &apos;N&apos; CHECK (IS_DELETED IN (&apos;Y&apos;, &apos;N&apos;))`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;3-ملف-business_rulesmd-قواعد-البيزنس-الثابتة&quot;&gt;3. ملف &lt;code&gt;BUSINESS_RULES.md&lt;/code&gt; (قواعد البيزنس الثابتة)&lt;/h3&gt;
&lt;p&gt;بيسجل شروط البيزنس عشان الـ AI ميهبدش منطق يخالف سياسة الشركة:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF;font-weight:bold&quot;&gt;# قواعد ومنطق البيزنس الجوهرية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **شرائح الخصومات للعملاء**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;   -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; خصم حتى 15%: بيعتمد أوتوماتيكياً بدون مراجعة.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;   -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; خصم من 15% وحتى 30%: بيتطلب موافقة صريحة من مدير المبيعات.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;   -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; خصم أكتر من 30%: ممنوع تماماً؛ ويرمي Exception برقم &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`-20050`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;2.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **دورة حياة الأوردر (Order State Machine)**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;   -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; `DRAFT`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ──&amp;gt; &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`SUBMITTED`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ──&amp;gt; &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`APPROVED`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ──&amp;gt; &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`FULFILLED`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;   -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; مستحيل الأوردر ينط من مسودة &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`DRAFT`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; لمعتمد &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`APPROVED`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; مباشرة.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;4-ملف-conventionsmd-دليل-الأسلوب-وتسمية-العناصر&quot;&gt;4. ملف &lt;code&gt;CONVENTIONS.md&lt;/code&gt; (دليل الأسلوب وتسمية العناصر)&lt;/h3&gt;
&lt;p&gt;بيقفل أي نقاش أو تضارب في التسمية، وبيخلي أي كود طالع كأن أشطر مهندس Senior في الفريق هو اللي كاتبه:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF;font-weight:bold&quot;&gt;# معايير التسمية في APEX و PL/SQL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **حقول الصفحات**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`P&amp;lt;PAGE&amp;gt;_&amp;lt;PURPOSE&amp;gt;`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (مثال: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`P12_CUSTOMER_NAME`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`P12_ORDER_TOTAL`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **الزراير**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`BTN_&amp;lt;ACTION&amp;gt;`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (مثال: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`BTN_SUBMIT`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`BTN_CANCEL`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`BTN_APPLY_DISCOUNT`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **الـ Dynamic Actions**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`DA_&amp;lt;EVENT&amp;gt;_&amp;lt;TARGET&amp;gt;`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (مثال: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`DA_CHANGE_DISCOUNT_CODE`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **عمليات الصفحات**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`PROC_&amp;lt;ACTION&amp;gt;`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (مثال: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`PROC_SAVE_ORDER_HEADER`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8;font-weight:bold&quot;&gt; **أسماء الـ Packages**&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`PKG_&amp;lt;MODULE&amp;gt;_API`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (مثال: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;`PKG_CHECKOUT_API`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-بروتوكول-الـ-init-تأهيل-في-30-ثانية&quot;&gt;🚀 بروتوكول الـ &lt;code&gt;/init&lt;/code&gt;: تأهيل في 30 ثانية&lt;/h2&gt;
&lt;p&gt;بعد ما جهزت الدوسيه ده، إزاي توكله للـ Agent من غير ما تفضل تقص وتلزق كل مرة؟&lt;/p&gt;
&lt;p&gt;بتعمل طقس تهيئة بسيط جداً: &lt;strong&gt;أمر &lt;code&gt;/init&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;كل ما تفتح شات جديد في Cursor أو Antigravity أو التيرمينال، كل اللي بتعمله إنك بتكتب:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;الـ Agent بيشغل روتين التهيئة القياسي:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;قراءة ملف &lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt;: بيعرف التطبيق النشط (&lt;code&gt;100&lt;/code&gt;) والـ Schema المستهدفة (&lt;code&gt;APP_CODE&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;فحص &lt;code&gt;app_context/100/&lt;/code&gt;&lt;/strong&gt;: بيقرا الملفات الأربعة المعمارية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التأكد من الـ Knowledge Graph&lt;/strong&gt;: بيتأكد إن شبكة العلاقات محدثة.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;طباعة شاشة التأكيد الخضراء&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[تم تجهيز الـ Agent بنجاح]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ التطبيق المحمل: 100 (&quot;بوابة إدارة الطلبات والمبيعات&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ الـ Schemas النشطة: APP_CODE (للبرمجة) | APP_DATA (للداتا)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ المعايير المفروضة: تريجرات الـ Sequences، أعمدة الـ Audit، بادئات P&amp;lt;PAGE&amp;gt;_*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ قواعد البيزنس مفعلة: شرائح موافقات الخصم ودورة حياة الأوردر&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;✓ حالة الـ Knowledge Graph: تم فهرسة 412 Node و 980 علاقة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;أنا جاهز لتعليماتك يا فنان!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;من اللحظة دي، أي حقل الـ Agent هيبنيه هيبدأ بـ &lt;code&gt;P12_&lt;/code&gt;، وأي جدول هيعمله هيحتوي على أعمدة الـ Audit الأربعة، وأي شرط خصم هيطبق شرائح البيزنس المظبوطة—&lt;strong&gt;من أول محاولة وبدون أي أخطاء!&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-المكسب-المزدوج-ذاكرة-للذكاء-الاصطناعي-وتأهيل-سريع-للبشر&quot;&gt;🎁 المكسب المزدوج: ذاكرة للذكاء الاصطناعي وتأهيل سريع للبشر!&lt;/h2&gt;
&lt;p&gt;أحلى ما في دوسيه &lt;code&gt;app_context/&lt;/code&gt; إنه بيضرب عصفورين بحجر واحد:&lt;/p&gt;
&lt;p&gt;نفس الملفات الأربعة اللي بتدي للـ AI ذاكرة خارقة، بتحل واحدة من أكبر عقد الشركات البرمجية: &lt;strong&gt;تأهيل المطورين الجدد (Developer Onboarding)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;لما ينضم لفريقك مطور Junior جديد أو استشاري خارجي، بدل ما تقعد معاه أسبوعين تشرح له معايير التسمية وجداول الداتابيز، بتديه فولدر &lt;code&gt;app_context/&amp;lt;app-id&amp;gt;/&lt;/code&gt;. في خلال ساعة واحدة بس، بيبقى فاهم معمارية المشروع وقواعد البيزنس كأنه شغال معاكم من سنتين!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-إزاي-تضيف-فولدر-السياق-لمشروعك&quot;&gt;🛠️ إزاي تضيف فولدر السياق لمشروعك؟&lt;/h2&gt;
&lt;p&gt;مش هياخد منك 15 دقيقة:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;أنشئ الفولدر&lt;/strong&gt;: ضيف &lt;code&gt;app_context/&lt;/code&gt; في الـ Root.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;اكتب الملفات الأربعة&lt;/strong&gt;: &lt;code&gt;APP_ARCHITECTURE.md&lt;/code&gt;، و &lt;code&gt;DATABASE_MODEL.md&lt;/code&gt;، و &lt;code&gt;BUSINESS_RULES.md&lt;/code&gt;، و &lt;code&gt;CONVENTIONS.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;اربطه بتعليمات الـ Agent&lt;/strong&gt;: جوه ملف القواعد (مثل &lt;code&gt;AGENTS.md&lt;/code&gt;) كالآتي:
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“لما اليوزر يكتب &lt;code&gt;/init&lt;/code&gt;، اقرأ ملف &lt;code&gt;.env&lt;/code&gt;، وحمل كل ملفات الـ Markdown في &lt;code&gt;app_context/&amp;lt;app-id&amp;gt;/&lt;/code&gt;، وأكد تحميل السياق قبل ما تبدأ البرمجة.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;h3 id=&quot;-عايز-قوالب-سياق-جاهزة&quot;&gt;📦 عايز قوالب سياق جاهزة؟&lt;/h3&gt;
&lt;p&gt;مستودع &lt;a href=&quot;https://github.com/ash2osh/APEX_PROJECT_TEMPLATE&quot;&gt;APEX Project Template&lt;/a&gt; بيحتوي على قوالب Markdown جاهزة لفولدر &lt;code&gt;app_context/&lt;/code&gt; مع سكربت &lt;code&gt;/init&lt;/code&gt; وقواعد الـ Agents متظبطة. تقدر تاخدها كوبي وبيست في مشروعك وتعدل عليها فوراً!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-مسك-الختام-الجزء-السابع&quot;&gt;🚀 إيه اللي مستنينا في مسك الختام (الجزء السابع)؟&lt;/h2&gt;
&lt;p&gt;دلوقتي كودنا بقى مقسم لملفات &lt;code&gt;.apx&lt;/code&gt; نظيفة، وعلاقاتنا مرسومة في Knowledge Graph، ومناطق المعمل النظيف معزولة، والـ Agent بقى معاه ذاكرة حديدية مابتنساش.&lt;/p&gt;
&lt;p&gt;مفاضلش غير قطعة واحدة أخيرة وحاسمة جداً: &lt;strong&gt;زرار إطلاق الصاروخ للـ Deployment&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;إزاي نسمح للـ AI أو لسكربتات الـ CI/CD تشغل الـ Migrations عبر SQLcl من غير الرعب القاتل إن سكربت تجارب يضرب في داتابيز الـ Production الحية؟&lt;/p&gt;
&lt;p&gt;في ختام السلسلة، &lt;strong&gt;الجزء السابع (“إطلاق الصاروخ بالمفتاحين: حراس أمان SQLcl المحكمة”)&lt;/strong&gt;، هنبني Pipeline مزدوج المفاتيح باتصالات معزولة الصلاحيات وفحوصات هوية آلية تحميك من أي خطأ بشري أو ذكاء اصطناعي!&lt;/p&gt;
&lt;p&gt;نشوفكم في الحلقة الأخيرة الكبيرة! 🔑🚀✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>مطور أبيكس المعزز بالذكاء الاصطناعي</category><category>oracle-apex</category><category>ai</category><category>context</category><category>prompt-engineering</category><category>onboarding</category><category>arabic</category></item><item><title>عزل المعمل النظيف: ليه سورس كودك، ومرايات الداتابيز، وتجارب الـ AI مستحيل يختلطوا؟ 🧼🚪</title><link>https://ash2osh.github.io/arabic-blog/posts/011_the-cleanroom-split-why-your-code-mirror-and-ai-staging-must-never-mix/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/011_the-cleanroom-split-why-your-code-mirror-and-ai-staging-must-never-mix/</guid><description>الجزء الخامس من سلسلة &quot;مطور APEX المدعوم بالذكاء الاصطناعي&quot;. معمارية الفولدرات الأربعة المعقمة اللي بتحمي سورس كودك وداتابيز الإنتاج من شطحات الـ AI Agents!</description><pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-cleanroom-split-why-your-code-mirror-and-ai-staging-must-never-mix&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;عزل-المعمل-النظيف-ليه-سورس-كودك-ومرايات-الداتابيز-وتجارب-الـ-ai-مستحيل-يختلطوا-&quot;&gt;عزل المعمل النظيف: ليه سورس كودك، ومرايات الداتابيز، وتجارب الـ AI مستحيل يختلطوا؟ 🧼🚪&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الخامس من سلسلة “مطور APEX المدعوم بالذكاء الاصطناعي”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;في أوض العمليات الجراحية، الدكاترة بيلتزموا بمناطق تعقيم صارمة جداً: الإيد اللي مش متعقمة مستحيل تلمس أدوات الجراحة، المشرط المعقم بيفضل متغطي على الصينية، والشاش المستخدم بيترمي فوراً في صندوق النفايات الطبية للمحرقة.&lt;/p&gt;
&lt;p&gt;لما تيجي تبرمج مع وكلاء البرمجة بالذكاء الاصطناعي، أنت محتاج نفس الانضباط الفيزيائي الصارم ده بالمللي. لو رميت كل ملفات التطبيق، وملفات سحب الـ DDL، وسكربتات الـ AI الجديدة في فولدر واحد عايم، الـ Agent عاجلاً أو آجلاً هيدخل يعدل في ملفات المراية بإيده، أو يعيد كتابة سكربتات migrations قديمة، أو يرفع ملفات تجارب عشوائية على الـ Git!&lt;/p&gt;
&lt;p&gt;بتطبيق &lt;strong&gt;معمارية المعمل النظيف ذات الـ 4 مناطق&lt;/strong&gt;، بتبني حائط صد فيزيائي لا يمكن اختراقه بين سورس كود التطبيق الحي، ومرايات الداتابيز المخصصة للقراءة فقط، وحجرات تجارب الـ AI المعزولة للمراجعة البشرية.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-كابوس-الفولدر-المفتوح-على-البحري-the-flat-directory&quot;&gt;🏥 كابوس الفولدر المفتوح على البحري (The Flat Directory)&lt;/h2&gt;
&lt;p&gt;كل مطور اشتغل مع مساعد ذكي ذاتي التوجيه في مشروع ملوش حدود فيزيائية واضحة عاش لحظة “العرق الساقع” دي:&lt;/p&gt;
&lt;p&gt;أنت بتطلب من الوكيل الذكي (الـ Agent) الآتي:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“محتاجين نضيف عمود &lt;code&gt;MIDDLE_NAME&lt;/code&gt; في جدول &lt;code&gt;CUSTOMERS&lt;/code&gt;، ونحدث شاشة تعديل بيانات العميل.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;الـ Agent يرد بكل نشاط وحماس:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“كله تمام يا باشا! حدثت لك تعريفات الداتابيز بالكامل!”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;تفتح الـ Git Diff وأنت متوقع تشوف سكربت Migration جديد وشيك، فتتصدم بالمشهد العبثي:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;تشويه المراية (Mirror Mutation)&lt;/strong&gt;: الـ Agent فتح ملف &lt;code&gt;database/tables/CUSTOMERS.sql&lt;/code&gt;—اللي المفروض يكون نسخة قراءة فقط جاية طازة من &lt;code&gt;DBMS_METADATA&lt;/code&gt;—ودخل كتب العمود الجديد بإيده جوه الملف! الداتابيز الحقيقية محدش لمسها، بس الـ Git دلوقتي بيدعي إن الجدول اتخلق بالعمود ده من أول يوم في التاريخ!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تعديل السكربتات التاريخية القديمة&lt;/strong&gt;: أو الأسوأ من كده: الـ Agent لقى ملف &lt;code&gt;migrations/001_initial_schema.sql&lt;/code&gt; معمول من سنتين، فدخل عدل فيه وحط العمود الجديد هناك، وبوظ كل سجلات تتبع الـ Deployments!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تلوث المستودع بالكراكيب&lt;/strong&gt;: الفولدر الرئيسي بقى ماليان ملفات تجارب عشوائية زي &lt;code&gt;test_query.sql&lt;/code&gt; و &lt;code&gt;temp_output.json&lt;/code&gt; وسكربتات بايثون مكسورة رماها الـ Agent وهو شغال.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ليه ده بيحصل؟ لأن &lt;strong&gt;نماذج الذكاء الاصطناعي مبيفهموش الحدود غير المرئية&lt;/strong&gt;. لو الملف موجود في الفولدر والـ Agent معاه صلاحية كتابة، هيعتبره سورس كود يقدر يعدل فيه براحته!&lt;/p&gt;
&lt;p&gt;عشان كده إحنا مبنعتمدش على التنبيهات الضعيفة في الـ Prompt زي &lt;em&gt;“أرجوك متعدلش في فولدر المراية”&lt;/em&gt;. إحنا بنفرض &lt;strong&gt;حدود فيزيائية للمعمل النظيف&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-معمارية-المعمل-النظيف-ذات-الـ-4-فولدرات-cleanroom-architecture&quot;&gt;🚪 معمارية المعمل النظيف ذات الـ 4 فولدرات (Cleanroom Architecture)&lt;/h2&gt;
&lt;p&gt;سواء بتدير تطبيق أبيكس صغير أو نظام مؤسسي عملاق، تقسيم المستودع لـ 4 مناطق فيزيائية مستقلة بيضمنلك الأمان والراحة التامة:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;my-apex-project/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── apps/&amp;lt;schema&amp;gt;/&amp;lt;app-id&amp;gt;/         ← ✏️ المنطقة 1: سورس كود شاشات أبيكس الحية (.apx)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── database/&amp;lt;schema&amp;gt;/              ← 🪞 المنطقة 2: فاترينة المراية (للقراءة فقط من DBMS_METADATA)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── ai_generate/YYYY-MM-DD/         ← 🚀 المنطقة 3: غرفة العزل ومطبخ السكربتات للمراجعة البشرية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── scratch/                        ← 🗑️ المنطقة 4: سلة التجارب المؤقتة (مهملة في الـ Git)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;تعالوا نعمل جولة سريعة جوه كل منطقة ونشوف إزاي بتحمي شغلك.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;المنطقة-1-apps-ورشة-العمل-الحية&quot;&gt;المنطقة 1: &lt;code&gt;apps/&lt;/code&gt; (ورشة العمل الحية)&lt;/h3&gt;
&lt;p&gt;ده المكان اللي بيعيش فيه سورس كود شاشات تطبيق أبيكس.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;إيه اللي موجود هنا&lt;/strong&gt;: ملفات لغة APEXlang (&lt;code&gt;.apx&lt;/code&gt;) المقسمة، ومكونات الـ Shared Components، والقوائم، وإعدادات التطبيق.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;مين اللي بيعدل هنا&lt;/strong&gt;: أنت والـ AI بتعدلوا هنا مباشرة لما تبنوا صفحات جديدة أو تعدلوا في شاشات موجودة.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ليه المكان ده آمن&lt;/strong&gt;: لأن كل صفحة معزولة تماماً في ملفها المستقل (زي &lt;code&gt;page_00012.apx&lt;/code&gt;)، فمستحيل تعديل صفحة 12 يخبط بالخطأ في صفحة 40!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;المنطقة-2-database-المراية-المحرمة-للعرض-فقط&quot;&gt;المنطقة 2: &lt;code&gt;database/&lt;/code&gt; (المراية المحرمة: للعرض فقط!)&lt;/h3&gt;
&lt;p&gt;الفولدر ده هو الانعكاس الرقمي الصافي لداتابيز أوراكل الحية.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;إيه اللي موجود هنا&lt;/strong&gt;: سحب كامل ونظيف لتعريفات الجداول، والـ Views، والـ Package Specs، والـ Triggers (مسحوبة عبر &lt;code&gt;DBMS_METADATA&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;القاعدة الحديدية&lt;/strong&gt;: &lt;strong&gt;ممنوع نهائياً على أي إنسان أو AI إنه يعدل ملف جوه &lt;code&gt;database/&lt;/code&gt; بإيده!&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;بيتحدث إزاي&lt;/strong&gt;: بيتحدث &lt;em&gt;فقط وحصرياً&lt;/em&gt; عبر سكربتات التصدير الآلية بعد ما الـ Migrations تتراجع وتتنفذ على الداتابيز الحقيقية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;حماية الحدود&lt;/strong&gt;: حط قاعدة في الـ Git pre-commit hooks ترفض أي تعديل يدوي في الفولدر ده.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;المنطقة-3-ai_generateyyyy-mm-dd-غرفة-العزل-والمراجعة&quot;&gt;المنطقة 3: &lt;code&gt;ai_generate/YYYY-MM-DD/&lt;/code&gt; (غرفة العزل والمراجعة)&lt;/h3&gt;
&lt;p&gt;لما الـ AI ينشئ جدول جديد، أو يكتب سكربت &lt;code&gt;ALTER TABLE&lt;/code&gt;، أو يبرمج Package Body جديدة، &lt;strong&gt;يحط الملفات فين؟&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ممنوع يرميها على الداتابيز مباشرة، وممنوع يقرب من فولدر المراية &lt;code&gt;database/&lt;/code&gt;. بيكتبها جوه فولدر عزل مؤرخ باليوم:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ai_generate/2026-09-05/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── 01_add_middle_name_to_customers.sql&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── 02_pkg_customer_api_body.sql&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── deployment_manifest.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;ليه-غرفة-العزل-دي-فكرة-عبقرية&quot;&gt;ليه غرفة العزل دي فكرة عبقرية؟&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;مراجعة بشرية مع كوباية الشاي&lt;/strong&gt;: تقدر تفحص كود الـ SQL سطر سطر قبل ما يتنفذ على الداتابيز.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;سجل تدقيق تاريخي لا يتغير&lt;/strong&gt;: لو بعد 3 شهور حد سأل “هو العمود ده اتضاف ليه ومين اللي عمله؟”، تلاقي السكربت والملف بتاريخه المحفوظ في الـ Git.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تراجع بدون أي خساير (Effortless Rollback)&lt;/strong&gt;: لو جربت فكرة ومطلعتش حلوة، امسح فولدر &lt;code&gt;ai_generate/2026-09-05/&lt;/code&gt; في ثانية، وكود مشروعك الأصلي يفضل نظيف 100%!&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;المنطقة-4-scratch-سلة-التجارب-المؤقتة&quot;&gt;المنطقة 4: &lt;code&gt;scratch/&lt;/code&gt; (سلة التجارب المؤقتة)&lt;/h3&gt;
&lt;p&gt;كل مطور وكل AI Agent محتاج مكتب متكركب يجرب فيه تعبيرات الـ Regex، ويرمي فيه ردود JSON مؤقتة من APIs، أو يجرب سكربتات سريعة.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;إيه اللي هنا&lt;/strong&gt;: ملفات تجارب عشوائية، لوجات مؤقتة، ومخرجات جراف تمهيدية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;حالتها في الـ Git&lt;/strong&gt;: &lt;strong&gt;معمولها Gitignore بنسبة 100%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;القاعدة الذهبية&lt;/strong&gt;: أي حاجة جوه &lt;code&gt;scratch/&lt;/code&gt; تقدر تدلتها في أي لحظة من غير ما تقلق على مشروعك.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-دورة-حياة-الميزة-خطوة-بخطوة&quot;&gt;🔄 دورة حياة الميزة خطوة بخطوة&lt;/h2&gt;
&lt;p&gt;تعالوا نشوف إزاي التقسيم ده بيحول مهمة تطوير بالذكاء الاصطناعي من مخاطرة مرعبة لـ Pipeline هندسي محكم:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    autonumber&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    actor&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Dev&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; المطور البشري&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    participant&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Agent&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; الـ AI Coding Agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    participant&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Stage&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ai_generate/YYYY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;-MM-DD/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    participant&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; DB&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; داتابيز أوراكل&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    participant&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Mirror&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; database/&amp;lt;schema&amp;gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Dev&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Agent&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;ضيف عمود LOYALTY_POINTS لجدول CUSTOMERS&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Agent&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Stage&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; بيكتب سكربت 01_alter_customers.sql&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Dev&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Stage&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; بيراجع كود الـ SQL ويوافق عليه&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Dev&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;DB&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; بينفذ السكربت عبر SQLcl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Dev&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Mirror&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; بيشغل سكربت المزامنة التلقائية&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    Mirror&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Dev&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; تحديث database/customers.sql بملف DDL طازة&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;الطلب&lt;/strong&gt;: طلبت من الـ AI إضافة عمود وتحديث شاشة العميل.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الكتابة في غرفة العزل&lt;/strong&gt;: الـ Agent بيكتب السكربت في &lt;code&gt;ai_generate/2026-09-05/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;المراجعة البشرية&lt;/strong&gt;: أنت بتراجع الكود، وتتأكد من الـ Data Types والـ Constraints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التنفيذ&lt;/strong&gt;: بتنفذ السكربت على داتابيز التطوير باستخدام SQLcl وحراس الأمان.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;مزامنة المراية&lt;/strong&gt;: سكربت التصدير الآلي بيشتغل ويسحب ميتاداتا الجدول الجديد في &lt;code&gt;database/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الـ Git Commit&lt;/strong&gt;: بترفع التعديل المعتمد والمراية المحدثة في كوميت واحدة نظيفة ومحترمة.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;صفر كوارث. صفر تضارب في الداتابيز. وصفر تهييس من الـ AI يلمس الـ Production!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-إزاي-تطبق-المعمل-النظيف-في-أي-مشروع&quot;&gt;🛡️ إزاي تطبق المعمل النظيف في أي مشروع؟&lt;/h2&gt;
&lt;p&gt;مش محتاج أدوات مدفوعة نهائياً:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;أنشئ الفولدرات الأربعة&lt;/strong&gt;: &lt;code&gt;apps/&lt;/code&gt;، و &lt;code&gt;database/&lt;/code&gt;، و &lt;code&gt;ai_generate/&lt;/code&gt;، و &lt;code&gt;scratch/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ظبط ملف &lt;code&gt;.gitignore&lt;/code&gt;&lt;/strong&gt;: ضيف &lt;code&gt;/scratch/&lt;/code&gt; وأي ملفات أسرار محلية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;عرف وصايا الـ Agent بوضوح&lt;/strong&gt;: جوه ملف القواعد (مثل &lt;code&gt;AGENTS.md&lt;/code&gt; أو &lt;code&gt;.cursorrules&lt;/code&gt;) كالآتي:
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“ممنوع تماماً تعديل أي ملف جوه &lt;code&gt;database/&lt;/code&gt;.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“كل سكربتات الـ SQL والـ Migrations الجديدة تتكتب حصراً في &lt;code&gt;ai_generate/&amp;lt;YYYY-MM-DD&amp;gt;/&lt;/code&gt;.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“تعديلات الشاشات تكون جوه فولدر &lt;code&gt;apps/&lt;/code&gt; فقط.”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;h3 id=&quot;-عايز-مشروع-متظبط-وجاهز-بالمعمل-النظيف&quot;&gt;📦 عايز مشروع متظبط وجاهز بالمعمل النظيف؟&lt;/h3&gt;
&lt;p&gt;مستودع &lt;a href=&quot;https://github.com/ash2osh/APEX_PROJECT_TEMPLATE&quot;&gt;APEX Project Template&lt;/a&gt; المفتوح المصدر بيجي ومعاه المعمل النظيف ده متظبط بالكامل بسكربتات المزامنة وقواعد الـ Agents. تقدر تستخدمه فوراً وتبني عليه بثقة تامة!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-الجزء-السادس&quot;&gt;🚀 إيه اللي مستنينا في الجزء السادس؟&lt;/h2&gt;
&lt;p&gt;دلوقتي بعد ما قفلنا حدود المشروع الفيزيائية، بنقابل مشكلة تانية مشهورة جداً في الشغل مع الذكاء الاصطناعي: &lt;strong&gt;زهايمر الـ LLM&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;كل ما تفتح شات جديد، الـ AI بينسى أسماء الـ Schemas، وتسمية المتغيرات، ورقم التطبيق اللي شغالين عليه!&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء السادس (“جلسة التعارف: منح الـ AI ذاكرة دائمة بفولدر app_context/”)&lt;/strong&gt;، هنشوف إزاي ملفات السياق الموجهة وأمر التهيئة &lt;code&gt;/init&lt;/code&gt; بيمحوا الزهايمر ده للأبد!&lt;/p&gt;
&lt;p&gt;استنونا في الجزء السادس! 📓✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>مطور أبيكس المعزز بالذكاء الاصطناعي</category><category>oracle-apex</category><category>ai</category><category>architecture</category><category>devops</category><category>git</category><category>arabic</category></item><item><title>سياق بدون هدر: استعلام اعتماديات أبيكس عبر Graphify بدقة جراحية 🎯⚡</title><link>https://ash2osh.github.io/arabic-blog/posts/010_zero-waste-context-querying-apex-dependencies-with-graphify/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/010_zero-waste-context-querying-apex-dependencies-with-graphify/</guid><description>الجزء الرابع من سلسلة &quot;مطور APEX المدعوم بالذكاء الاصطناعي&quot;. إزاي تسحب سياق من 10 Nodes بس في 25 ميلي ثانية، وتوفر 97% من التوكنز وتقضي على أوهام الـ AI!</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/zero-waste-context-querying-apex-dependencies-with-graphify&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;سياق-بدون-هدر-استعلام-اعتماديات-أبيكس-عبر-graphify-بدقة-جراحية-&quot;&gt;سياق بدون هدر: استعلام اعتماديات أبيكس عبر Graphify بدقة جراحية 🎯⚡&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الرابع من سلسلة “مطور APEX المدعوم بالذكاء الاصطناعي”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;لما تروح مكتبة أبحاث جامعية عشان تدور على مرجع عن الفخار الروماني، أنت أكيد مش عايز أمين المكتبة يزق لك 20 ترولي تقيل عليهم 500 كتاب ويدلقهم فوق مكتبك! أنت عايز كارت الفهرس الصغير اللي يقولك: &lt;em&gt;“الممر رقم 4، الرف ب، الكتاب رقم 12”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;البرمجة مع الذكاء الاصطناعي نفس الشيء بالظبط: إنك تسحب فولدرات كاملة أو نصوص Packages عملاقة في شات الـ AI، ده المقابل الرقمي لدلق 20 ترولي كتب على مكتبك. بيكركب ذاكرة النموذج، وينفخ فاتورة التوكنز، وبيطلع أخطاء كارثية وغير متوقعة.&lt;/p&gt;
&lt;p&gt;باستخدام أداة &lt;strong&gt;Graphify&lt;/strong&gt; (أو أي أداة استعلام جراف بنيتها لمشروعك)، الـ Agent بيسأل الجراف المعماري مباشرة—ويسحب الـ 10 نودز (Nodes) اللي محتاجهم بالمللي في أقل من 25 ميلي ثانية. هنا هنشوف إزاي هندسة السياق بدون هدر (Zero-Waste Context) بتشتغل على أرض الواقع.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-ورطة-ترولي-الكتب-التكلفة-الحقيقية-للبحث-العشوائي-بالـ-grep&quot;&gt;📚 ورطة ترولي الكتب: التكلفة الحقيقية للبحث العشوائي بالـ Grep&lt;/h2&gt;
&lt;p&gt;تعالوا نشوف إيه اللي بيحصل في جلسة برمجة عادية مع الـ AI من غير Knowledge Graph بالتفصيل:&lt;/p&gt;
&lt;p&gt;أنت بتسأل الـ AI بتاعك:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“لما العميل يدوس على زرار ‘تأكيد الطلب’ في صفحة 12، كود الخصم بيتراجع فين، وأنهي جداول بتتعدل بالظبط؟”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;شوف بقى الـ AI وهو بيغرق في شبر مية:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;البحث الهمجي بالـ Grep&lt;/strong&gt;: الـ Agent يشغل أمر &lt;code&gt;grep -rn &quot;DISCOUNT&quot; .&lt;/code&gt; على المستودع كله من أوله لآخره.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;كومة القش من النتائج الكاذبة (False Positives)&lt;/strong&gt;: يلاقي 142 سطر متفرقين في 28 ملف: سكربتات قديمة اتلغت، كومنتات من 3 سنين، ملفات تيست، وجداول فواتير ملهاش علاقة بالموضوع!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;دلق التوكنز في الشات&lt;/strong&gt;: يسحب 10 ملفات من دول في الـ Context Window، ويحرق &lt;strong&gt;35,000 توكن&lt;/strong&gt; قبل ما يكتب سطر كود واحد!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;استنتاج وهمي وهبد صريح&lt;/strong&gt;: من كتر الكومنتات القديمة والدوشة، الموديل يفترض بالغلط إن الخصم بيتحسب بكود جافاسكريبت على المتصفح، ويفوت تماماً الـ Package الحقيقية في الداتابيز!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;تعالوا نقارن ده بـ Agent معاه أدوات استعلام الجراف:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;graphify&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;BTN_SUBMIT_ORDER&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;ORDERS&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;في &lt;strong&gt;18 ميلي ثانية بس&lt;/strong&gt;، الجراف بيرد عليه:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;مسار مؤكد (4 خطوات):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[زرار: BTN_SUBMIT_ORDER]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  └── triggers ──&amp;gt; [Process: PROC_SAVE_ORDER]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        └── calls ──&amp;gt; [Package: PKG_CHECKOUT.PROCESS_ORDER]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              └── writes ──&amp;gt; [جدول: ORDERS]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;الـ Agent دلوقتي معاه &lt;strong&gt;حقيقة هندسية مؤكدة 100%&lt;/strong&gt; في &lt;strong&gt;42 توكن بس&lt;/strong&gt;! مفيش رغي، مفيش نتائج مزيفة، وصفر تخمين.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الأنماط-التلاتة-الأساسية-لاستعلام-الجراف&quot;&gt;🎯 الأنماط التلاتة الأساسية لاستعلام الجراف&lt;/h2&gt;
&lt;p&gt;أثناء بناء وتعديل تطبيقات Oracle APEX، وكيل البرمجة بالذكاء الاصطناعي بيحتاج 3 أنواع رئيسية من الرؤية المعمارية:&lt;/p&gt;
&lt;h3 id=&quot;1-استكشاف-الجيران-المحيطين-graphify-query&quot;&gt;1. استكشاف الجيران المحيطين (&lt;code&gt;graphify query&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;لما الـ Agent يطلب منه تعديل صفحة معينة، مش محتاج يعرف أي حاجة عن الـ 79 صفحة التانيين. هو محتاج بس يفهم المكونات المباشرة اللي عايشة في نفس الصفحة:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;graphify&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; query&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Page_12&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --depth&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;النتيجة:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- Page_12 (صفحة: &quot;Order Checkout&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ├── Region_CustomerInfo (منطقة)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  │   ├── P12_CUSTOMER_NAME (حقل نص)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  │   └── P12_CUSTOMER_EMAIL (حقل إيميل)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  └── Region_CartSummary (منطقة)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ├── P12_CART_TOTAL (حقل رقم)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ├── BTN_APPLY_DISCOUNT (زرار) ──[TRIGGERS]──&amp;gt; PROC_APPLY_PROMO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      └── BTN_SUBMIT_ORDER (زرار)   ──[TRIGGERS]──&amp;gt; PROC_SAVE_ORDER&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;في أقل من 80 توكن، الـ Agent عرف:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;المناطق (Regions) اللي موجودة في الصفحة.&lt;/li&gt;
&lt;li&gt;الحقول التابعة لكل منطقة.&lt;/li&gt;
&lt;li&gt;الزراير والـ Processes المرتبطة بيها.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-تتبع-مسار-تدفق-البيانات-graphify-path&quot;&gt;2. تتبع مسار تدفق البيانات (&lt;code&gt;graphify path&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;في أنظمة أبيكس للمؤسسات، دوسة الزرار بتشغل Process، والـ Process بتنادي Package، والـ Package بتكتب في جدول داتابيز.&lt;/p&gt;
&lt;p&gt;عشان تعرف الداتا بتسافر إزاي من شاشة المتصفح لحد قرص التخزين، أمر &lt;code&gt;graphify path&lt;/code&gt; بيكشف لك مسار السلسلة بالكامل:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;graphify&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;BTN_APPLY_DISCOUNT&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;DISCOUNT_LOGS&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;المسار بالكامل:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[BTN_APPLY_DISCOUNT] &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ──[TRIGGERS]──&amp;gt; [PROC_APPLY_PROMO] &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ──[CALLS]──&amp;gt; [PKG_PROMO.VALIDATE_CODE] &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ──[WRITES]──&amp;gt; [DISCOUNT_LOGS]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;الـ Agent بيشوف فوراً إن &lt;code&gt;PKG_PROMO.VALIDATE_CODE&lt;/code&gt; بتسجل محاولات الخصم في جدول &lt;code&gt;DISCOUNT_LOGS&lt;/code&gt;. مش محتاج يخمن ولا يسألك اللوجات دي بتروح فين.&lt;/p&gt;
&lt;h3 id=&quot;3-تحليل-نطاق-التأثير-والتوابع-graphify-callers&quot;&gt;3. تحليل نطاق التأثير والتوابع (&lt;code&gt;graphify callers&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;أرعب لحظة في شغل قواعد البيانات هي لما تيجي تعدل جدول مشترك أو تغير باراميتر في Package شغالة في كل حتة:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“لو عدلت شكل دالة&lt;/em&gt; &lt;code&gt;PKG_CUSTOMER_API.GET_BALANCE&lt;/code&gt;&lt;em&gt;، إيه اللي هيفرقع في وشنا؟”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;من غير جراف، يا إما هتقعد تشغل كويريهات معقدة على جدول &lt;code&gt;ALL_DEPENDENCIES&lt;/code&gt;، أو تدعي ربنا إن مفيش شاشة تبوظ في الـ Production! مع Graphify، الـ Agent بيكتب سطر واحد:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;graphify&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; callers&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;PKG_CUSTOMER_API.GET_BALANCE&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;الشاشات والبرامج اللي بتنادي PKG_CUSTOMER_API.GET_BALANCE:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── صفحة 04 (لوحة تحكم العميل) ──&amp;gt; Region_BalanceSummary&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── صفحة 12 (شاشة الشراء)       ──&amp;gt; Process_CheckCreditLimit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── باكيدج الفواتير PKG_INVOICING.GENERATE_MONTHLY&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;في ثواني معدودة، الـ Agent بيطلع لك تقرير أثر كامل (Blast Radius Report) وعارف بالظبط إيه الشاشات اللي لازم يختبرها قبل ما يرفع الكود!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-لغة-الأرقام-الحقيقية-بالجراف-ضد-من-غير-جراف&quot;&gt;⚡ لغة الأرقام الحقيقية: بالجراف ضد من غير جراف&lt;/h2&gt;
&lt;p&gt;تعالوا نقارن مهمة تعديل حقيقية تمت بالطريقتين:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المقياس&lt;/th&gt;
&lt;th&gt;البحث النصي الهمجي (Grep)&lt;/th&gt;
&lt;th&gt;الاستعلام الذكي بالجراف&lt;/th&gt;
&lt;th&gt;الفرق&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;الملفات المسحوبة في الـ Prompt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8 – 15 ملف كاملين&lt;/td&gt;
&lt;td&gt;ملف واحد مستهدف + كود الجراف&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85% ملفات أقل&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;التوكنز المستهلكة&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;28,000 – 45,000 توكن&lt;/td&gt;
&lt;td&gt;650 – 1,200 توكن&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;توفير 97% من التوكنز&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;وقت التنفيذ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;35 – 50 ثانية انتظار&lt;/td&gt;
&lt;td&gt;3 – 5 ثواني بس&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;أسرع 10 مرات&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;دقة الكود المقترح&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~65% (أسماء أعمدة وهمية)&lt;/td&gt;
&lt;td&gt;~98% (علاقات AST موثقة)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;كود جاهز للـ Production&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-إزاي-تضيف-استعلام-الجراف-لدورة-شغلك&quot;&gt;🛠️ إزاي تضيف استعلام الجراف لدورة شغلك؟&lt;/h2&gt;
&lt;p&gt;تقدر تبدأ تطبق الفكر ده في أي مشروع:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;أداة CLI خفيفة بلغة Python&lt;/strong&gt;: سكربت صغير (~60 سطر) بيحمل جراف الـ AST ويوفر أوامر سريعة في التيرمينال: &lt;code&gt;--query&lt;/code&gt; و &lt;code&gt;--path&lt;/code&gt; و &lt;code&gt;--callers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تسجيلها كـ Agent Tools&lt;/strong&gt;: في أدوات الـ AI الحديثة (Cursor, Antigravity, MCP Servers)، سجل الأوامر دي كـ أدوات يقدر الـ Agent يناديها تلقائياً بدل ما يقرأ الملفات عمال على بطال.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تثبيت سقف التوكنز تحت 1000 توكن&lt;/strong&gt;: علم الـ Agent بتاعك يسأل الجراف الأول عشان يحدد الملفات اللي محتاجها بالظبط قبل ما يسحب أي كود.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;h3 id=&quot;-عايز-أدوات-الجراف-جاهزة-للاستخدام&quot;&gt;📦 عايز أدوات الجراف جاهزة للاستخدام؟&lt;/h3&gt;
&lt;p&gt;مستودع &lt;a href=&quot;https://github.com/ash2osh/APEX_PROJECT_TEMPLATE&quot;&gt;APEX Project Template&lt;/a&gt; بيجي ومعاه تكامل &lt;strong&gt;Graphify&lt;/strong&gt; جاهز بالاختصارات وتعليمات الـ Agents. تقدر تاخد السكربتات وتطبقها في مشروعك الحالي فوراً!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-الجزء-الخامس&quot;&gt;🚀 إيه اللي مستنينا في الجزء الخامس؟&lt;/h2&gt;
&lt;p&gt;دلوقتي بعد ما الـ Agent بتاعنا بقى يقدر يتنقل بين اعتماديات التطبيق بدقة جراحية، بيظهر سؤال أمان في غاية الأهمية:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;هو الـ AI مسموح له يكتب كود فين، وممنوع يقرب من إيه؟&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;لو سبت الـ AI في فولدر عايم من غير حواجز أمان، ممكن بحسن نية يمسح ملفات الـ DDL النظيفة، أو يعدل في سكربتات migrations قديمة، أو يرفع ملفات تجارب في الـ Git.&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الخامس (“عزل المعمل النظيف: ليه سورس كودك، ومرايات الداتابيز، وتجارب الـ AI مستحيل يختلطوا؟”)&lt;/strong&gt;، هنتعرف على &lt;strong&gt;حدود الفولدرات الأربعة المعقمة&lt;/strong&gt; اللي بتحافظ على داتابيز الـ Production بتاعتك آمنة وبتخليك تشتغل بقمة راحة البال!&lt;/p&gt;
&lt;p&gt;استنونا في الجزء الخامس! 🧼✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>مطور أبيكس المعزز بالذكاء الاصطناعي</category><category>oracle-apex</category><category>ai</category><category>graphify</category><category>prompt-engineering</category><category>database</category><category>arabic</category></item><item><title>رسم ناطحة السحاب: بناء الـ AST Knowledge Graph لأوراكل أبيكس 🗺️🏗️</title><link>https://ash2osh.github.io/arabic-blog/posts/009_graphing-the-skyscraper-building-an-ast-knowledge-graph-for-apex/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/009_graphing-the-skyscraper-building-an-ast-knowledge-graph-for-apex/</guid><description>الجزء الثالث من سلسلة &quot;مطور APEX المدعوم بالذكاء الاصطناعي&quot;. إزاي تحول شاشات التطبيق لشبكة معرفية هندسية ثلاثية الأبعاد تربط الزرار بالداتابيز في أجزاء من الثانية!</description><pubDate>Tue, 08 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/graphing-the-skyscraper-building-an-ast-knowledge-graph-for-apex&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;رسم-ناطحة-السحاب-بناء-الـ-ast-knowledge-graph-لأوراكل-أبيكس-️️&quot;&gt;رسم ناطحة السحاب: بناء الـ AST Knowledge Graph لأوراكل أبيكس 🗺️🏗️&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الثالث من سلسلة “مطور APEX المدعوم بالذكاء الاصطناعي”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;إنك تسيب AI Coding Agent في فولدر فيه 50 ملف وتقوله “حل لي المشكلة المعقدة دي”، ده بالظبط زي ما تنزل سائح في وسط طوكيو وتديله دليل مطبوع فيه أسامي الشوارع مترتبة أبجدياً بس من غير خريطة!&lt;/p&gt;
&lt;p&gt;بتحليل ملفات APEX وتحويلها لـ &lt;strong&gt;شجرة نحو تجريدية (AST)&lt;/strong&gt; ورفعها على &lt;strong&gt;Knowledge Graph&lt;/strong&gt; معماري، بتدي للـ Agent بتاعك ماكيت هندسي ثلاثي الأبعاد للمشروع كله.&lt;/p&gt;
&lt;p&gt;بدل ما يقعد يخمن العلاقات بالبحث النصي العشوائي، الـ Agent بيقدر يتتبع المسار الدقيق بالمللي: من دوسة الزرار في صفحة 12 لحد جداول الداتابيز اللي بتتقري وتتعدل في الخلفية!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-خريطة-الـ-gps-ضد-دليل-أسامي-الشوارع-المطبوع&quot;&gt;🗺️ خريطة الـ GPS ضد دليل أسامي الشوارع المطبوع&lt;/h2&gt;
&lt;p&gt;تخيل إنك سايق رايح مستشفى في مدينة أول مرة في حياتك تزورها:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;طريقة الدليل الأبجدي&lt;/strong&gt;: تطلع كتاب تليفونات فيه 5000 اسم شارع مترتبين من الألف للياء. أنت عارف إن المستشفى في “شارع النخيل”، بس مضطر تقلب في كل الشوارع عشان تخمن أنهي شارع بيوصل له، وأنهي كوبري بيعدي النيل، والشوارع دي اتجاه واحد ولا اتنين!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;طريقة خريطة الـ GPS&lt;/strong&gt;: تبص في شاشة الملاحة. بتشوف فوراً مكانك الحالي، والملفات اللي هتدخلها بالترتيب، والكباري، ودبوس المستشفى منور بالأحمر على الخريطة في ثواني!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;لما مساعدي الذكاء الاصطناعي يعتمدوا بس على البحث النصي العادي (&lt;code&gt;grep&lt;/code&gt;) أو الـ Vector Embeddings العامة (RAG)، بيكونوا زي السائح التايه في شوارع طوكيو بالظبط.&lt;/p&gt;
&lt;p&gt;لو سألته: &lt;em&gt;“لما اليوزر يدوس على زرار ‘اعتماد استرجاع الفلوس’ (Approve Refund)، أنهي جداول بتتعدل؟”&lt;/em&gt;، البحث النصي هيدور على كلمة &lt;code&gt;&quot;REFUND&quot;&lt;/code&gt;. هيرجع لك 85 نتيجة ملهاش أي علاقة بالموضوع من ملفات قديمة وكومنتات ولوجات—وهيحرق رصيدك في التوكنز ويهبد علاقات مش موجودة!&lt;/p&gt;
&lt;p&gt;عشان نخلي الـ AI يشتغل بدقة جراحية في مشروعات Oracle APEX، محتاجين &lt;strong&gt;خريطة معمارية صريحة (Explicit Structural Topology)&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-يعني-إيه-شجرة-نحو-تجريدية-abstract-syntax-tree---ast&quot;&gt;🌳 يعني إيه شجرة نحو تجريدية (Abstract Syntax Tree - AST)؟&lt;/h2&gt;
&lt;p&gt;قبل ما نبني الجراف، لازم نفهم الكمبيوتر بيقرا الكود إزاي.&lt;/p&gt;
&lt;p&gt;أنت كإنسان لما بتبص على الكود بتشوف كلام وجمل. لكن الكومبيلر والمحلل (Parser) لما بيقرأ الكود، بيفككه لشجرة هرمية اسمها &lt;strong&gt;Abstract Syntax Tree (AST)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;تخيل تطبيق Oracle APEX كأنه شجرة ضخمة متفرعة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;جذع الشجرة (Trunk)&lt;/strong&gt;: التطبيق نفسه (App ID، اسمه، نظام الأمان).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الفروع الكبيرة&lt;/strong&gt;: الصفحات (صفحة 1، صفحة 12، صفحة 40).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الفروع الصغيرة&lt;/strong&gt;: المناطق (Regions) جوه كل صفحة (Grids، Forms، شاشات ثابتة).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الأوراق الخضراء&lt;/strong&gt;: العناصر المنفردة (&lt;code&gt;P12_EMAIL&lt;/code&gt;)، والزراير (&lt;code&gt;BTN_SUBMIT&lt;/code&gt;)، والـ Processes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;فروع اللبلاب المتسلقة&lt;/strong&gt;: الـ Dynamic Actions ونداءات الـ PL/SQL Packages اللي بتربط عناصر الشاشة بجداول الداتابيز الحقيقية.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;graph&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    APP&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;تطبيق 100: إدارة الطلبات&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; P12&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;صفحة 12: شاشة الدفع&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    P12 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; R1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Region: بيانات العميل&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    P12 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; R2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Region: ملخص الأوردر&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    R1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; I1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Item: P12_CUSTOMER_NAME&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    R1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; I2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Item: P12_EMAIL&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    R2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; B1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Button: BTN_SUBMIT_ORDER&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    B1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;triggers&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; PR1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Process: تنفيذ عملية الدفع&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    PR1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;calls&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; PKG&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Package: PKG_CHECKOUT.PROCESS_ORDER&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    PKG &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;writes&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; T1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;جدول: ORDERS&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    PKG &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;writes&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; T2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;جدول: ORDER_ITEMS&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    PKG &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;reads&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; T3&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;[(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;جدول: CUSTOMERS&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;شايف الجمال؟ ده مش مجرد لستة ملفات مرصوصة—دي &lt;strong&gt;شبكة علاقات واعتماديات موجهة (Directed Dependency Graph)&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;أول ما التطبيق يتحول لـ Nodes وأسهم (Edges)، الـ AI مستحيل يخمن إيه اللي بيحصل لما &lt;code&gt;BTN_SUBMIT_ORDER&lt;/code&gt; يتداس عليه—هيمشي ورا السهم مباشرة لـ &lt;code&gt;PKG_CHECKOUT&lt;/code&gt; ويعرف في ثانية إن جدولي &lt;code&gt;ORDERS&lt;/code&gt; و &lt;code&gt;ORDER_ITEMS&lt;/code&gt; هما اللي بيتعدلوا!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-تشريح-الـ-apex-knowledge-graph-من-جوه&quot;&gt;⚙️ تشريح الـ APEX Knowledge Graph من جوه&lt;/h2&gt;
&lt;p&gt;الجراف ده متكون من إيه بالظبط؟ بيتكون من عناصر معمارية واضحة ومحددة:&lt;/p&gt;
&lt;h3 id=&quot;1-الـ-nodes-الأساسية&quot;&gt;1. الـ Nodes الأساسية&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Page&lt;/code&gt;: شاشات التطبيق الرئيسية (&lt;code&gt;Page_12&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Region&lt;/code&gt;: المناطق الهيكلية جوه الصفحة (&lt;code&gt;Region_OrderSummary&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Item&lt;/code&gt;: الحقول والمدخلات والمتغيرات (&lt;code&gt;P12_DISCOUNT_CODE&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Button&lt;/code&gt;: زراير التفاعل (&lt;code&gt;BTN_APPLY_DISCOUNT&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Process&lt;/code&gt; / &lt;code&gt;DynamicAction&lt;/code&gt;: لوجيك التطبيق ومعالجة الأحداث.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Package&lt;/code&gt; / &lt;code&gt;Procedure&lt;/code&gt;: دوال وإجراءات الـ PL/SQL في الداتابيز.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Table&lt;/code&gt; / &lt;code&gt;View&lt;/code&gt;: جداول ومخازن البيانات (&lt;code&gt;ORDERS&lt;/code&gt;, &lt;code&gt;CUSTOMERS_V&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-الأسهم-والعلاقات-directed-edges&quot;&gt;2. الأسهم والعلاقات (Directed Edges)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[Region] --CONTAINS--&amp;gt; [Item]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[Button] --TRIGGERS--&amp;gt; [Process]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[Process] --CALLS--&amp;gt; [Package]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[Package] --READS--&amp;gt; [Table]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[Package] --WRITES--&amp;gt; [Table]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;لما تبني الجراف ده، إجابة سؤال معقد زي: &lt;em&gt;“لو ضفنا عمود جديد في جدول CUSTOMERS، أنهي صفحات وزراير ممكن تتأثر؟”&lt;/em&gt; بتتحول لعملية بحث سريعة في الجراف بتاخد أجزاء من الثانية!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-إزاي-استخراج-الـ-ast-بيشتغل-عملياً&quot;&gt;🛠️ إزاي استخراج الـ AST بيشتغل عملياً؟&lt;/h2&gt;
&lt;p&gt;إزاي بنحول ملفات APEX للشبكة الذكية دي؟&lt;/p&gt;
&lt;p&gt;المنطق بيتلخص في 3 خطوات بسيطة:&lt;/p&gt;
&lt;h3 id=&quot;الخطوة-1-استخراج-الهيكل-البصري-للشاشة&quot;&gt;الخطوة 1: استخراج الهيكل البصري للشاشة&lt;/h3&gt;
&lt;p&gt;الـ Parser بيمر على ملفات الصفحات ويستخرج الـ Regions والحقول والزراير:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# كود توضيحي لاستخراج مكونات الصفحة&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; extract_page_components&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(page_ast, graph):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    page_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;PAGE_&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;page_ast.number&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    graph.add_node(page_id, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;page&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;page_ast.title)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; region &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; page_ast.regions:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        reg_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;REG_&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;region.name&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        graph.add_node(reg_id, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;region&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;region.title)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        graph.add_edge(page_id, reg_id, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;rel&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;CONTAINS&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; button &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; region.buttons:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            btn_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;BTN_&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;button.name&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            graph.add_node(btn_id, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;button&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;button.label)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            graph.add_edge(reg_id, btn_id, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;rel&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;CONTAINS&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;الخطوة-2-ربط-الأحداث-بالـ-processes&quot;&gt;الخطوة 2: ربط الأحداث بالـ Processes&lt;/h3&gt;
&lt;p&gt;بعد كدة، السكربت بيبص على الزراير ويربطها بالـ Processes اللي بتشغلها:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; proc &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; page_ast.processes:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; proc.when_button_pressed &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; button.name:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                proc_id &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;PROC_&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;proc.name&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                graph.add_node(proc_id, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;process&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;proc.name)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                graph.add_edge(btn_id, proc_id, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;rel&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;TRIGGERS&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;الخطوة-3-فحص-كود-الـ-sql-والـ-plsql-الداخلي&quot;&gt;الخطوة 3: فحص كود الـ SQL والـ PL/SQL الداخلي&lt;/h3&gt;
&lt;p&gt;وأخيراً، السكربت بيفحص الأكواد المكتوبة جوه الـ Processes والـ Packages عشان يستخرج أسماء الجداول والـ Packages المستهدفة:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        # استخراج الجداول اللي بيحصل عليها كتابة (INSERT INTO, UPDATE)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        table_writes &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; find_dml_targets(proc.code)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; table &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; table_writes:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            graph.add_node(table, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;table&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;table)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            graph.add_edge(proc_id, table, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;rel&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;WRITES&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;في ثواني معدودة، تطبيق كامل من 80 صفحة و 200 جدول بيتحول لقاعدة بيانات جراف محلية وخفيفة الوزن جداً!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إزاي-تطبق-ده-في-مشروعك-النهاردة&quot;&gt;💡 إزاي تطبق ده في مشروعك النهاردة؟&lt;/h2&gt;
&lt;p&gt;مش محتاج ميزانيات ضخمة ولا بنية تحتية سحابية معقدة:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ابني بأدوات بسيطة&lt;/strong&gt;: سكربت بايثون صغير بمكتبات زي &lt;code&gt;sqlite3&lt;/code&gt; أو &lt;code&gt;networkx&lt;/code&gt; كفيل إنه يحلل ملفات الصفحات والـ Packages لقائمة علاقات.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;استخدم صيغ جراف خفيفة&lt;/strong&gt;: طلع النتيجة في ملف JSON أو SQLite محلي يقدر الـ AI يستعلم منه بسطور أوامر بسيطة.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;اربطه بالـ Git Hooks&lt;/strong&gt;: خلي السكربت يشتغل أوتوماتيك مع كل تصدير أو commit عشان يفضل الجراف متزامن مع كودك على طول.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;h3 id=&quot;-عايز-توفر-وقتك-وتاخد-الجراف-جاهز&quot;&gt;📦 عايز توفر وقتك وتاخد الجراف جاهز؟&lt;/h3&gt;
&lt;p&gt;مستودع &lt;a href=&quot;https://github.com/ash2osh/APEX_PROJECT_TEMPLATE&quot;&gt;APEX Project Template&lt;/a&gt; بيجي ومعاه سكربت &lt;code&gt;setup_graphify_apx.py&lt;/code&gt; وأداة &lt;strong&gt;Graphify&lt;/strong&gt; جاهزين ومتظبطين بالكامل.
بأمر واحد بس (&lt;code&gt;python scripts/setup_graphify_apx.py&lt;/code&gt;)، بيحول ملفات &lt;code&gt;.apx&lt;/code&gt; وملفات الـ DDL لجراف عالي الأداء!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-الجزء-الرابع&quot;&gt;🚀 إيه اللي مستنينا في الجزء الرابع؟&lt;/h2&gt;
&lt;p&gt;دلوقتي بعد ما رسمنا ناطحة سحاب أبيكس في Knowledge Graph هندسي دقيق، يا ترى الوكيل الذكي بيستخدمه إزاي في جلسات البرمجة الحقيقية؟&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الرابع (“سياق بدون هدر: استعلام اعتماديات أبيكس عبر Graphify”)&lt;/strong&gt;، هنتعرف على أوامر التيرمينال الحقيقية (&lt;code&gt;graphify query&lt;/code&gt; و &lt;code&gt;graphify path&lt;/code&gt;) اللي بتخلي الـ Agent يسحب بس الـ 15 نود اللي محتاجهم—ويوفر 90% من التوكنز ويقضي على التهييس نهائياً!&lt;/p&gt;
&lt;p&gt;استنونا في الجزء الرابع! 🎯✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>مطور أبيكس المعزز بالذكاء الاصطناعي</category><category>oracle-apex</category><category>ai</category><category>ast</category><category>knowledge-graph</category><category>database</category><category>arabic</category></item><item><title>من الكتلة الصماء للتقسيم الذكي: ليه ملفات APEXlang بتغير كل حاجة؟ 📦✨</title><link>https://ash2osh.github.io/arabic-blog/posts/008_from-monolith-to-modular-why-apexlang-files-change-everything/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/008_from-monolith-to-modular-why-apexlang-files-change-everything/</guid><description>الجزء الثاني من سلسلة &quot;مطور APEX المدعوم بالذكاء الاصطناعي&quot;. إزاي تفك ملف f100.sql العملاق لملفات نظيفة ومقروءة للبشر والـ AI وتخلي الـ Git Diffs متعة!</description><pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/from-monolith-to-modular-why-apexlang-files-change-everything&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;من-الكتلة-الصماء-للتقسيم-الذكي-ليه-ملفات-apexlang-بتغير-كل-حاجة-&quot;&gt;من الكتلة الصماء للتقسيم الذكي: ليه ملفات APEXlang بتغير كل حاجة؟ 📦✨&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الثاني من سلسلة “مطور APEX المدعوم بالذكاء الاصطناعي”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;إنك تحاول تتبع تعديلات الـ Git أو توجه AI Coding Agent جوه ملف واحد ضخم اسمه &lt;code&gt;f100.sql&lt;/code&gt;، ده بالظبط زي ما تكون عايش في حاوية شحن بضائع 40 قدم مفيهاش أي رفوف ولا تنظيم! محتاج تفضي عفش الحاوية كله في الشارع بس عشان تدور على مفاتيح عربيتك!&lt;/p&gt;
&lt;p&gt;بتحويل وتفكيك تطبيقات Oracle APEX لملفات صفحة-بصفحة بلغة &lt;strong&gt;APEXlang (&lt;/strong&gt;&lt;code&gt;.apx&lt;/code&gt;&lt;strong&gt;)&lt;/strong&gt; النظيفة، بتدي لفريقك البشري ولمساعدي الذكاء الاصطناعي سورس كود شفاف، ومقسم، ومثالي للمقارنة والمراجعة في الـ Git.&lt;/p&gt;
&lt;p&gt;هنا هنشوف إزاي APEXlang بتشيل آلاف السطور من دوشة السباكة الداخلية، وتقلل فواتير التوكنز، وتخلي الشغل المشترك في فروع الـ Git ممتع وسهل بالظبط زي شغل الـ Frontend الحديث.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-حاوية-البضائع-المقفولة-ضد-الجراج-المنظم-بالمللي&quot;&gt;📦 حاوية البضائع المقفولة ضد الجراج المنظم بالمللي&lt;/h2&gt;
&lt;p&gt;في عالم Oracle APEX التقليدي، تصدير الكود غالباً بيقع بين نارين:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;الكتلة الصماء الواحدة (&lt;/strong&gt;&lt;code&gt;f100.sql&lt;/code&gt;&lt;strong&gt;)&lt;/strong&gt;: ملف SQL واحد عملاق فيه إعدادات الـ Workspace، والـ Themes، وخطط الأمان، والـ 80 صفحة بتوع التطبيق مرصوصين فوق بعض في برج من 150,000 سطر كود!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التقسيم الإجرائي القديم (&lt;/strong&gt;&lt;code&gt;f100/application/...&lt;/code&gt;&lt;strong&gt;)&lt;/strong&gt;: فولدر فيه عشرات الملفات المرقمة (&lt;code&gt;page_00012.sql&lt;/code&gt;)، بس كل ملف فيهم لسه عبارة عن حيطة سد من أوامر &lt;code&gt;wwv_flow_imp_page.create_page_plug&lt;/code&gt; الغارقة في أرقام الـ Hexadecimal غير المفهومة.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;تخيل معايا شكل تنظيم العدة والأدوات في بيتك:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الكتلة الصماء (حاوية الشحن العشوائية)&lt;/strong&gt;: الخيم، وماكينة قص الحشائش، وجرادل البوية، والشنيور كلهم مرميين ورا باب حديد تقيل. لو عايز تتأكد عندك بنطة 10 ملم ولا لأ، لازم تسحب كل الكراكيب دي برة على الأسفلت وتقعد تنبش في الكومة!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التقسيم الذكي (علب شفافة ومكتوب عليها أسماء العدة على رفوف الجدار)&lt;/strong&gt;: تدخل الجراج في ثانية تلاقي العلبة رقم 1 “الشناير والبنط”، العلبة رقم 2 “أدوات الدهان”، العلبة رقم 3 “أدوات التخييم”. تمد إيدك على علبة 1 وتاخد البنطة وتقفل الغطاء في 5 ثواني وتمشي!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;لغة &lt;strong&gt;APEXlang (&lt;/strong&gt;&lt;code&gt;.apx&lt;/code&gt;&lt;strong&gt;)&lt;/strong&gt; هي بالظبط الرفوف المنظمة والعلب الشفافة اللي مكتوب عليها أسماء عناصر تطبيقك بالمللي.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-اتعرف-على-لغة-apexlang--لغة-وصفية-معمولة-بالحب-للـ-low-code&quot;&gt;🔍 اتعرف على لغة APEXlang — لغة وصفية معمولة بالحب للـ Low-Code&lt;/h2&gt;
&lt;p&gt;لغة APEXlang هي لغة مخصصة (DSL) معمولة خصيصاً عشان تقراها عيون البشر وعقول وكلاء الذكاء الاصطناعي بمنتهى السلاسة والوضوح.&lt;/p&gt;
&lt;p&gt;بدل ما تجبر الوكيل الذكي يقعد يحلل ويفك طلاسم النداءات الإجرائية، APEXlang بتوصف الشاشات بطريقة تقريرية (Declarative)—بنفس الطريقة اللي دماغنا بيفكر بيها لما بنيجي نصمم شاشة على الورق!&lt;/p&gt;
&lt;h3 id=&quot;مقارنة-وجهاً-لوجه-الطريقة-القديمة-ضد-طريقة-apexlang&quot;&gt;مقارنة وجهاً لوجه: الطريقة القديمة ضد طريقة APEXlang&lt;/h3&gt;
&lt;p&gt;تعالوا نشوف حقل نصي بسيط في صفحة “الدفع والشراء” بيتكتب إزاي في ملفات الـ SQL القديمة ومقابله في APEXlang كالآتي:&lt;/p&gt;
&lt;h4 id=&quot;التصدير-التقليدي-القديم-مليان-دوشة-وطلاسم&quot;&gt;التصدير التقليدي القديم (مليان دوشة وطلاسم)&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wwv_flow_imp_page&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;create_page_item&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  p_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wwv_flow_imp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4918239019283741&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;P12_CUSTOMER_EMAIL&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_item_sequence&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_item_plug_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wwv_flow_imp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4918200192837400&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_prompt&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Customer Email&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_display_as&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;NATIVE_TEXT_FIELD&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_cSize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;60&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_is_required&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_field_template&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wwv_flow_imp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4918001928374611&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;تمثيل-نفس-الحقل-بلغة-apexlang-apx-واضح-وصفي-وشيك&quot;&gt;تمثيل نفس الحقل بلغة APEXlang (&lt;code&gt;.apx&lt;/code&gt;) (واضح، وصفي، وشيك)&lt;/h4&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// apps/order_hub/100/pages/page_00012.apx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;page 12 &quot;Order Checkout&quot; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    region &quot;Customer Information&quot; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        item P12_CUSTOMER_NAME: text &quot;Full Name&quot; required;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        item P12_CUSTOMER_EMAIL: email &quot;Customer Email&quot; required;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        item P12_DISCOUNT_CODE: text &quot;Promo Code&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    region &quot;Cart Summary&quot; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        item P12_CART_TOTAL: number &quot;Order Total&quot; readonly;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        button &quot;BTN_APPLY_DISCOUNT&quot; label &quot;Apply Promo&quot; hot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        button &quot;BTN_SUBMIT_ORDER&quot; label &quot;Place Order&quot; primary;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    process &quot;Process Payment&quot; on &quot;BTN_SUBMIT_ORDER&quot; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        plsql {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            PKG_CHECKOUT.PROCESS_ORDER(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                p_cust_name  =&amp;gt; :P12_CUSTOMER_NAME,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                p_cust_email =&amp;gt; :P12_CUSTOMER_EMAIL,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                p_discount   =&amp;gt; :P12_DISCOUNT_CODE,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                p_order_id   =&amp;gt; :P12_ORDER_ID&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;لاحظ الفرق الشاسع:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;صفر أرقام هيكس عشوائية&lt;/strong&gt;: أسماء واضحة ومنطقية (&lt;code&gt;P12_CUSTOMER_EMAIL&lt;/code&gt;, &lt;code&gt;BTN_SUBMIT_ORDER&lt;/code&gt;) بدل أرقام زي &lt;code&gt;4918239019283741&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تسلسل بصري حقيقي (Visual Hierarchy)&lt;/strong&gt;: بلمحة عين بتشوف إن الصفحة فيها منطقتين (Regions)، وكل منطقة فيها حقول وزراير، وزرار الدفع بينادي كود PL/SQL صريح.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;منطق بيزنس صافي&lt;/strong&gt;: كل دوشة السباكة لمحرك أبيكس اختفت، ومتبقاش غير التصميم المعماري والكود اللي يهمك بجد.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-ليه-وكيل-البرمجة-بالذكاء-الاصطناعي-بيعشق-لغة-apexlang&quot;&gt;🤝 ليه وكيل البرمجة بالذكاء الاصطناعي بيعشق لغة APEXlang؟&lt;/h2&gt;
&lt;p&gt;لما تطلب من المساعد الذكي (AI Assistant) الآتي:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“ضيف لي قائمة منسدلة (Dropdown) لاختيار فئة العضوية جوه منطقة ‘بيانات العميل’ في صفحة 12، وتكون القيمة الافتراضية بتاعتها ‘BRONZE’.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;شوف الفرق في تعامل الـ Agent بين الطريقتين:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;وجه المقارنة&lt;/th&gt;
&lt;th&gt;الملف الضخم القديم &lt;code&gt;f100.sql&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;الملف المقسم الحديث &lt;code&gt;page_00012.apx&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;الملفات المقروءة&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ملف واحد عملاق (~150,000 سطر)&lt;/td&gt;
&lt;td&gt;ملف واحد محدد ومعزول (65 سطر بس)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;التوكنز المستهلكة&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~65,000 توكن&lt;/td&gt;
&lt;td&gt;~320 توكن بس!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;وقت القراءة والتفكير&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;من 20 لـ 40 ثانية&lt;/td&gt;
&lt;td&gt;أقل من ثانية واحدة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;دقة التعديل&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;احتمالية عالية جداً لكسر الـ Syntax أو الـ IDs&lt;/td&gt;
&lt;td&gt;تعديل جراحي بالمللي وفي مكانه الصح&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;خطر التأثير على صفحات تانية&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ممكن يبوظ صفحات تانية بالخطأ&lt;/td&gt;
&lt;td&gt;صفر تأثير على باقي التطبيق&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;بدل ما يحرق ميزانيتك، الـ AI بيفتح &lt;code&gt;page_00012.apx&lt;/code&gt;، يدخل على &lt;code&gt;region &quot;Customer Information&quot;&lt;/code&gt;، ويضيف سطر واحد بس:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        item P12_LOYALTY_TIER: select &quot;Loyalty Tier&quot; default &quot;BRONZE&quot; lov &quot;LOV_TIERS&quot;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…وبيخلص الشغلانة في 3 ثواني وبدون أي تهييس!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-تتبع-التعديلات-في-git-diffs-تفهمها-وتقراها-زي-الرواية&quot;&gt;🔀 تتبع التعديلات في Git (Diffs تفهمها وتقراها زي الرواية)&lt;/h2&gt;
&lt;p&gt;لسنين طويلة، تتبع ومزامنة كود Oracle APEX في الـ Git كان بمثابة صداع مزمن لفرق البرمجة. لو اتنين مطورين عدلوا في صفحة 12 وصفحة 15 في نفس التطبيق، عملية الـ Merge كانت بتتحول لكابوس:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;أرقام الـ IDs اتغيرت في كل حتة.&lt;/li&gt;
&lt;li&gt;التواريخ (Timestamps) ضربت في سطر 4 وسطر 1200 وسطر 15000.&lt;/li&gt;
&lt;li&gt;مراجعات الـ Pull Requests كانت مستحيلة لأن مفيش بني آدم يقدر يراجع diff فيه 50 ألف سطر!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;مع ملفات &lt;code&gt;.apx&lt;/code&gt; المقسمة، الـ PRs بتتحول لشغل هندسي محترم وراقي:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;diff&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  region &quot;Customer Information&quot; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      item P12_CUSTOMER_NAME: text &quot;Full Name&quot; required;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      item P12_CUSTOMER_EMAIL: email &quot;Customer Email&quot; required;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;     item P12_LOYALTY_TIER: select &quot;Loyalty Tier&quot; default &quot;BRONZE&quot; lov &quot;LOV_TIERS&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      item P12_DISCOUNT_CODE: text &quot;Promo Code&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;التيم ليدر يقدر يراجع التعديل ده في 10 ثواني، يدوس Approve وهو واثق، وعارف بالظبط إيه اللي اتغير في المشروع.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-إزاي-تطبق-المعمارية-المقسمة-دي-في-مشروعاتك&quot;&gt;🛠️ إزاي تطبق المعمارية المقسمة دي في مشروعاتك؟&lt;/h2&gt;
&lt;p&gt;مش لازم تقلب بنية شركتك كلها بين يوم وليلة عشان تستفيد من المزايا دي.&lt;/p&gt;
&lt;p&gt;تقدر تبدأ بالخطوات دي:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ابدأ بالتقسيم على مستوى الصفحات&lt;/strong&gt;: اتأكد إن سكربتات التصدير بتاعتك بتستخدم خيار التجزئة (زي &lt;code&gt;apex export -split&lt;/code&gt; أو أوامر SQLcl الرسمية) عشان كل صفحة تعيش في ملف مستقل.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التحويل لصيغة مقروءة للبشر&lt;/strong&gt;: سواء بسكربتات بايثون أو أدوات DSL من المجتمع التقني، حول الأغلفة المليانة سباكة لشكل وصفي بسيط ومباشر.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;أتمتة التجميع (Compilation)&lt;/strong&gt;: وقت الـ Deployment لأوراكل أبيكس، خلي الـ CI/CD Pipeline يعيد تجميع ملفات &lt;code&gt;.apx&lt;/code&gt; لسكربتات تثبيت APEX القياسية.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;h3 id=&quot;-عايز-حل-جاهز-ومتكامل-من-غير-وجع-دماغ&quot;&gt;📦 عايز حل جاهز ومتكامل من غير وجع دماغ؟&lt;/h3&gt;
&lt;p&gt;بص على &lt;a href=&quot;https://github.com/ash2osh/APEX_PROJECT_TEMPLATE&quot;&gt;APEX Project Template&lt;/a&gt; المفتوح المصدر.
بيحتوي على سكربتات التفكيك الجاهزة (&lt;code&gt;export_apx.py&lt;/code&gt;)، ومحركات التجميع، وهيكل الفولدرات المنظم بالكامل ومجاني تماماً!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-الجزء-الثالث&quot;&gt;🚀 إيه اللي مستنينا في الجزء الثالث؟&lt;/h2&gt;
&lt;p&gt;دلوقتي بعد ما فككنا كود التطبيق لملفات &lt;code&gt;.apx&lt;/code&gt; نظيفة ومستقلة، التطبيقات الحقيقية مش مجرد جزر معزولة—دي شبكة علاقات معقدة بين الزراير، والـ Dynamic Actions، والـ Packages، وجداول الداتابيز!&lt;/p&gt;
&lt;p&gt;لما الـ AI يحتاج يعدل في صفحة 12، إزاي يعرف الجداول والـ Packages المرتبطة بيها &lt;em&gt;من غير&lt;/em&gt; ما يحتاج يفحص الداتابيز كلها؟&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الثالث (“رسم ناطحة السحاب: بناء الـ AST Knowledge Graph لأبيكس”)&lt;/strong&gt;، هنشوف إزاي تحليل شجرة الكود (AST) بيحول ملفات تطبيقك لشبكة معرفية ثلاثية الأبعاد تفاعلية وسريعة زي الطلقة!&lt;/p&gt;
&lt;p&gt;استنونا في الجزء التالت! 🏗️✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>مطور أبيكس المعزز بالذكاء الاصطناعي</category><category>oracle-apex</category><category>ai</category><category>git</category><category>dsl</category><category>apexlang</category><category>arabic</category></item><item><title>غمامة الـ 50 ألف توكن: ليه رمي ملفات الـ APEX الخام للذكاء الاصطناعي بيحرق فلوسك ع الفاضي؟ 💸🙈</title><link>https://ash2osh.github.io/arabic-blog/posts/007_the-50-000-token-blindfold-why-handing-ai-raw-apex-exports-burns-cash/</link><guid isPermaLink="true">https://ash2osh.github.io/arabic-blog/posts/007_the-50-000-token-blindfold-why-handing-ai-raw-apex-exports-burns-cash/</guid><description>الجزء الأول من سلسلة &quot;مطور APEX المدعوم بالذكاء الاصطناعي&quot;. ليه ملفات f100.sql بتخنق نماذج الـ LLMs، وإزاي تحول كودك لصيغة خفيفة وسريعة توفر 99% من التوكنز!</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 &lt;strong&gt;English Version:&lt;/strong&gt; Read the original article in English &lt;a href=&quot;https://ash2osh.hashnode.dev/the-50-000-token-blindfold-why-handing-ai-raw-apex-exports-burns-cash&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;غمامة-الـ-50-ألف-توكن-ليه-رمي-ملفات-الـ-apex-الخام-للذكاء-الاصطناعي-بيحرق-فلوسك-ع-الفاضي-&quot;&gt;غمامة الـ 50 ألف توكن: ليه رمي ملفات الـ APEX الخام للذكاء الاصطناعي بيحرق فلوسك ع الفاضي؟ 💸🙈&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;الجزء الأول من سلسلة “مطور APEX المدعوم بالذكاء الاصطناعي”.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الخلاصة-في-كلمتين-tldr&quot;&gt;⚡ الخلاصة في كلمتين (TL;DR)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;إنك تدي لـ AI Coding Assistant ملف تصدير Oracle APEX بصيغة الـ SQL الخام، ده بالظبط عامل زي ما تطلب من صاحبك يدور لك على وصفة كحك العيد السرية بتاعة جدتك.. بس مديله يدور جوه موسوعة قانون الضرائب المكونة من 5000 صفحة ومكتوبة بخط منمنم وقوانين معقدة!&lt;/p&gt;
&lt;p&gt;صاحبك (الذكاء الاصطناعي) هيحرق لك رصيد التوكنز كله في سؤالين تلاتة، وهيفوّت تماماً شرط التحقق (Validation) اللي أنت بتدور عليه في الصفحة، وفي الآخر هيهبد لك كود PL/SQL خيالي ممكن يفرمت داتابيز الـ Production بتاعتك!&lt;/p&gt;
&lt;p&gt;في الدليل ده، هنشرح بالتفصيل ليه ملفات تصدير APEX الضخمة (Monolithic) بتخنق نماذج الـ LLM، والضوضاء المعمارية المخفية اللي بتنفخ فواتير الـ API بتاعتك، والاستراتيجيات الأساسية اللي تقدر تطبقها فوراً في أي مشروع لبناء دورات عمل ذكية وسريعة زي الصاروخ.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-وهم-يا-عم-ارمي-له-ملف-الـ-sql-وخلاص&quot;&gt;🔍 وهم “يا عم ارمي له ملف الـ SQL وخلاص!”&lt;/h2&gt;
&lt;p&gt;تخيل المشهد ده—واللي بيحصل بالحرف مع 99% من مطوري Oracle APEX أول ما يبدأوا يجربوا أدوات الذكاء الاصطناعي التوليدي:&lt;/p&gt;
&lt;p&gt;عندك تطبيق شغال، وليكن تطبيق 100. حابب تخلي مساعد الذكاء الاصطناعي (Claude أو GPT أو Gemini) يساعدك تبني ميزة بسيطة:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“يا عم الذكاء الاصطناعي، بص كدة على تطبيقي. في صفحة 12، لما اليوزر يدخل نسبة خصم أكبر من 20%، اطلب موافقة المدير قبل ما ينشئ الأوردر.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ولأن Oracle APEX بتصدر التطبيقات على شكل ملفات SQL، أول فكرة بتيجي في بالك بتكون بديهية ومنطقية جداً: &lt;em&gt;“الله! ما هي أبيكس أصلاً مبنية على SQL من تحت، خليني أشغل أمر&lt;/em&gt; &lt;code&gt;apex export -applicationid 100&lt;/code&gt;&lt;em&gt;، وأرفع ملف&lt;/em&gt; &lt;code&gt;f100.sql&lt;/code&gt; &lt;em&gt;ده جوه شات الـ AI أو الـ IDE، وسيبه بقى يعيش ويبهرني!”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;بعد 5 ثواني بس، الواقع بيصدمك بالقلم:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;انفجار التوكنز (Token Explosion)&lt;/strong&gt;: عداد التوكنز بتاعك ينط فجأة من صفر لـ &lt;strong&gt;65,000 وحتى 180,000 توكن&lt;/strong&gt; عشان سؤال واحد بس!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;شلل السياق (Context Paralysis)&lt;/strong&gt;: الـ AI بيفضل متنح 45 ثانية وهو بيطحن آلاف السطور من الدوال الداخلية، وأرقام الـ Hexadecimal، وسكربتات إنشاء الـ Workspaces.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;كارثة التهييس (Hallucination Disaster)&lt;/strong&gt;: بدل ما يديك Process نظيف أو Dynamic Action محترم، الموديل بيرد عليك بكود PL/SQL غريب ومخترع أعمدة مش موجودة أصلاً في جداولك، وبيحاول يعدل جداول المحرك الداخلية لأبيكس (&lt;code&gt;WWV_FLOW_STEPS&lt;/code&gt;)!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ليه ده بيحصل كل مرة بدون استثناء؟ لأن ملف التصدير بتاع APEX مكنش معمول أصلاً عشان تقراه عين بشرية.. ولا عشان تقراه نماذج اللغة!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-تشريح-ملف-التصدير-إيه-اللي-مستخبي-جوه-f100sql&quot;&gt;🔬 تشريح ملف التصدير: إيه اللي مستخبي جوه &lt;code&gt;f100.sql&lt;/code&gt;؟&lt;/h2&gt;
&lt;p&gt;عشان تفهم ليه الذكاء الاصطناعي بيفشل الفشل الذريع ده لما يشوف ملف الـ Export، لازم نبص بعينينا على اللي جوه &lt;code&gt;f100.sql&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;أوراكل أبيكس لما بتصدر تطبيق، مش بتطلع لك مواصفات وصفية واضحة (Declarative Specification) للشاشات والتقارير. هي في الحقيقة بتولد &lt;strong&gt;سكربت تثبيت إجرائي (Imperative Installation Script)&lt;/strong&gt; معمول مخصوص عشان يعيد حقن سطور الداتا جوه جداول محرك أبيكس الداخلي (&lt;code&gt;APEX_260100&lt;/code&gt; / &lt;code&gt;WWV_FLOW&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;بص كدة على العينة دي اللي بتمثل مجرد حقل نصي &lt;em&gt;واحد&lt;/em&gt; في صفحة:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;prompt &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;--application/pages/page_00012&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wwv_flow_imp_page&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;create_page_item&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  p_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wwv_flow_imp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;9817239182736192&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;P12_DISCOUNT_PCT&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_item_sequence&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_item_plug_id&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wwv_flow_imp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;9817211100293812&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_prompt&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Discount %&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_source&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;DISCOUNT_PCT&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_source_type&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;DB_COLUMN&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_display_as&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;NATIVE_NUMBER_FIELD&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_cSize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_cMaxlength&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_tag_attributes&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;class=&quot;apex-item-number&quot;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_begin_on_new_line&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Y&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_colspan&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_rowspan&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_label_alignment&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;RIGHT&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_field_alignment&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;LEFT-CENTER&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_field_template&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;wwv_flow_imp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;9817001928374611&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_is_persistent&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;Y&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_attribute_01&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;0&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_attribute_02&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;100&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ,p_attribute_03&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;1&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;اضرب بقى الكود ده في 40 حقل، و 15 ريجين (Region)، و 12 أكشن ديناميكي (Dynamic Action)، و 8 بروسيسز (Processes)، وعلى مدار 50 صفحة في التطبيق. فجأة هتلاقي نفسك باصص على &lt;strong&gt;أكتر من 150,000 سطر من الحشو المعقد&lt;/strong&gt;!&lt;/p&gt;
&lt;h3 id=&quot;الـ-150-ألف-سطر-دول-عبارة-عن-إيه-أصلاً&quot;&gt;الـ 150 ألف سطر دول عبارة عن إيه أصلاً؟&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;90% سباكة داخلية لمحرك أبيكس&lt;/strong&gt;: نداءات إجرائية غامضة (&lt;code&gt;wwv_flow_imp_page&lt;/code&gt;, &lt;code&gt;wwv_flow_imp_shared&lt;/code&gt;)، أرقام ID عشوائية بالهيكس، إحداثيات محاذاة الشاشة، ومؤشرات الـ Templates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8% لزق وتنسيق عناصر&lt;/strong&gt;: كلاسات CSS، وإحداثيات الشاشة، وترتيب العرض.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;فقط 2% هو منطق البيزنس الحقيقي (Actual Business Logic)&lt;/strong&gt;: السطرين الصغيرين بتوع كود الـ PL/SQL أو الـ SQL Query اللي أنت أصلاً كنت عايز الـ AI يراجعهم ويعدل فيهم!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;لما ترمي الملف ده لـ LLM، أنت بتجبره يصرف 98% من تركيزه وطاقته الاستيعابية بس عشان يفلتر الدوشة دي!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-التشبيه-البلدي-بتدور-على-مقادير-كيكة-في-قانون-الضرائب&quot;&gt;📚 التشبيه البلدي: بتدور على مقادير كيكة في قانون الضرائب!&lt;/h2&gt;
&lt;p&gt;تخيل عينت شيف حلويات عالمي عشان يراجع معاك مقادير تورتة شيكولاتة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الطريقة العاقلة&lt;/strong&gt;: بتديه ورقة مقادير شيك في صفحة واحدة: كوبايتين دقيق، 3 بيضات، كوباية سكر، ونص ساعة في الفرن. الشيف هيبص في ثانية ويقولك: “أنت نسيت البيكنج باودر ورشة الملح!”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;طريقة ملف الـ APEX الخام&lt;/strong&gt;: بدل ورقة المقادير، تروح تديله:
&lt;ol&gt;
&lt;li&gt;كود البناء والمواصفات القياسية لمبنى المطبخ.&lt;/li&gt;
&lt;li&gt;الدوائر الكهربائية والأسلاك لفرن البوتاجاز.&lt;/li&gt;
&lt;li&gt;كشف شحن من 200 صفحة فيه أرقام مسلسلة لكل مضرب بيض ومعلقة.&lt;/li&gt;
&lt;li&gt;ومستخبي في صفحة 347 سطر بيقول: &lt;code&gt;p_ingredient =&amp;gt; &apos;SUGAR&apos;, p_qty =&amp;gt; 1&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;الشيف هيتجنن، ويضيع تلات ساعات يقرا في أسلاك الكهرباء، وفي الآخر هيهبد لك نصيحة ملهاش علاقة بالحلويات: &lt;em&gt;“اتأكد بس إن القاطع الكهربائي 240 فولت ميفصلش وأنت بتضرب البيض!”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ده بالظبط اللي بيحس بيه الـ AI لما تديله &lt;code&gt;f100.sql&lt;/code&gt;!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-الاقتصاديات-المخفية-التوكنز-وقت-الاستجابة-وفقدان-التركيز-في-النص&quot;&gt;💸 الاقتصاديات المخفية: التوكنز، وقت الاستجابة، وفقدان التركيز في النص&lt;/h2&gt;
&lt;p&gt;رمي الملفات الضخمة دي مش بس بيطلع إجابات تعبانة—ده بينفض جيبك وبيموت سرعة التطوير.&lt;/p&gt;
&lt;h3 id=&quot;1-لغة-الأرقام-الصادمة&quot;&gt;1. لغة الأرقام الصادمة&lt;/h3&gt;
&lt;p&gt;تعالوا نقارن بين الطريقتين لتطبيق APEX متوسط الحجم:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المقياس&lt;/th&gt;
&lt;th&gt;الملف الضخم المجمع (&lt;code&gt;f100.sql&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;التنسيق المجزأ النظيف (Modular)&lt;/th&gt;
&lt;th&gt;الفرق&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;عدد السطور&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~120,000 سطر&lt;/td&gt;
&lt;td&gt;~80 سطر لكل صفحة&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;أصغر 1,500 مرة&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;استهلاك التوكنز&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~55,000 – 90,000 توكن&lt;/td&gt;
&lt;td&gt;~350 – 800 توكن&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;توفير 99% من التوكنز&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;التكلفة لكل 10 أسئلة&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$3.50 – $7.00 دولار&lt;/td&gt;
&lt;td&gt;~$0.02 – $0.05 سنت&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;سنتات مقابل دولارات&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;وقت الرد (Latency)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25 – 45 ثانية انتظار&lt;/td&gt;
&lt;td&gt;2 – 4 ثواني بس&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;أسرع 10 مرات&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;نسبة التهييس والهبد&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;عالية جداً (&amp;gt;60%)&lt;/td&gt;
&lt;td&gt;تكاد تنعدم (&amp;lt;2%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;إجابات دقيقة زي السيف&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;2-متلازمة-الضياع-في-الزحمة-lost-in-the-middle&quot;&gt;2. متلازمة “الضياع في الزحمة” (Lost in the Middle)&lt;/h3&gt;
&lt;p&gt;أبحاث الذكاء الاصطناعي أثبتت مراراً ظاهرة &lt;strong&gt;“منحنى الانتباه على شكل حرف U”&lt;/strong&gt;: الموديل بيركز جداً في أول الـ Prompt وفي آخره، لكن في النص الانتباه بيقع في بئر عميق! لما شرط الـ SQL بتاعك يكون مدفون في وسط 40 ألف توكن من سباكة أبيكس، الموديل بينسى تماماً أنت سألته عن إيه.&lt;/p&gt;
&lt;h3 id=&quot;3-فخ-الملف-المكسور-غير-القابل-للاستيراد&quot;&gt;3. فخ الملف المكسور غير القابل للاستيراد&lt;/h3&gt;
&lt;p&gt;لو سبت الـ AI يعدل مباشرة في &lt;code&gt;f100.sql&lt;/code&gt;، الكارثة قادمة لا محالة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;فصلة منقوطة ناقصة أو كوتيشن طار من كود &lt;code&gt;wwv_flow_imp&lt;/code&gt; هيخلي أبيكس ترفض استيراد التطبيق كله!&lt;/li&gt;
&lt;li&gt;لو الـ AI بدّل رقم ID عشوائي (مثلاً غير &lt;code&gt;9817239182736192&lt;/code&gt; لـ &lt;code&gt;9817239182736199&lt;/code&gt;)، عناصر كاملة هتختفي من الـ Page Designer أو تتربط في صفحات تانية غلط!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;️-القواعد-الذهبية-التلاتة-لكود-apex-جاهز-للذكاء-الاصطناعي&quot;&gt;🛠️ القواعد الذهبية التلاتة لكود APEX جاهز للذكاء الاصطناعي&lt;/h2&gt;
&lt;p&gt;عشان تخلي شغلك سريع وذكي، التزم بالتلات مبادئ دول في أي مشروع:&lt;/p&gt;
&lt;h3 id=&quot;القاعدة-1-تقسيم-الكود-على-مستوى-الصفحات-page-level-granularity&quot;&gt;القاعدة 1: تقسيم الكود على مستوى الصفحات (Page-Level Granularity)&lt;/h3&gt;
&lt;p&gt;ممنوع نهائياً تبعت التطبيق كله للـ AI. استخدم أدوات تقسيم التصدير لفصل كل صفحة في ملف مستقل. لما تسأل عن صفحة 12، الـ Agent ميشوفش غير صفحة 12 بس.&lt;/p&gt;
&lt;h3 id=&quot;القاعدة-2-تنظيف-دوشة-الـ-hexadecimal-بلغة-مقروءة-للبشر&quot;&gt;القاعدة 2: تنظيف دوشة الـ Hexadecimal بلغة مقروءة للبشر&lt;/h3&gt;
&lt;p&gt;الذكاء الاصطناعي بيفهم مفاهيم ومنطق وكلام—مبيفهمش شفرات Hexadecimal. تحويل صفحات أبيكس لصيغة نظيفة ومقروءة (زي لغة &lt;strong&gt;APEXlang /&lt;/strong&gt; &lt;code&gt;.apx&lt;/code&gt;) بيشيل 95% من دوشة السباكة مع الحفاظ على المنطق والتقسيم بنسبة 100%.&lt;/p&gt;
&lt;h3 id=&quot;القاعدة-3-رسم-خريطة-الاعتماديات-المعمارية-بوضوح&quot;&gt;القاعدة 3: رسم خريطة الاعتماديات المعمارية بوضوح&lt;/h3&gt;
&lt;p&gt;صفحة أبيكس مش عايشة لوحدها في الصحراء؛ هي بتتعامل مع جداول و Views و Packages. بدل ما ترمي كل أكواد الداتابيز في الشات، ادي للـ Agent خريطة علاقات واضحة عشان يسحب بس الجدول أو الـ Package اللي محتاجه بالظبط.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
مش محتاج أدوات مدفوعة عشان تبدأ تطبق المبادئ دي النهاردة. مجرد استخدام أمر التصدير المقسم في SQLcl عبر &lt;code&gt;lb generate-apex&lt;/code&gt; أو &lt;code&gt;apex export -split&lt;/code&gt; هي خطوة أولى ممتازة يقدر أي فريق يبدأ بيها فوراً في أي ريبو!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-بداية-جاهزة-وسريعة-قالب-مشروع-apex-المفتوح&quot;&gt;📦 بداية جاهزة وسريعة: قالب مشروع APEX المفتوح&lt;/h2&gt;
&lt;p&gt;رغم إنك تقدر تكتب سكربتاتك الخاصة عشان تقسم وتنظم التصدير، مش لازم تخترع العجلة من الصفر.&lt;/p&gt;
&lt;p&gt;لو بتدور على هيكل مستودع جاهز ومجرب بيطبق نفس المعايير دي بالحرف—مع التصدير الذري، والتقسيم النظيف، وقواعد الـ Agents—تقدر تبص على &lt;a href=&quot;https://github.com/ash2osh/APEX_PROJECT_TEMPLATE&quot;&gt;APEX Project Template&lt;/a&gt; المفتوح المصدر بالكامل.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-إيه-اللي-مستنينا-في-الجزء-الثاني&quot;&gt;🚀 إيه اللي مستنينا في الجزء الثاني؟&lt;/h2&gt;
&lt;p&gt;دلوقتي بعد ما عرفنا ليه التصدير المجمع بيفشل، يا ترى شكل كود APEX النظيف والجاهز للذكاء الاصطناعي عامل إزاي؟&lt;/p&gt;
&lt;p&gt;في &lt;strong&gt;الجزء الثاني (“من الكتلة الصماء للتقسيم الذكي: ليه ملفات APEXlang بتغير قواعد اللعبة؟”)&lt;/strong&gt;، هنتعرف على لغة &lt;strong&gt;APEXlang (&lt;/strong&gt;&lt;code&gt;.apx&lt;/code&gt;&lt;strong&gt;)&lt;/strong&gt;: إزاي تحويل التصدير لملفات مقروءة بيغير تماماً طريقتك أنت والـ AI في قراءة وتعديل وتتبع كود أبيكس في Git!&lt;/p&gt;
&lt;p&gt;نشوفكم في الجزء الثاني! 🚀✨&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;كتبه:&lt;/em&gt; &lt;a href=&quot;https://www.linkedin.com/in/ahmed-d-sherif&quot;&gt;&lt;em&gt;أحمد شريف (Ahmed Sherif)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>مطور أبيكس المعزز بالذكاء الاصطناعي</category><category>oracle-apex</category><category>ai</category><category>llm</category><category>tokens</category><category>prompt-engineering</category><category>arabic</category></item></channel></rss>