Merge pull request #614 from expsa/membership_dev

Membership dev
This commit is contained in:
zainab2097 2024-08-08 16:54:50 +03:00 committed by GitHub
commit cf86a4eac5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 166 additions and 62 deletions

View File

@ -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>

View File

@ -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'

View File

@ -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)

View File

@ -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'
)

View File

@ -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)

View File

@ -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,
}
}

View File

@ -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"/>

View File

@ -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">

View File

@ -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"/>

View File

@ -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>