یک شرکت مشتری رفته است، قرارداد پایان یافته و میخواهید آن را در Odoo بایگانی کنید. Odoo با یک پیام خطا پاسخ میدهد: «شما نمیتوانید مخاطبانی را که به یک کاربر فعال مرتبطاند بایگانی کنید. ابتدا کاربر مربوط را بایگانی کنید.» اگر شرکت چند دسترسی پورتال دارد، یعنی: هر کاربر را جداگانه جستوجو کنید، جداگانه بایگانی کنید، به شرکت برگردید و دوباره بایگانی کنید.
ما برای این کار ماژول کوچک بایگانی شرکت همراه با کاربران پورتال (partner_archive_users) را برای Odoo 19 نوشتهایم. بهجای پیام خطا یک پرسش تأیید میآید و با «بله» کاربران پورتال و شرکت در یک گام بایگانی میشوند. این ماژول بهصورت نرمافزار آزاد تحت مجوز AGPL-3 در GitHub در دسترس است:
github.com/Alex0176/odoo-partner-archive-users
ما این ماژول را از ۳ نوامبر ۲۰۲۶ در سیستم عملیاتی Biricon IT Services به کار میبریم. ماژول جدید است و تجربهٔ ما با آن هنوز کوتاه. هر کس آن را برمیگیرد، باید بخشهای مربوط به دامنه و محدودیتها را بخواند.
مسئله در استاندارد Odoo
Odoo هنگام بایگانی یک مخاطب بررسی میکند که آیا کاربری به آن وابسته است و در صورت وجود، متوقف میشود. این بررسی معنا دارد، چون هر کاربر به یک مخاطب نیاز دارد. برای کاربران داخلی، یعنی کارمندان، این قفل خواستهشده هم هست. اما در مورد کاربران پورتال مشتریان این بیشتر کار دستی است. هر شرکت مشتری با دسترسیهای پورتال، مثلاً برای مشاهدهٔ فاکتورها و تیکتها، هنگام بایگانی به همین روند نیاز دارد:
- کاربران شرکت و رابطانش را جستوجو کنید،
- هر کدام را جداگانه بایگانی کنید،
- به شرکت برگردید،
- شرکت را بایگانی کنید.
راهحل: یک پرسش تأیید
ماژول مسیر اقدام ← بایگانی را در مخاطب، هم در فرم و هم در فهرست، گسترش میدهد. اگر به شرکت انتخابشده یا رابطانش کاربران فعال پورتال وابسته باشند، یک گفتوگو با این پرسش باز میشود: «آیا شرکت واقعاً بایگانی شود؟ هنوز کاربران فعال در سیستم وجود دارند.» در زیر آن کاربران مربوط با نام، نام ورود و مخاطب فهرست شدهاند.
- بله، شرکت و کاربران بایگانی شوند: ابتدا کاربران بایگانی میشوند، سپس شرکت.
- لغو: هیچ چیز تغییر نمیکند.
- کاربر پورتالی وجود ندارد: Odoo مانند گذشته رفتار میکند، هیچ گفتوگویی ظاهر نمیشود.
چه چیزی بایگانی میشود و چه چیزی نه
دامنه عمداً محدود تعریف شده است:
- فقط کاربران پورتال و عمومی (
share = True). کاربران داخلی از این مسیر هرگز بایگانی نمیشوند. اگر دسترسی یک کارمند به مخاطب وابسته باشد، پیام خطای Odoo باقی میماند. به این ترتیب هیچکس بهاشتباه یک کارمند را قفل نمیکند چون یک شرکت را بایگانی کرده است. - رابطان بهعنوان مخاطب فعال میمانند. فقط دسترسیهای پورتال آنها بایگانی میشود. این با استاندارد Odoo مطابقت دارد که هنگام بایگانی یک شرکت، مخاطبان زیرمجموعه را نیز لمس نمیکند.
- فقط مسیر بایگانی در رابط کاربری. یک
write({'active': False})مستقیم، مثلاً در یک واردسازی یا اسکریپت، بدون تغییر وارد بررسی Odoo میشود.
پیادهسازی فنی
ماژول هیچ فیلد جدیدی روی مدلهای موجود ندارد. از یک گسترش res.partner.action_archive و یک دستیار (partner.archive.users.wizard) تشکیل شده که بهصورت گفتوگو ظاهر میشود.
| جزء | وظیفه |
|---|---|
action_archive در مخاطب | کاربران فعال با share = True را که به مخاطب یا (در مورد شرکتها) به مخاطبان شرکت وابستهاند جستوجو میکند. اگر وجود داشته باشند، بهجای بایگانی گفتوگو برگردانده میشود. |
| دستیار | شرکت و کاربران یافتشده را ذخیره میکند، نشان میدهد و با «بله» بایگانی را با کلید زمینهٔ archive_linked_users اجرا میکند. |
زمینهٔ skip_archive_users_wizard | گفتوگو را خاموش میکند. در آن صورت دوباره بررسی Odoo اعمال میشود. |
| دسترسی | دستیار را کاربران داخلی (base.group_user) میتوانند ایجاد و استفاده کنند. |
| ترجمه | آلمانی (de.po) و الگو (.pot) پیوستاند. |
کاربران با حقوق افزوده جستوجو و بایگانی میشوند (sudo). به این ترتیب گفتوگو برای کاربرانی که به مدیریت کاربران دسترسی ندارند نیز کار میکند. روی دیگر این سکه در بخش محدودیتها.
یک یافته: آزمون سبز بود، اما گفتوگو باز هم خراب بود
ماژول در نخستین کاربرد خطایی داشت که آزمونهای خودکار آن را نیافتند. با نخستین کلیک روی «بایگانی» در رابط کاربری، بهجای گفتوگو صفحهٔ خطای Odoo با Cannot read properties of undefined (reading 'map') ظاهر شد.
علت: کلاینت وب action_archive را مستقیماً فرا میخواند و یک اقدام برگرداندهشده را بدون آمادهسازی بیشتر اجرا میکند. در این حین کلید views اقدام را الزاماً میخواند. اقدام ما فقط view_mode داشت. اقدامهایی را که از دکمههایی با type="object" میآیند، سرور پیشتر کامل میکند (clean_action در call_button)، اما فراخوانی مستقیم action_archive را نه. آزمونها متد را فقط در Python فرا میخواندند و آنجا فیلد جاافتاده به چشم نیامد.
رفع آن یک خط است ("views": [(False, "form")]) و افزون بر آن یک بررسی در آزمون که دقیقاً همین کلید را الزامی میکند. در این میان چیزی بایگانی نشد. درس: هر کس از متدی که کلاینت مستقیماً آن را فرا میخواند (action_archive، action_unarchive و مشابه) اقدامی برمیگرداند، باید همیشه views را نیز بدهد.
نصب
git clone https://github.com/Alex0176/odoo-partner-archive-users.git
ln -s /pfad/odoo-partner-archive-users/partner_archive_users /pfad/addons/
odoo-bin -c odoo.conf -d <datenbank> -i partner_archive_users --stop-after-init
وابستگیها base و contacts هستند. پس از نصب باید سرویس Odoo دوباره راهاندازی شود، چون ماژول کد Python دارد. هر کس سیستم عملیاتی دارد، ماژول را ابتدا روی یک کپی از پایگاه داده نصب میکند.
محدودیتها
- مجوز. از آنجا که کاربران با حقوق افزوده بایگانی میشوند، هر کس مجاز به بایگانی یک مخاطب باشد، از طریق گفتوگو میتواند دسترسیهای پورتال آن شرکت را نیز بایگانی کند. برای کاربران داخلی این صادق نیست. هر کس بخواهد دسترسیهای پورتال را دقیقتر ایمن کند، باید ماژول را سازگار کند.
- بازیابی خودکار وجود ندارد. اگر شرکت بعداً دوباره فعال شود، کاربران بایگانیشده میمانند. باید آنها را دستی دوباره فعال کرد.
- فقط مخاطبان. ماژول مربوط به شرکتها بهعنوان مخاطب است (
res.partner). بایگانی یک شرکت Odoo (res.company) بررسیهای دیگری دارد، مثلاً وقتی هنوز شرکت پیشفرض کاربران باشد. ماژول برای این منظور در نظر گرفته نشده است. - فقط روی Odoo 19.0 Community آزموده شده. برای نسخههای دیگر آن را بررسی نکردهایم.
پرسشهای متداول
چرا کارمندان همزمان بایگانی نمیشوند؟
یک کاربر داخلی در سیستم حقوق دارد و معمولاً با دادهها، وظایف و مجوزهای خودش مرتبط است. قفلکردن او بهعنوان اثر جانبی بایگانی یک شرکت برای ما بیش از حد پرخطر است. برای همین پیام خطای Odoo باقی میماند.
آیا میتوانم پرسش تأیید را خاموش کنم؟
در کد از طریق زمینهٔ skip_archive_users_wizard. تنظیمی در رابط کاربری وجود ندارد. هر کس ماژول را حذف نصب کند، دوباره رفتار استاندارد Odoo را میگیرد.
تحت چه مجوزی است؟
تحت AGPL-3. خطاها و بهبودها را بهصورت Issue در مخزن GitHub با خوشحالی میپذیریم.
پشتیبانی از سوی Biricon IT Services
ما نصبهای Odoo را برای کسبوکارهای کوچک و متوسط پشتیبانی میکنیم: از راهاندازی اولیه و سفارشیسازیها و مهاجرتها تا بهرهبرداری جاری. اگر میخواهید روندهایی مانند بایگانی شرکتهای مشتری را در Odoo ساده کنید، یک پورتال برای مشتریان خود راه بیندازید یا ماژولی را با اطمینان به نمونهٔ عملیاتی خود بیاورید، با کمال میل کمک میکنیم. توسعههای داخلی دیگر: شمارهٔ اسناد از پیشوند، سال و شمارنده, ثبت شرکتها و بررسی نشانی برای مشتریان اتریشی و مجموعههای محصول در پیشنهاد قیمت بهصورت بخش.
تاریخ بروزرسانی: ۳ نوامبر ۲۰۲۶. نسخهٔ ماژول 19.0.1.0.0 با رفع خطای همان روز. همهٔ نامها و نامهای ورود در تصاویر آزادانه انتخاب شدهاند.