From 9b2b86bf8ee9bf001cbb093ea5e5bd382b7bd2db Mon Sep 17 00:00:00 2001
From: zainab8585
Date: Mon, 8 Jul 2024 10:34:20 +0200
Subject: [PATCH 1/2] [ADD]ADDcorn job for second reminder
---
.../dev_membership/data/mail_template.xml | 40 +++++++++++++------
odex25_sales/dev_membership/data/sequence.xml | 13 ++++++
.../dev_membership/models/dev_membership.py | 12 +++++-
3 files changed, 52 insertions(+), 13 deletions(-)
diff --git a/odex25_sales/dev_membership/data/mail_template.xml b/odex25_sales/dev_membership/data/mail_template.xml
index 4da794406..b76c9c59b 100644
--- a/odex25_sales/dev_membership/data/mail_template.xml
+++ b/odex25_sales/dev_membership/data/mail_template.xml
@@ -12,7 +12,9 @@
Hello ${object.partner_id.name},
-
Your ${object.product_id.name} membership of amount ${object.membership_fees} have activated on ${object.from_date} - ${object.to_date} .
+
Your ${object.product_id.name} membership of amount ${object.membership_fees} have
+ activated on ${object.from_date} - ${object.to_date} .
+
@@ -21,21 +23,35 @@
-
+
- Membership Expire Reminder
- ${(object.company_id.email or '') | safe}
- ${(object.partner_id.email or '') | safe}
- Membership Expire Reminder
-
-
- Membership Expire Reminder
+ ${(object.company_id.email or '') | safe}
+ ${(object.partner_id.email or '') | safe}
+ Membership Expire Reminder
+
+
+ Hello ${object.partner_id.name}.
Hope you doing well!
It's gentle reminder that your membership is about to expire on ${object.datetime_convert()}.
]]>
-
-
+
+
+
+ Membership Expire Second Reminder
+ ${(object.company_id.email or '') | safe}
+ ${(object.partner_id.email or '') | safe}
+ Membership Expire Reminder
+
+
+ Hello ${object.partner_id.name}.
+ Hope you doing well!
+ It's gentle reminder that your membership is about to expire on ${object.datetime_convert()}.
+ ]]>
+
+
Membership Expired Mail
${(object.company_id.email or '') | safe}
@@ -49,5 +65,5 @@
Your membership ${(object.name)} was expired on ${object.datetime_convert()} date.
]]>
-
+
diff --git a/odex25_sales/dev_membership/data/sequence.xml b/odex25_sales/dev_membership/data/sequence.xml
index 46c7681ab..6bcdcc389 100644
--- a/odex25_sales/dev_membership/data/sequence.xml
+++ b/odex25_sales/dev_membership/data/sequence.xml
@@ -26,7 +26,20 @@
model.membership_reminder_email_cron()
+
+
+ Membership Secand Reminder
+
+ 1
+ days
+ -1
+
+
+ code
+ model.membership_secand_reminder_email_cron()
+
+
Auto Expire Membership
diff --git a/odex25_sales/dev_membership/models/dev_membership.py b/odex25_sales/dev_membership/models/dev_membership.py
index 2f61560d1..424a6a092 100644
--- a/odex25_sales/dev_membership/models/dev_membership.py
+++ b/odex25_sales/dev_membership/models/dev_membership.py
@@ -141,7 +141,17 @@ class DevMembership(models.Model):
for membership in membership_ids:
tmpl_id.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')
+ days_before_second = self.env['ir.config_parameter'].get_param('dev_membership.days_before_second')
+ if tmpl_id:
+ date = datetime.now().date() + relativedelta(days=int(days_before))
+ membership_ids = membership_pool.search([('state', '=', 'active'),
+ ('to_date', '<=', date)])
+ for membership in membership_ids:
+ tmpl_id.send_mail(membership.id, force_send=True)
+ return True
def datetime_convert(self):
convert_date = self.to_date.strftime("%d-%m-%Y")
return convert_date
From dded48e30317511468be85f3b6efda5992aff128 Mon Sep 17 00:00:00 2001
From: zainab8585
Date: Mon, 8 Jul 2024 16:18:08 +0200
Subject: [PATCH 2/2] [ADD] ADD cancell membership,renew,devmembership
customuzation
---
odex25_sales/dev_membership/__manifest__.py | 1 +
.../dev_membership/data/mail_template.xml | 3 +-
.../dev_membership/models/dev_membership.py | 58 +++++-
.../security/ir.model.access.csv | 4 +-
.../dev_membership/views/dev_membership.xml | 71 +++++--
.../dev_membership/views/partner_extended.xml | 193 ++++++++++--------
.../views/res_config_settings.xml | 14 ++
.../dev_membership/wizard/__init__.py | 1 +
.../wizard/cancel_membership.py | 39 ++++
.../wizard/cancel_membership.xml | 28 +++
10 files changed, 301 insertions(+), 111 deletions(-)
create mode 100644 odex25_sales/dev_membership/wizard/cancel_membership.py
create mode 100644 odex25_sales/dev_membership/wizard/cancel_membership.xml
diff --git a/odex25_sales/dev_membership/__manifest__.py b/odex25_sales/dev_membership/__manifest__.py
index 0bf562f66..890306c1d 100644
--- a/odex25_sales/dev_membership/__manifest__.py
+++ b/odex25_sales/dev_membership/__manifest__.py
@@ -70,6 +70,7 @@ odoo app manage Membership subscription plans, odoo membership memeber, odoo mem
'data/sequence.xml',
'views/main_menu.xml',
'wizard/renew_membership.xml',
+ 'wizard/cancel_membership.xml',
'views/partner_extended.xml',
'views/dev_membership.xml',
'views/product_template.xml',
diff --git a/odex25_sales/dev_membership/data/mail_template.xml b/odex25_sales/dev_membership/data/mail_template.xml
index b76c9c59b..2eeaffbe0 100644
--- a/odex25_sales/dev_membership/data/mail_template.xml
+++ b/odex25_sales/dev_membership/data/mail_template.xml
@@ -1,5 +1,6 @@
+
membership.email.template
Membership Detail
@@ -42,7 +43,7 @@
Membership Expire Second Reminder
${(object.company_id.email or '') | safe}
${(object.partner_id.email or '') | safe}
- Membership Expire Reminder
+ Membership Second Expire Reminder
= datetime.now().date():
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')
+ # templet2_id = self.env.ref('dev_membership.template_membership_cancell2')
+ date_deadline = fields.Date.today()
+ note=_('Membership %s is Cancelled') % self.name
+
+ summary = _("Membership Cancellation")
+ self.sudo().activity_schedule(
+ 'mail.mail_activity_data_todo', date_deadline,
+ note=note,
+ user_id=self.partner_id.user_id.id,
+ res_id=self.id,
+ summary=summary
+ )
+ self.sudo().activity_schedule(
+ 'mail.mail_activity_data_todo', date_deadline,
+ note=note,
+ user_id=self.user_id.id,
+ res_id=self.id,
+ summary=summary
+ )
+
@api.constrains('partner_id', 'from_date')
def _check_if_membership_exists(self):
membership_obj = self.env['dev.membership'].search([('partner_id.id', '=', self.partner_id.id), ('state', 'in', ['draft', 'active', 'confirm']), ('id', '!=', self.id)])
@@ -75,9 +121,9 @@ class DevMembership(models.Model):
self.state = 'confirm'
def action_active_membership(self):
- if not self.invoice_id:
+ if not self.invoice_id and not self.is_free:
raise ValidationError(_('Please Create Membership Invoice'))
- if self.invoice_id.payment_state != 'paid':
+ if self.invoice_id.payment_state != 'paid' and not self.is_free:
raise ValidationError(_('Membership Invoice is not paid.\nPlease Paid membership invoice and active the membership.'))
self.state = 'active'
diff --git a/odex25_sales/dev_membership/security/ir.model.access.csv b/odex25_sales/dev_membership/security/ir.model.access.csv
index 64ac76336..19c1875a0 100644
--- a/odex25_sales/dev_membership/security/ir.model.access.csv
+++ b/odex25_sales/dev_membership/security/ir.model.access.csv
@@ -6,5 +6,7 @@ access_dev_membership_user,dev.membership.user,model_dev_membership,group_member
access_dev_membership_manager,dev.membership.manager,model_dev_membership,group_membership_manager,1,1,1,1
access_renew_membership_user,renew.membership.user,model_renew_membership,group_membership_user,1,1,1,1
access_renew_membership_manager,renew.membership.manager,model_renew_membership,group_membership_manager,1,1,1,1
-access_renew_membership_resone,renew.membership.resone,model_cancellation_reason,,1,1,1,1
+access_renew_membership_resone,renew.membership.resone,model_cancellation_reason,group_membership_manager,1,1,1,1
+access_renew_membership_resone2,renew.membership.resone2,model_cancellation_reason,group_membership_user,1,0,0,0
+access_renew_membership_wiz_resone2,renew.membership.wiz.resone2,model_membership_request_cancel_wizard,,1,1,1,1
diff --git a/odex25_sales/dev_membership/views/dev_membership.xml b/odex25_sales/dev_membership/views/dev_membership.xml
index 3bd0efb5b..1202a7ad1 100644
--- a/odex25_sales/dev_membership/views/dev_membership.xml
+++ b/odex25_sales/dev_membership/views/dev_membership.xml
@@ -8,9 +8,13 @@
+
+
+
+
+ attrs="{'invisible':['|','|',('is_free','=',True),
+ ('state','!=','confirm'),('invoice_id','!=',False)]}"/>
-
+ class="oe_highlight"
+ attrs="{'invisible':['|',('membership_id','!=',False),('state','not in',['expire','active','cancel'])]}"/>
+
@@ -65,6 +71,10 @@
+
+
+
+
@@ -101,7 +111,7 @@
-
+
@@ -121,6 +131,7 @@
+
@@ -137,7 +148,9 @@
Membership
- -
+
+ -
+
@@ -151,6 +164,15 @@
options="{'classes': {'draft': 'warning', 'expire': 'danger', 'confirm': 'success', 'active' : 'success'}}"/>
+
+
+
@@ -181,31 +203,52 @@
+
+
+ activity.dev.membership
+ dev.membership
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
+
+
Memberships
ir.actions.act_window
dev.membership
- kanban,tree,form
+ kanban,tree,activity,form
-
+
Active Memberships
ir.actions.act_window
dev.membership
- kanban,tree,form
+ kanban,tree,activity,form
[('state', '=', 'active')]
-
+
Expire Memberships
ir.actions.act_window
dev.membership
- kanban,tree,form
- [('state', '=', 'expire')]
+ kanban,tree,activity,form
+ [('state', 'in', ['cancel','expire'])]
-
+
-
+
-
+
@@ -43,7 +43,9 @@
+
+
@@ -122,99 +124,112 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
- view.res.partner.member.form
- res.partner
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+view.res.partner.member.form
+res.partner
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
- True
-
-
- True
-
-
-
-
-
-
-
-
- res.partner.search
- res.partner
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Member
- ir.actions.act_window
- res.partner
- [('is_member', '=', True)]
- {'default_is_member' : 1}
- kanban,tree,activity,form
-
+
+
+
+
+
+
+
+
+ True
+
+
+ True
+
+
+
+
+
+
+
+
+res.partner.search
+res.partner
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Member
+ir.actions.act_window
+res.partner
+[('is_member', '=', True)]
+{'default_is_member' : 1}
+kanban,tree,activity,form
+
-
-
+
-
-
-
+
+
+
diff --git a/odex25_sales/dev_membership/views/res_config_settings.xml b/odex25_sales/dev_membership/views/res_config_settings.xml
index 5a7959e23..77028b9ca 100644
--- a/odex25_sales/dev_membership/views/res_config_settings.xml
+++ b/odex25_sales/dev_membership/views/res_config_settings.xml
@@ -110,10 +110,24 @@
{'module' : 'dev_membership', 'bin_size': False}
+
+ Cancell Resone
+ ir.actions.act_window
+ cancellation.reason
+ form,tree
+
+
+
+
+
diff --git a/odex25_sales/dev_membership/wizard/__init__.py b/odex25_sales/dev_membership/wizard/__init__.py
index a276d27f2..dedd77d3b 100644
--- a/odex25_sales/dev_membership/wizard/__init__.py
+++ b/odex25_sales/dev_membership/wizard/__init__.py
@@ -2,3 +2,4 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import renew_membership
+from . import cancel_membership
diff --git a/odex25_sales/dev_membership/wizard/cancel_membership.py b/odex25_sales/dev_membership/wizard/cancel_membership.py
new file mode 100644
index 000000000..e03fd0b8f
--- /dev/null
+++ b/odex25_sales/dev_membership/wizard/cancel_membership.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models, _
+
+
+class MembershipRefues(models.TransientModel):
+ _name = "membership.request.cancel.wizard"
+ _description = "Membership refuse Reason wizard"
+
+ reason_id = fields.Many2one('cancellation.reason',string='Cancel Membership Reason' ,required=True)
+ request_id = fields.Many2one('dev.membership')
+ user_id = fields.Many2one('res.users', string='User', default=lambda self: self.env.user,)
+
+
+ @api.model
+ def default_get(self, fields):
+ res = super(MembershipRefues, self).default_get(fields)
+ active_ids = self.env.context.get('active_ids', [])
+ active_model = self.env.context.get('active_model', [])
+ if active_model == 'dev.membership':
+ res.update({'request_id': active_ids[0] if active_ids else False})
+ return res
+
+ def request_cancel_reason(self):
+ for record in self:
+ record.ensure_one()
+ subject = _("Membership Cancelled")
+ body = _('The Membership was Cancelled by %s for the following reason: %s ') % (
+ self.env.user.name, record.reason_id.name)
+
+ if record.request_id:
+ record.request_id.cancel_reason_id.name = record.reason_id.name
+ record.request_id.state = 'cancel'
+ record.request_id.message_post(body=body, subject=subject)
+ record.request_id.make_activity_group()
+ # end chatter
+ return {'type': 'ir.actions.act_window_close'}
+
diff --git a/odex25_sales/dev_membership/wizard/cancel_membership.xml b/odex25_sales/dev_membership/wizard/cancel_membership.xml
new file mode 100644
index 000000000..c43d8de5f
--- /dev/null
+++ b/odex25_sales/dev_membership/wizard/cancel_membership.xml
@@ -0,0 +1,28 @@
+
+
+
+ membership.request.cancel.wizard.form
+ membership.request.cancel.wizard
+
+
+
+
+
+
+ Cancel Membership Reason
+ membership.request.cancel.wizard
+ form
+
+ new
+
+