From 1f99eec4b0dabf1cff7f70a56df40803b7f1da8f Mon Sep 17 00:00:00 2001 From: AjmalCybro Date: Fri, 1 Sep 2023 17:12:40 +0530 Subject: [PATCH] Sep 1 [FIX] : Bug Fixed 'subscription_package' --- subscription_package/__manifest__.py | 1 + subscription_package/data/mail_template.xml | 4 +- .../data/subscription_package_stop_data.xml | 12 ++ .../models/subscription_package.py | 137 +++++++++++++----- .../models/subscription_plan.py | 8 +- .../views/subscription_package.xml | 5 +- 6 files changed, 124 insertions(+), 43 deletions(-) create mode 100644 subscription_package/data/subscription_package_stop_data.xml diff --git a/subscription_package/__manifest__.py b/subscription_package/__manifest__.py index c4576ef64..1db9489e0 100644 --- a/subscription_package/__manifest__.py +++ b/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', diff --git a/subscription_package/data/mail_template.xml b/subscription_package/data/mail_template.xml index 61a4ff74f..974e2059c 100644 --- a/subscription_package/data/mail_template.xml +++ b/subscription_package/data/mail_template.xml @@ -30,14 +30,14 @@ -

Dear, +

Dear ,

Your subscription Plan is going to Expired on .

-

If you have some concerns about it, please contact your contact person +

If you have any concerns about it, please contact your representative at or reply to this email. diff --git a/subscription_package/data/subscription_package_stop_data.xml b/subscription_package/data/subscription_package_stop_data.xml new file mode 100644 index 000000000..3490721f2 --- /dev/null +++ b/subscription_package/data/subscription_package_stop_data.xml @@ -0,0 +1,12 @@ + + + + + + Renewal Limit Exceeded + + + + + + \ No newline at end of file diff --git a/subscription_package/models/subscription_package.py b/subscription_package/models/subscription_package.py index 935a3986e..82fc692b8 100644 --- a/subscription_package/models/subscription_package.py +++ b/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 = ("

The renewal limit has been exceeded " + "today for this subscription based on the " + "current subscription plan.
") + 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): diff --git a/subscription_package/models/subscription_plan.py b/subscription_package/models/subscription_plan.py index db553fbf3..bd5e6fcf3 100644 --- a/subscription_package/models/subscription_plan.py +++ b/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): diff --git a/subscription_package/views/subscription_package.xml b/subscription_package/views/subscription_package.xml index c318bbdf7..469185101 100644 --- a/subscription_package/views/subscription_package.xml +++ b/subscription_package/views/subscription_package.xml @@ -100,7 +100,7 @@