Browse Source

Sep 1 [FIX] : Bug Fixed 'subscription_package'

pull/277/head
AjmalCybro 2 years ago
parent
commit
4b1bcb8f17
  1. 1
      subscription_package/__manifest__.py
  2. 4
      subscription_package/data/mail_template.xml
  3. 12
      subscription_package/data/subscription_package_stop_data.xml
  4. 149
      subscription_package/models/subscription_package.py
  5. 4
      subscription_package/models/subscription_plan.py
  6. 30
      subscription_package/views/subscription_package.xml

1
subscription_package/__manifest__.py

@ -35,6 +35,7 @@
'security/security.xml', 'security/security.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'data/uom_demo.xml', 'data/uom_demo.xml',
'data/subscription_package_stop_data.xml',
'data/subscription_stage_data.xml', 'data/subscription_stage_data.xml',
'data/mail_template.xml', 'data/mail_template.xml',
'data/cron.xml', 'data/cron.xml',

4
subscription_package/data/mail_template.xml

@ -30,14 +30,14 @@
<tbody> <tbody>
<tr> <tr>
<td style="padding:15px 20px 10px 20px;"> <td style="padding:15px 20px 10px 20px;">
<p>Dear<t t-out="object.partner_id.name or ''"/>, <p>Dear <t t-out=" object.partner_id.name or ''"/>,
</p> </p>
<p>Your subscription Plan <p>Your subscription Plan
<strong t-out="object.name or ''"/> <strong t-out="object.name or ''"/>
is going to Expired on is going to Expired on
<strong t-out="object.close_date or ''"/>. <strong t-out="object.close_date or ''"/>.
</p> </p>
<p>If you have some concerns about it, please contact your contact person <p>If you have any concerns about it, please contact your representative at
<t <t
t-out="object.company_id.name or ''"/> t-out="object.company_id.name or ''"/>
or reply to this email. or reply to this email.

12
subscription_package/data/subscription_package_stop_data.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record model="subscription.package.stop" id="Close_limit">
<field name="name">Renewal Limit Exceeded</field>
</record>
</data>
</odoo>

149
subscription_package/models/subscription_package.py

@ -112,8 +112,10 @@ class SubscriptionPackage(models.Model):
readonly=False) readonly=False)
plan_id = fields.Many2one('subscription.package.plan', plan_id = fields.Many2one('subscription.package.plan',
string='Subscription Plan') string='Subscription Plan')
start_date = fields.Date(string='Start Date', store=True, start_date = fields.Date(string='Period Start Date', store=True,
ondelete='restrict') ondelete='restrict')
date_started = fields.Date(string='Subsciption Start date', store=True,
ondelete='restrict', readonly=True)
next_invoice_date = fields.Date(string='Next Invoice Date', readonly=False, next_invoice_date = fields.Date(string='Next Invoice Date', readonly=False,
store=True, store=True,
compute="_compute_next_invoice_date") compute="_compute_next_invoice_date")
@ -239,8 +241,8 @@ class SubscriptionPackage(models.Model):
def button_start_date(self): def button_start_date(self):
"""Button to start subscription package""" """Button to start subscription package"""
if not self.start_date: stage_id = (self.env['subscription.package.stage'].search([
self.start_date = datetime.date.today() ('category', '=', 'progress')], limit=1).id)
for rec in self: for rec in self:
if len(rec.env['subscription.package.stage'].search( if len(rec.env['subscription.package.stage'].search(
[('category', '=', 'draft')])) > 1: [('category', '=', 'draft')])) > 1:
@ -250,9 +252,8 @@ class SubscriptionPackage(models.Model):
'only one stage is allowed to have category "Draft"')) 'only one stage is allowed to have category "Draft"'))
else: else:
rec.write( rec.write(
{'stage_id': (rec.env[ {'stage_id': stage_id,
'subscription.package.stage'].search([ 'date_started': fields.Date.today()})
('category', '=', 'draft')]).id) + 1})
def button_sale_order(self): def button_sale_order(self):
"""Button to create sale order""" """Button to create sale order"""
@ -321,54 +322,114 @@ class SubscriptionPackage(models.Model):
sub.write(values) sub.write(values)
return True return True
def send_renew_alert_mail(self, today, renew_date, sub_id):
if today == renew_date:
self.env.ref(
'subscription_package'
'.mail_template_subscription_renew').send_mail(
sub_id, force_send=True)
subscription = self.env['subscription.package'].browse(sub_id)
subscription.write({'to_renew': True})
return True
else:
return False
def find_renew_date(self, next_invoice, date_started, end):
if end == 0:
end_date = next_invoice
difference = (next_invoice - date_started).days / 10
renew_date = next_invoice - relativedelta(
days=difference)
close_date = next_invoice
else:
end_date = fields.Date.add(date_started,
days=end)
close = date_started + relativedelta(days=end)
difference = (close - date_started).days / 10
renew_date = close - relativedelta(
days=difference)
close_date = close
data = {'renew_date': renew_date,
'end_date': end_date,
'close_date': close_date}
return data
def close_limit_cron(self): def close_limit_cron(self):
""" It Checks renew date, close date. It will send mail when renew date """ """ It Checks renew date, close date. It will send mail when renew
date and also generates invoices based on the plan.
It wil close the subscription automatically if renewal limit is exceeded """
pending_subscriptions = self.env['subscription.package'].search( pending_subscriptions = self.env['subscription.package'].search(
[('stage_category', '=', 'progress')]) [('stage_category', '=', 'progress')])
today_date = fields.Date.today() # today_date = fields.Date.today()
today_date = datetime.datetime.strptime('21092023', '%d%m%Y').date()
pending_subscription = False pending_subscription = False
close_subscription = False
for pending_subscription in pending_subscriptions: for pending_subscription in pending_subscriptions:
if pending_subscription.start_date: get_dates = self.find_renew_date(
pending_subscription.close_date = pending_subscription.start_date + relativedelta( pending_subscription.next_invoice_date,
days=pending_subscription.plan_id.days_to_end) pending_subscription.date_started,
difference = (pending_subscription.close_date - pending_subscription.plan_id.days_to_end)
pending_subscription.start_date).days / 10 renew_date = get_dates['renew_date']
renew_date = pending_subscription.close_date - relativedelta( end_date = get_dates['end_date']
days=difference) pending_subscription.close_date = get_dates['close_date']
if today_date == renew_date: if today_date == pending_subscription.next_invoice_date:
pending_subscription.to_renew = True
self.env.ref(
'subscription_package.mail_template_subscription_renew').send_mail(
pending_subscription.id, force_send=True)
if pending_subscription.plan_id.invoice_mode == 'draft_invoice': if pending_subscription.plan_id.invoice_mode == 'draft_invoice':
this_products_line = [] this_products_line = []
for rec in pending_subscription.product_line_ids: for rec in pending_subscription.product_line_ids:
rec_list = [0, 0, {'product_id': rec.product_id.id, rec_list = [0, 0, {'product_id': rec.product_id.id,
'quantity': rec.product_qty}] 'quantity': rec.product_qty,
'price_unit': rec.unit_price,
'discount': rec.discount
}]
this_products_line.append(rec_list) this_products_line.append(rec_list)
b = self.env['account.move'].create( self.env['account.move'].create(
{ {
'move_type': 'out_invoice', 'move_type': 'out_invoice',
'subscription_id': pending_subscription.id, 'invoice_date_due': today_date,
'date': fields.Date.today(), 'invoice_payment_term_id': False,
'invoice_date': fields.Date.today(), 'invoice_date': today_date,
'state': 'draft', 'state': 'draft',
'partner_id': pending_subscription.partner_invoice_id.id, 'subscription_id': pending_subscription.id,
'currency_id': pending_subscription.partner_invoice_id.currency_id.id, 'partner_id': pending_subscription.partner_invoice_id.id,
'invoice_line_ids': this_products_line 'currency_id': pending_subscription.partner_invoice_id.currency_id.id,
}) 'invoice_line_ids': this_products_line
pending_subscription.write({'to_renew': False, })
'start_date': datetime.datetime.today()})
close_subscriptions = self.env['subscription.package'].search( pending_subscription.write({'to_renew': False,
[('stage_category', '=', 'progress'), ('to_renew', '=', True)]) 'start_date': pending_subscription.next_invoice_date})
for close_subscription in close_subscriptions: new_date = self.find_renew_date(
close_subscription.close_date = close_subscription.start_date + relativedelta( pending_subscription.next_invoice_date,
days=close_subscription.plan_id.days_to_end) pending_subscription.date_started,
if today_date == close_subscription.close_date: pending_subscription.plan_id.days_to_end)
close_subscription.set_close() pending_subscription.write(
return dict(pending=pending_subscription, closed=close_subscription) {'close_date': new_date['close_date']})
self.send_renew_alert_mail(today_date,
new_date['renew_date'],
pending_subscription.id)
if (today_date == end_date) and (
pending_subscription.plan_id.limit_choice != 'manual'):
display_msg = ("<h5><i>The renewal limit has been exceeded "
"today for this subscription based on the "
"current subscription plan.</i></h5>")
pending_subscription.message_post(body=display_msg)
pending_subscription.is_closed = True
reason = (self.env['subscription.package.stop'].search([
('name', '=', 'Renewal Limit Exceeded')]).id)
pending_subscription.close_reason = reason
pending_subscription.closed_by = self.user_id
pending_subscription.close_date = fields.Date.today()
stage = (self.env['subscription.package.stage'].search([
('category', '=', 'closed')]).id)
values = {'stage_id': stage, 'to_renew': False,
'next_invoice_date': False}
pending_subscription.write(values)
self.send_renew_alert_mail(today_date, renew_date,
pending_subscription.id)
return dict(pending=pending_subscription)
@api.depends('product_line_ids.total_amount') @api.depends('product_line_ids.total_amount')
def _compute_total_recurring_price(self): def _compute_total_recurring_price(self):

4
subscription_package/models/subscription_plan.py

@ -76,6 +76,8 @@ class SubscriptionPlan(models.Model):
def _compute_renewal_time(self): def _compute_renewal_time(self):
""" This method calculate renewal time based on renewal value """ """ This method calculate renewal time based on renewal value """
for rec in self: for rec in self:
if int(rec.renewal_value) == 0 or int(rec.renewal_value) < 0:
rec.renewal_value = 1
if rec.renewal_period == 'days': if rec.renewal_period == 'days':
rec.renewal_time = int(rec.renewal_value) rec.renewal_time = int(rec.renewal_value)
elif rec.renewal_period == 'weeks': elif rec.renewal_period == 'weeks':
@ -92,6 +94,8 @@ class SubscriptionPlan(models.Model):
""" This method calculate days to end for subscription plan based on """ This method calculate days to end for subscription plan based on
limit count """ limit count """
for rec in self: for rec in self:
if rec.limit_count == 0 or rec.limit_count < 0:
rec.limit_count = 1
if rec.limit_choice == 'ones': if rec.limit_choice == 'ones':
rec.days_to_end = rec.renewal_time rec.days_to_end = rec.renewal_time
if rec.limit_choice == 'manual': if rec.limit_choice == 'manual':

30
subscription_package/views/subscription_package.xml

@ -82,11 +82,8 @@
type="object" class="btn-primary" type="object" class="btn-primary"
attrs="{'invisible': ['|',('stage_category','!=', 'progress'),('so_count','>',0)]}"/> attrs="{'invisible': ['|',('stage_category','!=', 'progress'),('so_count','>',0)]}"/>
<button name="button_close" string="Close Subscription" <button name="button_close" string="Close Subscription"
type="object" class="btn-primary" type="object" class="btn-secondary"
attrs="{'invisible': [('stage_category', '!=', 'progress')]}"/> attrs="{'invisible': [('stage_category', '!=', 'progress')]}"/>
<button name="action_renew" string="Renew" type="object"
class="btn-primary oe_read_only"
attrs="{'invisible': [('so_count', '=', 0)]}"/>
<field name="stage_id" widget="statusbar" <field name="stage_id" widget="statusbar"
options="{'clickable' :0}"/> options="{'clickable' :0}"/>
@ -120,28 +117,38 @@
</div> </div>
</button> </button>
</div> </div>
<div>
<widget name="web_ribbon" title="To Renew"
bg_color="bg-info"
attrs="{'invisible': [('to_renew', '=', False)]}"/>
</div>
<div class="text-truncate w-100"> <div class="text-truncate w-100">
<h1> <h1>
<field name="name" <field name="name"
placeholder="e.g. Monthly Subscriptions" placeholder="e.g. Monthly Subscriptions"
attrs="{'readonly': 1}"/> attrs="{'readonly': 1}"/>
</h1> </h1>
<div class="badge-pill badge-danger float-right"
attrs="{'invisible': [('to_renew', '=', False)]}">
For Renewal
</div>
</div> </div>
<group> <group>
<group> <group>
<field name="partner_id" <field name="partner_id"
attrs="{'required': True}"/> attrs="{'required': True}"/>
<field name="partner_invoice_id"/> <field name="partner_invoice_id"/>
<field name="partner_shipping_id"/> <field name="partner_shipping_id"/>
<field name="date_started"/>
<field name="start_date"/> <field name="start_date"/>
<field name="next_invoice_date"/> <field name="next_invoice_date"/>
</group> </group>
<group> <group>
<field name="plan_id" attrs="{'required': True}"/>
<field name="plan_id" attrs="{'required': True}"
style="width:60%%"/>
<field name="to_renew" invisible="1"/> <field name="to_renew" invisible="1"/>
<field name="reference_code"/> <field name="reference_code"/>
<field name="analytic_account_id"/> <field name="analytic_account_id"/>
@ -227,7 +234,7 @@
<div class="o_kanban_record_body"> <div class="o_kanban_record_body">
<field name="reference_code"/> <field name="reference_code"/>
<br/> <br/>
<div class="badge badge-pill badge-info badge-danger mt4 mr16" <div class="badge badge-pill badge-info badge-danger"
attrs="{'invisible': [('to_renew', '=', False)]}"> attrs="{'invisible': [('to_renew', '=', False)]}">
To Renew To Renew
</div> </div>
@ -264,7 +271,8 @@
<menuitem id="subscription_menu_root" <menuitem id="subscription_menu_root"
name="Subscription" name="Subscription"
action="subscription_package.subscription_action_subscriptions" action="subscription_package.subscription_action_subscriptions"
sequence="1" groups="group_subscription_user"/> sequence="1" groups="group_subscription_user"
web_icon="subscription_package,static/description/icon.png"/>
<menuitem id="subscription_menu_subscriptions" <menuitem id="subscription_menu_subscriptions"
name="Subscriptions" name="Subscriptions"

Loading…
Cancel
Save