# Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import api, fields, models class ResPartner(models.Model): _inherit = 'res.partner' membership_level_id = fields.Many2one( 'loyalty.program', string='Membership Level', help='Specific multi-level membership assigned to this customer.' ) @api.model def _load_pos_data_fields(self, config_id): fields_list = super()._load_pos_data_fields(config_id) # 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)