من چندتا گزینه در پرتال اودوو برای پرداخت و سفارش دوباره و ... دیدم میخواستم ببینم شرایطی که باعث میشه این دکمه ها نمایش داده بشوند چه چیزهایی هست.
1 پاسخ
. تابع _has_to_be_signed (امضا لازم است)
مکان: ماژول sale.order
نمایش دکمه: دکمه Sign & Pay
کد تابع
def _has_to_be_signed(self, include_draft=False): return (self.state == 'sent' or (self.state == 'draft' and include_draft)) and \ not self.is_expired and \ self.require_signature and \ not self.signature
توضیح عملکرد
این تابع بررسی میکند که آیا سفارش فروش باید امضا شود یا خیر. این بررسی بر اساس شرایط زیر انجام میشود:
- وضعیت سفارش باید ارسالشده (sent) باشد، یا پیشنویس (draft) باشد و پارامتر include_draft برابر True باشد.
- سفارش نباید منقضی شده باشد (not self.is_expired).
- سفارش باید نیاز به امضا داشته باشد (self.require_signature).
- سفارش هنوز امضا نشده باشد (not self.signature).
این تابع باعث میشود که دکمه ای در پرتال به صورت Sign & Pay نمایش داده شود.
۲. تابع _has_to_be_paid (پرداخت لازم است)
مکان: ماژول sale.order
نمایش دکمه: دکمه Accept & Pay
کد تابع:
def _has_to_be_paid(self, include_draft=False): transaction = self.get_portal_last_transaction() return (self.state == 'sent' or (self.state == 'draft' and include_draft)) and \ not self.is_expired and \ self.require_payment and \ transaction.state != 'done' and \ self.amount_total
توضیح عملکرد:
این تابع بررسی میکند که آیا سفارش فروش باید پرداخت شود یا خیر. شرایط به این صورت است:
- وضعیت سفارش باید یکی از موارد زیر باشد:
- ارسالشده (sent)
- پیشنویس (draft) در صورتی که پارامتر include_draft برابر True باشد.
- سفارش نباید منقضی شده باشد (not self.is_expired).
- سفارش باید نیاز به پرداخت داشته باشد (self.require_payment).
- آخرین تراکنش مالی مرتبط با سفارش نباید در وضعیت موفقیتآمیز باشد (transaction.state != 'done).
- مبلغ کل سفارش (self.amount_total) باید بزرگتر از صفر باشد.
این تابع باعث میشود که دکمه Accept & Pay در پرتال در ساید بار نمایش داده شود.
۳. تابع _is_reorder_allowed (اجازه سفارش مجدد)
مکان: ماژول sale.order
نمایش دکمه: دکمه Order Again
کد تابع در sale.order:
def _is_reorder_allowed(self): self.ensure_one() return self.state == 'sale' and \ any(line._is_reorder_allowed() for line in self.order_line if not line.display_type)
توضیح عملکرد:
این تابع بررسی میکند که آیا امکان ثبت سفارش مجدد برای سفارش فعلی وجود دارد یا خیر. شرایط شامل موارد زیر است:
- وضعیت سفارش باید sale باشد.
- حداقل یکی از خطوط سفارش (خطوطی که فیلد display_type آنها مقداردهی نشده باشد) باید شرایط لازم برای سفارش مجدد را داشته باشد. این شرایط از طریق فراخوانی تابع line._is_reorder_allowed بررسی میشود.
توابع کمکی:
۳.۱. تابع _is_reorder_allowed در sale.order.line:
کد تابع:
def _is_reorder_allowed(self): self.ensure_one() return self.product_id._is_add_to_cart_allowed()
توضیح:
این تابع بررسی میکند که آیا خط سفارش مربوطه اجازه سفارش مجدد دارد یا خیر. برای این کار، تابع product.product._is_add_to_cart_allowed را برای محصول این خط (از طریق self.product_id) فراخوانی میکند.
این تابع باعث میشود که دکمه Order Again در ساید بار پرتال نمایش داده شود.
۳.۲. تابع _is_add_to_cart_allowed در product.product:
کد تابع:
def _is_add_to_cart_allowed(self): self.ensure_one() return self.user_has_groups('base.group_system') or \ (self.active and self.sale_ok and self.website_published)
توضیح:
این تابع بررسی میکند که آیا یک محصول اجازه اضافه شدن به سبد خرید را دارد یا خیر. شرایط بررسی عبارتند از:
- کاربر فعلی باید عضو گروه سیستم (ادمین) باشد (self.user_has_groups('base.group_system')) یا:
- محصول فعال باشد (self.active).
- محصول برای فروش تنظیم شده باشد (self.sale_ok).
- محصول در وبسایت منتشر شده باشد (self.website_published).
خلاصه کدها و روابط بین توابع:
-
Sign & Pay:
تابع _has_to_be_signed وضعیت سفارش، نیاز به امضا، و انقضا را بررسی میکند. -
Accept & Pay:
تابع _has_to_be_paid وضعیت سفارش، نیاز به پرداخت، و وضعیت آخرین تراکنش را بررسی میکند. -
Order Again:
تابع _is_reorder_allowed بررسی میکند که آیا سفارش مجدد برای محصولات سفارش داده شده امکانپذیر است یا خیر.
این تابع وابسته به توابع کمکی _is_reorder_allowed در sale.order.line و _is_add_to_cart_allowed در product.product است.