From 15917ee27728a4d5a6b364acd33f3972c66ebaec Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Thu, 28 May 2026 14:20:08 +0700 Subject: [PATCH] feat: implement automatic status reset to draft for loyalty programs upon modification, addition, or removal of rewards and rules --- models/__init__.py | 1 + models/loyalty_program.py | 19 ++++------------ models/loyalty_reward.py | 44 ++++++++++++++++++++++++++++++++++- models/loyalty_rule.py | 48 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 15 deletions(-) create mode 100644 models/loyalty_rule.py diff --git a/models/__init__.py b/models/__init__.py index 6bf837b..18a566d 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -5,4 +5,5 @@ from . import loyalty_program from . import sale_order from . import loyalty_voucher_generation_request from . import loyalty_reward +from . import loyalty_rule diff --git a/models/loyalty_program.py b/models/loyalty_program.py index 3113a69..bbc03ef 100644 --- a/models/loyalty_program.py +++ b/models/loyalty_program.py @@ -51,20 +51,11 @@ class LoyaltyProgram(models.Model): return super().write(vals) # For modifications, check if they are in pending/approved state - for program in self: - if program.state in ['pending', 'approved']: - target_company = program.company_id or self.env.company - approver = target_company._get_marketing_program_approver() - - if approver: - if self.env.user.id != approver.id: - vals['state'] = 'draft' - program.message_post(body=_("The approved marketing program was modified by a standard user and has been reset to Draft status for re-approval.")) - else: - is_manager = self.env.user.has_group('pos_loyalty_marketing_access.group_marketing_manager') - if not is_manager: - vals['state'] = 'draft' - program.message_post(body=_("The approved marketing program was modified by a standard user and has been reset to Draft status for re-approval.")) + programs_to_reset = self.filtered(lambda p: p.state in ['pending', 'approved']) + if programs_to_reset: + vals['state'] = 'draft' + for program in programs_to_reset: + program.message_post(body=_("The marketing program was modified and has been reset to Draft status for re-approval.")) return super().write(vals) diff --git a/models/loyalty_reward.py b/models/loyalty_reward.py index 9066219..4cdabc9 100644 --- a/models/loyalty_reward.py +++ b/models/loyalty_reward.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from odoo import api, fields, models +from odoo import _, api, fields, models class LoyaltyReward(models.Model): _inherit = 'loyalty.reward' @@ -33,3 +33,45 @@ class LoyaltyReward(models.Model): vals['property_account_expense_id'] = account.id return res + + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + for record in records: + if record.program_id and record.program_id.state in ['pending', 'approved']: + record.program_id.write({'state': 'draft'}) + record.program_id.message_post(body=_("A loyalty reward was added, resetting the program to Draft status for re-approval.")) + return records + + def write(self, vals): + programs_to_reset = self.env['loyalty.program'] + for record in self: + if record.program_id and record.program_id.state in ['pending', 'approved']: + programs_to_reset |= record.program_id + + res = super().write(vals) + + if 'program_id' in vals: + new_program = self.env['loyalty.program'].browse(vals['program_id']) + if new_program and new_program.state in ['pending', 'approved']: + programs_to_reset |= new_program + + for program in programs_to_reset: + program.write({'state': 'draft'}) + program.message_post(body=_("A loyalty reward was modified, resetting the program to Draft status for re-approval.")) + + return res + + def unlink(self): + programs_to_reset = self.env['loyalty.program'] + for record in self: + if record.program_id and record.program_id.state in ['pending', 'approved']: + programs_to_reset |= record.program_id + + res = super().unlink() + + for program in programs_to_reset: + program.write({'state': 'draft'}) + program.message_post(body=_("A loyalty reward was deleted, resetting the program to Draft status for re-approval.")) + + return res diff --git a/models/loyalty_rule.py b/models/loyalty_rule.py new file mode 100644 index 0000000..5270c52 --- /dev/null +++ b/models/loyalty_rule.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +from odoo import _, api, fields, models + +class LoyaltyRule(models.Model): + _inherit = 'loyalty.rule' + + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + for record in records: + if record.program_id and record.program_id.state in ['pending', 'approved']: + record.program_id.write({'state': 'draft'}) + record.program_id.message_post(body=_("A loyalty rule was added, resetting the program to Draft status for re-approval.")) + return records + + def write(self, vals): + programs_to_reset = self.env['loyalty.program'] + for record in self: + if record.program_id and record.program_id.state in ['pending', 'approved']: + programs_to_reset |= record.program_id + + res = super().write(vals) + + if 'program_id' in vals: + new_program = self.env['loyalty.program'].browse(vals['program_id']) + if new_program and new_program.state in ['pending', 'approved']: + programs_to_reset |= new_program + + for program in programs_to_reset: + program.write({'state': 'draft'}) + program.message_post(body=_("A loyalty rule was modified, resetting the program to Draft status for re-approval.")) + + return res + + def unlink(self): + programs_to_reset = self.env['loyalty.program'] + for record in self: + if record.program_id and record.program_id.state in ['pending', 'approved']: + programs_to_reset |= record.program_id + + res = super().unlink() + + for program in programs_to_reset: + program.write({'state': 'draft'}) + program.message_post(body=_("A loyalty rule was deleted, resetting the program to Draft status for re-approval.")) + + return res