Merge pull request #711 from expsa/sale_dev

Sale dev
This commit is contained in:
zainab2097 2024-08-14 14:43:43 +03:00 committed by GitHub
commit b7cfe67ff8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 108 additions and 53 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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