# -*- coding: utf-8 -*- ############################################################################# # # Cybrosys Technologies Pvt. Ltd. # # Copyright (C) 2024-TODAY Cybrosys Technologies() # Author: Cybrosys Techno Solutions() # # 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 . # ############################################################################# from odoo import api, fields, models, _ from odoo.exceptions import UserError class AccountMove(models.Model): """Inherits from the account.move model for adding the depreciation field to the account""" _inherit = 'account.move' has_due = fields.Boolean(string='Has due') is_warning = fields.Boolean(string='Is warning') due_amount = fields.Float(string="Due Amount", related='partner_id.due_amount') recurring_ref = fields.Char(string='Recurring Ref') asset_depreciation_ids = fields.One2many('account.asset.depreciation.line', 'move_id', string='Assets Depreciation Lines') to_check = fields.Boolean(string='To Check', tracking=True, help="If this checkbox is ticked, it means that the user was not sure of all the related " "information at the time of the creation of the move and that the move needs to be " "checked again.", ) def button_cancel(self): """Button action to cancel the transfer""" for move in self: for line in move.asset_depreciation_ids: line.move_posted_check = False return super(AccountMove, self).button_cancel() def post(self): """Supering the post method to mapped the asset depreciation records""" self.mapped('asset_depreciation_ids').post_lines_and_close_asset() return super(AccountMove, self).action_post() @api.model def _refund_cleanup_lines(self, lines): """Supering the refund cleanup lines to check the asset category """ result = super(AccountMove, self)._refund_cleanup_lines(lines) for i, line in enumerate(lines): for name, field in line._fields.items(): if name == 'asset_category_id': result[i][2][name] = False break return result def action_cancel(self): """Action perform to cancel the asset record""" res = super(AccountMove, self).action_cancel() self.env['account.asset.asset'].sudo().search( [('invoice_id', 'in', self.ids)]).write({'active': False}) return res def action_post(self): """Action used to post invoice""" result = super(AccountMove, self).action_post() for inv in self: context = dict(self.env.context) # Within the context of an invoice, # this default value is for the type of the invoice, not the type # of the asset. This has to be cleaned from the context before # creating the asset,otherwise it tries to create the asset with # the type of the invoice. context.pop('default_type', None) inv.invoice_line_ids.with_context(context).asset_create() return result 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