45 lines
1.9 KiB
Python
45 lines
1.9 KiB
Python
import logging
|
|
|
|
from odoo import api, models
|
|
from odoo.exceptions import AccessError
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ProductProduct(models.Model):
|
|
_inherit = 'product.product'
|
|
|
|
@api.model
|
|
def _load_pos_data_fields(self, config_id):
|
|
params = super()._load_pos_data_fields(config_id)
|
|
params += ['all_product_tag_ids']
|
|
|
|
# add missing product fields used in the reward_product_domain
|
|
missing_fields = self.env['loyalty.reward']._get_reward_product_domain_fields(config_id) - set(params)
|
|
|
|
if missing_fields:
|
|
params.extend([field for field in missing_fields if field in self._fields])
|
|
|
|
return params
|
|
|
|
def _load_pos_data(self, data):
|
|
res = super()._load_pos_data(data)
|
|
config_id = self.env['pos.config'].browse(data['pos.config']['data'][0]['id'])
|
|
try:
|
|
rewards = config_id._get_program_ids().reward_ids
|
|
reward_products = rewards.discount_line_product_id | rewards.reward_product_ids | rewards.reward_product_id
|
|
trigger_products = config_id._get_program_ids().filtered(lambda p: p.program_type in ['ewallet', 'gift_card']).trigger_product_ids
|
|
|
|
loyalty_product_ids = set(reward_products.ids + trigger_products.ids)
|
|
classic_product_ids = {product['id'] for product in res['data']}
|
|
products = self.env['product.product'].browse(list(loyalty_product_ids - classic_product_ids))
|
|
products = products.read(fields=res['fields'], load=False)
|
|
self._process_pos_ui_product_product(products, config_id)
|
|
|
|
data['pos.session']['data'][0]['_pos_special_products_ids'] += [product.id for product in reward_products if product.id not in [p["id"] for p in res['data']]]
|
|
res['data'].extend(products)
|
|
except AccessError as e:
|
|
_logger.warning('Cannot load loyalty products into the PoS \n%s', e)
|
|
|
|
return res
|