42 lines
1.7 KiB
Python
42 lines
1.7 KiB
Python
# 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)
|