You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							121 lines
						
					
					
						
							6.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							121 lines
						
					
					
						
							6.3 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								###############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Anagha S (odoo@cybrosys.com)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU AFFERO
							 | 
						|
								#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#    This program is distributed in the hope that it will be useful,
							 | 
						|
								#    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
							 | 
						|
								#    (AGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								###############################################################################
							 | 
						|
								from odoo import fields, models
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class SubscriptionPackage(models.Model):
							 | 
						|
								    """This class inherits from the 'subscription.package' model and extends
							 | 
						|
								    its functionality. It provides methods for sending subscription order
							 | 
						|
								    details to customers and managing subscription limits."""
							 | 
						|
								    _inherit = "subscription.package"
							 | 
						|
								
							 | 
						|
								    recurrence_period_id = fields.Many2one("recurrence.period",
							 | 
						|
								                                           string="Recurrence Period",
							 | 
						|
								                                           help="The period of the recurrence")
							 | 
						|
								
							 | 
						|
								    def send_subscription_order_to_customer(self):
							 | 
						|
								        """Generates a mail and send to customer about the subscription order
							 | 
						|
								        details."""
							 | 
						|
								        template_id = self.env.ref(
							 | 
						|
								            'website_subscription_package.mail_template_subscription_order')
							 | 
						|
								        for rec in self:
							 | 
						|
								            email_vals = {'message_type': 'notification',
							 | 
						|
								                          'is_notification': True,
							 | 
						|
								                          "model": 'subscription.package',
							 | 
						|
								                          "res_id": rec.id}
							 | 
						|
								            template_id.send_mail(
							 | 
						|
								                rec.id, force_send=True,
							 | 
						|
								                email_layout_xmlid=
							 | 
						|
								                "mail.mail_notification_layout_with_responsible_signature",
							 | 
						|
								                email_values=email_vals)
							 | 
						|
								
							 | 
						|
								    def close_limit_cron(self):
							 | 
						|
								        """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(
							 | 
						|
								            [('stage_category', '=', 'progress')])
							 | 
						|
								        today_date = fields.Date.today()
							 | 
						|
								        pending_subscription = False
							 | 
						|
								        for pending_subscription in pending_subscriptions:
							 | 
						|
								            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 == 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,
							 | 
						|
								                                           'price_unit': rec.unit_price,
							 | 
						|
								                                           'discount': rec.product_id.subscription_discount,
							 | 
						|
								                                           'tax_ids': rec.tax_id
							 | 
						|
								                                           }]
							 | 
						|
								                        this_products_line.append(rec_list)
							 | 
						|
								                    self.env['account.move'].create(
							 | 
						|
								                        {'move_type': 'out_invoice',
							 | 
						|
								                         'invoice_date_due': today_date,
							 | 
						|
								                         'invoice_payment_term_id': False,
							 | 
						|
								                         '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.write({
							 | 
						|
								                        'to_renew': False,
							 | 
						|
								                        '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']})
							 | 
						|
								                    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)
							 | 
						|
								
							 |