commit
b7cfe67ff8
|
|
@ -57,7 +57,7 @@
|
|||
<field name="name">Membership Cancel Notify</field>
|
||||
<field name="email_from">${(object.company_id.email or '') | safe}</field>
|
||||
<field name="email_to">${(object.partner_id.email or '') | safe}</field>
|
||||
<field name="subject">Membership Second Expire Reminder</field>
|
||||
<field name="subject">Membership Cancel Notify Reminder</field>
|
||||
<field name="model_id" ref="dev_membership.model_dev_membership"/>
|
||||
<field name="auto_delete" eval="True"/>
|
||||
<field name="body_html"><![CDATA[
|
||||
|
|
@ -70,7 +70,7 @@
|
|||
<field name="name">Membership Cancel Notify</field>
|
||||
<field name="email_from">${(object.company_id.email or '') | safe}</field>
|
||||
<field name="email_to">${(object.user_id.email or '') | safe}</field>
|
||||
<field name="subject">Membership Second Expire Reminder</field>
|
||||
<field name="subject">Membership Cancel Reminder</field>
|
||||
<field name="model_id" ref="dev_membership.model_dev_membership"/>
|
||||
<field name="auto_delete" eval="True"/>
|
||||
<field name="body_html"><![CDATA[
|
||||
|
|
|
|||
|
|
@ -13,7 +13,14 @@
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -84,7 +84,8 @@ class DevMembership(models.Model):
|
|||
def _check_from_date(self):
|
||||
for rec in self:
|
||||
if not rec.from_date >= datetime.now().date():
|
||||
raise ValidationError("Membership date should be greater than or equal to today's date!!")
|
||||
pass
|
||||
# raise ValidationError("Membership date should be greater than or equal to today's date!!")
|
||||
|
||||
def make_activity_group(self):
|
||||
# templet_id = self.env.ref('dev_membership.template_membership_cancell')
|
||||
|
|
@ -150,7 +151,12 @@ class DevMembership(models.Model):
|
|||
|
||||
self.state = 'active'
|
||||
self.partner_id.product_id = self.product_id.id
|
||||
|
||||
# Handle sequence generation for new or renewed memberships
|
||||
sequence_code = 'membership.no.sequence'
|
||||
if not self.membership_id or self.state == 'cancel':
|
||||
# Generate new sequence number if it's the first membership or it's a renewal after cancellation
|
||||
self.partner_id.membrship_no = self.env['ir.sequence'].next_by_code(sequence_code) or _('New')
|
||||
|
||||
if not self.partner_id.join_date:
|
||||
self.partner_id.join_date = self.from_date
|
||||
if not self.partner_id.membrship_level:
|
||||
|
|
@ -233,10 +239,20 @@ class DevMembership(models.Model):
|
|||
('to_date', '<=', date),('membership_id','=',False)
|
||||
])
|
||||
for membership in membership_ids:
|
||||
membership.write({
|
||||
'state': 'cancel',
|
||||
'cancel_reason': cancel_reason
|
||||
})
|
||||
# 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,
|
||||
'request_date': fields.Datetime.now(),
|
||||
'state': 'draft',
|
||||
'cancel_reason': cancel_reason
|
||||
})
|
||||
tmpl_id.send_mail(membership.id, force_send=True)
|
||||
return True
|
||||
def cancell2_membership_reminder_email_cron(self):
|
||||
|
|
@ -252,10 +268,20 @@ class DevMembership(models.Model):
|
|||
('to_date', '<=', date),('membership_id','=',False)
|
||||
])
|
||||
for membership in membership_ids:
|
||||
membership.write({
|
||||
'state': 'cancel',
|
||||
'cancel_reason': cancel_reason
|
||||
})
|
||||
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,
|
||||
'request_date': fields.Datetime.now(),
|
||||
'state': 'draft',
|
||||
'cancel_reason': cancel_reason
|
||||
})
|
||||
tmpl_id.send_mail(membership.id, force_send=True)
|
||||
return True
|
||||
|
||||
|
|
@ -268,6 +294,20 @@ class DevMembership(models.Model):
|
|||
membership_ids = membership_pool.search([('state', '=', 'expire'),
|
||||
('to_date', '<=', date)])
|
||||
for membership in membership_ids:
|
||||
# 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,
|
||||
'request_date': fields.Datetime.now(),
|
||||
'state': 'draft',
|
||||
'cancel_reason': cancel_reason
|
||||
})
|
||||
tmpl_id.send_mail(membership.id, force_send=True)
|
||||
return True
|
||||
def membership_secand_reminder_email_cron(self):
|
||||
|
|
@ -304,7 +344,7 @@ class DevMembership(models.Model):
|
|||
# البحث عن مستوى العضوية بناءً على إجمالي الرسوم
|
||||
level_by_fees = self.env['membership.level'].search([
|
||||
('min', '<=', total_fees),
|
||||
('max', '>=', total_fees),('years', '<=',total_duration)
|
||||
('max', '>=', total_fees),('years', '>=',total_duration)
|
||||
],order='sequence desc',limit=1)
|
||||
if level_by_fees :
|
||||
record.membrship_level = level_by_fees
|
||||
|
|
|
|||
|
|
@ -20,6 +20,10 @@ class MembershipCancellationRequest(models.Model):
|
|||
|
||||
def action_approve(self):
|
||||
for rec in self:
|
||||
# Check if the request date is before the membership end date
|
||||
if rec.request_date < rec.membership_id.membership_end_date:
|
||||
# Update the membership end date to the request date
|
||||
rec.membership_id.membership_end_date = rec.request_date
|
||||
rec.state = 'approved'
|
||||
rec.membership_id.state = 'cancel'
|
||||
|
||||
|
|
|
|||
|
|
@ -64,27 +64,29 @@ class PartnerExtended(models.Model):
|
|||
if partner.membership_count == 0:
|
||||
partner.memebership_status = 'No Membership'
|
||||
else:
|
||||
if partner.is_membership_expire:
|
||||
partner.memebership_status = 'Membership Expire'
|
||||
# Prioritize active membership first
|
||||
if partner.active_membership_id:
|
||||
partner.memebership_status = partner.active_membership_id.product_id.name
|
||||
else:
|
||||
if partner.active_membership_id:
|
||||
partner.memebership_status = partner.active_membership_id.product_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'
|
||||
# Search for the last membership
|
||||
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 Waiting'
|
||||
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 Waiting for 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 Waiting for Payment'
|
||||
# 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'
|
||||
##############################################################################################################################################
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@
|
|||
<field name="inherit_id" ref="partner_custom.partner_view_property_cusotm"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//group[@name='identifcation_info']" position="after">
|
||||
<group>
|
||||
<group attrs="{'invisible':[('company_type', '=', 'company')]}>
|
||||
<field name="gender"/>
|
||||
<field name="nationality_id"/>
|
||||
<field name="birth_date"/>
|
||||
|
|
@ -181,6 +181,20 @@
|
|||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='vat']" position="attributes">
|
||||
<attribute name="atrrs">{'invisible':[('company_type','!=','company')]}"</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//page[@name='sales_purchases']" position="attributes">
|
||||
<attribute name="groups">dev_membership.sale_purchase_tab</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='title']" position="replace"></xpath>
|
||||
<!-- Locate the 'name' field in the form -->
|
||||
<xpath expr="//h1/field[@id='individual']" position="before">
|
||||
<!-- Add the 'title' field next to the 'name' field -->
|
||||
<field name="title" class="o_address_state" placeholder="Title"
|
||||
options="{'no_quick_create': True}"
|
||||
attrs="{'invisible': [('company_type', '=', 'company')]}"/>
|
||||
</xpath>
|
||||
<xpath expr="//page" position="after">
|
||||
|
||||
<page group="dev_membership.group_membership_user" name="memebership" string='Memebership'>
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
'company': 'Cybrosys Techno Solutions',
|
||||
'maintainer': 'Cybrosys Techno Solutions',
|
||||
'website': 'https://www.cybrosys.com',
|
||||
'depends': ['membership','dev_membership'],
|
||||
'depends': ['dev_membership'],
|
||||
'data': [
|
||||
'report/membership_card_reports.xml',
|
||||
'data/ir_actions_server_data.xml',
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ class ResPartner(models.Model):
|
|||
partner_id = self.env['res.partner'] \
|
||||
.browse(self.env.context.get('active_ids'))
|
||||
company_id = self.env.company
|
||||
if self.is_member or partner_id.member_lines:
|
||||
if self.is_member:
|
||||
data = {
|
||||
'name': partner_id.name,
|
||||
'product_id': partner_id.product_id.name,
|
||||
|
|
@ -49,21 +49,9 @@ class ResPartner(models.Model):
|
|||
'membrship_level_color':partner_id.membrship_level.color,
|
||||
'membrship_no':partner_id.membrship_no,
|
||||
'image': partner_id.image_1920,
|
||||
'phone': partner_id.phone,
|
||||
'function': partner_id.function,
|
||||
'free_member': partner_id.is_member,
|
||||
'membership_product': partner_id.member_lines.
|
||||
mapped('membership_id.name'),
|
||||
'start_date': partner_id.join_date,
|
||||
'end_date': partner_id.memebership_end_date,
|
||||
'company_name': company_id.name,
|
||||
'company_address': company_id.street,
|
||||
'city': company_id.city,
|
||||
'country': company_id.country_id.name,
|
||||
'state': company_id.state_id.name,
|
||||
'company_email': company_id.email,
|
||||
'company_phone': company_id.phone,
|
||||
'website': company_id.website,
|
||||
}
|
||||
return self.env.ref('membership_card_odoo.action_membership'
|
||||
'_card').report_action(None, data=data)
|
||||
|
|
|
|||
|
|
@ -31,9 +31,9 @@
|
|||
<t t-call="web.html_container">
|
||||
<t t-set="company" t-value="user.company_id"/>
|
||||
<!-- Header -->
|
||||
<div class="page">
|
||||
<div style="font-family: 'Roboto', sans-serif;" class="page">
|
||||
<div t-attf-style="background-color:{{membrship_level_color }};">
|
||||
<div>
|
||||
<div style="font-family: 'Roboto', sans-serif;">
|
||||
<center>
|
||||
<h2><t t-esc="company.name"/></h2>
|
||||
</center>
|
||||
|
|
@ -42,12 +42,12 @@
|
|||
</center>
|
||||
</div><br/>
|
||||
<!-- Content -->
|
||||
<div class="row mt32">
|
||||
<div style="font-family: 'Roboto', sans-serif;" class="row mt32">
|
||||
<div style="margin-top:10px;float:right" class="col-4">
|
||||
<img t-if="image" style="width: 120px; border-radius: 5px;"
|
||||
t-attf-src="data:image/*;base64,{{image}}"/>
|
||||
</div>
|
||||
<div style="position:relative;left:80px;margin-top:5px;float:left" class="col-8">
|
||||
<div style="font-family: 'Roboto', sans-serif;position:relative;left:80px;margin-top:5px;float:left" class="col-8">
|
||||
<p dir="rtl" t-if="name"><strong>الاسم:</strong> <t t-esc="name"/></p>
|
||||
<p dir="rtl" t-if="membrship_no"><strong>رقم العضوية:</strong> <t t-esc="membrship_no"/></p>
|
||||
<p dir="rtl" t-if="product_id"><strong> نوع العضوية:</strong> <t t-esc="product_id"/></p>
|
||||
|
|
|
|||
Loading…
Reference in New Issue