مقدمة
في Odoo تُعرّف النماذج (models) الطريقة التي يُخزّن بها النظام البيانات ويُنظّمها داخل قاعدة البيانات. كل عنصر في العمل—من طلبات البيع إلى الفواتير وحركات اليومية—يُخزّن ضمن نموذج معيّن يحدّد حقوله وعلاقاته.
فهم النماذج أساسي لكل من المستشارين الوظيفيين والمطورين؛ لأنها العمود الفقري لهندسة بيانات Odoo. عبر النماذج تُعرّف الحقول، الروابط بين السجلات، والمنطق التجاري الذي يتحكّم في سلوك النظام.
سنركز هنا على أحد أهم نماذج المحاسبة في Odoo: account.move.line. سواء كنت تبني تقارير مخصّصة، توصل نظام خارجي، أو تضبّط إجراءات التسوية، فستتعامل مع هذا النموذج بانتظام.
ما هو نموذج account.move.line
نموذج account.move.line يمثّل السطر الواحد في القيد المحاسبي — أي أحد المدينين أو الدائنين داخل قيد اليومية. مجموعة السطور في قيد واحد يجب أن تتوازن: مجموع المدينين يساوي مجموع الدائنين.
يُستخدم هذا النموذج داخل تطبيق المحاسبة في Odoo. هو سجل تابع لنموذج account.move الذي يُمثّل القيد نفسه (كالفاتورة، الفاتورة المستلمة، قيد تسوية البنك أو قيد يدوي). كل قيد يحتوي على سطر واحد أو أكثر.
التعريف الأساسي للنموذج موجود في وحدة الحسابات (account). وحدات أخرى توسّعه عبر وراثة النماذج: مبيعات تضيف تفاصيل خطوط الفاتورة، المشتريات تضيف بيانات خطوط المصروفات، والحساب التحليلي يضيف التوزيع التحليلي. بهذه الطريقة تُبقى البنية الأساسية موحّدة دون تكرار.
الحقول الأساسية في النموذج
فيما يلي الحقول الأهم في account.move.line التي ستحتاج معرفتها للتعامل مع القيود والتقارير والتسويات المالية.
1. name
نوع الحقل: نص قصير (Char). يحوي وصف السطر أو الوسم الظاهر في واجهات القيد والتقارير. غالبًا يُملأ من اسم المنتج أو وصف مخصّص عند إنشاء فاتورة.
2. move_id
نوع الحقل: Many2one إلى account.move. يربط السطر بقيده الأب. كل سطر ينتمي إلى قيد واحد فقط، وهذه العلاقة هي المحور الأساسي للنموذج.
3. account_id
نوع الحقل: Many2one إلى account.account. الحساب الذي تُسجّل عليه القيمة. حقل مطلوب ويجب أن يكون حساباً تنفيذياً (ليس حساب عرض) وصالحاً للاستخدام، ويُستخدم لتجميع التقارير حسب دليل الحساب.
4. debit
نوع الحقل: عدد عشري. مبلغ المدين. القيمة الافتراضية 0.0. لكل سطر يكون إما مدين أو دائن، لا كلاهما. المدين يرفع أرصدة الأصول والمصروفات.
5. credit
نوع الحقل: عدد عشري. مبلغ الدائن. القيمة الافتراضية 0.0. الدائن يرفع أرصدة الالتزامات وحقوق الملكية والإيرادات. مجموع المدين يساوي مجموع الدائن عند القيد.
6. balance
نوع الحقل: عدد عشري محسوب: debit - credit. يبيّن التأثير الصافي للسطر؛ موجب للمدين وسالب للدائن. يُستخدم في تقارير وتسويات الحسابات.
7. partner_id
نوع الحقل: Many2one إلى res.partner. الطرف المقابل—عميل أو مورد أو جهة أخرى. مهم لقيود المدينين والدائنين، جداول الاستحقاق، وعملية التسوية.
8. date
نوع الحقل: تاريخ. التاريخ الفعّال للسطر، عادةً يستمد من القيد الأب. يؤثر في إقفال الفترات والتقارير وجداول الاستحقاق.
9. date_maturity
نوع الحقل: تاريخ. تاريخ الاستحقاق للدفع؛ ذو صلة بالذمم المدينة والدائنة ويُستخدم في تقارير العمر وحجز المدفوعات.
10. currency_id
نوع الحقل: Many2one إلى res.currency. عملة السطر والتي قد تختلف عن عملة الشركة في حالات الحسابات بعملات متعددة.
11. amount_currency
نوع الحقل: عدد عشري. المبلغ بالعملة المذكورة في currency_id. يُستخدم لحساب القيم في قيود بعملات أجنبية وتسهيل المحاسبة متعددة العملات.
12. quantity
نوع الحقل: عدد عشري اختياري. كمية مرتبطة بالسطر عند وجود منتج—مفيد لتقارير مبنية على الكميات وحساب أسعار الوحدة.
13. product_id
نوع الحقل: Many2one إلى product.product. المنتج المرتبط بالسطر، يُملأ عند إنشاء سطر من أمر بيع أو شراء أو سطر فاتورة.
14. product_uom_id
نوع الحقل: Many2one إلى uom.uom. وحدة القياس المستخدمة مع الكمية لضمان عرض وتحويل الكميات بشكل صحيح.
15. price_unit
نوع الحقل: عدد عشري. سعر الوحدة المستخدم مع الكمية لاحتساب المبالغ على الفواتير والمشتريات.
16. tax_ids
نوع الحقل: Many2many إلى account.tax. الضرائب المطبّقة على السطر؛ عند النشر ينشئ Odoo سطوراً ضريبية منفصلة للمبالغ الضريبية.
17. tax_line_id
نوع الحقل: Many2one إلى account.tax. يُشير لسطر ضريبي يُنشىء بواسطة ضريبة معينة، لتمييز سطور الضرائب عن السطور العادية.
18. analytic_account_id
نوع الحقل: Many2one إلى account.analytic.account. الحساب التحليلي لتتبّع التكاليف والإيرادات عند تفعيل المحاسبة التحليلية.
19. analytic_distribution
نوع الحقل: JSON/نص. يخزن توزيع التحليل عبر عدة حسابات تحليلية؛ يُستخدم في النسخ الأحدث كبديل للتخصيص البسيط عبر analytic_account_id.
20. ref
نوع الحقل: نص قصير. مرجع خارجي أو ملاحظة تُعرض في التقارير وتساعد في مطابقة القيود أثناء التسوية.
21. narration
نوع الحقل: نص طويل. ملاحظة داخلية من القيد الأب؛ عادة لا تُطبع في المستندات الموجهة للعميل.
22. journal_id
نوع الحقل: Many2one إلى account.journal. اليومية التي ينتمي إليها القيد؛ مفيد للتصفية والتقارير حسب اليومية.
23. company_id
نوع الحقل: Many2one إلى res.company. الشركة المالكة للسطر؛ في بيئات متعددة الشركات كل سطر مرتبط بشركة واحدة ويؤثر ذلك على الرؤية والتقارير الموحدة.
24. reconciled
نوع الحقل: منطقي (Boolean). يبيّن ما إذا تم تسوية السطر بالكامل؛ يُستخدم لتصفية البنود غير المسواة في واجهات التسوية.
25. full_reconcile_id
نوع الحقل: Many2one إلى account.full.reconcile. يربط السطور التي تم تسويتها معًا كمجموعة واحدة، مما يسهل تتبع عملية التسوية الكاملة.
26. payment_id
نوع الحقل: Many2one إلى account.payment. يربط سطور الدفعات بسجل الدفعة عند تسوية فواتير بواسطة دفعات.
27. statement_id
نوع الحقل: Many2one إلى account.bank.statement. يربط سطور القيد بكشف البنك عند استعمال تسوية كشف الحسابات البنكية.
28. statement_line_id
نوع الحقل: Many2one إلى account.bank.statement.line. يربط السطر بخط كشف بنكي محدد عند مطابقة القيود مع حركات البنك.
29. display_type
نوع الحقل: اختيار. يُستخدم لأسطر عرضية مثل رؤوس الأقسام أو ملاحظات داخل القيد (line_section أو line_note). هذه الأسطر لا تحتوي على مدين أو دائن وتُستخدم للعرض فقط.
30. create_date
نوع الحقل: تاريخ ووقت. وقت إنشاء السجل؛ يُدار آليًا ومفيد لأغراض التدقيق.
31. write_date
نوع الحقل: تاريخ ووقت. وقت آخر تعديل على السجل؛ يُدار آليًا ويساعد في تتبع التغييرات مع الزمن.
كيف يدخل هذا النموذج في سير العمل اليومي للشركة
1. فواتير العملاء
عند تأكيد فاتورة، يُنشئ Odoo سطورًا في account.move.line: سطور إيراد تذهب لحسابات الإيرادات، وسطور ذمم مدينة تذهب لحساب العميل، وسطور ضرائب لكل ضريبة مطبقة. الحقل partner_id يربط السطر بالعميل لتقارير العمر والتسوية.
2. فواتير الموردين
تُنتج فواتير الموردين سطور مصروفات، وذكور ضريبيّة (ضريبة مدخلات) وسطور ذمم مدينة للمورد. بنية السطور مشابهة لفواتير العملاء لكن مع أنواع حسابات مختلفة.
3. تسوية البنك
تُطابق حركات كشف البنك مع سطور القيد عبر statement_line_id. عند التسوية يربط Odoo السطور باستخدام full_reconcile_id ويُعلم الحقل reconciled على أنه True.
4. قيود يدوية
يسنخدم المستخدمون واجهة إنشاء قيود يدوية تتضمّن عدة سطور. كل سطر يحتاج حسابًا ومبلغ مدين أو دائن وربما طرفًا. قبل الترحيل يفرض Odoo تساوي مجموع المدين مع الدائن.
5. تقارير تحليلية وتكاليف
عند تفعيل المحاسبة التحليلية تُحمل السطور معلومات analytic_account_id أو analytic_distribution. تسمح التقارير بتجميع التكاليف والإيرادات بحسب مشروع أو قسم أو بُعد تحليلي آخر.
كيف يوسع المطورون هذا النموذج
يستعمل المطورون أنماطًا معروفة لتوسيع account.move.line، حيث تُعد وراثة النماذج الآلية الأداة الرئيسة لذلك.
وراثة النموذج
استعمل _inherit = 'account.move.line' لإضافة حقول جديدة أو تعديل سلوك أو إضافة قيود. توضع التوسعات في وحدة منفصلة حتى يسهل صيانتها مع التحديثات.
إضافة حقول
عرّف الحقول الجديدة ضمن النموذج المورث. اختر نوع الحقل المناسب—نص، علاقة Many2one، منطقية، عددية، نص طويل أو اختيار—وانظر فيما إذا كانت بحاجة لأن تكون معتمدة على الشركة. انتبه للحقول المحسوبة واعتماداتها لضمان الأداء.
امتدادات بايثون
يمكنك تجاوز دوال مثل create وwrite وunlink لإضافة منطق مخصّص، لكن استخدم super() لاستدعاء السلوك الأصلي. لا تكسر قاعدة تساوي المدين والدائن، وامتثل لواجهة API كي لا تتأثر التكاملات الخارجية.
Odoo Studio
يوفّر Odoo Studio طريقة سريعة لإضافة حقول بدون كود—مناسبة للحقول العرضية أو الوسوم. لكن للمنطق المعقّد أو قواعد التصفية والتسوية المخصّصة، تبقى الإضافات البرمجية في وحدة مخصصة أكثر استدامة.
ممارسات موصى بها
- لا تخلق أو تعدّل سطور القيد مباشرةً بعيدًا عن القيد الأب. استخدم واجهة القيد (مثل line_ids على السجل parent move) حتى يضمن Odoo تشغيل كل الفحوصات والحفاظ على الاتساق.
- عند بناء تقارير تحكّم بفلترة السطور عبر حالة القيد: مثلاً استبعد المسودات والقيود الملغاة بفحص move_id.state = 'posted'.
- استخدم account_id الصحيح حسب نوع الحساب (ذمم مدينة/ذمم دائنين…) لضمان سلوك صحيح في تقارير العمر والتسوية.
- عند التكامل عبر API، أنشئ القيد أولًا ثم أضف السطور، وتأكد من تساوي مجموع المدين مع الدائن قبل محاولة ترحيل القيد.
- لحقولك المخصّصة استعمل بادئة مثل
x_أو بادئة اسم الوحدة لتفادي تعارضات مع حقول في إصدارات Odoo المستقبلية.
أخطاء شائعة يجب تجنبها
- ضبط كل من debit وcredit في نفس السطر. يجب أن يحتوي السطر على إما مدين أو دائن فقط، لا كلاهما.
- إنشاء قيود غير متوازنة. مجموع المدين يجب أن يساوي مجموع الدائن—Odoo يتحقق من ذلك عند الترحيل.
- تعديل سطور مُرحّلة مباشرةً بدل عمل قيود عكسية أو قيود تعديل. القيود المرحّلة تُعدّ نهائية ويجب تعديل أثرها عبر قيود جديدة.
- نسيان ضبط partner_id على سطور الذمم المدينة/الدائنة. هذا يكسر تقارير العمر ويعقد عملية التسوية.
- تجاوز الدوال الأساسية بدون استدعاء
super(). هذا قد يكسر التسويات، الأقفال، أو يضر وظائف وحدات أخرى.
خاتمة
نموذج account.move.line هو قلب محاسبة Odoo: يخزن كل مدين ودائن في الفواتير والقيود البنكية والقيود اليدوية. معرفة حقوله وكيف تتوسّع الوحدات حوله تُسهّل ضبط النظام وتكاملاته.
سواء كنت مستشارًا وظيفيًا تُصمّم سير عمل محاسبي أو مطورًا يبني تقارير وتكاملات مخصّصة، فهم account.move.line يوفّر عليك وقتًا ويقلّل الأخطاء التشغيلية.
هل تحتاج مساعدة في تنفيذ Odoo لديك؟
تقوم Dasolo بمساعدة الشركات في تنفيذ وتعديل وتحسين Odoo، مع خبرة خاصة في تكاملات API وتطوير وحدات مخصّصة. فريقنا يملك معرفة عميقة ببنية بيانات Odoo ونماذج مثل account.move.line.
إذا احتجت دعمًا في تنفيذ Odoo، تطوير وحدات مخصّصة، أو ربط أنظمة خارجية، فنحن جاهزون لمساعدتك. احجز عرضًا توضيحيًا لنتحدّث حول مشروعك.