مقدمة
إذا كنت قد فتحت يومًا ما طلب مبيعات أو مهمة مشروع أو أمر تصنيع في Odoo، فقد استخدمت بالفعل حقل التاريخ. المواعيد النهائية، تواريخ التسليم، تواريخ استحقاق الفواتير، تواريخ بدء العقود - معظم البيانات الحساسة للوقت في Odoo مخزنة باستخدام هذا النوع من الحقول.
بالنسبة لمستخدمي الأعمال، فإن حقول التاريخ بديهية: تنقر، يظهر تقويم، تختار تاريخًا. لكن هناك المزيد يحدث في الخلفية. سيساعدك فهم كيفية عمل حقل التاريخ في نموذج بيانات Odoo، وكيف يختلف عن حقول التاريخ والوقت، وكيفية إنشائه أو تخصيصه في بناء سير عمل أكثر دقة وتجنب المفاجآت المتعلقة بالمناطق الزمنية التي تعرقل العديد من تطبيقات Odoo.
يغطي هذا الدليل كل ما تحتاج لمعرفته حول حقل التاريخ في Odoo، من ما يخزنه إلى كيفية استخدامه بفعالية في عملياتك التجارية.
ما هو حقل التاريخ في أودو
في ORM أودو، تم تصميم نوع fields.Date لتخزين تواريخ التقويم بدون مكون زمني. يتم تخزين تاريخ مثل "2026-03-06" كما هو، بدون ساعات أو دقائق أو ثوانٍ مرفقة.
في PostgreSQL، قاعدة البيانات التي تعمل عليها أودو، يتم ربط حقل التاريخ بنوع العمود DATE. وهذا يختلف عن حقل DateTime، الذي يرتبط بـ TIMESTAMP ويشمل طابع زمني كامل حتى الثانية.
في واجهة المستخدم، يتم عرض حقل التاريخ كمدخل نصي مع محدد تقويم. يمكن للمستخدمين إما كتابة تاريخ مباشرة أو النقر على أيقونة التقويم لاختيار واحد. في طرق العرض القائمة، يظهر كنص منسق متوافق مع لغة المستخدم.
إليك كيف يبدو تعريف حقل التاريخ في وحدة بايثون مخصصة:
from odoo import fields, models
class ProjectTask(models.Model):
_inherit = 'project.task'
x_deadline_confirmed = fields.Date(
string='الموعد النهائي المؤكد',
help='الموعد النهائي الذي تم تأكيده رسميًا والذي تم الاتفاق عليه مع العميل.',
)
في أودو ستوديو، يتم تسمية هذا الحقل ببساطة التاريخ. عند إنشائه من خلال ستوديو، يحصل على بادئة x_studio_ تلقائيًا. عند إنشائه عبر كود بايثون أو واجهة XML-RPC، تختار الاسم الفني بنفسك.
كيف يعمل الحقل
التاريخ مقابل DateTime: ما الذي يتغير فعلاً
أهم شيء يجب فهمه حول حقل التاريخ هو ما لا يتضمنه لا: الوقت. لا توجد ساعات، لا تحويلات زمنية، لا شيء يتجاوز تاريخ التقويم نفسه.
حقل DateTime، بالمقابل، يخزن طابعًا زمنيًا كاملًا ويتم حفظه بتوقيت UTC في قاعدة البيانات. ثم تقوم أودو بتحويله إلى المنطقة الزمنية المحلية للمستخدم عند العرض. هذا هو مصدر العديد من الأخطاء المحيرة "تاريخي انتقل ليوم واحد" التي تواجهها الفرق. تلك غالبًا ما تكون مشكلات DateTime، وليست مشكلات حقل التاريخ.
عند استخدامك لحقل التاريخ، ما تخزنه هو بالضبط ما يراه المستخدمون. قيمة 2026-03-15 هي 2026-03-15 لكل مستخدم، بغض النظر عن مكان وجودهم في العالم.
السمات الرئيسية للحقل
إليك أهم الخصائص التي يمكنك تكوينها على حقل التاريخ في إطار عمل أودو:
- مطلوب: يجعل الحقل إلزاميًا على كل من واجهة المستخدم ونموذج البيانات.
- افتراضي: يحدد قيمة افتراضية تلقائية. على سبيل المثال،
fields.Date.todayتعود بتاريخ اليوم للسجلات الجديدة. - فهرس: ينشئ فهرس قاعدة بيانات لتسريع التصفية والبحث على هذا الحقل.
- حساب: يربط طريقة بايثون تحسب القيمة ديناميكيًا.
- تخزين: عند دمجه مع
حساب، يحتفظ بالقيمة المحسوبة في قاعدة البيانات. - للقراءة فقط: يمنع المستخدمين من تعديل الحقل مباشرة في الواجهة.
- نسخ: يتحكم فيما إذا كانت القيمة تُنقل عند تكرار سجل. الافتراضي هو
صحيح.
كيف يظهر في العروض
في عروض النماذج، يتم عرض حقل التاريخ كمدخل نصي مع نافذة منبثقة للتقويم. في عروض القوائم، يظهر كنص منسق. في عروض البحث، يدعم عوامل تصفية نطاق التاريخ بشكل افتراضي: "هذا الأسبوع"، "هذا الشهر"، "هذا الربع"، بالإضافة إلى عوامل المقارنة الدقيقة مثل قبل، بعد، وعلى تاريخ محدد.
يتبع تنسيق العرض إعدادات لغة المستخدم في أودو. يرى المستخدم الأمريكي MM/DD/YYYY بينما يرى المستخدم الأوروبي DD/MM/YYYY. القيمة المخزنة الأساسية دائمًا بتنسيق ISO (YYYY-MM-DD)، بغض النظر عن كيفية ظهورها على الشاشة.
التفاعل مع ORM أودو
عند قراءة حقل التاريخ في الكود، يُرجع ORM الخاص بـ Odoo كائن datetime.date في بايثون، أو False إذا كان الحقل فارغًا. عند الكتابة من خلال ORM، يمكنك تمرير إما كائن datetime.date أو سلسلة بتنسيق "YYYY-MM-DD". من خلال واجهة برمجة التطبيقات XML-RPC، يتم دائمًا تمرير واستقبال التواريخ كسلاسل.
لا توجد تحويلات معقدة متضمنة عند العمل مع حقول التاريخ في نموذج بيانات Odoo. يتولى الإطار تنسيق البيانات وتخزينها تلقائيًا، وهو جزء مما يجعل هذا النوع من الحقول عمليًا للاستخدام اليومي في تطوير Odoo.
حالات الاستخدام التجارية
يظهر حقل التاريخ في كل جزء تقريبًا من تنفيذ Odoo. إليك خمسة أمثلة عملية من سير العمل التجارية الحقيقية.
إدارة علاقات العملاء: تواريخ بدء وانتهاء العقود
في فرق المبيعات التي تستخدم Odoo CRM، غالبًا ما تحتوي العقود على تواريخ بدء وانتهاء محددة. يجعل حقل التاريخ على العميل أو نموذج العقد المخصص من السهل تتبع متى يتم تفعيل الصفقات ومتى تنتهي.
بالإضافة إلى الإجراءات التلقائية، يمكنك تفعيل تذكيرات عبر البريد الإلكتروني أو تغييرات في الحالة عندما تقترب مدة العقد من تاريخ انتهائه، دون أي متابعة يدوية من الفريق. هذا النوع من الأتمتة سهل الإعداد ويوفر الكثير من التجديدات المفقودة مع مرور الوقت.
المبيعات: تواريخ التسليم المطلوبة
غالبًا ما يطلب العملاء تاريخ تسليم محدد عند تقديم الطلبات. تضيف العديد من الشركات حقل "تاريخ مطلوب من العميل" على طلبات البيع لتوفير تاريخ هدف واضح لفريق العمليات للتخطيط حوله.
استخدام حقل التاريخ بدلاً من DateTime يبقي البيانات بسيطة ويتجنب ارتباك المناطق الزمنية أثناء التنسيق في المستودع. يرى فريق المستودع نفس التاريخ الذي أدخله فريق المبيعات، دون أي خطر من مشاكل التحويل.
المخزون: تواريخ انتهاء الصلاحية على الدفعات
في الصناعات الغذائية والصيدلانية والكيميائية، تحتاج دفعات المنتجات إلى تتبع تواريخ انتهاء الصلاحية على مستوى المستودع. يستخدم نظام إدارة الدفعات في Odoo حقول التاريخ لتخزين تواريخ انتهاء الصلاحية وتواريخ الأفضل قبل stock.lot.
تدفع هذه الاستراتيجيات الخاصة بالاختيار وفقًا لتاريخ انتهاء الصلاحية (FEFO) والتنبيهات التلقائية عندما تقترب المخزونات من انتهاء الصلاحية، مما يحمي كل من الامتثال التنظيمي وجودة المنتج دون الحاجة إلى فحوصات يدوية.
المحاسبة: مواعيد استحقاق الفواتير
مواعيد استحقاق الفواتير في أودو هي حقول تاريخ. تحدد متى يتم إرسال تذكيرات الدفع التلقائية، وكيف يتم تحديد الفواتير المتأخرة، وكيف يتم حساب تقارير الحسابات المستحقة والذمم المدينة.
الحصول على هذه التواريخ بشكل صحيح هو أحد الاستخدامات الأكثر أهمية من الناحية التشغيلية لحقل التاريخ في نموذج بيانات أودو بالكامل. تاريخ استحقاق خاطئ يكسر تتبع التدفق النقدي وأتمتة المتابعة بشكل صامت.
الموارد البشرية: التوظيف، تاريخ العقد، وتواريخ الشهادات
تعتمد فرق الموارد البشرية بشكل كبير على حقول التاريخ لتواريخ التوظيف، وتواريخ انتهاء فترة التجربة، وتواريخ بدء وانتهاء العقود، وتواريخ انتهاء صلاحية الشهادات. هذه القيم تغذي رسائل البريد الإلكتروني التلقائية، والتنبيهات، وقواعد حساب الرواتب.
من المستحيل وجود وحدة موارد بشرية مصممة بشكل جيد في أودو دون بيانات حقول تاريخ نظيفة ودقيقة عبر سجلات الموظفين. غالبًا ما تكون هذه التواريخ هي المحفزات لبعض الأتمتة الأكثر أهمية في إعداد أودو.
إنشاء أو تخصيص حقل التاريخ
هناك ثلاث طرق رئيسية لإضافة حقل تاريخ إلى نموذج أودو، اعتمادًا على إعدادك الفني ونهج النشر.
استخدام أودو ستوديو (بدون كود)
أودو ستوديو هو أسهل طريقة لإضافة حقل تاريخ دون كتابة أي كود. هذه هي الطريقة الموصى بها لمستخدمي الأعمال والاستشاريين الذين يرغبون في إضافة تتبع التواريخ إلى نماذج أودو القياسية بسرعة:
- افتح أودو ستوديو من القائمة الرئيسية.
- انتقل إلى النموذج الذي تريد إضافة الحقل إليه.
- اسحب حقل التاريخ من الشريط الجانبي إلى النموذج.
- قم بتعيين التسمية، حالة الإلزام، وقيمة افتراضية إذا لزم الأمر.
- احفظ وأغلق الاستوديو.
ينشئ الاستوديو الحقل مع بادئة x_studio_ ويضيفه إلى عرض النموذج على الفور. لا حاجة لترحيل قاعدة البيانات من جانبك.
استخدام بايثون في وحدة مخصصة
بالنسبة للمطورين الذين يقومون بإنشاء وحدات Odoo، يتم تعريف حقول التاريخ في ملفات نماذج بايثون. هذه هي الطريقة الصحيحة لأي تخصيص يحتاج إلى التحكم في الإصدار ونشره عبر بيئات متعددة:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_customer_requested_date = fields.Date(
string='تاريخ الطلب المطلوب من العميل',
index=True,
copy=False,
help='تاريخ التسليم المطلوب من العميل عند وقت الطلب.',
)
بعد إضافة الحقل إلى النموذج، تحتاج أيضًا إلى إضافته إلى ملف العرض XML ذي الصلة حتى يظهر في الواجهة. تتولى Odoo إنشاء عمود قاعدة البيانات عند تثبيت الوحدة أو ترقيتها.
استخدام واجهة XML-RPC API
لإنشاء الحقول برمجيًا كجزء من خط أنابيب النشر أو دفتر تكوين بعيد، يمكنك إنشاء حقول التاريخ عبر واجهة Odoo XML-RPC API:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_customer_requested_date',
'field_description': 'تاريخ الطلب المطلوب من العميل',
'model_id': model_id,
'ttype': 'date',
'state': 'manual',
}]
)
قيمة ttype لحقل التاريخ هي 'date'. بالنسبة لحقل DateTime ستكون 'datetime'. استخدام 'manual' كحالة يخبر Odoo أن هذا الحقل تم إنشاؤه يدويًا، وليس من خلال تثبيت وحدة. هذه هي الطريقة التي تدير بها Dasolo إنشاء الحقول عن بُعد للعملاء كجزء من نصوص التكوين الآلي.
أفضل الممارسات
1. استخدم التاريخ، وليس تاريخ ووقت، عندما يكون الوقت غير ذي صلة
إذا كان الشيء الوحيد المهم هو تاريخ التقويم (موعد نهائي، تاريخ عقد، تاريخ ميلاد، تاريخ انتهاء)، استخدم fields.Date. اختيار تاريخ ووقت للبيانات المعتمدة فقط على التاريخ يضيف تعقيد المنطقة الزمنية دون فائدة عملية، ويمكن أن يسبب أخطاء مربكة تتعلق باليوم الواحد اعتمادًا على تكوين المنطقة الزمنية للخادم.
2. حدد قيمة افتراضية ذات معنى عندما يكون ذلك منطقيًا
بالنسبة للحقول مثل "تاريخ التسليم المتوقع" أو "تاريخ المتابعة"، فإن الافتراض إلى اليوم أو اليوم زائد عدد من الأيام يمنح المستخدمين نقطة انطلاق معقولة. استخدم default=fields.Date.today بدون أقواس للحصول على قيمة افتراضية ديناميكية يتم تقييمها في وقت إنشاء السجل، وليس في وقت تعريف الفئة.
3. قم بفهرسة حقول التاريخ المستخدمة في التقارير ومرشحات البحث
إذا كان مستخدموك يقومون بانتظام بتصفية السجلات حسب حقل تاريخ (فواتير متأخرة، تجديدات قادمة، شهادات تنتهي)، أضف index=True. على مجموعات البيانات الكبيرة، هذا يحسن بشكل كبير أداء الفلترة والتقارير. إنها تغيير صغير له تأثير كبير على نطاق واسع وتكلفته تقريبًا لا شيء للتنفيذ مسبقًا.
4. استخدم copy=False للتواريخ التي لا ينبغي أن تنتقل
التواريخ مثل "تاريخ بدء العقد" أو "تاريخ انتهاء الصلاحية" لا ينبغي نسخها عندما يقوم المستخدم بتكرار سجل. إضافة copy=False تجبر المستخدم على تعيين التاريخ بشكل صريح على السجل الجديد، مما يتجنب الأخطاء الصامتة حيث يستمر تاريخ قديم في عقد مكرر أو مهمة مشروع.
5. أضف قيودًا عندما تشكل حقلين تاريخيين نطاقًا
كلما كان لدى النموذج زوج من "تاريخ البدء" و"تاريخ الانتهاء"، أضف قيد بايثون باستخدام @api.constrains لضمان عدم كون تاريخ الانتهاء قبل تاريخ البدء. هذا سهل التنفيذ ويمنع فئة كاملة من مشاكل جودة البيانات التي تكون مزعجة للتشخيص بعد حدوثها.
المزالق الشائعة
حقول التاريخ وتاريخ ووقت المربكة
هذا هو الخطأ الأكثر شيوعًا عند العمل مع البيانات الحساسة للوقت في أودو. يخزن تاريخ ووقت طابعًا زمنيًا كاملًا بتوقيت UTC ويقوم بالتحويل عند العرض. يخزن التاريخ فقط تاريخ التقويم دون تحويل. استخدام تاريخ ووقت عندما تحتاج فقط إلى تاريخ يؤدي إلى مشاكل في المنطقة الزمنية: قد يظهر تاريخ تم إدخاله كـ 15 مارس في بيئة UTC+2 كـ 14 مارس لمستخدم في UTC-5.
استخدم دائمًا أبسط نوع حقل يلبي احتياجات عملك الفعلية.
عدم أخذ المنطقة الزمنية للخادم في الاعتبار في الإجراءات المجدولة
عند بناء إجراءات مجدولة أو تقارير تقوم بتصفية حقل التاريخ بالنسبة إلى "اليوم"، كن على علم بأن fields.Date.today() تعيد تاريخ الخادم بتنسيق UTC. بالنسبة لمعظم حالات الاستخدام للتقارير، فإن هذا مقبول، ولكنه قد يتسبب في اختلاف يوم واحد للفرق في المناطق الزمنية التي تختلف بشكل كبير عن الخادم. اختبر الأتمتة المعتمدة على التاريخ من مناطق زمنية متعددة إذا كان فريقك موزعًا عالميًا.
غياب القيود على أزواج نطاق التاريخ
من الشائع رؤية تطبيقات حيث يوجد "تاريخ البدء" و"تاريخ الانتهاء" كحقول منفصلة ولكن لا توجد تحقق يضمن أن تاريخ الانتهاء يأتي بعد تاريخ البدء. هذا يسمح بدخول بيانات غير صالحة إلى النظام بهدوء، مما يكسر حسابات المدة، ونتائج التصفية، والتقارير. أضف دائمًا تحقق @api.constrains عندما تشكل تاريخان نطاقًا منطقيًا.
نسيان فهرسة حقول التاريخ المستخدمة في الفلاتر
تستخدم حقول التاريخ في فحوصات "المتأخرات"، ووجهات نظر "المواعيد النهائية القادمة"، أو تقارير الرصيد المتقادم عادةً في استعلامات بمقارنات مثل "التاريخ أقل من اليوم". بدون فهرس، كل استعلام من هذا القبيل هو مسح كامل للجدول. على النماذج التي تحتوي على عدد كبير من السجلات مثل الفواتير، والمهام، أو حركات المخزون، يؤدي نقص الفهارس على حقول التاريخ إلى إبطاء العمليات اليومية بشكل ملحوظ مع مرور الوقت.
تخزين التواريخ كحقول Char
تقوم بعض الفرق بتخزين التواريخ كسلاسل نصية في حقول Char للحفاظ على تنسيق مخصص أو لتجنب اختيار التاريخ. هذا يكسر تمامًا الفرز، والتصفية، والحسابات المتعلقة بالتاريخ، والتقارير. استخدم دائمًا النوع المناسب fields.Date. يتعامل إطار عمل Odoo وقاعدة البيانات مع التنسيق والتعريب تلقائيًا، لذا لا يوجد سبب عملي لتخزين التواريخ كنص عادي.
الأسئلة الشائعة
ما الفرق بين حقل التاريخ وحقل DateTime في Odoo؟
يخزن حقل التاريخ تاريخًا تقويميًا فقط (السنة، الشهر، اليوم) بدون مكون زمني. يخزن حقل DateTime طابعًا زمنيًا كاملًا بما في ذلك الساعات والدقائق والثواني، محفوظًا بتنسيق UTC ويعرض في المنطقة الزمنية المحلية للمستخدم. استخدم التاريخ عندما يكون وقت اليوم غير ذي صلة بعملية العمل. استخدم DateTime عندما تحتاج إلى تتبع بالضبط متى حدث شيء ما.
كيف يمكنني تعيين تاريخ اليوم كافتراضي لحقل التاريخ؟
في بايثون، استخدم default=fields.Date.today بدون أقواس. هذه دالة يمكن استدعاؤها يقوم أودو بتقييمها في وقت إنشاء السجل، لذا فإن القيمة الافتراضية دائمًا ما تكون التاريخ الحالي بدلاً من تاريخ ثابت تم تضمينه عند تعريف الفئة. في أودو ستوديو، اختر "اليوم" كقيمة افتراضية في لوحة خصائص الحقل.
هل يمكنني حساب حقل تاريخ بناءً على قيم حقول أخرى؟
نعم. قم بتعريف الحقل باستخدام compute='_compute_my_date' واكتب طريقة مزينة بـ @api.depends() تسرد الحقول التي تؤدي إلى إعادة الحساب. داخل الطريقة، قم بإجراء حسابات التاريخ باستخدام datetime.date أو timedelta في بايثون. أضف store=True إذا كنت تريد حفظ النتيجة في قاعدة البيانات لاستخدامها في فلاتر البحث، والتجميع، والتصدير.
كيف يمكنني تصفية السجلات حسب نطاق تاريخ في مجال أودو؟
استخدم مشغلات المقارنة القياسية في المجال. على سبيل المثال، للعثور على السجلات التي يقع فيها حقل التاريخ في مارس 2026:
[
('x_date_field', '>=', '2026-03-01'),
('x_date_field', '<=', '2026-03-31')
]
يجب أن تكون سلاسل التاريخ في المجالات دائمًا بتنسيق ISO: YYYY-MM-DD.
هل يمكنني جعل حقل التاريخ إلزاميًا فقط تحت ظروف معينة؟
لا يفرض أودو القياسية حقول مطلوبة شرطية في الخلفية بدون كود. يمكنك استخدام attrs في XML العرض لتمييز حقل بصريًا كشرط بناءً على قيم أخرى، لكن التنفيذ الحقيقي في الخلفية يحتاج إلى قيد بايثون باستخدام @api.constrains. للحالات البسيطة، توفر قواعد الرؤية الشرطية في أودو ستوديو بديلاً عمليًا دون كتابة كود.
الخاتمة
حقل التاريخ هو أحد أكثر أنواع الحقول عملية في إطار عمل أودو. من السهل فهمه، وسهل الاستخدام، وقوي بما يكفي لدفع منطق الأعمال المهم مثل التذكيرات، والتحقق من المتأخرات، والتقارير الحساسة للوقت.
الأشياء الرئيسية التي يجب أن تأخذها في الاعتبار: استخدم التاريخ بدلاً من تاريخ ووقت عندما تحتاج فقط إلى تاريخ تقويمي، وفهم كيف تحسن القيم الافتراضية والفهارس من قابلية الاستخدام والأداء، ودائمًا أضف القيود عندما يحدد حقلان تاريخيان نطاقًا.
بناء نماذج بيانات نظيفة ومصممة جيدًا في أودو يبدأ بقرارات صغيرة مثل اختيار نوع الحقل الصحيح. الحصول على تلك القرارات بشكل صحيح من البداية هو أحد سمات تنفيذ أودو القوي، وحقل التاريخ هو قطعة أساسية من تلك اللغز.
في داسولو، نساعد الشركات على تنفيذ وتخصيص وتحسين أودو عبر جميع الأقسام وعمليات الأعمال. سواء كنت بحاجة إلى مساعدة في تصميم نموذج بيانات نظيف، أو إضافة حقول مخصصة وتدفقات عمل، أو بناء وحدة أودو كاملة من الصفر، فإن فريقنا هنا لمساعدتك. تواصل معنا ودعنا نتحدث عن مشروع أودو الخاص بك.