من يستطيع حذف فاتورة في أودو عندك؟ شرح الصلاحيات والمجموعات وقواعد السجلات
TechnoVision
٢٤ سبتمبر ٢٠٢٦ · ٧ دقائق قراءة
اسأل مسؤول نظام أودو «من يستطيع حذف فاتورة مرحّلة؟» والإجابة الصادقة غالباً «دعني أتأكد». نموذج المستخدم يعرض مربعات اختيار، لكن المربعات ليست هي الصلاحيات. الصلاحيات هي محصلة أربع طبقات مكدّسة فوق بعضها، وهذه الطبقات تتجمع بطرق تفاجئ الناس.
هذا المقال يشرح تلك الطبقات عبر سؤال واحد ملموس، حتى تستطيع في النهاية الإجابة عنه لقاعدة بياناتك. ينطبق على أودو 17 و18 و19، Community وEnterprise؛ ونشير إلى المواضع التي غيّر فيها الإصدار 19 المصطلحات.
الطبقات الأربع في جدول واحد
| الطبقة | نموذج أودو | السؤال الذي تجيب عنه | مثال |
|---|---|---|---|
| المجموعات | res.groups | ما الأدوار التي يحملها هذا المستخدم؟ | «المحاسبة / محاسب» |
| حقوق الوصول (ACL) | ir.model.access | هل تستطيع هذه المجموعة قراءة/تعديل/إنشاء/حذف هذا النموذج؟ | المحاسب يستطيع حذف account.move |
| قواعد السجلات | ir.rule | أي سجلات من هذا النموذج يمكنهم لمسها؟ | فواتير شركتهم فقط |
| مجموعات الحقول | groups= على الحقل | هل يرون أو يعدلون هذا الحقل؟ | المديرون فقط يرون سعر التكلفة |
أودو يفحصها بهذا الترتيب: بلا مجموعة لا ACL؛ ACL بلا قاعدة مطابقة لا سجل؛ ومجموعات الحقول تقص ما يظهر فوق ذلك. منطق الأعمال (مثل «لا يمكنك حذف فاتورة مرحّلة، أعدها إلى مسودة أولاً») طبقة خامسة مكتوبة ببايثون خارج نموذج الأمان.
الطبقة 1: المجموعات والمجموعات الضمنية والامتيازات
المستخدم ينتمي إلى أي عدد من المجموعات. ميزتان تجعلان المجموعات أقل وضوحاً مما تبدو:
- المجموعات الضمنية (Implied groups). المجموعة يمكن أن تتضمن غيرها. منح «المحاسبة / مدير» يضيف بصمت «المحاسبة / محاسب» و«المحاسبة / فوترة» وغالباً «إنشاء جهات اتصال». نموذج المستخدم لا يعرض الضمنية؛ ترى فقط المربع الذي حددته.
- الفئات مقابل الامتيازات. في أودو 17 و18 تُنظَّم المجموعات حسب الفئة (التطبيق)، ولهذا يعرض نموذج المستخدم قائمة منسدلة لكل تطبيق. أودو 19 أعاد التنظيم: المجموعات مرتبطة بـ امتيازات (
res.groups.privilege) ما زالت تجمعها حسب التطبيق لكنها تجعل سلسلة التضمين صريحة وأسهل تتبعاً. السلوك نفسه؛ المصطلح تغيّر.
النتيجة العملية: لمعرفة مجموعات المستخدم الحقيقية يجب حل سلسلة التضمين لا قراءة النموذج.
الطبقة 2: حقوق الوصول (ir.model.access)
كل موديول يأتي بملف CSV فيه سطر لكل نموذج ومجموعة، بأربع قيم منطقية: perm_read وperm_write وperm_create وperm_unlink. قاعدتان مهمتان:
- حقوق الوصول تراكمية. حقوق المستخدم على نموذج هي اتحاد الحقوق من كل مجموعاته (بما فيها الضمنية). لا يوجد سطر «منع». إذا منحت أي مجموعة الحذف فالمستخدم يملك الحذف.
- سطر ACL بمجموعة فارغة ينطبق على الجميع. بعض النماذج مفتوحة عمداً لكل المستخدمين الداخليين بهذه الطريقة.
إذن بالنسبة لـ account.move (الفواتير) يصبح السؤال: أي من مجموعات المستخدم، المباشرة أو الضمنية، لها سطر ACL فيه perm_unlink = 1؟ في أودو القياسي تحمله مجموعة «المحاسبة / محاسب» (أو ما يعادلها في إصدارك) ولا تحمله «الفوترة»؛ تحقق في قاعدة بياناتك لأن التخصيصات تغيّر ذلك.
الطبقة 3: قواعد السجلات (ir.rule)
بعد أن يقول الـ ACL «نعم، هذا النموذج»، تقرر قواعد السجلات أي الصفوف. القاعدة عبارة عن domain مع نفس أعلام الصلاحيات الأربعة. يوجد نوعان يتجمعان بشكل مختلف:
- القواعد العامة (Global) (بدون مجموعة) تتقاطع: إذا انطبقت قاعدتان عامتان يجب تحقق كلتيهما. قاعدة تعدد الشركات على الفواتير عامة، ولهذا لا يرى المستخدم فواتير شركة أخرى أياً كانت مجموعاته.
- قواعد المجموعات (Group) (مرتبطة بمجموعة أو أكثر) تتحد: إذا انطبقت قاعدتان لمجموعات يكفي تحقق إحداهما.
- ثم تتقاطع مجموعة القواعد العامة مع مجموعة قواعد المجموعات.
وثائق أودو تنص على هذا بدقة، وهو الجزء الأكثر سوء فهم في أمان أودو. خطأ شائع: إضافة قاعدة مجموعة «مندوبو المبيعات يرون عروضهم فقط» ونسيان أن قاعدة مجموعة ثانية على النموذج نفسه لمجموعة يحملها المستخدم أيضاً («مديرو المبيعات يرون الكل») ستفتح كل شيء، لأن قواعد المجموعات تتحد بـ OR.
وبالنسبة للحذف تحديداً: القاعدة التي فيها perm_unlink محدداً تقيّد أي الفواتير يمكن حذفها؛ والقاعدة التي لا تحدده لا تنطبق على الحذف أصلاً.
الطبقة 4: مجموعات الحقول
الحقل المعرّف بـ groups="account.group_account_manager" يختفي من الواجهات ومن fields_get() ومن القراءة والكتابة لكل من هو خارج المجموعة. لا يؤثر على حذف السجل، لكنه يقرر هل الشخص الذي يحذف كان يستطيع حتى رؤية المبلغ.
الطبقة 5 (منطق الأعمال): لماذا «الحذف مسموح» قد لا يحذف رغم ذلك
حتى مع حقوق الحذف على account.move وقاعدة مطابقة، يرفض كود المحاسبة في أودو حذف فاتورة مرحّلة: يجب إلغاؤها أو إعادتها إلى مسودة أولاً، وفي الفترة المقفلة يُمنع حتى ذلك. هذه الفحوصات في بايثون لا في جداول الأمان. عندما يسأل المراجع «هل كان المستخدم س يستطيع حذف الفاتورة ص؟» فالإجابة الصادقة تراعي نموذج الأمان وحالة السجل معاً.
الإجابة عن السؤال خطوة بخطوة
هذا الإجراء اليدوي لسؤال «هل يستطيع المستخدم س حذف الفواتير؟» مع تفعيل وضع المطور.
- اعرض مجموعات س. الإعدادات ← المستخدمون ← س ← تبويب حقوق الوصول. دوّن كل اختيار.
- حلّ المجموعات الضمنية. الإعدادات ← المستخدمون والشركات ← المجموعات (أودو 19: الامتيازات). افتح كل مجموعة واقرأ «ترث» / المجموعات الضمنية. كرر حتى لا يظهر جديد.
- ابحث عن ACL للنموذج. الإعدادات ← تقني ← الأمان ← حقوق الوصول. صفِّ بالنموذج = قيد يومية (
account.move). أبقِ فقط الأسطر التي مجموعتها ضمن مجموعات س المحلولة أو مجموعتها فارغة. إذا كان أي سطر فيه «حذف» محدداً فلدى س الحذف على مستوى النموذج. - ابحث عن قواعد السجلات للنموذج. الإعدادات ← تقني ← الأمان ← قواعد السجلات. صفِّ بالنموذج =
account.move. افصل القواعد العامة عن قواعد المجموعات التي مجموعتها ضمن مجموعات س. طبّق منطق AND/OR أعلاه على القواعد التي فيها «حذف» محدداً فقط. - افحص حالة السجل. مرحّلة؟ فترة مقفلة؟ إذن منطق الأعمال يمنع الحذف بغض النظر.
- افحص المستخدم الخارق (superuser). المستخدم الذي يحمل مجموعة «الإعدادات / مدير» ويتحول إلى وضع superuser يتجاوز كل ما سبق. هذا هو الذي تريد إيجاده أكثر من غيره.
تنفيذ هذا لمستخدم واحد ونموذج واحد يستغرق عشر دقائق. تنفيذه لأربعين مستخدماً وكل نموذج حساس (الفواتير، المدفوعات، الرواتب، جهات الاتصال، أوامر الشراء) يستغرق يوماً، ويصبح قديماً في المرة التالية التي يعدّل فيها أحد مجموعة.
ولهذا يشغّل موصل Claude الذي نقدمه كل استدعاء بصلاحيات صاحب التوكن.
أخطاء شائعة نراها في الشركات المصرية
- الجميع «مدير محاسبة» لأن ذلك كان الطريقة الوحيدة لتشغيل تقرير في 2021. لم يراجعه أحد.
- حساب الموظف السابق مؤرشف لا مراجَع. الأرشفة توقف الدخول؛ لا تخبرك ماذا كان يستطيع فعله وهو نشط، ولا هل ما زال لديه مفتاح API.
- موديولات مخصصة بـ
group_idفارغ في ملف ACL، تمنح الجميع بصمت حقوقاً كاملة على نموذج جديد. - قواعد سجلات مكتوبة على حقل الشركة الخطأ، فيتوقف عزل الشركات بهدوء على نموذج مخصص.
- وضع superuser يُترك كطريقة افتراضية «لإصلاح الأمور» من حساب مشترك.
قائمة التحصين
- أنشئ مجموعة مخصصة «المحاسبة / يستطيع حذف الفواتير» بلا مجموعات ضمنية، وانقل الحذف على
account.moveإليها. امنحها لشخص أو اثنين. - أزل «الإعدادات / مدير» من الجميع باستثناء مسؤول محدد بالاسم وحساب طوارئ بكلمة مرور محفوظة تُغيَّر دورياً.
- راجع كل سطر ACL بمجموعة فارغة في الموديولات المخصصة.
- أضف قاعدة سجلات عامة على النماذج المخصصة الحساسة بشرط
company_id in company_ids. - حدد مراجعة شهرية تجيب كتابةً عن: «من يستطيع حذف الفواتير والمدفوعات والموظفين؟».
أودو 18 مقابل أودو 19: ما تغيّر للمسؤولين
| الموضوع | أودو 18 | أودو 19 |
|---|---|---|
| تنظيم المجموعات | فئات لكل تطبيق | امتيازات (res.groups.privilege) لكل تطبيق |
| المجموعات الضمنية | implied_ids على المجموعة | نفسه، ويظهر عبر الامتياز |
| دلالات ACL والقواعد | ACL تراكمي؛ العامة AND، المجموعات OR | بلا تغيير |
| نموذج المستخدم | قائمة منسدلة لكل فئة | قائمة لكل امتياز مع وراثة أوضح |
إذا كتبت توثيقاً لفريقك على 17 أو 18 فالمفاهيم تبقى في 19؛ الشاشات والأسماء لا.
أسئلة شائعة
ما الفرق بين حقوق الوصول وقواعد السجلات في أودو؟
حقوق الوصول تقرر هل تستطيع المجموعة قراءة أو تعديل أو إنشاء أو حذف نموذج كامل. قواعد السجلات تقرر على أي سجلات بعينها تنطبق تلك العمليات باستخدام domain.
كيف تتجمع قواعد السجلات المتعددة في أودو؟
القواعد العامة (بلا مجموعة) تُجمع بـ AND. قواعد المجموعات تُجمع بـ OR. ثم تُجمع نتيجة العامة مع نتيجة المجموعات بـ AND.
لماذا يرى مستخدم سجلات ظننت أن قاعدة سجلات تمنعها؟
غالباً لأنه يحمل مجموعة أخرى لها قاعدة أوسع على النموذج نفسه؛ قواعد المجموعات تُجمع بـ OR فتغلب الأوسع. أو أن القاعدة التي كتبتها غير محددة للعملية المعنية (قراءة/تعديل/حذف).
هل يستطيع مستخدم حذف فاتورة مرحّلة في أودو؟
ليس مباشرة. حتى مع حقوق الحذف، يشترط منطق المحاسبة في أودو إلغاء الفاتورة أو إعادتها إلى مسودة أولاً، والفترات المقفلة تمنع ذلك تماماً. نموذج الأمان وحالة السجل كلاهما مهم.
إذا كنت تفضّل ألا تبني هذا بنفسك