[UPDATE]UPDATE
This commit is contained in:
parent
6a3866bc2b
commit
80cbc4db9b
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in New Issue