commit
cf86a4eac5
|
|
@ -5,7 +5,33 @@
|
|||
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_reasons" model="ir.sequence">
|
||||
<field name="name">Membership resonse Number</field>
|
||||
<field name="code">se.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>
|
||||
|
||||
|
||||
<!-- end -->
|
||||
<record id="seq_dev_membership" model="ir.sequence">
|
||||
<field name="name">seq.dev.membership</field>
|
||||
<field name="code">seq.dev.membership</field>
|
||||
|
|
|
|||
|
|
@ -148,15 +148,12 @@ 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.partner_id.age < 18:
|
||||
raise ValidationError(_('The member must be at least 18 years old.'))
|
||||
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:
|
||||
raise ValidationError(_('Membership is only allowed for %s') % self.product_id.gender)
|
||||
|
||||
|
||||
|
||||
|
||||
raise ValidationError(_('Membership is only %s allowed') % self.product_id.gender)
|
||||
self.state = 'confirm'
|
||||
|
||||
def action_active_membership(self):
|
||||
if not self.invoice_id and not self.is_free:
|
||||
raise ValidationError(_('Please Create Membership Invoice'))
|
||||
|
|
@ -166,6 +163,8 @@ class DevMembership(models.Model):
|
|||
self.partner_id.product_id = self.product_id.id
|
||||
if not self.partner_id.join_date:
|
||||
self.partner_id.join_date = self.from_date
|
||||
if not self.partner_id.memebership_end_date:
|
||||
self.partner_id.memebership_end_date = self.to_date
|
||||
|
||||
def action_cancel_membership(self):
|
||||
self.state = 'cancel'
|
||||
|
|
|
|||
|
|
@ -9,3 +9,25 @@ class MembershipLevel(models.Model):
|
|||
min = fields.Integer(string='Maximum', required=True)
|
||||
max = fields.Integer(string='Maximum', required=True)
|
||||
color = fields.Char(string='Membership Card Color')
|
||||
level_no = fields.Char("Number", default=lambda self: self._get_next_levelno(), tracking=True,copy=False)
|
||||
sequence = fields.Integer(string="Sequence", help="Define the display order")
|
||||
|
||||
|
||||
@api.model
|
||||
def _get_next_levelno(self):
|
||||
next_sequence = "/ "
|
||||
sequence = self.env['ir.sequence'].search(
|
||||
['|', ('company_id', '=', self.env.company[0].id), ('company_id', '=', False),
|
||||
('code', '=', 'seq.membership.level')], limit=1)
|
||||
if sequence:
|
||||
next_sequence = sequence.get_next_char(sequence.number_next_actual)
|
||||
return next_sequence
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
company_id = vals.get('company_id', self.default_get(['company_id'])['company_id'])
|
||||
self_comp = self.with_company(company_id)
|
||||
if not vals.get('level_no', False):
|
||||
vals['level_no'] = self_comp.env['ir.sequence'].next_by_code('seq.membership.level') or '/'
|
||||
return super().create(vals)
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,27 @@ from odoo import fields,api, models,_
|
|||
class ProductTemplate(models.Model):
|
||||
_inherit = "product.template"
|
||||
|
||||
type_no = fields.Char("Number", default=lambda self: self._get_next_projectno(), tracking=True,copy=False)
|
||||
sequence_no = fields.Integer(string="Sequence", help="Define the display order")
|
||||
|
||||
@api.model
|
||||
def _get_next_projectno(self):
|
||||
next_sequence = "/ "
|
||||
sequence = self.env['ir.sequence'].search(
|
||||
['|', ('company_id', '=', self.env.company[0].id), ('company_id', '=', False),
|
||||
('code', '=', 'seq.product.template')], limit=1)
|
||||
if sequence:
|
||||
next_sequence = sequence.get_next_char(sequence.number_next_actual)
|
||||
return next_sequence
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
company_id = vals.get('company_id', self.default_get(['company_id'])['company_id'])
|
||||
self_comp = self.with_company(company_id)
|
||||
if not vals.get('type_no', False):
|
||||
vals['type_no'] = self_comp.env['ir.sequence'].next_by_code('seq.product.template') or '/'
|
||||
return super().create(vals)
|
||||
|
||||
gender = fields.Selection(
|
||||
selection=[("male", "Male"), ("female", "Female")], default="male",string='Gender'
|
||||
)
|
||||
|
|
|
|||
|
|
@ -59,3 +59,26 @@ class CancellReason(models.Model):
|
|||
_description = 'Cancellation Reason'
|
||||
|
||||
name = fields.Char(string='Reasone of Cancellation')
|
||||
reasone_no = fields.Char("Number", default=lambda self: self._get_next_reasone_no(), tracking=True,copy=False)
|
||||
sequence = fields.Integer(string="Sequence", help="Define the display order")
|
||||
|
||||
|
||||
@api.model
|
||||
def _get_next_reasone_no(self):
|
||||
next_sequence = "/ "
|
||||
sequence = self.env['ir.sequence'].search(
|
||||
['|', ('company_id', '=', self.env.company[0].id), ('company_id', '=', False),
|
||||
('code', '=', 'seq.cancellation.reason')], limit=1)
|
||||
if sequence:
|
||||
next_sequence = sequence.get_next_char(sequence.number_next_actual)
|
||||
return next_sequence
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
company_id = vals.get('company_id', self.default_get(['company_id'])['company_id'])
|
||||
self_comp = self.with_company(company_id)
|
||||
if not vals.get('reasone_no', False):
|
||||
vals['reasone_no'] = self_comp.env['ir.sequence'].next_by_code('seq.cancellation.reason') or '/'
|
||||
return super().create(vals)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -44,38 +44,17 @@ class PartnerExtended(models.Model):
|
|||
for rec in self:
|
||||
if rec.active_membership_id:
|
||||
print('if in.....')
|
||||
# todo end
|
||||
def check_memebership_status(self):
|
||||
for partner in self:
|
||||
partner.memebership_status = ''
|
||||
if partner.membership_count == 0:
|
||||
partner.memebership_status = 'No Membership'
|
||||
|
||||
else:
|
||||
if partner.active_membership_id:
|
||||
partner.memebership_status = 'Membership : ' + partner.active_membership_id.name
|
||||
else:
|
||||
# البحث عن حالة الاشتراك الأخيرة
|
||||
last_membership = self.env['dev.membership'].search([('partner_id', '=', partner.id)], order='to_date desc', limit=1)
|
||||
print('last_membership = ',last_membership)
|
||||
if last_membership:
|
||||
if last_membership.state=='draft':
|
||||
partner.memebership_status = 'Membership Waitting'
|
||||
elif last_membership.state=='cancel':
|
||||
partner.memebership_status = 'Membership Cancelled'
|
||||
elif last_membership.state=='confirm':
|
||||
if not last_membership.invoice_id and not last_membership.is_free:
|
||||
partner.memebership_status = 'Membership Waitting invoice'
|
||||
elif last_membership.invoice_id.payment_state in ['paid','in_payment']:
|
||||
partner.memebership_status = 'Membership Paid'
|
||||
elif last_membership.invoice_id.payment_state not in ['paid','in_payment']:
|
||||
partner.memebership_status = 'Membership Waitting Paid'
|
||||
##############################################################################################################################################
|
||||
# if partner.is_membership_expire:
|
||||
# partner.memebership_status = 'Membership Expire'
|
||||
# else:
|
||||
if partner.active_membership_id:
|
||||
partner.memebership_status = 'Membership : ' + partner.active_membership_id.name
|
||||
# def check_memebership_status(self):
|
||||
# for partner in self:
|
||||
# partner.memebership_status = ''
|
||||
# if partner.membership_count == 0:
|
||||
# partner.memebership_status = 'No Membership'
|
||||
# else:
|
||||
# if partner.is_membership_expire:
|
||||
# partner.memebership_status = 'Membership Expire'
|
||||
# else:
|
||||
# if partner.active_membership_id:
|
||||
# partner.memebership_status = 'Membership : ' + partner.active_membership_id.name
|
||||
|
||||
def check_active_membership(self):
|
||||
for partner in self:
|
||||
|
|
@ -92,6 +71,38 @@ class PartnerExtended(models.Model):
|
|||
else:
|
||||
partner.is_membership_expire = True
|
||||
|
||||
|
||||
# todo end
|
||||
def check_memebership_status(self):
|
||||
for partner in self:
|
||||
partner.memebership_status = ''
|
||||
if partner.membership_count == 0:
|
||||
partner.memebership_status = 'No Membership'
|
||||
else:
|
||||
if partner.is_membership_expire:
|
||||
partner.memebership_status = 'Membership Expire'
|
||||
else:
|
||||
if partner.active_membership_id:
|
||||
partner.memebership_status = 'Membership : ' + partner.active_membership_id.name
|
||||
else:
|
||||
# البحث عن حالة الاشتراك الأخيرة
|
||||
last_membership = self.env['dev.membership'].search([('partner_id', '=', partner.id)],
|
||||
order='to_date desc', limit=1)
|
||||
if last_membership:
|
||||
if last_membership.state == 'draft':
|
||||
partner.memebership_status = 'Membership Waitting'
|
||||
elif last_membership.state == 'cancel':
|
||||
partner.memebership_status = 'Membership Cancelled'
|
||||
elif last_membership.state == 'confirm':
|
||||
if not last_membership.invoice_id and not last_membership.is_free:
|
||||
partner.memebership_status = 'Membership Waitting invoice'
|
||||
elif last_membership.invoice_id.payment_state in ['paid', 'in_payment']:
|
||||
partner.memebership_status = 'Membership Paid'
|
||||
elif last_membership.invoice_id.payment_state not in ['paid', 'in_payment']:
|
||||
partner.memebership_status = 'Membership Waitting Paid'
|
||||
##############################################################################################################################################
|
||||
|
||||
|
||||
def _get_membership_count(self):
|
||||
for rec in self:
|
||||
membership_count = self.env['dev.membership'].search_count([('partner_id', '=', rec.id)])
|
||||
|
|
@ -107,4 +118,4 @@ class PartnerExtended(models.Model):
|
|||
'view_mode': 'tree,form',
|
||||
'target': 'current',
|
||||
'context': ctx,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
<field name="model">membership.level</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree editable="bottom" string="Membership Level">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="level_no"/>
|
||||
<field name="name"/>
|
||||
<field name="years"/>
|
||||
<field name="min"/>
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
<field name="mobile"/>
|
||||
<field name="state_id"/>
|
||||
<field name="join_date"/>
|
||||
<field name="memebership_end_date"/>
|
||||
<field name="membrship_level"/>
|
||||
<field name="category_id" widget="many2many_tags"/>
|
||||
|
||||
|
|
@ -133,7 +134,7 @@
|
|||
<div class="o_kanban_record_bottom">
|
||||
<div class="oe_kanban_bottom_left text-muted">
|
||||
<span>
|
||||
<t t-esc="record.join_date.value"/>
|
||||
<t t-esc="record.memebership_end_date.value"/>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -168,7 +169,7 @@
|
|||
</xpath>
|
||||
|
||||
<xpath expr="//page" position="after">
|
||||
<page name="memebership" string='Memebership'>
|
||||
<page group="dev_membership.group_membership_user" name="memebership" string='Memebership'>
|
||||
<group>
|
||||
<group name="memeber">
|
||||
<field name="is_member"/>
|
||||
|
|
@ -189,7 +190,7 @@
|
|||
<attribute name="required">True</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//div[@name='button_box']" position="inside">
|
||||
<button name="view_membership" type="object"
|
||||
<button group="dev_membership.group_membership_user" name="view_membership" type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-vcard-o" attrs="{'invisible' : [('membership_count', '=', 0)]}">
|
||||
<div class="o_stat_info">
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
<field name="model">product.template</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Membership Product Tree View">
|
||||
<field name="type_no"/>
|
||||
<field name="sequence_no" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="default_code"/>
|
||||
<field name="duration"/>
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
</div>
|
||||
<div class="text-muted content-group mt16">
|
||||
<field name="days_before" class="text-left oe_inline"/>
|
||||
<field name="interval" readonly="1"
|
||||
<field name="interval" readonly="1"
|
||||
style="width: 48%; padding:3px; font-size:13px;"/>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -34,16 +34,13 @@
|
|||
</div>
|
||||
<div class="text-muted content-group mt16">
|
||||
<field name="days_before_second" class="text-left oe_inline"/>
|
||||
<field name="interval" readonly="1"
|
||||
<field name="interval" readonly="1"
|
||||
style="width: 48%; padding:3px; font-size:13px;"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- todo end -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="app_settings_block" data-key="dev_membership">
|
||||
<h2>Membership Experience Evaluation</h2>
|
||||
<div class="row mt16 o_settings_container" name="dev_membership_setting_container">
|
||||
<div class="col-12 col-lg-6 o_setting_box" id="late_reg">
|
||||
<div class="o_setting_left_pane"/>
|
||||
|
|
@ -77,9 +74,6 @@
|
|||
</div>
|
||||
<!-- todo end -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="app_settings_block" data-key="dev_membership">
|
||||
<h2>Membership Cancellation</h2>
|
||||
<div class="row mt16 o_settings_container" name="dev_membership_setting_container">
|
||||
<div class="col-12 col-lg-6 o_setting_box" id="late_cancellfine">
|
||||
<div class="o_setting_left_pane"/>
|
||||
|
|
@ -91,8 +85,9 @@
|
|||
</div>
|
||||
<div class="text-muted content-group mt16">
|
||||
<field name="post_expiry_period"/>
|
||||
<field name="interval" readonly="1"
|
||||
style="width: 48%; padding:3px; font-size:13px;"/> </div>
|
||||
<field name="interval" readonly="1"
|
||||
style="width: 48%; padding:3px; font-size:13px;"/>
|
||||
</div>
|
||||
<div class="text-muted content-group mt16">
|
||||
<field name="cancellation_reason"/>
|
||||
</div>
|
||||
|
|
@ -114,15 +109,17 @@
|
|||
<field name="target">inline</field>
|
||||
<field name="context">{'module' : 'dev_membership', 'bin_size': False}</field>
|
||||
</record>
|
||||
<record id="cancell_view_tree" model="ir.ui.view">
|
||||
<field name="name">cancell_view_tree</field>
|
||||
<field name="model">cancellation.reason</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree editable='top' string="cancell_tree">
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<record id="cancell_view_tree" model="ir.ui.view">
|
||||
<field name="name">cancell_view_tree</field>
|
||||
<field name="model">cancellation.reason</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree editable='top' string="cancell_tree">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="reasone_no"/>
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_dev_membership_config_refuse_resone" model="ir.actions.act_window">
|
||||
<field name="name">Cancell Resone</field>
|
||||
|
|
|
|||
Loading…
Reference in New Issue