مقدمة
واحدة من الميزات الأقل حديثًا في نموذج بيانات أودو هي الحقل المعتمد على الشركة. إنه سمة صغيرة تحدث فرقًا كبيرًا بمجرد أن تبدأ في العمل مع تكوينات متعددة الشركات.
في معظم إعدادات أودو، يحمل حقل في سجل قيمة واحدة يمكن لكل مستخدم عبر قاعدة البيانات رؤيتها. لكن ماذا يحدث عندما تشارك شركتان نفس كتالوج المنتجات، وتحتاج كل شركة إلى رمز مرجعي داخلي خاص بها؟ أو عندما تحتاج شركات مختلفة إلى حسابات افتراضية مختلفة على نفس المنتج؟
هذه هي بالضبط المشكلة التي يحلها سمة company_dependent. سواء كنت تقوم بتطوير أودو، أو تخصيص أودو، أو مجرد استكشاف إطار عمل أودو، فإن فهم هذا النوع من الحقول سيمنحك ميزة حقيقية في مشاريع متعددة الشركات.
ما هو حقل يعتمد على الشركة في أودو
حقل معتمد على الشركة هو حقل يخزن قيمة منفصلة لكل شركة، على نفس السجل. عندما يقرأ مستخدم ينتمي إلى الشركة A الحقل، يرى قيمة شركته. عندما يقرأ مستخدم من الشركة B نفس السجل، يرى قيمة مختلفة.
من الخارج، يبدو ويتصرف مثل حقل عادي. يتفاعل المستخدمون معه بنفس الطريقة في واجهة أودو. السحر يحدث خلف الكواليس في ORM أودو.
كيف يظهر في الواجهة
في واجهة أودو، يبدو الحقل المعتمد على الشركة مطابقًا لحقل عادي. لا يوجد مؤشر مرئي يخبر المستخدم أن القيمة التي يراها خاصة بالشركة. هذا مقصود: السلوك شفاف للمستخدمين النهائيين.
من منظور المطور، هذا هو أحد أنواع حقول أودو التي يمكن تطبيقها على العديد من الأنواع الأساسية: Char، Boolean، Integer، Float، Many2one، وغيرها. خاصية company_dependent=True هي ما ينشط هذا السلوك في ORM أودو.
في أودو ستوديو، يتم بالفعل عرض بعض الحقول المعتمدة على الشركة على النماذج القياسية (مثل الحقول المتعلقة بالمنتجات للحسابات). يمكن أيضًا إنشاء حقول معتمدة على الشركة مخصصة، على الرغم من أن دعم الاستوديو لهذه الخاصية المحددة محدود في بعض إصدارات أودو.
كيف يعمل الحقل
تعمل الحقول المعتمدة على الشركة بشكل مختلف تمامًا عن الحقول العادية. يساعد فهم الآلية في تجنب المفاجآت عند بناء أو تصحيح تخصيصات أودو.
التخزين في ir.property
في أودو 16 والإصدارات السابقة، لا يتم تخزين قيم الحقول المعتمدة على الشركة في جدول قاعدة البيانات الخاص بالنموذج. بدلاً من ذلك، يتم تخزينها في جدول نظام منفصل يسمى ir.property.
يرتبط كل إدخال في ir.property:
- سجل محدد (مثل المنتج الذي يحمل ID 42)
- حقل محدد (مثل
property_account_income_id) - شركة معينة
- القيمة الفعلية لتلك المجموعة
لهذا السبب تبدو القيم شفافة للمستخدمين: يقوم ORM باسترجاع وكتابة إلى ir.property تلقائيًا بناءً على سياق الشركة الحالي.
التغييرات في Odoo 17+
بدءًا من Odoo 17، تم إعادة هيكلة آلية التخزين. يتم الآن تخزين الحقول المعتمدة على الشركة مباشرة في جدول النموذج باستخدام عمود jsonb، مع تخزين قيم الشركة كقاموس JSON. هذا يحسن الأداء بشكل كبير ويبسّط الاستعلامات.
تظل الواجهة وواجهة برمجة التطبيقات الموجهة للمطورين كما هي، ولكن الاستعلامات على الحقول المعتمدة على الشركة أصبحت الآن أسرع بكثير على نطاق واسع.
القيم الافتراضية
تدعم الحقول المعتمدة على الشركة القيم الافتراضية الخاصة بالشركة. عندما لا يتم تعيين قيمة صراحة لشركة معينة، فإن الحقل يعود إلى القيمة الافتراضية المحددة على الحقل نفسه. يمكن أيضًا تعيين هذه القيمة الافتراضية لكل شركة من خلال نموذج ir.property (Odoo 16 وما قبله) أو مباشرة على النموذج (Odoo 17+).
التفاعل مع ORM
في سياق ORM الخاص بـ Odoo، فإن الوصول إلى حقل معتمد على الشركة يحترم دائمًا الشركة الحالية في البيئة (self.env.company). وهذا يعني:
- قراءة الحقل تعيد القيمة للشركة النشطة
- كتابة إلى الحقل تحدث فقط القيمة للشركة النشطة
- تغيير سياق الشركة (
record.with_company(company)) يتيح لك قراءة أو كتابة القيم لشركة معينة
حالات الاستخدام التجارية
الحقل المعتمد على الشركة ليس مجرد فضول تقني. إنه يحل مشاكل حقيقية، يومية، في إعدادات أودو متعددة الشركات. إليك خمسة سيناريوهات شائعة حيث يكسب مكانه حقًا.
1. المحاسبة: حسابات الدخل والمصروفات لكل شركة
هذا هو المثال الأكثر شيوعًا في أودو كما هو. الحقول property_account_income_id وproperty_account_expense_id على المنتجات تعتمد على الشركة.
في الممارسة العملية: تبيع الشركة A نفس المنتج الذي تبيعه الشركة B، ولكن لكل شركة مخطط حسابات مختلف. بدلاً من تكرار سجل المنتج، تقوم كل شركة فقط بتكوين خطوط المحاسبة الخاصة بها. المنتج مشترك؛ منطق المحاسبة ليس كذلك.
2. المبيعات وإدارة علاقات العملاء: قوائم الأسعار لكل شركة
في مجموعة تدير كيانات مبيعات متعددة، قد تستخدم كل شركة استراتيجيات تسعير مختلفة. مع حقل قائمة الأسعار المعتمد على الشركة، يمكن أن يحمل سجل العميل المشترك قوائم أسعار افتراضية مختلفة اعتمادًا على الشركة التي تعالج البيع.
هذا يحافظ على بيانات إدارة علاقات العملاء مركزية مع السماح لكل شركة بتطبيق قواعدها التجارية الخاصة.
3. المخزون: طريقة تقييم المخزون لكل شركة
تعمل بعض المجموعات على تشغيل مستودعات عبر كيانات قانونية متعددة مع لوائح محلية مختلفة. قد يتطلب منتج ما تكلفة FIFO في بلد واحد ومتوسط تكلفة في بلد آخر. استخدام الحقول المعتمدة على الشركة على المنتج أو الفئة يتجنب تكرار الكتالوج الكامل للمنتجات.
4. التصنيع: المورد الافتراضي لكل شركة
عندما يتم شراء منتج مشترك من موردين مختلفين اعتمادًا على الشركة، يمكن أن يحمل حقل many2one المعتمد على الشركة والذي يشير إلى res.partner المورد المفضل لكل كيان. ترى كل شركة موردها المفضل دون أي تعارض.
5. حقول مخصصة للبيانات التنظيمية
تحتاج المجموعات التي تعمل عبر دول متعددة غالبًا إلى تخزين مراجع الامتثال الخاصة بكل بلد على السجلات المشتركة. على سبيل المثال، قد يحتاج منتج ما إلى رمز HS أو تصنيف ضريبي مختلف لكل ولاية قضائية. يعتبر حقل Char المعتمد على الشركة وسيلة نظيفة ومنخفضة التكلفة للتعامل مع ذلك دون إنشاء متغيرات نموذجية.
إنشاء أو تخصيص الحقل
هناك طريقتان رئيسيتان لإنشاء حقول معتمدة على الشركة في Odoo: استخدام Odoo Studio أو كتابة كود Python مباشرة.
استخدام Odoo Studio
يتيح لك Odoo Studio إنشاء حقول دون أي كود. ومع ذلك، لا يكشف Studio عن مفتاح مخصص لـ company_dependent في جميع الإصدارات. في Odoo 16 و 17، تتوفر هذه الخيار على بعض أنواع الحقول عند إنشاء حقول جديدة على النماذج القياسية.
إذا كنت بحاجة إلى التحكم الكامل في هذه السمة، فإن التطوير الفني هو النهج الأكثر موثوقية. يعد Studio نقطة انطلاق جيدة للحالات الأبسط، ولكنه له حدود عندما يتعلق الأمر بسيناريوهات تخصيص Odoo المتقدمة.
النهج الفني: حقول Python
في وحدة Odoo مخصصة، فإن إعلان حقل معتمد على الشركة أمر بسيط. هذه هي النمط القياسي المستخدم في تطوير حقول Python في Odoo:
from odoo import fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
x_internal_ref = fields.Char(
string='مرجع داخلي (لكل شركة)',
company_dependent=True,
)
x_preferred_carrier_id = fields.Many2one(
comodel_name='res.partner',
string='الناقل المفضل',
company_dependent=True,
)
إضافة company_dependent=True إلى أي إعلان حقل هو كل ما يتطلبه الأمر. يتولى ORM الباقي تلقائيًا.
تعيين القيم الافتراضية لكل شركة
في Odoo 16 والإصدارات السابقة، يمكنك تعيين قيمة افتراضية على مستوى الشركة عبر نموذج ir.property. هذا مفيد عندما تريد قيمة افتراضية معقولة لجميع السجلات في شركة، دون تعيينها سجلًا بسجل:
self.env['ir.property']._set_default(
'x_internal_ref',
'product.template',
'DEFAULT-VALUE',
company_id=self.env.company.id,
)
في Odoo 17+، يتم تخزين القيمة الافتراضية مباشرة على سجل النموذج ويمكن الوصول إليها أيضًا من خلال تعريف الحقل.
حقول Odoo Studio والقيود
عند العمل مع حقول Odoo Studio، تذكر أن بادئة x_ مطلوبة للحقول المخصصة. قد لا تكون السلوكيات المعتمدة على الشركة مرئية في واجهة مستخدم الاستوديو، ولكن يمكن تكوينها من القائمة الفنية تحت الإعدادات إذا كان وضع المطور مفعلًا.
أفضل الممارسات
العمل مع الحقول المعتمدة على الشركة سهل بمجرد أن تعرف الأنماط. إليك الممارسات التي ستوفر لك الوقت وتمنع الصداع.
1. استخدمها فقط عندما تختلف القيم حقًا لكل شركة
تضيف الحقول المعتمدة على الشركة تعقيدًا. إذا كانت القيمة هي نفسها عبر جميع الشركات، استخدم حقلًا عاديًا. احتفظ بـ company_dependent=True للحقول التي تحتاج فيها الشركات المختلفة حقًا إلى قيم مختلفة على السجلات المشتركة.
2. اختبر دائمًا في سياق متعدد الشركات
عند بناء أو اختبار ميزات تتضمن حقولًا معتمدة على الشركة، اختبر دائمًا مع وجود شركتين على الأقل نشطتين. من السهل تفويت المشكلات في إعداد شركة واحدة ستظهر على الفور في الإنتاج.
3. استخدم with_company() للعمليات عبر الشركات
إذا كان كودك يحتاج إلى قراءة أو كتابة قيم الحقول المعتمدة على الشركة لشركة غير الحالية، استخدم record.with_company(target_company). تجنب التبديل يدويًا لشركة البيئة دون استعادتها.
4. كن حذرًا مع التصديرات والاستيرادات
عند تصدير السجلات التي تحتوي على حقول تعتمد على الشركة، تعكس القيم المصدرة الشركة الخاصة بالمستخدم الذي يقوم بالتصدير. استيراد نفس الملف في سياق شركة مختلفة سيحدد القيم لتلك الشركة. هذا غالبًا هو السلوك الصحيح، ولكن كن صريحًا بشأنه في عمليات الترحيل واستيراد البيانات.
5. وثق أي الحقول تعتمد على الشركة
نادراً ما يعرف المستخدمون النهائيون أي الحقول تعتمد على الشركة. ملاحظة قصيرة في وثائق Odoo الداخلية الخاصة بك أو مواد التوجيه ستقطع شوطًا طويلاً. إنها تمنع الارتباك عندما يغير المستخدمون الشركات ويرون قيمًا مختلفة على نفس السجل.
6. فضل Many2one على Char للبيانات المنظمة
عندما تكون القيمة لكل شركة مرجعًا لسجل آخر (حساب، قائمة أسعار، شريك)، استخدم حقل يعتمد على الشركة من نوع Many2one بدلاً من تخزين اسم كنص. هذا يحافظ على نظافة نموذج البيانات ويجعل التقارير أكثر موثوقية.
المزالق الشائعة
حتى مطوري Odoo ذوي الخبرة يواجهون مشاكل مع الحقول المعتمدة على الشركة. معرفة ما يجب الانتباه إليه ستمنع إضاعة الوقت في تصحيح الأخطاء.
فخ 1: نسيان سياق الشركة في الإجراءات الآلية
غالبًا ما تعمل الإجراءات المجدولة وإجراءات الخادم في سياق حيث تكون الشركة هي أول شركة في قاعدة البيانات، وليس بالضرورة تلك التي تتوقعها. إذا كانت إجراءاتك الآلية تقرأ أو تكتب حقلًا يعتمد على الشركة، تحقق من سياق الشركة بشكل صريح. استخدم with_company() لتكون في أمان.
فخ 2: افتراض أن الحقل يتصرف مثل حقل محسوب
الحقول المعتمدة على الشركة ليست حقولًا محسوبة. ليس لديها طريقة compute. تأتي التباينات لكل شركة من التخزين، وليس من الحساب. محاولة إضافة compute= جنبًا إلى جنب مع company_dependent=True لن تعمل كما هو متوقع وقد تسبب أخطاء في إطار عمل Odoo.
فخ 3: البحث عبر الشركات
تبحث عمليات البحث القياسية في ORM على الحقول المعتمدة على الشركة فقط عن النتائج التي تتطابق مع سياق الشركة الحالي. إذا كنت بحاجة إلى البحث عبر جميع الشركات، تحتاج إلى استعلام ir.property مباشرة (Odoo 16 وما قبله) أو التعامل مع عمود jsonb بعناية (Odoo 17+). هذا مصدر شائع للارتباك في التقارير وأعمال استخراج البيانات.
الفخ 4: عدم تعيين القيم الافتراضية لجميع الشركات
عند إدخال حقل يعتمد على الشركة في نظام مباشر، ستعيد السجلات الموجودة False أو None لأي شركة لم يتم تعيين قيمة لها بشكل صريح. إذا كانت منطق الأعمال الخاص بك يتوقع قيمة افتراضية، قم بتعيينها بشكل استباقي لجميع الشركات المعنية باستخدام نص ترحيل البيانات.
الفخ 5: الخلط بينه وبين حقوق الوصول
تتحكم الحقول المعتمدة على الشركة في القيمة المعروضة، وليس ما إذا كان يمكن للمستخدم رؤية الحقل على الإطلاق. إذا كنت بحاجة إلى إخفاء حقل تمامًا عن شركات أو مستخدمين معينين، فإن هذه مهمة لقواعد السجلات أو حقوق الوصول على مستوى الحقل، وليس company_dependent.
الخاتمة
الحقل المعتمد على الشركة هو أحد تلك الميزات في Odoo التي تبدو غير مرئية حتى تحتاج إليها، ثم تصبح لا غنى عنها. إنه الأداة المناسبة لأي حالة تحتاج فيها السجل نفسه إلى حمل قيم مختلفة عبر الشركات: تكوينات المحاسبة، قواعد التسعير، المراجع التنظيمية، أو أي سمة خاصة بالأعمال تختلف حسب الكيان القانوني.
فهم كيفية عمله على مستوى ORM، وأي إصدار من Odoo غير نموذج التخزين، وما هي الفخاخ التي يجب تجنبها سيوفر لك وقتًا كبيرًا في مشاريع الشركات المتعددة. سواء واجهته في دليل مطور Odoo القياسي أو اكتشفته أثناء تصحيح نظام مباشر، فإن معرفة هذا النوع من الحقول هو علامة على خبرة حقيقية في Odoo.
إذا كنت تبني على إطار عمل Odoo وتحتاج إلى التعامل مع بيانات لكل شركة بشكل نظيف، فإن company_dependent=True هو الجواب الذي كنت تبحث عنه.
هل تحتاج إلى مساعدة في تنفيذ أودو الخاص بك؟
في Dasolo، نساعد الشركات في تنفيذ وتخصيص وتحسين Odoo عبر جميع المقاييس والتكوينات، بما في ذلك الإعدادات المعقدة متعددة الشركات. سواء كنت بحاجة إلى نموذج بيانات مخصص، أو استراتيجية حقل مخصصة، أو تنفيذ كامل لـ Odoo، فإن فريقنا لديه العمق الفني والوظيفي لتحقيق ذلك بشكل صحيح.
إذا كانت لديك أسئلة حول الحقول المعتمدة على الشركة أو أي جانب آخر من تنفيذ Odoo الخاص بك، فنحن سعداء للمساعدة. تواصل معنا ودعنا نتحدث عما تقوم ببنائه.