diff --git a/models/res_partner.py b/models/res_partner.py index 92bd77c..e9d416e 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -46,27 +46,22 @@ class ResPartner(models.Model): @api.model_create_multi def create(self, vals_list): partners = super().create(vals_list) - - # Check context or stack trace to see if we are creating an internal user or employee - import sys - is_internal_creation = False - frame = sys._getframe() - while frame: - filename = frame.f_code.co_filename - if 'res_users.py' in filename or 'hr_employee.py' in filename: - is_internal_creation = True - break - frame = frame.f_back - # Also respect standard Odoo install and import bypass flags - if is_internal_creation or self.env.context.get('install_mode') or self.env.context.get('import_file'): + # Skip auto-Silver assignment for system/internal partner creations. + # Internal callers (res_users, hr_employee, etc.) should pass + # context key 'no_loyalty_auto_assign=True' to suppress this logic. + if ( + self.env.context.get('install_mode') + or self.env.context.get('import_file') + or self.env.context.get('no_loyalty_auto_assign') + ): return partners for partner in partners: if partner.is_company: continue - - # Find the lowest membership program level (Membership Silver) + + # Find Membership Silver first, then fall back to lowest spend program lowest_program = self.env['loyalty.program'].sudo().search( [('multi_level_membership', '=', True), ('manual_membership', '=', False), ('name', '=ilike', 'Membership Silver')], limit=1 @@ -88,8 +83,10 @@ class ResPartner(models.Model): 'program_id': lowest_program.id, 'points': 0, }) - - if hasattr(partner, 'membership_level_id') and not partner.membership_level_id: + + # Always write membership_level_id if not already set. + # pos_loyalty_multi_level is a hard dependency so the field always exists. + if not partner.membership_level_id: partner.sudo().write({'membership_level_id': lowest_program.id}) - + return partners