مقدمة
في Odoo تُبنى البيانات حول نماذج تحدد البنية وطريقة التخزين. كل كيان تجاري—مثل فاتورة بيع أو عملية جرد أو منتج—يُخزّن داخل نموذج محدد في قاعدة البيانات.
فهم النماذج ضروري لكل من المستشارين التقنيين والوظيفيين. النماذج هي العمود الفقري لهيكل بيانات Odoo: تحدد الحقول، العلاقات، والمنطق الذي يطبّق قواعد العمل.
التركيز هنا على نموذج أساسي في إدارة المنتجات: product.product. سواء كنت تطور إضافات مخصصة، توصل نظام خارجي، أو تعد كتالوج منتجات، ستتعامل معه كثيرًا.
ما هو نموذج product.product
نموذج product.product يرمز إلى الأصناف الفعلية القابلة للبيع والشراء — أي المتغيرات الملموسة التي تُدرج على أوامر البيع، أوامر الشراء، وحركات المخزون.
هناك فصل واضح بين product.product و product.template: القالب يجمع الخصائص المشتركة لعائلة المنتج، بينما product.product يمثل كل متغير مفصّل. لمنتج بلا متغيرات توجد نسخة وحيدة من المتغير تقابل القالب؛ أما المنتجات القابلة للتخصيص (مثل قميص بأحجام وألوان مختلفة) فكل توليفة لها سجل product.product مستقل.
النموذج موجود ضمن وحدة المنتج في Odoo وتُستخدمه موديولات المبيعات، الشراء، الجرد، والمتجر الإلكتروني. كلما أضفت سطرًا في عرض سعر أو استلمت مخزونًا تتعامل عمليًا مع سجلات product.product.
يعتمد product.product على وراثة تفويضية من product.template؛ ذلك يسمح بتخزين البيانات المشتركة في القالب مع إمكانية تجاوز قيم معينة في المتغيرات عند الحاجة.
الحقول الأساسية في النموذج
فيما يلي الحقول الأهم التي يجب أن تعرفها في product.product — فهمها يُسهّل إدارة المتغيرات وربطها بالعمليات الأخرى.
1. name
نوع: نص قصير. اسم المتغير كما يظهر في القوائم والمستندات. في المنتجات البسيطة يتطابق مع اسم القالب، أما في المتغيرات فقد يضيف قيم الخواص لتوضيحها (مثل "قميص — أزرق / M").
2. product_tmpl_id
نوع: Many2one (product.template). رابط إلى القالب الأب. كل متغير مرتبط بقالب واحد؛ هذه العلاقة هي المحور عند وراثة الحقول أو تنفيذ منطق خاص بالعائلة.
3. default_code
نوع: نص قصير. مرجع داخلي أو رمز SKU يُستخدم للبحث، المطابقة مع أنظمة خارجية، وعمليات الباركود. كل متغير يمكن أن يمتلك رمزًا منفصلًا.
4. barcode
نوع: نص قصير. رمز الباركود (EAN/UPC...). يُستخدم في نقاط البيع والمخازن للمسح السريع؛ عند تعيينه يجب أن يكون فريدًا بين المنتجات.
5. create_date
نوع: تاريخ ووقت. تاريخ إنشاء السجل تُديره Odoo تلقائيًا، ويُفيد للتقارير والتدقيق.
6. write_date
نوع: تاريخ ووقت. تاريخ آخر تعديل على السجل، يُحدث تلقائيًا لمتابعة التغييرات.
7. active
نوع: منطقي. علم الأرشفة؛ عند تعيينه False يُخفى المنتج من العرض الافتراضي بدل حذفه نهائيًا للحفاظ على السجلات التاريخية.
8. type
نوع: اختيار. نوع المنتج: قابل للاستهلاك، خدمة، أو قابل للتخزين. يحدد هذا كيف يتعامل النظام مع المخزون وما إذا كانت وحدات التخزين تُتبع.
9. categ_id
نوع: Many2one (product.category). فئة المنتج لتنظيم الكتالوج، تطبيق قواعد التسعير، وإعداد التقارير؛ يمكن أن تكون الفئات متداخلة (أب/ابن).
10. list_price
نوع: عدد عشري. سعر البيع الافتراضي المعروض في عروض الأسعار والذي يمكن تعديله بواسطة القوائم السعرية أو الاتفاقات مع العملاء.
11. standard_price
نوع: عدد عشري. سعر التكلفة المستخدم في تقييم المخزون وحساب الهوامش، ويُحدّث عادة من أوامر الشراء أو إدخالات المحاسبة.
12. uom_id
نوع: Many2one (uom.uom). وحدة القياس للبيوع والمخزون (قطعة، كجم، لتر...). تحدد كيف تُعبر الكميات.
13. uom_po_id
نوع: Many2one (uom.uom). وحدة القياس عند الشراء — قد تختلف عن uom_id (شراء بالعلب وبيع بالقطع) وتحوّل Odoo بينهما تلقائيًا.
14. description_sale
نوع: HTML. وصف البيع الذي يظهر في عروض الأسعار والفواتير؛ يدعم تنسيق النص لتقديم تفاصيل المنتج.
15. description_purchase
نوع: HTML. وصف الشراء الموجّه للموردين ويُدرج في أوامر الشراء وفواتير الموردين.
16. sale_ok
نوع: منطقي. يحدد ما إذا كان المنتج متاحًا للبيع؛ إذا كان False يُستبعد من قوائم المبيعات والمتجر الإلكتروني.
17. purchase_ok
نوع: منطقي. يحدد ما إذا كان المنتج يمكن شراؤه من الموردين؛ يُستخدم للتمييز بين المنتجات المصنّعة والمنتجات التي لا تُشترى.
18. image_1920
نوع: ثنائي. صورة المنتج بدقة عالية؛ النظام يخزن أحجامًا متعددة للعرض في الواجهة والمتجر والتقارير.
19. weight
نوع: عدد عشري. وزن المنتج يستخدم لحسابات الشحن واللوجستيات، ووحدة القياس تعتمد على إعدادات الشركة.
20. volume
نوع: عدد عشري. حجم المنتج مهم لحسابات الشحن وسعة المستودع، خاصة عندما تكون القيود الحجمية ذات تأثير على التكلفة.
21. company_id
نوع: Many2one (res.company). عند العمل ببيئة متعددة الشركات يحدد مالك السجل ويؤثر على من يستطيع رؤيته وإدارته.
22. currency_id
نوع: Many2one (res.currency). عملة أسعار البيع والتكلفة عادةً تكون عملة الشركة، بينما قوائم الأسعار قد تحول القيم لعملات أخرى.
23. qty_available
نوع: عدد عشري. الكمية الفعلية في المخزون مُحتسبة من الكوانتات؛ حقل للقراءة فقط ويُستخدم للتحقّق من التوفر للمنتجات القابلة للتخزين.
24. virtual_available
نوع: عدد عشري. التوقع الكمي (الموجود + الوارد - الصادر) لحساب الاحتياجات وإعادة التوريد؛ حقل محسوب للقراءة فقط.
25. product_template_attribute_value_ids
نوع: Many2many. يربط قيم الخواص التي تحدد المتغير (مثل: اللون=أزرق، المقاس=M) ويُستخدم في المكوّنات المرئية ومحدّدات المتغيرات.
26. sequence
نوع: عدد صحيح. ترتيب العرض في القوائم أو منصات التصفية؛ القيم الأقل تظهر أولًا.
27. display_name
نوع: نص قصير محسوب. اسم العرض الذي يجمع اسم المنتج مع قيم المتغيرات ليُعرض في قوائم البحث والروابط.
28. responsible_id
نوع: Many2one (res.users). الشخص المسؤول عن المنتج—يُستخدم في قواعد إعادة الطلب وتوزيع المهام داخليًا.
كيف يُستخدم هذا النموذج في مسارات العمل التجارية
1. المبيعات وعروض الأسعار
عند إنشاء عرض سعر يختار مندوب المبيعات المنتج (product.product). تسحب سطور العرض سعر القائمة، وصف المبيع، ووحدة القياس تلقائيًا؛ يمكن أن تُعدّل الأسعار عبر قوائم الأسعار، وتظهر فقط المنتجات المسموح ببيعها (sale_ok=True).
2. الشراء والموردون
تُشير أوامر الشراء وفواتير الموردين إلى سجلات product.product. تُحدّث تكلفة المنتج من تكاليف الشراء، وتُستخدم uom_po_id لتحديد طريقة الطلب (مثلاً شراؤه بالعلبة بينما يُباع بالقطع).
3. الجرد والمخزون
حركات المخزون، وسندات النقل، والكوانتات كلها مرتبطة بالمتغيرات. الحقول qty_available و virtual_available هي مصدر القرار للتوافر وإعادة التوريد، ومسح الباركود يسرّع عمليات التخزين.
4. المتجر الإلكتروني والموقع
يعرض الموقع سجلات المتغيرات كخيارات للمنتج؛ الصور، الأوصاف، والأسعار تأتي من النموذج، وعلم البيع يتحكم في ظهور المنتج أو إخفائه من المتجر.
5. التصنيع وMRP
قوائم المواد تشير إلى المتغيرات لكل من المكونات والمنتج النهائي؛ نوع المنتج يحدد إن كان يُصنّع أم يُستهلك، ومستويات المخزون تُؤثر في تخطيط الإنتاج.
كيف يوسّع المطوّرون هذا النموذج
المطوّرون يوسّعون product.product بعدة أساليب، وأهمها وراثة النماذج في Odoo.
وراثة النموذج
استخدم _inherit = 'product.product' لإضافة حقول أو تعديل سلوك. أضف الحقول الجديدة، غيّر الدوال أو أضف قيودًا. الاحتفاظ بالتعديلات في موديل مستقل يسهل التحديثات؛ اختر product.product للبيانات الخاصة بالمتغيرات و product.template للبيانات المشتركة للعائلة.
إضافة حقول
عرّف الحقول الملائمة في الميراث مع النوع الصحيح: Char، Many2one، Boolean، Integer، Text، Selection. فكّر إن كان الحقل مشتركًا على مستوى القالب أو يجب أن يكون خاصًا بالمتغير—لرموز SKU والباركودات الخاصة بالمتغير استخدم product.product.
امتدادات بايثون
يمكنك تجاوز دوال مثل create وwrite وunlink لإدخال منطق مخصص، مع استدعاء super() لعدم تعطيل سلوك النظام الأساسي. احذر من الحقول المحسوبة واعتمد تبعياتها بشكل سليم لأن المنتج يحتوي على حقول محسوبة من موديولات الجرد والبيع.
Odoo Studio
Odoo Studio يسهّل إضافة الحقول بدون كود للمطلوبات السريعة، لكن للتخصيصات المعقدة أو عند الحاجة لصيانة طويلة الأمد يفضل كتابة موديول مخصص. واجهات التكامل (XML-RPC و JSON-RPC) تعرض نماذج Odoo بما في ذلك product.product للتكامل مع الأنظمة الخارجية.
ممارسات مُوصى بها
- استخدم default_code أو barcode للمطابقة مع الأنظمة الخارجية واجعلها ثابتة وفريدة لتفادي تعارضات في المزامنة.
- اضبط الحقل type لكل منتج بدقّة: قابل للاستهلاك أم قابل للتخزين أم خدمة؛ هذا يغير المسارات الوظيفية المطبّقة.
- في التكامل عبر API استخدم product.product في سطور الأوامر والمعاملات، أما product.template فمناسب للعمليات المتعلقة بإدارة الكتالوج على مستوى العائلة.
- عند إنشاء حقول مخصصة ضع بادئة
x_أو بادئة اسم الموديول لتقليل مخاطر التعارض مع إصدارات Odoo المستقبلية. - فكّر في إضافة الحقول على product.template إذا كانت تنطبق على جميع المتغيرات (مثل العلامة التجارية أو الفئة)، واستخدم product.product للمعلومات الخاصة بكل متغير (مثل باركود خاص بالمتغير).
أخطاء شائعة
- لا ترث من product.template عندما تحتاج منطقًا يخص المتغير فقط؛ استخدم product.product حينما يكون السلوك خاصًا بكل متغير.
- لا تنشئ سجلات product.product يدويًا إذا كان المنتج مُدارًا عبر القالب؛ للمنتجات ذات المتغيرات استخدم مُكوّن تكوين المنتج لإنشاء المتغيرات بطريقة سليمة.
- نسيان ضبط sale_ok أو purchase_ok قد يؤدي إلى إخفاء المنتج عن قنوات البيع أو الشراء في بعض الإعدادات الافتراضية.
- تجاوز دوال جوهرية بدون استدعاء super() قد يكسر وظائف موديولات أخرى أو يجعل الترقية المستقبلية صعبة.
- استخدام product.product في شروط البحث عندما يكون الأنسب الاستعلام على القالب (مثل فلترة حسب الفئة) قد يؤدي لنتائج غير دقيقة.
خاتمة
نموذج product.product هو حجر الزاوية في بنية المنتجات داخل Odoo. يمثل العناصر القابلة للبيع والشراء فعليًا؛ فهم حقوله وعلاقته مع product.template يساعد في التهيئة والتخصيص والتكامل بكفاءة.
سواءً كنت مستشارًا وظيفيًا ينسق كتالوجات أو مطوّرًا يبني موديولات مخصصة، إتقانك لـ product.product يوفر وقتك ويقلّل الأخطاء.
هل تحتاج مساعدة في تنفيذ Odoo لديك؟
شركة Dasolo تدعم الشركات في تنفيذ، تخصيص، وتحسين أنظمة Odoo. نتخصص في تكاملات API وتطوير Odoo مع خبرة عميقة في هيكلية البيانات ونماذج مثل product.product.
إذا رغبت بمساعدة في تنفيذ Odoo، تطوير موديولات مخصصة، أو التكاملات، فريقنا جاهز لدعمك. احجز عرضًا توضيحيًا لمناقشة مشروعك.