Files
tradon/modules/account_asset/account.py
2026-03-14 09:42:12 +00:00

220 lines
6.9 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.i18n import gettext
from trytond.model import ModelSQL, fields
from trytond.model.exceptions import AccessError
from trytond.modules.company.model import CompanyValueMixin
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Bool, Eval, Id, If
asset_bymonthday = fields.Selection([
('1', "First"),
('-1', "Last"),
], "Day of the Month",
help="The day of the month to create the depreciation moves.")
asset_bymonth = fields.Selection([
('1', "January"),
('2', "February"),
('3', "March"),
('4', "April"),
('5', "May"),
('6', "June"),
('7', "July"),
('8', "August"),
('9', "September"),
('10', "October"),
('11', "November"),
('12', "December"),
], "Month", sort=False,
help="The month to create the depreciation moves.")
asset_frequency = fields.Selection('get_asset_frequencies',
"Asset Depreciation Frequency",
required=True, help="The default depreciation frequency for new assets.")
def get_asset_selection(field_name):
@classmethod
def get_selection(cls):
pool = Pool()
Asset = pool.get('account.asset')
return Asset.fields_get([field_name])[field_name]['selection']
return get_selection
class Configuration(metaclass=PoolMeta):
__name__ = 'account.configuration'
asset_sequence = fields.MultiValue(fields.Many2One(
'ir.sequence', "Asset Sequence", required=True,
domain=[
('company', 'in', [
Eval('context', {}).get('company', -1), None]),
('sequence_type', '=',
Id('account_asset', 'sequence_type_asset')),
]))
asset_bymonthday = fields.MultiValue(asset_bymonthday)
asset_bymonth = fields.MultiValue(asset_bymonth)
asset_frequency = fields.MultiValue(asset_frequency)
get_asset_frequencies = get_asset_selection('frequency')
@classmethod
def multivalue_model(cls, field):
pool = Pool()
if field in {'asset_bymonthday', 'asset_bymonth'}:
return pool.get('account.configuration.asset_date')
return super().multivalue_model(field)
@classmethod
def default_asset_sequence(cls, **pattern):
return cls.multivalue_model('asset_sequence').default_asset_sequence()
@classmethod
def default_asset_bymonthday(cls, **pattern):
return cls.multivalue_model(
'asset_bymonthday').default_asset_bymonthday()
@classmethod
def default_asset_bymonth(cls, **pattern):
return cls.multivalue_model('asset_bymonth').default_asset_bymonth()
@classmethod
def default_asset_frequency(cls, **pattern):
return cls.multivalue_model(
'asset_frequency').default_asset_frequency()
class ConfigurationAssetSequence(ModelSQL, CompanyValueMixin):
__name__ = 'account.configuration.asset_sequence'
asset_sequence = fields.Many2One(
'ir.sequence', "Asset Reference Sequence", required=True,
domain=[
('company', 'in', [Eval('company', -1), None]),
('sequence_type', '=',
Id('account_asset', 'sequence_type_asset')),
])
@classmethod
def default_asset_sequence(cls):
pool = Pool()
ModelData = pool.get('ir.model.data')
try:
return ModelData.get_id('account_asset', 'sequence_asset')
except KeyError:
return None
class ConfigurationAssetDate(ModelSQL, CompanyValueMixin):
__name__ = 'account.configuration.asset_date'
asset_bymonthday = asset_bymonthday
asset_bymonth = asset_bymonth
@classmethod
def default_asset_bymonthday(cls):
return "-1"
@classmethod
def default_asset_bymonth(cls):
return "12"
class ConfigurationAssetFrequency(ModelSQL, CompanyValueMixin):
__name__ = 'account.configuration.asset_frequency'
asset_frequency = asset_frequency
get_asset_frequencies = get_asset_selection('frequency')
@classmethod
def default_asset_frequency(cls):
return 'monthly'
def AccountTypeMixin(template=False):
class Mixin:
__slots__ = ()
fixed_asset = fields.Boolean(
"Fixed Asset",
domain=[
If(Eval('statement') != 'balance',
('fixed_asset', '=', False), ()),
],
states={
'invisible': ((Eval('statement') != 'balance')
| ~Eval('assets', True)),
})
if not template:
for fname in dir(Mixin):
field = getattr(Mixin, fname)
if not isinstance(field, fields.Field):
continue
field.states['readonly'] = (
Bool(Eval('template', -1)) & ~Eval('template_override', False))
return Mixin
class AccountTypeTemplate(AccountTypeMixin(template=True), metaclass=PoolMeta):
__name__ = 'account.account.type.template'
def _get_type_value(self, type=None):
values = super()._get_type_value(type=type)
if not type or type.fixed_asset != self.fixed_asset:
values['fixed_asset'] = self.fixed_asset
return values
class AccountType(AccountTypeMixin(), metaclass=PoolMeta):
__name__ = 'account.account.type'
class Move(metaclass=PoolMeta):
__name__ = 'account.move'
@classmethod
def _get_origin(cls):
origins = super()._get_origin()
origins.append('account.asset')
origins.append('account.asset.line')
return origins
class Period(metaclass=PoolMeta):
__name__ = 'account.period'
def check_asset_line_running(self):
"""
Check if it exists any asset line without account move for the period.
"""
pool = Pool()
Asset = pool.get('account.asset')
assets = Asset.search([
('state', '=', 'running'),
('company', '=', self.company.id),
('lines', 'where', [
('date', '>=', self.start_date),
('date', '<=', self.end_date),
('move', '=', None),
]),
], limit=6)
if assets:
names = ', '.join(a.rec_name for a in assets[:5])
if len(assets) > 5:
names += '...'
raise AccessError(
gettext('account_asset.msg_asset_running_close_period',
period=self.rec_name,
assets=names))
@classmethod
def close(cls, periods):
for period in periods:
period.check_asset_line_running()
super().close(periods)
class Journal(metaclass=PoolMeta):
__name__ = 'account.journal'
@classmethod
def __setup__(cls):
super().__setup__()
cls.type.selection.append(('asset', "Asset"))