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.
		
		
		
		
		
			
		
			
				
					
					
						
							137 lines
						
					
					
						
							6.0 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							137 lines
						
					
					
						
							6.0 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU LESSER
							 | 
						|
								#    GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
							 | 
						|
								#    (LGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								#############################################################################
							 | 
						|
								
							 | 
						|
								from odoo import api, models, fields
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class SubscriptionPlan(models.Model):
							 | 
						|
								    _name = 'subscription.package.plan'
							 | 
						|
								    _description = 'Subscription Package Plan'
							 | 
						|
								
							 | 
						|
								    name = fields.Char(string='Plan Name', required=True)
							 | 
						|
								    renewal_value = fields.Char(string='Renewal')
							 | 
						|
								    renewal_period = fields.Selection([('days', 'Day(s)'),
							 | 
						|
								                                       ('weeks', 'Week(s)'),
							 | 
						|
								                                       ('months', 'Month(s)'),
							 | 
						|
								                                       ('years', 'Year(s)')],
							 | 
						|
								                                      default='months')
							 | 
						|
								    renewal_time = fields.Integer(string='Renewal Time Interval',
							 | 
						|
								                                  readonly=True,
							 | 
						|
								                                  compute='_compute_renewal_time',
							 | 
						|
								                                  store=True)
							 | 
						|
								    limit_choice = fields.Selection([('ones', 'Ones'),
							 | 
						|
								                                     ('manual', 'Until Closed Manually'),
							 | 
						|
								                                     ('custom', 'Custom')],
							 | 
						|
								                                    default='ones')
							 | 
						|
								    limit_count = fields.Integer(string='Custom Renewal Limit')
							 | 
						|
								    days_to_end = fields.Integer(string='Days End', readonly=True,
							 | 
						|
								                                 compute='_compute_days_to_end', store=True,
							 | 
						|
								                                 help="Subscription ending date")
							 | 
						|
								    invoice_mode = fields.Selection([('manual', 'Manually'),
							 | 
						|
								                                     ('draft_invoice', 'Draft')],
							 | 
						|
								                                    default='draft_invoice')
							 | 
						|
								    journal_id = fields.Many2one('account.journal', string='Journal',
							 | 
						|
								                                 store=True, domain="[('type', '=', 'sale')]")
							 | 
						|
								    company_id = fields.Many2one('res.company', string='Company', store=True,
							 | 
						|
								                                 default=lambda self: self.env.company)
							 | 
						|
								    short_code = fields.Char(string='Short Code')
							 | 
						|
								    terms_and_conditions = fields.Text(string='Terms and Conditions')
							 | 
						|
								    product_count = fields.Integer(string='Products',
							 | 
						|
								                                   compute='_compute_product_count')
							 | 
						|
								    subscription_count = fields.Integer(string='Subscriptions',
							 | 
						|
								                                        compute='_compute_subscription_count')
							 | 
						|
								
							 | 
						|
								    @api.depends('product_count')
							 | 
						|
								    def _compute_product_count(self):
							 | 
						|
								        """ Calculate product count based on subscription plan """
							 | 
						|
								        self.product_count = self.env['product.product'].search_count(
							 | 
						|
								            [('subscription_plan_id', '=', self.id)])
							 | 
						|
								
							 | 
						|
								    @api.depends('subscription_count')
							 | 
						|
								    def _compute_subscription_count(self):
							 | 
						|
								        """ Calculate subscription count based on subscription plan """
							 | 
						|
								        self.subscription_count = self.env[
							 | 
						|
								            'subscription.package'].search_count([('plan_id', '=', self.id)])
							 | 
						|
								
							 | 
						|
								    @api.depends('renewal_value', 'renewal_period')
							 | 
						|
								    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':
							 | 
						|
								                rec.renewal_time = int(rec.renewal_value) * 7
							 | 
						|
								            elif rec.renewal_period == 'months':
							 | 
						|
								                rec.renewal_time = int(rec.renewal_value) * 28
							 | 
						|
								            elif rec.renewal_period == 'years':
							 | 
						|
								                rec.renewal_time = int(rec.renewal_value) * 364
							 | 
						|
								            if rec.name:
							 | 
						|
								                rec.short_code = str(rec.name[0:3]).upper()
							 | 
						|
								
							 | 
						|
								    @api.depends('renewal_time', 'limit_count')
							 | 
						|
								    def _compute_days_to_end(self):
							 | 
						|
								        """ 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':
							 | 
						|
								                rec.days_to_end = False
							 | 
						|
								            if rec.limit_choice == 'custom':
							 | 
						|
								                rec.days_to_end = rec.renewal_time * rec.limit_count
							 | 
						|
								
							 | 
						|
								    def button_product_count(self):
							 | 
						|
								        """ It displays products based on subscription plan """
							 | 
						|
								        return {
							 | 
						|
								            'name': 'Products',
							 | 
						|
								            'res_model': 'product.product',
							 | 
						|
								            'domain': [('subscription_plan_id', '=', self.id)],
							 | 
						|
								            'view_type': 'form',
							 | 
						|
								            'view_mode': 'tree,form',
							 | 
						|
								            'type': 'ir.actions.act_window',
							 | 
						|
								            'context': {
							 | 
						|
								                'default_is_subscription': True,
							 | 
						|
								            },
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								    def button_sub_count(self):
							 | 
						|
								        """ It displays subscriptions based on subscription plan """
							 | 
						|
								        return {
							 | 
						|
								            'name': 'Subscriptions',
							 | 
						|
								            'domain': [('plan_id', '=', self.id)],
							 | 
						|
								            'view_type': 'form',
							 | 
						|
								            'res_model': 'subscription.package',
							 | 
						|
								            'view_mode': 'tree,form',
							 | 
						|
								            'type': 'ir.actions.act_window',
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								    def name_get(self):
							 | 
						|
								        """ It displays record name as combination of short code and
							 | 
						|
								        plan name """
							 | 
						|
								        res = []
							 | 
						|
								        for rec in self:
							 | 
						|
								            res.append((rec.id, '%s - %s' % (rec.short_code, rec.name)))
							 | 
						|
								        return res
							 | 
						|
								
							 |