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.
		
		
		
		
		
			
		
			
				
					
					
						
							148 lines
						
					
					
						
							6.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							148 lines
						
					
					
						
							6.3 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2019-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, fields, models
							 | 
						|
								from odoo.exceptions import UserError
							 | 
						|
								from odoo.tools.translate import _
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class ResPartner(models.Model):
							 | 
						|
								    _inherit = 'res.partner'
							 | 
						|
								
							 | 
						|
								    warning_stage = fields.Float(string='Warning Amount',
							 | 
						|
								                                 help="A warning message will appear once the "
							 | 
						|
								                                      "selected customer is crossed warning "
							 | 
						|
								                                      "amount. Set its value to 0.00 to"
							 | 
						|
								                                      " disable this feature")
							 | 
						|
								    blocking_stage = fields.Float(string='Blocking Amount',
							 | 
						|
								                                  help="Cannot make sales once the selected "
							 | 
						|
								                                       "customer is crossed blocking amount."
							 | 
						|
								                                       "Set its value to 0.00 to disable "
							 | 
						|
								                                       "this feature")
							 | 
						|
								    due_amount = fields.Float(string="Total Sale",
							 | 
						|
								                              compute="compute_due_amount")
							 | 
						|
								    active_limit = fields.Boolean("Active Credit Limit", default=False)
							 | 
						|
								
							 | 
						|
								    enable_credit_limit = fields.Boolean(string="Credit Limit Enabled",
							 | 
						|
								                                         compute="_compute_enable_credit_limit")
							 | 
						|
								
							 | 
						|
								    def compute_due_amount(self):
							 | 
						|
								        for rec in self:
							 | 
						|
								            if not rec.id:
							 | 
						|
								                continue
							 | 
						|
								            rec.due_amount = rec.credit - rec.debit
							 | 
						|
								
							 | 
						|
								    def _compute_enable_credit_limit(self):
							 | 
						|
								        """ Check credit limit is enabled in account settings """
							 | 
						|
								        params = self.env['ir.config_parameter'].sudo()
							 | 
						|
								        customer_credit_limit = params.get_param('customer_credit_limit',
							 | 
						|
								                                                 default=False)
							 | 
						|
								        for rec in self:
							 | 
						|
								            rec.enable_credit_limit = True if customer_credit_limit else False
							 | 
						|
								
							 | 
						|
								    @api.constrains('warning_stage', 'blocking_stage')
							 | 
						|
								    def constrains_warning_stage(self):
							 | 
						|
								        if self.active_limit and self.enable_credit_limit:
							 | 
						|
								            if self.warning_stage >= self.blocking_stage:
							 | 
						|
								                if self.blocking_stage > 0:
							 | 
						|
								                    raise UserError(_(
							 | 
						|
								                        "Warning amount should be less than Blocking amount"))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class SaleOrder(models.Model):
							 | 
						|
								    _inherit = 'sale.order'
							 | 
						|
								
							 | 
						|
								    has_due = fields.Boolean()
							 | 
						|
								    is_warning = fields.Boolean()
							 | 
						|
								    due_amount = fields.Float(related='partner_id.due_amount')
							 | 
						|
								
							 | 
						|
								    def _action_confirm(self):
							 | 
						|
								        """To check the selected customers due amount is exceed than
							 | 
						|
								        blocking stage"""
							 | 
						|
								        if self.partner_id.active_limit \
							 | 
						|
								                and self.partner_id.enable_credit_limit:
							 | 
						|
								            if self.due_amount >= self.partner_id.blocking_stage:
							 | 
						|
								                if self.partner_id.blocking_stage != 0:
							 | 
						|
								                    raise UserError(_(
							 | 
						|
								                        "%s is in  Blocking Stage and "
							 | 
						|
								                        "has a due amount of %s %s to pay") % (
							 | 
						|
								                                        self.partner_id.name, self.due_amount,
							 | 
						|
								                                        self.currency_id.symbol))
							 | 
						|
								        return super(SaleOrder, self)._action_confirm()
							 | 
						|
								
							 | 
						|
								    @api.onchange('partner_id')
							 | 
						|
								    def check_due(self):
							 | 
						|
								        """To show the due amount and warning stage"""
							 | 
						|
								        if self.partner_id and self.partner_id.due_amount > 0 \
							 | 
						|
								                and self.partner_id.active_limit \
							 | 
						|
								                and self.partner_id.enable_credit_limit:
							 | 
						|
								            self.has_due = True
							 | 
						|
								        else:
							 | 
						|
								            self.has_due = False
							 | 
						|
								        if self.partner_id and self.partner_id.active_limit\
							 | 
						|
								                and self.partner_id.enable_credit_limit:
							 | 
						|
								            if self.due_amount >= self.partner_id.warning_stage:
							 | 
						|
								                if self.partner_id.warning_stage != 0:
							 | 
						|
								                    self.is_warning = True
							 | 
						|
								        else:
							 | 
						|
								            self.is_warning = False
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class AccountMove(models.Model):
							 | 
						|
								    _inherit = 'account.move'
							 | 
						|
								
							 | 
						|
								    has_due = fields.Boolean()
							 | 
						|
								    is_warning = fields.Boolean()
							 | 
						|
								    due_amount = fields.Float(related='partner_id.due_amount')
							 | 
						|
								
							 | 
						|
								    def action_post(self):
							 | 
						|
								        """To check the selected customers due amount is exceed than
							 | 
						|
								        blocking stage"""
							 | 
						|
								        pay_type = ['out_invoice', 'out_refund', 'out_receipt']
							 | 
						|
								        for rec in self:
							 | 
						|
								            if rec.partner_id.active_limit and rec.move_type in pay_type \
							 | 
						|
								                    and rec.partner_id.enable_credit_limit:
							 | 
						|
								                if rec.due_amount >= rec.partner_id.blocking_stage:
							 | 
						|
								                    if rec.partner_id.blocking_stage != 0:
							 | 
						|
								                        raise UserError(_(
							 | 
						|
								                            "%s is in  Blocking Stage and "
							 | 
						|
								                            "has a due amount of %s %s to pay") % (
							 | 
						|
								                                            rec.partner_id.name, rec.due_amount,
							 | 
						|
								                                            rec.currency_id.symbol))
							 | 
						|
								        return super(AccountMove, self).action_post()
							 | 
						|
								
							 | 
						|
								    @api.onchange('partner_id')
							 | 
						|
								    def check_due(self):
							 | 
						|
								        """To show the due amount and warning stage"""
							 | 
						|
								        if self.partner_id and self.partner_id.due_amount > 0 \
							 | 
						|
								                and self.partner_id.active_limit \
							 | 
						|
								                and self.partner_id.enable_credit_limit:
							 | 
						|
								            self.has_due = True
							 | 
						|
								        else:
							 | 
						|
								            self.has_due = False
							 | 
						|
								        if self.partner_id and self.partner_id.active_limit \
							 | 
						|
								                and self.partner_id.enable_credit_limit:
							 | 
						|
								            if self.due_amount >= self.partner_id.warning_stage:
							 | 
						|
								                if self.partner_id.warning_stage != 0:
							 | 
						|
								                    self.is_warning = True
							 | 
						|
								        else:
							 | 
						|
								            self.is_warning = False
							 | 
						|
								
							 |