From 05462f0ffad0d9378e4c18d0a3c8e518a6808d5a Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Wed, 13 May 2026 16:37:01 +0700 Subject: [PATCH] feat: implement automated decimal precision sync for reward points across loyalty models and PoS configuration --- __manifest__.py | 1 - models/__init__.py | 4 ++-- models/decimal_precision.py | 15 +++++++++++++++ models/loyalty_models.py | 27 +++++++++++++++++++++++++++ models/loyalty_rule.py | 6 ------ models/pos_config.py | 8 +++++++- models/res_config_settings.py | 26 -------------------------- views/res_config_settings_views.xml | 15 --------------- 8 files changed, 51 insertions(+), 51 deletions(-) create mode 100644 models/decimal_precision.py create mode 100644 models/loyalty_models.py delete mode 100644 models/loyalty_rule.py delete mode 100644 models/res_config_settings.py delete mode 100644 views/res_config_settings_views.xml diff --git a/__manifest__.py b/__manifest__.py index 4aa80c1..4f21359 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -19,7 +19,6 @@ A new 'Reward Point' decimal precision record is created, and the POS Settings v 'depends': ['point_of_sale', 'pos_loyalty', 'loyalty'], 'data': [ 'data/decimal_precision_data.xml', - 'views/res_config_settings_views.xml', ], 'installable': True, 'auto_install': False, diff --git a/models/__init__.py b/models/__init__.py index ee33405..6487ff5 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,3 +1,3 @@ -from . import loyalty_rule +from . import loyalty_models from . import pos_config -from . import res_config_settings +from . import decimal_precision diff --git a/models/decimal_precision.py b/models/decimal_precision.py new file mode 100644 index 0000000..2167406 --- /dev/null +++ b/models/decimal_precision.py @@ -0,0 +1,15 @@ +from odoo import api, fields, models + +class DecimalPrecision(models.Model): + _inherit = 'decimal.precision' + + def write(self, vals): + res = super(DecimalPrecision, self).write(vals) + if 'digits' in vals: + for record in self: + if record.name == 'Reward Point': + # Sync to all pos.config records + # We iterate to avoid 'Expected singleton' error in multi-company + for config in self.env['pos.config'].sudo().search([]): + config.write({'reward_point_digits': record.digits}) + return res diff --git a/models/loyalty_models.py b/models/loyalty_models.py new file mode 100644 index 0000000..2aedd59 --- /dev/null +++ b/models/loyalty_models.py @@ -0,0 +1,27 @@ +from odoo import fields, models + +class LoyaltyRule(models.Model): + _inherit = 'loyalty.rule' + + reward_point_amount = fields.Float(digits='Reward Point') + +class LoyaltyReward(models.Model): + _inherit = 'loyalty.reward' + + required_points = fields.Float(digits='Reward Point') + +class LoyaltyCard(models.Model): + _inherit = 'loyalty.card' + + points = fields.Float(digits='Reward Point') + +class LoyaltyHistory(models.Model): + _inherit = 'loyalty.history' + + issued = fields.Float(digits='Reward Point') + used = fields.Float(digits='Reward Point') + +class PosOrderLine(models.Model): + _inherit = 'pos.order.line' + + points_cost = fields.Float(digits='Reward Point') diff --git a/models/loyalty_rule.py b/models/loyalty_rule.py deleted file mode 100644 index 0d312af..0000000 --- a/models/loyalty_rule.py +++ /dev/null @@ -1,6 +0,0 @@ -from odoo import fields, models - -class LoyaltyRule(models.Model): - _inherit = 'loyalty.rule' - - reward_point_amount = fields.Float(digits='Reward Point') diff --git a/models/pos_config.py b/models/pos_config.py index e92d0af..1b579f0 100644 --- a/models/pos_config.py +++ b/models/pos_config.py @@ -1,6 +1,12 @@ -from odoo import fields, models +from odoo import api, fields, models class PosConfig(models.Model): _inherit = 'pos.config' reward_point_digits = fields.Integer(string="Reward Point Digits", default=2) + + @api.model + def _load_pos_data_fields(self, config): + fields_list = super()._load_pos_data_fields(config) + fields_list.append('reward_point_digits') + return fields_list diff --git a/models/res_config_settings.py b/models/res_config_settings.py deleted file mode 100644 index 4028f0b..0000000 --- a/models/res_config_settings.py +++ /dev/null @@ -1,26 +0,0 @@ -from odoo import api, fields, models - -class ResConfigSettings(models.TransientModel): - _inherit = 'res.config.settings' - - pos_reward_point_digits = fields.Integer( - string="Reward Point Digits", - config_parameter='pos_reward_point_digits', - default=2 - ) - - @api.model - def get_values(self): - res = super(ResConfigSettings, self).get_values() - precision = self.env.ref('pos_reward_point_digits.dp_reward_point', raise_if_not_found=False) - if precision: - res.update({ - 'pos_reward_point_digits': precision.digits, - }) - return res - - def set_values(self): - super(ResConfigSettings, self).set_values() - precision = self.env.ref('pos_reward_point_digits.dp_reward_point', raise_if_not_found=False) - if precision and precision.digits != self.pos_reward_point_digits: - precision.sudo().digits = self.pos_reward_point_digits diff --git a/views/res_config_settings_views.xml b/views/res_config_settings_views.xml deleted file mode 100644 index 015562f..0000000 --- a/views/res_config_settings_views.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - res.config.settings.view.form.inherit.pos_reward_point_digits - res.config.settings - - - - - - - - - -