Odoo18-Base/addons/pos_loyalty/models/product_product.py
2025-01-06 10:57:38 +07:00

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