[UPDATE]UPDATE

This commit is contained in:
zainab8585 2024-09-17 10:08:14 +02:00
parent 6a3866bc2b
commit 80cbc4db9b
12 changed files with 166 additions and 171 deletions

View File

@ -1,6 +1,13 @@
<?xml version="1.0" ?>
<odoo>
<record id="mt_dev_membership_created" model="mail.message.subtype">
<field name="name">Membership Created</field>
<field name="sequence">20</field>
<field name="res_model">dev.membership</field>
</record>
<record id="template_membership" model="mail.template">
<field name="name">membership.email.template</field>
<field name="subject">Membership Detail</field>

View File

@ -1,44 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 DevIntelle Consulting Service Pvt.Ltd (<http://www.devintellecs.com>).
For Module Support : devintelle@gmail.com or Skype : devintelle
-->
<odoo>
<!-- membership no -->
<record id="seq_membership_type" model="ir.sequence">
<field name="name">Membership Type Number</field>
<field name="code">seq.product.template</field>
<field name="prefix">MEMT%(y)s-</field>
<field name="padding">5</field>
<field name="company_id" eval="False"/>
</record>
<record id="seq_membership_partner" model="ir.sequence">
<field name="name">Membership Number</field>
<field name="code">membership.no.sequence</field>
<field name="prefix">ENM/</field>
<field name="padding">5</field>
<field name="implementation">standard</field>
<field name="company_id" eval="False"/>
</record>
<record id="seq_membership_reasons" model="ir.sequence">
<field name="name">Membership resonse Number</field>
<field name="code">seq.cancellation.reason</field>
<field name="prefix">MEMR%(y)s-</field>
<field name="padding">5</field>
<field name="company_id" eval="False"/>
</record>
<record id="seq_membership_level" model="ir.sequence">
<field name="name">Membership level Number</field>
<field name="code">seq.membership.level</field>
<field name="prefix">MEML%(y)s-</field>
<field name="padding">5</field>
<field name="company_id" eval="False"/>
</record>
<record id="seq_membership_partner" model="ir.sequence">
<field name="name">Membership Number</field>
<field name="code">membership.no.sequence</field>
<field name="implementation">standard</field>
<field name="company_id" eval="False"/>
</record>
<!-- end -->
<record id="seq_dev_membership" model="ir.sequence">
<field name="name">seq.dev.membership</field>
<field name="code">seq.dev.membership</field>
@ -96,4 +67,10 @@
<field name="state">code</field>
<field name="code">model.membership_auto_expire()</field>
</record>
<template id="mail_message_lead_enrich_no_email">
<p>Lead Enrichment based on email address</p>
<div style="background-color:#ffffff;padding:15px;">
<span>Enrichment could not be done as no email address was provided.</span>
</div>
</template>
</odoo>

View File

@ -20,12 +20,12 @@ class DevMembership(models.Model):
_description = 'Dev Membership'
_order = 'name desc'
membrship_level = fields.Many2one('membership.level',string='Membrship level',store=True,required=False,compute='_compute_membership_level')
name = fields.Char(string='Name', readonly=1)
date = fields.Date(string="Request Date", tracking=3, required=1, default=lambda self: datetime.now().date())
from_date = fields.Date(string="Membership From Date", tracking=3, required=1, default=lambda *a: (datetime.now().date()))
to_date = fields.Date(string="Membership To Date", tracking=3)
request_date = fields.Date(string="Membership Cancell Request Date", tracking=3,readonly=1)
request_date = fields.Date(string="Cancell Date", tracking=3,readonly=1)
partner_id = fields.Many2one('res.partner', string="Partner", domain="[('is_member', '=', True)]", tracking=2, required=1)
id_no = fields.Char(string='Identification Number',related='partner_id.identification_number',store=True)
phone = fields.Char(string='Phone',related='partner_id.phone',store=True)
@ -33,24 +33,25 @@ class DevMembership(models.Model):
product_id = fields.Many2one('product.product', string="Membership Product", domain="[('is_membership', '=', True)]", tracking=2, required=1)
membership_fees = fields.Float(string="Membership Fees")
is_free = fields.Boolean(string="Is Free",related="product_id.is_free",)
company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.company, required=1, tracking=3)
duration = fields.Integer(string="Duration",)
description = fields.Text(string="Description", related="product_id.description", readonly=False)
interval = fields.Selection(string="Interval", related="product_id.interval")
interval = fields.Selection(string="Interval", selection=([
('days', 'Days'),
('month', 'Month'),
('year', 'Year')]), default='year',required=1)
payment_state = fields.Selection(string='Payment State',related='invoice_id.payment_state')
state = fields.Selection(string="State", selection=([('draft', 'Draft'),
('confirm', 'Confirm'),
('active', 'Active'),
('expire', 'Expire'),
('cancel', 'Cancel')]), default='draft', tracking=1)
state = fields.Selection(string="State", selection=([
('draft', 'Draft'),
('confirm', 'Confirm'),
('active', 'Active'),
('expire', 'Expire'),
('cancel', 'Cancel')]), default='draft', tracking=1)
membership_id = fields.Many2one('dev.membership', string='Renew Membership')
invoice_id = fields.Many2one('account.move', string='Invoice')
user_id = fields.Many2one('res.users', string='Resposible', default=lambda self:self.env.user)
cancel_reasone = fields.Many2one('cancellation.reason',string='Cancel Membership Reason')
membrship_level = fields.Many2one('membership.level', string='Membrship level',store=True,required=False,compute='_compute_membership_level')
@api.onchange('product_id')
@ -60,26 +61,29 @@ class DevMembership(models.Model):
self.membership_fees = 0
else:
self.membership_fees = self.product_id.list_price
self.duration = (self.product_id.duration)
self.duration = self.product_id.duration
self.interval = self.product_id.interval
@api.onchange('duration')
def _onchange_duration(self):
if self.duration and self.interval and self.membership_fees:
self.membership_fees = self.duration*self.product_id.list_price
self.membership_fees = self.duration * self.product_id.list_price
@api.constrains('membership_fees')
def _check_subscription_fee(self):
for record in self:
if record.product_id.duration and record.membership_fees < record.product_id.list_price :
raise ValidationError(_('Membership fees cannot be less than the default value in Setting of membrship type.'))
# elif record.product_id.duration>1 and record.membership_fees*record.duration < record.product_id.list_price*record.duration :
# raise ValidationError(_('Membership fees cannot be less than the default value in Setting of membrship type.'))
if record.membership_fees < (record.product_id.list_price * record.duration ):
raise ValidationError(_("Membership fees cannot be less than %s .") % (record.product_id.list_price* record.duration,))
@api.constrains('duration')
def _check_duration(self):
for record in self:
if record.duration < record.product_id.duration:
raise ValidationError(_('Duration cannot be less than the default value in Setting of membrship type.'))
raise ValidationError(_("Duration cannot be less than the default value in Setting of membrship type.%s'") % record.product_id.duration)
@api.constrains('from_date')
def _check_from_date(self):
@ -135,9 +139,11 @@ class DevMembership(models.Model):
if self.product_id.nationality_ids:
if self.partner_id.nationality_id not in self.product_id.nationality_ids:
raise ValidationError(_("The member's nationality does not meet the membership requirements"))
if self.product_id.age!=0 and self.partner_id.age <self.product_id.age:
if self.product_id.age > 0 and self.partner_id.age < self.product_id.age:
raise ValidationError(_('The member must be at least %s years old.')%self.product_id.age)
if self.partner_id.gender != self.product_id.gender and self.product_id.gender != False:
if self.product_id.max_age > 0 and self.partner_id.age > self.product_id.max_age:
raise ValidationError(_('The member must not be more than %s years old.') % self.product_id.max_age)
if self.product_id.gender and self.partner_id.gender != self.product_id.gender :
raise ValidationError(_('Membership is only %s allowed') % self.product_id.gender)
self.state = 'confirm'
@ -215,12 +221,20 @@ class DevMembership(models.Model):
def membership_auto_expire(self):
current_date = datetime.now().date()
membership_ids = self.env['dev.membership'].search([('state', '=', 'active'),
('to_date', '<', current_date)])
('to_date', '<=', current_date)])
template_id = self.env.ref('dev_membership.dev_membership_expired_mail_template')
for membership in membership_ids:
membership.state = 'expire'
template_id.send_mail(membership.id, force_send=True)
#template_id.send_mail(membership.id, force_send=True)
if membership.user_id:
membership.message_post(
body=_("The Membership %s was expired on %s") % (membership.name,membership.to_date),
subject=_("Auto Expire Membership") ,
partner_ids=[membership.user_id.partner_id.id],
message_type='notification', #
author_id=self.env.user.partner_id.id,
)
def membership_reminder_email_cron(self):
membership_pool = self.env['dev.membership']
tmpl_id = self.env.ref('dev_membership.dev_membership_expire_reminder_mail_template')
@ -228,21 +242,26 @@ class DevMembership(models.Model):
if tmpl_id:
date = datetime.now().date() + relativedelta(days=int(days_before))
membership_ids = membership_pool.search([('state', '=', 'active'),
('to_date', '<=', date)])
('to_date', '=', date)])
for membership in membership_ids:
tmpl_id.send_mail(membership.id, force_send=True)
return True
#tmpl_id.send_mail(membership.id, force_send=True)
if membership.user_id:
membership.message_post(
body=_("The Membership %s is about to expire on %s") % (membership.name,membership.to_date),
subject=_("Membership Expire Reminder") ,
partner_ids=[membership.user_id.partner_id.id],
message_type='notification',
author_id=self.env.user.partner_id.id,
)
def cancell2_membership_reminder_email_cron(self):
membership_pool = self.env['dev.membership']
tmpl_id = self.env.ref('dev_membership.dev_cancel_membership_expire2')
post_expiry_period = self.env['ir.config_parameter'].get_param('dev_membership.post_expiry_period')
cancel_reason = self.env['ir.config_parameter'].get_param('dev_membership.cancellation_reason')
tmpl_id2 = self.env.ref('dev_membership.dev_cancel_membership_expire')
if (tmpl_id or tmpl_id2) and post_expiry_period:
if post_expiry_period:
try:
post_expiry_period = int(post_expiry_period)
except ValueError:
@ -251,16 +270,14 @@ class DevMembership(models.Model):
date = fields.Date.today() - relativedelta(days=int(post_expiry_period))
membership_ids = membership_pool.search([
('state', '=', 'expire'),
('to_date', '<=', date),('membership_id','=',False)
('to_date', '=', date),('membership_id','=',False)
])
for membership in membership_ids:
# m # Check if a cancellation request already exists
existing_cancel_request = self.env['membership.cancellation.request'].search([
('membership_id', '=', membership.id),
('state', '=', 'draft')
], limit=1)
if not existing_cancel_request:
# Create a new cancellation request instead of canceling directly
self.env['membership.cancellation.request'].create({
'membership_id': membership.id,
'member_id': membership.partner_id.id,
@ -268,12 +285,9 @@ class DevMembership(models.Model):
'state': 'draft',
'cancel_reason': cancel_reason
})
if tmpl_id:
tmpl_id.send_mail(membership.id, force_send=True)
if tmpl_id2:
tmpl_id2.send_mail(membership.id, force_send=True)
return True
def membership_secand_reminder_email_cron(self):
membership_pool = self.env['dev.membership']
tmpl_id = self.env.ref('dev_membership.dev_membership_expire_second_reminder_mail_template')
@ -283,13 +297,22 @@ class DevMembership(models.Model):
days_before_second = int(days_before_second)
except ValueError:
days_before_second = 0
date = datetime.now().date() + relativedelta(days=days_before_second)
membership_ids = membership_pool.search([
('state', '=', 'active'),
('to_date', '<=', date)
('to_date', '=', date)
])
for membership in membership_ids:
tmpl_id.send_mail(membership.id, force_send=True)
#tmpl_id.send_mail(membership.id, force_send=True)
if membership.user_id:
membership.message_post(
body=_("The Membership %s is about to expire on %s") % (membership.name,membership.to_date),
subject=_("Membership Expire Reminder") ,
partner_ids=[membership.user_id.partner_id.id],
message_type='notification',
author_id=self.env.user.partner_id.id,
)
return True
def datetime_convert(self):
@ -310,9 +333,9 @@ class DevMembership(models.Model):
@api.depends('membership_fees','duration')
def _compute_membership_level(self):
for record in self:
memberships = self.env['dev.membership'].search([('partner_id', '=', record.partner_id.id),('payment_state', 'in', ['paid','in_payment'])])
total_fees = sum(membership.membership_fees for membership in memberships)+record.membership_fees
total_duration = sum(membership.duration for membership in memberships)+record.duration
memberships = self.env['dev.membership'].search([('partner_id', '=', record.partner_id.id),('state', 'in', [['expire','active','cancel']])])
total_fees = sum(membership.membership_fees for membership in memberships) + record.membership_fees
total_duration = sum(membership.duration for membership in memberships)+ record.duration
level_by_fees = self.env['membership.level'].search([ ('min', '<=', total_fees),('years', '<=', total_duration)], limit=1, order='sequence desc')
if level_by_fees:

View File

@ -14,26 +14,4 @@ class MembershipLevel(models.Model):
sequence = fields.Integer(string="Sequence", help="Define the display order")
company_id = fields.Many2one('res.company', string='Company', readonly=True,
default=lambda self: self.env.company)
# @api.model
# def _get_next_levelno(self):
# sequence = self.env['ir.sequence'].search(
# [('code', '=', 'seq.membership.level'),
# '|',
# ('company_id', '=', self.env.company.id),
# ('company_id', '=', False)],
# limit=1
# )
# if sequence:
# return sequence.next_by_id()
# return '/'
# @api.model
# def create(self, vals):
# if 'company_id' not in vals:
# vals['company_id'] = self.env.company.id
# if not vals.get('level_no'):
# vals['level_no'] = self.env['ir.sequence'].with_company(vals['company_id']).next_by_code('seq.membership.level') or '/'
# return super(MembershipLevel, self).create(vals)
active = fields.Boolean(default=True)

View File

@ -20,13 +20,26 @@ class ProductTemplate(models.Model):
company_id = fields.Many2one('res.company', string='Company', readonly=True,
default=lambda self: self.env.company)
gender = fields.Selection(
selection=[("male", "Male"), ("female", "Female")], default="male",string='Gender'
)
selection=[("male", "Male"), ("female", "Female")], default="male",string='Gender')
membership_benefits = fields.Text(
string="Membership Benefits",
required=False)
is_membership = fields.Boolean(string="Is Membership")
duration = fields.Integer(string="Duration")
interval = fields.Selection(string="Interval", selection=([('days', 'Days'),
('month', 'Month'),
('year', 'Year')]), default='year')
membership_count = fields.Integer(string="Membership Count", compute="_get_membership_count")
is_free = fields.Boolean(string="Is Free")
nominee = fields.Boolean(string="Nominee")
join_period = fields.Integer(string="Join Period")
nationality_ids = fields.Many2many('res.country', 'country_group_rel', 'devmember_id', 'country_id', 'Nationality')
age = fields.Integer(string="Age", default=18)
max_age = fields.Integer(string="Max Age", default=55)
def view_membership(self):
ctx = dict(create=False)
return {
@ -43,24 +56,7 @@ class ProductTemplate(models.Model):
for rec in self:
membership_count = self.env['dev.membership'].search_count([('product_id.name', '=', rec.name)])
rec.membership_count = membership_count
is_membership = fields.Boolean(string="Is Membership")
duration = fields.Integer(string="Duration")
interval = fields.Selection(string="Interval", selection=([('days', 'Days'),
('month', 'Month'),
('year', 'Year')]), default='month')
membership_count = fields.Integer(string="Membership Count", compute="_get_membership_count")
# todo start
# add new fields
# New Fields
is_free = fields.Boolean(string="Is Free")
nominee = fields.Boolean(string="Nominee")
join_period = fields.Integer(string="Join Period")
nationality_ids = fields.Many2many('res.country', 'country_group_rel', 'devmember_id', 'country_id', 'Nationality')
age = fields.Integer(string="Age", default=18)
# Sale Description Override
@api.model
def default_get(self, fields):
res = super(ProductTemplate, self).default_get(fields)

View File

@ -63,4 +63,5 @@ class CancellReason(models.Model):
reasone_no = fields.Char("Number",tracking=True,copy=False)
sequence = fields.Integer(string="Sequence", help="Define the display order")
company_id = fields.Many2one('res.company', string='Company', readonly=True,default=lambda self: self.env.company)
active = fields.Boolean(default=True)

View File

@ -12,35 +12,33 @@ from odoo import fields, models, api,_
from datetime import datetime
class PartnerExtended(models.Model):
class Partner(models.Model):
_inherit = 'res.partner'
is_member = fields.Boolean(string='Is Member')
membership_count = fields.Integer(string="Membership Count", compute="_get_membership_count")
active_membership_id = fields.Many2one('dev.membership', string='Membership', compute='check_active_membership')
membrship_level = fields.Many2one('membership.level',string='Membrship level',store=True, required=False,readonly=1)
nationality_id = fields.Many2one('res.country', string="Nationality")
membrship_level = fields.Many2one('membership.level',string='Membrship level',compute='_compute_membership_level')
nationality_id = fields.Many2one('res.country', string="Nationality",default=lambda self: self.env.user.company_id.country_id)
is_membership_expire = fields.Boolean('Expire Membership',store=True, compute='check_active_membership')
memebership_status = fields.Char('Membership Status', compute='check_memebership_status')
membrship_no = fields.Char('Membership Number',readonly="1")
membrship_no = fields.Char('Membership Number')
birth_date = fields.Date(string='Birth Date')
join_date = fields.Date(string='Join Date')
memebership_end_date = fields.Date(string='Memebership End Date',readonly=1,store=True,related='active_membership_id.to_date')
age = fields.Integer(string='Age',store=True,compute='_compute_age')
memebership_end_date = fields.Date(string='Memebership End Date', compute='_compute_membership_end')
age = fields.Integer(string='Age',compute='_compute_age')
employer = fields.Char(string='Employer',)
product_id = fields.Many2one('product.product', string="Membership Type",store=True,readonly=1,related='active_membership_id.product_id')
product_id = fields.Many2one('product.product', string="Membership Type",related='active_membership_id.product_id')
gender = fields.Selection(
selection=[("male", "Male"), ("female", "Female")], default="male",string='Gender'
)
# todo start
@api.depends('birth_date')
def _compute_age(self):
for rec in self:
rec.age = 0
if rec.birth_date:
rec.age = (datetime.today().year-rec.birth_date.year)
def check_active_membership(self):
for partner in self:
partner.active_membership_id = False
@ -50,25 +48,50 @@ class PartnerExtended(models.Model):
membership_id = self.env['dev.membership'].sudo().search([('partner_id', '=', partner.id),
('state', '=', 'active'),
('from_date', '<=', c_date),
('to_date', '>=', c_date)], limit=1)
('to_date', '>=', c_date)], order='to_date desc', limit=1)
if membership_id:
partner.active_membership_id = membership_id and membership_id.id or False
else:
partner.is_membership_expire = True
# todo end
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
def _compute_membership_level(self):
for partner in self:
partner.membrship_level = False
if partner.membership_count > 0:
membership_id = self.env['dev.membership'].sudo().search([
('partner_id', '=', partner.id),
('state', 'in', ('active','expire','cancel'))], order='to_date desc', limit=1)
if membership_id:
partner.membrship_level = membership_id.membrship_level
def check_memebership_status(self):
for partner in self:
partner.memebership_status = ''
if partner.membership_count == 0:
partner.memebership_status = (_('No Membership'))
else:
# Prioritize active membership first
if partner.active_membership_id:
partner.memebership_status = partner.active_membership_id.product_id.name
else:
# Search for the last membership
last_membership = self.env['dev.membership'].search(
[('partner_id', '=', partner.id)], order='to_date desc', limit=1)
@ -87,7 +110,7 @@ class PartnerExtended(models.Model):
# If no active or draft memberships exist, check for expiration
if not partner.memebership_status and partner.is_membership_expire:
partner.memebership_status = (_('Membership Expire'))
##############################################################################################################################################
def _get_membership_count(self):

View File

@ -11,4 +11,6 @@ access_renew_membership_resone2,renew.membership.resone2,model_cancellation_reas
access_renew_membership_wiz_resone2,renew.membership.wiz.resone2,model_membership_request_cancel_wizard,,1,1,1,1
access_membership_level,membership.level,model_membership_level,,1,1,1,1
access_membership_cancel_requesst,membership.cancel,model_membership_cancellation_request,,1,1,1,1
access_product_template_membership,product.template membership,product.model_product_template,group_membership_manager,1,1,1,1
access_product_product_membership,product.product membership,product.model_product_product,group_membership_manager,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
11 access_membership_level membership.level model_membership_level 1 1 1 1
12 access_membership_cancel_requesst membership.cancel model_membership_cancellation_request 1 1 1 1
13 access_product_template_membership product.template membership product.model_product_template group_membership_manager 1 1 1 1
14 access_product_product_membership product.product membership product.model_product_product group_membership_manager 1 1 1 1
15
16

View File

@ -40,14 +40,14 @@
<button name="action_confirm_membership" type="object" string="Confirm" class="oe_highlight"
attrs="{'invisible': ([('state', '!=', 'draft')])}"/>
<button name="action_set_to_draft" type="object" string="Set To Draft"
attrs="{'invisible': ([('state', '!=', 'cancel')])}"/>
attrs="{'invisible': ([('state', 'not in', ['cancel','confirm'])])}"/>
<button string="Send by Mail" name="membership_send_by_mail" type="object" class="oe_highlight"
attrs="{'invisible': ([('state', 'not in', ['confirm', 'draft'])])}"/>
<button string="Renew Membership" name="%(dev_membership.action_renew_membership)d" type="action"
class="oe_highlight"
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"
attrs="{'invisible': ([('state', 'in', ['cancel'])])}"/>
attrs="{'invisible': ([('state', 'not in', ['active'])])}"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,active"/>
</header>
<sheet>
@ -83,7 +83,7 @@
context="{'form_view_ref': 'dev_membership.form_membership_product'}"
attrs="{'readonly': ([('state', '!=', 'draft')])}"/>
<field attrs="{'readonly': ([('state', '!=', 'draft')])}" name="membership_fees"/>
<field name="invoice_id" attrs="{'invisible': ([('invoice_id', '=', False)])}"/>
<field name="invoice_id" readonly="1" attrs="{'invisible': ([('invoice_id', '=', False)])}"/>
</group>
<group>
@ -106,10 +106,9 @@
style="width: 48%; padding:3px; font-size:13px;"/>
</div>
<field name="user_id" attrs="{'readonly':[('state','!=','draft')]}"/>
<field name="user_id" />
<field name="company_id" attrs="{'readonly': ([('state', '!=', 'draft')])}"/>
<field name="membership_id" invisible="1"/>
<field name="invoice_id" invisible="1"/>
</group>
</group>
<div>
@ -141,7 +140,7 @@
<kanban class="o_dev_membership_kanban">
<field name="id"/>
<field name="name"/>
<field name="partner_id"/>
<field name="partner_id" />
<field name="company_id"/>
<field name="from_date"/>
<field name="to_date"/>

View File

@ -7,7 +7,9 @@
<field eval="8" name="priority"/>
<field name="arch" type="xml">
<tree string="Members" sample="1" multi_edit="1">
<field name="membrship_no" optional="hide"/>
<field name="title" optional="hide"/>
<field name="display_name" string="Name"/>
<field name="membrship_level" optional="hide"/>
<field name="phone" class="o_force_ltr" optional="show"/>
@ -92,6 +94,7 @@
</t>
<div class="oe_kanban_details d-flex flex-column">
<strong class="o_kanban_record_title oe_partner_heading">
<field name="title"/>
<field name="display_name"/>
</strong>
<div class="o_kanban_tags_section oe_kanban_partner_categories"/>
@ -209,7 +212,7 @@
<field name="is_member"/>
<field name="product_id"/>
<field name="membrship_level"/>
<field name="membrship_no"/>
<field name="membrship_no" readonly="1"/>
</group>
<group name="other">
@ -225,26 +228,11 @@
<xpath expr="//field[@name='function']" position="attributes">
<attribute name="attrs">{'required':[('is_member','=',True)]}</attribute>
</xpath>
<xpath expr="//field[@name='street']" position="attributes">
<attribute name="attrs">{'required':[('is_member','=',True)]}</attribute>
<xpath expr="//field[@name='company_type']" position="attributes">
<attribute name="attrs">{'invisible':[('is_member','=',True)]}</attribute>
</xpath>
<xpath expr="//field[@name='street2']" position="attributes">
<attribute name="attrs">{'required':[('is_member','=',True)]}</attribute>
</xpath>
<xpath expr="//field[@name='city']" position="attributes">
<attribute name="attrs">{'required':[('is_member','=',True)]}</attribute>
</xpath>
<xpath expr="//field[@name='state_id']" position="attributes">
<attribute name="attrs">{'required':[('is_member','=',True)]}</attribute>
</xpath>
<xpath expr="//field[@name='zip']" position="attributes">
<attribute name="attrs">{'required':[('is_member','=',True)]}</attribute>
</xpath>
<xpath expr="//field[@name='vat']" position="attributes">
<attribute name="attrs">{'invisible':[('company_type','!=','company')]}</attribute>
@ -275,7 +263,7 @@
<field name="arch" type="xml">
<xpath expr="//group[@name='identifcation_info']" position="after">
<group>
<field name="gender"/>
<field name="gender" attrs="{'required':[('is_member','=',True)]}"/>
<field name="nationality_id"/>
<field attrs="{'required':[('is_member','=',True)]}" name="birth_date"/>
<field name="age"/>
@ -299,7 +287,7 @@
domain="[('is_membership_expire', '=', True)]"/>
<group string="Group By">
<filter string="Membership Type" name="product_id" context="{'group_by': 'product_id'}"/>
<filter string="Branch" name="branch_id" context="{'group_by': 'branch_id'}"/>
<!-- filter string="Branch" name="branch_id" context="{'group_by': 'branch_id'}"/ -->
</group>
</search>
</field>

View File

@ -86,8 +86,9 @@
<group>
<group string="Membership Terms">
<field widget="many2many_tags" name="nationality_ids"/>
<field name="age"/>
<field name="gender"/>
<field name="age"/>
<field name="max_age"/>
</group>
<group string="Nomination for Membership">
<field name="nominee"/>

View File

@ -136,7 +136,7 @@
<menuitem id="menu_dev_membership_general_settings"
name="Settings"
parent="menu_configuration_root"
sequence="0"
sequence="0"
action="action_dev_membership_config_settings"/>
<menuitem id="menu_dev_membership_general_reasons"