membership module
This commit is contained in:
parent
23ec64f2ef
commit
13e7aef41f
|
|
@ -11,6 +11,10 @@
|
||||||
from odoo import fields, models, api,_
|
from odoo import fields, models, api,_
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
from odoo.exceptions import Warning, ValidationError
|
||||||
|
import re
|
||||||
|
import logging
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class Partner(models.Model):
|
class Partner(models.Model):
|
||||||
_inherit = 'res.partner'
|
_inherit = 'res.partner'
|
||||||
|
|
@ -67,21 +71,25 @@ class Partner(models.Model):
|
||||||
@api.depends('active_membership_id')
|
@api.depends('active_membership_id')
|
||||||
def _compute_membership_end(self):
|
def _compute_membership_end(self):
|
||||||
for partner in self:
|
for partner in self:
|
||||||
partner.memebership_end_date = False
|
partner.membership_end_date = False
|
||||||
if partner.membership_count > 0:
|
if partner.membership_count > 0:
|
||||||
if partner.active_membership_id:
|
if partner.active_membership_id:
|
||||||
membership_id = self.env['dev.membership'].sudo().search([
|
# Search for the latest active membership with the same product
|
||||||
|
membership = self.env['dev.membership'].sudo().search([
|
||||||
('partner_id', '=', partner.id),
|
('partner_id', '=', partner.id),
|
||||||
('state', '=', 'active'),
|
('state', '=', 'active'),
|
||||||
('product_id', '=', partner.active_membership_id.product_id.id)], order='to_date desc', limit=1)
|
('product_id', '=', partner.active_membership_id.product_id.id)
|
||||||
if membership_id:
|
], order='to_date desc', limit=1)
|
||||||
partner.memebership_end_date = membership_id.to_date
|
if membership:
|
||||||
|
partner.membership_end_date = membership.to_date
|
||||||
else:
|
else:
|
||||||
membership_id = self.env['dev.membership'].sudo().search([
|
# Find the latest expired or cancelled membership
|
||||||
|
membership = self.env['dev.membership'].sudo().search([
|
||||||
('partner_id', '=', partner.id),
|
('partner_id', '=', partner.id),
|
||||||
('state', 'in', ('expire','cancel'))], order='to_date desc', limit=1)
|
('state', 'in', ('expire', 'cancel'))
|
||||||
if membership_id:
|
], order='to_date desc', limit=1)
|
||||||
partner.memebership_end_date = membership_id.to_date
|
if membership:
|
||||||
|
partner.membership_end_date = membership.to_date
|
||||||
|
|
||||||
@api.depends('active_membership_id')
|
@api.depends('active_membership_id')
|
||||||
def _compute_membership_level(self):
|
def _compute_membership_level(self):
|
||||||
|
|
@ -157,3 +165,56 @@ class Partner(models.Model):
|
||||||
'view_mode': 'tree,form',
|
'view_mode': 'tree,form',
|
||||||
'target': 'current',
|
'target': 'current',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@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.'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -39,5 +39,8 @@
|
||||||
<field name="domain_force">[(1,'=',1)]</field>
|
<field name="domain_force">[(1,'=',1)]</field>
|
||||||
<field name="groups" eval="[(4, ref('group_membership_manager'))]"/>
|
<field name="groups" eval="[(4, ref('group_membership_manager'))]"/>
|
||||||
</record>
|
</record>
|
||||||
|
<record id="sale_purchase_tab" model="res.groups">
|
||||||
|
<field name="name">Sale/Purchase Tab</field>
|
||||||
|
<field name="category_id" ref="dev_membership.membership_category"/> <!-- Or use your own category -->
|
||||||
|
</record>
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|
|
||||||
|
|
@ -47,8 +47,8 @@
|
||||||
class="oe_highlight"
|
class="oe_highlight"
|
||||||
attrs="{'invisible':['|',('membership_id','!=',False),('state','not in',['expire','active','cancel'])]}"/>
|
attrs="{'invisible':['|',('membership_id','!=',False),('state','not in',['expire','active','cancel'])]}"/>
|
||||||
<button name="%(dev_membership.membership_request_cancel_wizard_action)d" type="action" string="Cancel"
|
<button name="%(dev_membership.membership_request_cancel_wizard_action)d" type="action" string="Cancel"
|
||||||
attrs="{'invisible': ([('state', 'not in', ['active'])])}"/>
|
attrs="{'invisible': ([('state', 'not in', ['active','expire'])])}"/>
|
||||||
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,active"/>
|
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,activeexpire,cancel"/>
|
||||||
</header>
|
</header>
|
||||||
<sheet>
|
<sheet>
|
||||||
<div class="oe_button_box" name="button_box">
|
<div class="oe_button_box" name="button_box">
|
||||||
|
|
|
||||||
|
|
@ -217,7 +217,9 @@
|
||||||
|
|
||||||
</group>
|
</group>
|
||||||
<group name="other">
|
<group name="other">
|
||||||
<field name="join_date"/>
|
|
||||||
|
<field name="join_date" readonly="1"/>
|
||||||
|
|
||||||
<field name="memebership_end_date"/>
|
<field name="memebership_end_date"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue