Browse Source

Sep 1 [FIX] : Bug Fixed 'subscription_package'

pull/254/merge
AjmalCybro 2 years ago
parent
commit
1f99eec4b0
  1. 1
      subscription_package/__manifest__.py
  2. 2
      subscription_package/data/mail_template.xml
  3. 12
      subscription_package/data/subscription_package_stop_data.xml
  4. 137
      subscription_package/models/subscription_package.py
  5. 8
      subscription_package/models/subscription_plan.py
  6. 5
      subscription_package/views/subscription_package.xml

1
subscription_package/__manifest__.py

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

2
subscription_package/data/mail_template.xml

@ -37,7 +37,7 @@
is going to Expired on
<strong t-out="object.close_date or ''"/>.
</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-out="object.company_id.name or ''"/>
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>

137
subscription_package/models/subscription_package.py

@ -103,10 +103,12 @@ class SubscriptionPackage(models.Model):
readonly=False)
plan_id = fields.Many2one('subscription.package.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')
next_invoice_date = fields.Date(string='Next Invoice Date', readonly=False,
store=True,
date_started = fields.Date(string='Subsciption Start date', store=True,
ondelete='restrict', readonly=True)
next_invoice_date = fields.Date(string='Next Invoice Date',
store=False, readonly=False,
compute="_compute_next_invoice_date")
company_id = fields.Many2one('res.company', string='Company',
default=lambda self: self.env.company,
@ -121,7 +123,7 @@ class SubscriptionPackage(models.Model):
index=True,
group_expand='_read_group_stage_ids')
invoice_count = fields.Integer(string='Invoices',
compute='_compute_invoice_count')
compute='_compute_invoice_count', store=True)
so_count = fields.Integer(string='Sales', compute='_compute_sale_count')
description = fields.Text(string='Description')
analytic_account_id = fields.Many2one('account.analytic.account',
@ -178,6 +180,8 @@ class SubscriptionPackage(models.Model):
if sub.start_date:
sub.next_invoice_date = sub.start_date + relativedelta(
days=sub.plan_id.renewal_time)
else:
sub.next_invoice_date = None
def button_invoice_count(self):
""" It displays invoice based on subscription package """
@ -225,8 +229,10 @@ class SubscriptionPackage(models.Model):
rec_list = [0, 0, {'product_id': rec.product_id.id,
'quantity': rec.product_qty}]
this_products_line.append(rec_list)
invoices = self.env['account.move'].search([('subscription_id', '=', self.id), ('state', '=', 'draft')])
orders = self.env['sale.order'].search([('subscription_id', '=', self.id), ('invoice_status', '=', 'no')])
invoices = self.env['account.move'].search(
[('subscription_id', '=', self.id), ('state', '=', 'draft')])
orders = self.env['sale.order'].search(
[('subscription_id', '=', self.id), ('invoice_status', '=', 'no')])
if invoices:
for invoice in invoices:
invoice.action_post()
@ -258,18 +264,20 @@ class SubscriptionPackage(models.Model):
def button_start_date(self):
"""Button to start subscription package"""
if not self.start_date:
self.start_date = datetime.date.today()
stage_id = (self.env['subscription.package.stage'].search([
('category', '=', 'progress')], limit=1).id)
for rec in self:
if len(rec.env['subscription.package.stage'].search([('category', '=', 'draft')])) > 1:
if len(rec.env['subscription.package.stage'].search(
[('category', '=', 'draft')])) > 1:
raise UserError(
_('More than one stage is having category "Draft". '
'Please change category of stage to "In Progress", '
'only one stage is allowed to have category "Draft"'))
else:
rec.write(
{'stage_id': (rec.env['subscription.package.stage'].search([
('category', '=', 'draft')]).id) + 1})
{'stage_id': stage_id,
'date_started': fields.Date.today()
})
def button_sale_order(self):
"""Button to create sale order"""
@ -279,7 +287,8 @@ class SubscriptionPackage(models.Model):
'product_uom_qty': rec.product_qty,
'discount': rec.discount}]
this_products_line.append(rec_list)
orders = self.env['sale.order'].search([('subscription_id', '=', self.id), ('invoice_status', '=', 'no')])
orders = self.env['sale.order'].search(
[('subscription_id', '=', self.id), ('invoice_status', '=', 'no')])
if orders:
for order in orders:
order.action_confirm()
@ -333,51 +342,105 @@ class SubscriptionPackage(models.Model):
sub.write(values)
return True
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):
""" 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"""
pending_subscriptions = self.env['subscription.package'].search(
[('stage_category', '=', 'progress')])
today_date = fields.Date.today()
pending_subscription = False
close_subscription = False
for pending_subscription in pending_subscriptions:
pending_subscription.close_date = pending_subscription.start_date + relativedelta(
days=pending_subscription.plan_id.days_to_end)
difference = (
pending_subscription.close_date - pending_subscription.start_date).days / 10
renew_date = pending_subscription.close_date - relativedelta(
days=difference)
if today_date == renew_date:
self.env.ref(
'subscription_package.mail_template_subscription_renew').send_mail(
pending_subscription.id, force_send=True)
pending_subscription.write({'to_renew': True})
get_dates = self.find_renew_date(
pending_subscription.next_invoice_date,
pending_subscription.date_started,
pending_subscription.plan_id.days_to_end)
renew_date = get_dates['renew_date']
end_date = get_dates['end_date']
pending_subscription.close_date = get_dates['close_date']
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}
pending_subscription.write(values)
if today_date == pending_subscription.next_invoice_date:
if pending_subscription.plan_id.invoice_mode == 'draft_invoice':
this_products_line = []
for rec in pending_subscription.product_line_ids:
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)
self.env['account.move'].create(
{
'move_type': 'out_invoice',
'date': fields.Date.today(),
'invoice_date': fields.Date.today(),
'date': today_date,
'invoice_date': today_date,
'state': 'draft',
'subscription_id': pending_subscription.id,
'partner_id': pending_subscription.partner_invoice_id.id,
'currency_id': pending_subscription.partner_invoice_id.currency_id.id,
'invoice_line_ids': this_products_line
})
pending_subscription._compute_invoice_count()
pending_subscription.write({'to_renew': False,
'start_date': datetime.datetime.today()})
close_subscriptions = self.env['subscription.package'].search(
[('stage_category', '=', 'progress'), ('to_renew', '=', True)])
for close_subscription in close_subscriptions:
close_subscription.close_date = close_subscription.start_date + relativedelta(
days=close_subscription.plan_id.days_to_end)
if today_date == close_subscription.close_date:
close_subscription.set_close()
return dict(pending=pending_subscription, closed=close_subscription)
'start_date': pending_subscription.next_invoice_date})
new_date = self.find_renew_date(
pending_subscription.next_invoice_date,
pending_subscription.date_started,
pending_subscription.plan_id.days_to_end)
pending_subscription.write(
{'close_date': new_date['close_date']})
if today_date == new_date['renew_date']:
self.env.ref(
'subscription_package'
'.mail_template_subscription_renew').send_mail(
pending_subscription.id, force_send=True)
pending_subscription.write({'to_renew': True})
if today_date == renew_date:
self.env.ref(
'subscription_package.mail_template_subscription_renew').send_mail(
pending_subscription.id, force_send=True)
pending_subscription.write({'to_renew': True})
return dict(pending=pending_subscription)
@api.depends('product_line_ids.total_amount')
def _compute_total_recurring_price(self):

8
subscription_package/models/subscription_plan.py

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

5
subscription_package/views/subscription_package.xml

@ -100,7 +100,7 @@
</div>
</button>
<button name="button_invoice_count" type="object" class="oe_stat_button"
icon="fa-book" attrs="{'invisible': [('invoice_count','&lt;=',0)]}">
icon="fa-file-text" attrs="{'invisible': [('invoice_count','&lt;=',0)]}">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="invoice_count"/>
@ -127,6 +127,7 @@
<field name="partner_id" attrs="{'required': True}"/>
<field name="partner_invoice_id"/>
<field name="partner_shipping_id"/>
<field name="date_started"/>
<field name="start_date"/>
<field name="next_invoice_date"/>
</group>
@ -246,7 +247,7 @@
<menuitem id="subscription_menu_root"
name="Subscription"
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"
name="Subscriptions"

Loading…
Cancel
Save