diff --git a/odex25_sales/dev_membership/models/res_partner.py b/odex25_sales/dev_membership/models/res_partner.py index be396d38f..308b84292 100644 --- a/odex25_sales/dev_membership/models/res_partner.py +++ b/odex25_sales/dev_membership/models/res_partner.py @@ -11,6 +11,10 @@ from odoo import fields, models, api,_ from datetime import datetime +from odoo.exceptions import Warning, ValidationError +import re +import logging +_logger = logging.getLogger(__name__) class Partner(models.Model): _inherit = 'res.partner' @@ -66,22 +70,26 @@ class Partner(models.Model): partner.product_id = last_membership_id.product_id.id @api.depends('active_membership_id') def _compute_membership_end(self): - for partner in self: - partner.memebership_end_date = False - if partner.membership_count > 0: - if partner.active_membership_id: - membership_id = self.env['dev.membership'].sudo().search([ - ('partner_id', '=', partner.id), - ('state', '=', 'active'), - ('product_id', '=', partner.active_membership_id.product_id.id)], order='to_date desc', limit=1) - if membership_id: - partner.memebership_end_date = membership_id.to_date - else: - membership_id = self.env['dev.membership'].sudo().search([ - ('partner_id', '=', partner.id), - ('state', 'in', ('expire','cancel'))], order='to_date desc', limit=1) - if membership_id: - partner.memebership_end_date = membership_id.to_date + for partner in self: + partner.membership_end_date = False + if partner.membership_count > 0: + if partner.active_membership_id: + # Search for the latest active membership with the same product + membership = self.env['dev.membership'].sudo().search([ + ('partner_id', '=', partner.id), + ('state', '=', 'active'), + ('product_id', '=', partner.active_membership_id.product_id.id) + ], order='to_date desc', limit=1) + if membership: + partner.membership_end_date = membership.to_date + else: + # Find the latest expired or cancelled membership + membership = self.env['dev.membership'].sudo().search([ + ('partner_id', '=', partner.id), + ('state', 'in', ('expire', 'cancel')) + ], order='to_date desc', limit=1) + if membership: + partner.membership_end_date = membership.to_date @api.depends('active_membership_id') def _compute_membership_level(self): @@ -156,4 +164,57 @@ class Partner(models.Model): 'domain': [('id', '=', board_nominations)], 'view_mode': 'tree,form', 'target': 'current', - } \ No newline at end of file + } + + + + + @api.constrains('identification_number', 'is_member') + def _check_id_no_required_if_member(self): + for record in self: + if record.is_member and not record.identification_number: + raise ValidationError(_("ID number is required for members.")) + + @api.constrains('mobile', 'is_member') + def _check_mobile_required_if_member(self): + for record in self: + if record.is_member and not record.mobile: + raise ValidationError(_("Mobile number is required for members.")) + + @api.constrains('mobile', 'identification_number') + def _check_unique_mobile_id(self): + for record in self: + if record.mobile: + existing_mobile = self.search([ + ('mobile', '=', record.mobile), + ('id', '!=', record.id) + ], limit=1) + if existing_mobile: + raise ValidationError(_("Mobile number must be unique.")) + if record.identification_number: + existing_id = self.search([ + ('identification_number', '=', record.identification_number), + ('id', '!=', record.id) + ], limit=1) + if existing_id: + raise ValidationError(_("ID number must be unique.")) + + @api.constrains('mobile') + def _check_mobile_format(self): + print("Test constraint running!") + for record in self: + print("Checking mobile format: %s", record.mobile) + if record.mobile and (len(record.mobile) != 10 or not record.mobile.isdigit()): + raise ValidationError(_("Mobile number must be exactly 10 digits.")) + + # Optional: Add SQL constraints for uniqueness + _sql_constraints = [ + ('unique_mobile', 'UNIQUE(mobile)', 'Mobile number must be unique.'), + ('unique_identification_number', 'UNIQUE(identification_number)', 'ID number must be unique.'), + ] + + + + + + \ No newline at end of file diff --git a/odex25_sales/dev_membership/security/security.xml b/odex25_sales/dev_membership/security/security.xml index 0faea90a8..682252a1f 100644 --- a/odex25_sales/dev_membership/security/security.xml +++ b/odex25_sales/dev_membership/security/security.xml @@ -39,5 +39,8 @@ [(1,'=',1)] - + + Sale/Purchase Tab + + diff --git a/odex25_sales/dev_membership/views/dev_membership.xml b/odex25_sales/dev_membership/views/dev_membership.xml index aee6c28e5..3ec72d24e 100644 --- a/odex25_sales/dev_membership/views/dev_membership.xml +++ b/odex25_sales/dev_membership/views/dev_membership.xml @@ -47,8 +47,8 @@ class="oe_highlight" attrs="{'invisible':['|',('membership_id','!=',False),('state','not in',['expire','active','cancel'])]}"/>