77 lines
3.4 KiB
Python
77 lines
3.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, models
|
|
from odoo.fields import Command
|
|
|
|
|
|
class SaleOrder(models.Model):
|
|
_inherit = 'sale.order'
|
|
|
|
# delivery overrides
|
|
|
|
def _compute_amount_total_without_delivery(self):
|
|
res = super()._compute_amount_total_without_delivery()
|
|
return res - sum(
|
|
self.order_line.filtered(
|
|
lambda l: l.coupon_id and l.coupon_id.program_type in ['ewallet', 'gift_card']
|
|
).mapped('price_unit')
|
|
)
|
|
|
|
# sale_loyalty overrides
|
|
|
|
def _get_no_effect_on_threshold_lines(self):
|
|
res = super()._get_no_effect_on_threshold_lines()
|
|
return res + self.order_line.filtered(
|
|
lambda line: line.is_delivery or line.reward_id.reward_type == 'shipping')
|
|
|
|
def _get_lines_impacting_invoice_status(self):
|
|
return super()._get_lines_impacting_invoice_status().filtered(
|
|
lambda line: not line.is_reward_line
|
|
)
|
|
|
|
def _get_not_rewarded_order_lines(self):
|
|
"""Exclude delivery lines from consideration for reward points."""
|
|
order_line = super()._get_not_rewarded_order_lines()
|
|
return order_line.filtered(lambda line: not line.is_delivery)
|
|
|
|
def _get_reward_values_free_shipping(self, reward, coupon, **kwargs):
|
|
delivery_line = self.order_line.filtered(lambda l: l.is_delivery)
|
|
taxes = delivery_line.product_id.taxes_id.filtered(lambda t: t.company_id.id == self.company_id.id)
|
|
taxes = self.fiscal_position_id.map_tax(taxes)
|
|
max_discount = reward.discount_max_amount or float('inf')
|
|
return [{
|
|
'name': _('Free Shipping - %s', reward.description),
|
|
'reward_id': reward.id,
|
|
'coupon_id': coupon.id,
|
|
'points_cost': reward.required_points if not reward.clear_wallet else self._get_real_points_for_coupon(coupon),
|
|
'product_id': reward.discount_line_product_id.id,
|
|
'price_unit': -min(max_discount, delivery_line.price_unit or 0),
|
|
'product_uom_qty': 1,
|
|
'product_uom': reward.discount_line_product_id.uom_id.id,
|
|
'order_id': self.id,
|
|
'is_reward_line': True,
|
|
'sequence': max(self.order_line.filtered(lambda x: not x.is_reward_line).mapped('sequence'), default=0) + 1,
|
|
'tax_id': [(Command.CLEAR, 0, 0)] + [(Command.LINK, tax.id, False) for tax in taxes],
|
|
}]
|
|
|
|
def _get_reward_line_values(self, reward, coupon, **kwargs):
|
|
self.ensure_one()
|
|
if reward.reward_type == 'shipping':
|
|
self = self.with_context(lang=self._get_lang())
|
|
reward = reward.with_context(lang=self._get_lang())
|
|
return self._get_reward_values_free_shipping(reward, coupon, **kwargs)
|
|
return super()._get_reward_line_values(reward, coupon, **kwargs)
|
|
|
|
def _get_claimable_rewards(self, forced_coupons=None):
|
|
res = super()._get_claimable_rewards(forced_coupons)
|
|
if any(reward.reward_type == 'shipping' for reward in self.order_line.reward_id):
|
|
# Allow only one reward of type shipping at the same time
|
|
filtered_res = {}
|
|
for coupon, rewards in res.items():
|
|
filtered_rewards = rewards.filtered(lambda r: r.reward_type != 'shipping')
|
|
if filtered_rewards:
|
|
filtered_res[coupon] = filtered_rewards
|
|
res = filtered_res
|
|
return res
|