From a2fa0304d8c15e44a927d86caf76e4face7ef2df Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Thu, 21 May 2026 20:58:05 +0700 Subject: [PATCH] fix: archive old loyalty cards when updating partner membership level to prevent duplication --- models/res_partner.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/models/res_partner.py b/models/res_partner.py index 7456b27..fe58603 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -18,3 +18,24 @@ class ResPartner(models.Model): # Add custom field for customer membership level fields_list.append('membership_level_id') return fields_list + + def write(self, vals): + """ + When a partner's membership level changes, delete their loyalty cards + from the OLD level's program so they don't accumulate cards across levels. + """ + if 'membership_level_id' in vals: + new_level_id = vals['membership_level_id'] + for partner in self: + old_level_id = partner.membership_level_id.id if partner.membership_level_id else False + # Only act when the level is actually changing to a different value + if old_level_id and old_level_id != new_level_id: + old_cards = self.env['loyalty.card'].search([ + ('partner_id', '=', partner.id), + ('program_id', '=', old_level_id), + ]) + if old_cards: + # Archive instead of delete — loyalty cards may be referenced + # by pos_order_line.coupon_id (FK), so unlink() would fail. + old_cards.write({'active': False}) + return super().write(vals)