2
0
account-financial-tools/account_asset_management/models/account_asset_profile.py
2022-12-24 00:42:21 +01:00

199 lines
8.0 KiB
Python

# Copyright 2009-2018 Noviat
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class AccountAssetProfile(models.Model):
_name = 'account.asset.profile'
_description = 'Asset profile'
_order = 'name'
name = fields.Char(string='Name', size=64, required=True, index=True)
note = fields.Text()
account_analytic_id = fields.Many2one(
comodel_name='account.analytic.account',
string='Analytic account')
account_asset_id = fields.Many2one(
comodel_name='account.account',
domain=[('deprecated', '=', False)],
string='Asset Account', required=True)
account_depreciation_id = fields.Many2one(
comodel_name='account.account',
domain=[('deprecated', '=', False)],
string='Depreciation Account', required=True)
account_expense_depreciation_id = fields.Many2one(
comodel_name='account.account',
domain=[('deprecated', '=', False)],
string='Depr. Expense Account', required=True)
account_plus_value_id = fields.Many2one(
comodel_name='account.account',
domain=[('deprecated', '=', False)],
string='Plus-Value Account')
account_min_value_id = fields.Many2one(
comodel_name='account.account',
domain=[('deprecated', '=', False)],
string='Min-Value Account')
account_residual_value_id = fields.Many2one(
comodel_name='account.account',
domain=[('deprecated', '=', False)],
string='Residual Value Account')
journal_id = fields.Many2one(
comodel_name='account.journal',
domain=[('type', '=', 'general')],
string='Journal', required=True)
company_id = fields.Many2one(
comodel_name='res.company',
string='Company', required=True,
default=lambda self: self._default_company_id())
group_ids = fields.Many2many(
comodel_name='account.asset.group',
relation="account_asset_profile_group_rel",
column1="profile_id",
column2="group_id",
string='Asset Groups')
method = fields.Selection(
selection=lambda self: self._selection_method(),
string='Computation Method',
required=True,
help="Choose the method to use to compute the depreciation lines.\n"
" * Linear: Calculated on basis of: "
"Depreciation Base / Number of Depreciations. "
"Depreciation Base = Purchase Value - Salvage Value.\n"
" * Linear-Limit: Linear up to Salvage Value. "
"Depreciation Base = Purchase Value.\n"
" * Degressive: Calculated on basis of: "
"Residual Value * Degressive Factor.\n"
" * Degressive-Linear (only for Time Method = Year): "
"Degressive becomes linear when the annual linear "
"depreciation exceeds the annual degressive depreciation.\n"
" * Degressive-Limit: Degressive up to Salvage Value. "
"The Depreciation Base is equal to the asset value.",
default='linear')
method_number = fields.Integer(
string='Number of Years',
help="The number of years needed to depreciate your asset",
default=5)
method_period = fields.Selection(
selection=lambda self: self._selection_method_period(),
string='Period Length', required=True,
default='year',
help="Period length for the depreciation accounting entries")
method_progress_factor = fields.Float(
string='Degressive Factor', default=0.3)
method_time = fields.Selection(
selection=lambda self: self._selection_method_time(),
string='Time Method', required=True,
default='year',
help="Choose the method to use to compute the dates and "
"number of depreciation lines.\n"
" * Number of Years: Specify the number of years "
"for the depreciation.\n")
days_calc = fields.Boolean(
string='Calculate by days',
default=False,
help="Use number of days to calculate depreciation amount")
use_leap_years = fields.Boolean(
string='Use leap years',
default=False,
help="If not set, the system will distribute evenly the amount to "
"amortize across the years, based on the number of years. "
"So the amount per year will be the "
"depreciation base / number of years.\n "
"If set, the system will consider if the current year "
"is a leap year. The amount to depreciate per year will be "
"calculated as depreciation base / (depreciation end date - "
"start date + 1) * days in the current year.",
)
prorata = fields.Boolean(
string='Prorata Temporis',
help="Indicates that the first depreciation entry for this asset "
"has to be done from the depreciation start date instead of "
"the first day of the fiscal year.")
open_asset = fields.Boolean(
string='Skip Draft State',
help="Check this if you want to automatically confirm the assets "
"of this profile when created by invoices.")
asset_product_item = fields.Boolean(
string='Create an asset by product item',
help="By default during the validation of an invoice, an asset "
"is created by invoice line as long as an accounting entry is "
"created by invoice line. "
"With this setting, an accounting entry will be created by "
"product item. So, there will be an asset by product item.")
active = fields.Boolean(default=True)
@api.model
def _default_company_id(self):
return self.env['res.company']._company_default_get('account.asset')
@api.model
def _selection_method(self):
return[
('linear', _('Linear')),
('linear-limit', _('Linear up to Salvage Value')),
('degressive', _('Degressive')),
('degr-linear', _('Degressive-Linear')),
('degr-limit', _('Degressive up to Salvage Value')),
]
@api.model
def _selection_method_period(self):
return [
('month', _('Month')),
('quarter', _('Quarter')),
('year', _('Year')),
]
@api.model
def _selection_method_time(self):
"""
Install the 'account_asset_management_method_number_end' to enable the
'Number' and 'End' Time Methods.
"""
return [
('year', _('Number of Years or end date')),
]
@api.multi
@api.constrains('method')
def _check_method(self):
for profile in self:
if profile.method == 'degr-linear' and \
profile.method_time != 'year':
raise UserError(
_("Degressive-Linear is only supported for Time Method = "
"Year."))
@api.onchange('method_time')
def _onchange_method_time(self):
if self.method_time != 'year':
self.prorata = True
@api.model
def create(self, vals):
if vals.get('method_time') != 'year' and not vals.get('prorata'):
vals['prorata'] = True
profile = super().create(vals)
acc_id = vals.get('account_asset_id')
if acc_id:
account = self.env['account.account'].browse(acc_id)
if not account.asset_profile_id:
account.write({'asset_profile_id': profile.id})
return profile
@api.multi
def write(self, vals):
if vals.get('method_time'):
if vals['method_time'] != 'year' and not vals.get('prorata'):
vals['prorata'] = True
res = super().write(vals)
# TODO last profile in self is defined as default on the related
# account. must be improved.
account = self.env['account.account'].browse(
vals.get('account_asset_id'))
if self and account and not account.asset_profile_id:
account.write({'asset_profile_id': self[-1].id})
return res