diff --git a/account_asset_disposal/README.rst b/account_asset_disposal/README.rst index f23160d38..4bae3a548 100644 --- a/account_asset_disposal/README.rst +++ b/account_asset_disposal/README.rst @@ -9,6 +9,8 @@ Account asset disposal This module extends the functionality of account_asset adding a disposal date, allowing reversion of disposal operation and adding the state "Disposed" to the asset. +It adds an expense account at asset category level to post expenses when +asset is disposed. Usage ===== diff --git a/account_asset_disposal/__manifest__.py b/account_asset_disposal/__manifest__.py index 0ce2197b3..1ee56933f 100644 --- a/account_asset_disposal/__manifest__.py +++ b/account_asset_disposal/__manifest__.py @@ -6,7 +6,7 @@ { "name": "Account asset disposal", "summary": "Makes asset close account move automatically", - "version": "10.0.1.0.0", + "version": "10.0.1.1.0", "category": "Accounting & Finance", "website": "https://www.tecnativa.com", "author": "Tecnativa, " @@ -19,6 +19,6 @@ "account_cancel", ], "data": [ - "views/account_asset_asset_view.xml", + "views/account_asset_view.xml", ], } diff --git a/account_asset_disposal/i18n/es.po b/account_asset_disposal/i18n/es.po index 3053cb963..e7c224558 100644 --- a/account_asset_disposal/i18n/es.po +++ b/account_asset_disposal/i18n/es.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-13 16:50+0000\n" -"PO-Revision-Date: 2017-09-13 16:50+0000\n" +"POT-Creation-Date: 2017-11-23 09:15+0000\n" +"PO-Revision-Date: 2017-11-23 09:15+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "Language: \n" @@ -16,15 +16,38 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: account_asset_disposal +#: model:ir.model,name:account_asset_disposal.model_account_asset_category +msgid "Asset category" +msgstr "Categoría de activo" + +#. module: account_asset_disposal +#: code:addons/account_asset_disposal/models/account_asset.py:88 +#, python-format +msgid "Asset depreciation" +msgstr "Depreciación de activo" + #. module: account_asset_disposal #: model:ir.model,name:account_asset_disposal.model_account_asset_depreciation_line msgid "Asset depreciation line" -msgstr "Línea de amortización del activo" +msgstr "Línea de Depreciación de Activo" + +#. module: account_asset_disposal +#: code:addons/account_asset_disposal/models/account_asset.py:77 +#, python-format +msgid "Asset disposal" +msgstr "Baja de activo" + +#. module: account_asset_disposal +#: code:addons/account_asset_disposal/models/account_asset.py:99 +#, python-format +msgid "Asset loss" +msgstr "Pérdida valor de activo" #. module: account_asset_disposal #: model:ir.model,name:account_asset_disposal.model_account_asset_asset msgid "Asset/Revenue Recognition" -msgstr "Activo fijo" +msgstr "Aceptación de pagos/Ingresos" #. module: account_asset_disposal #: model:ir.model.fields,field_description:account_asset_disposal.field_account_asset_asset_disposal_date @@ -36,6 +59,11 @@ msgstr "Fecha de baja" msgid "Disposal move" msgstr "Asiento de baja" +#. module: account_asset_disposal +#: model:ir.model.fields,field_description:account_asset_disposal.field_account_asset_category_loss_account_id +msgid "Loss Account" +msgstr "Cuenta de pérdidas" + #. module: account_asset_disposal #: model:ir.ui.view,arch_db:account_asset_disposal.view_account_asset_asset_form msgid "Undo disposal" diff --git a/account_asset_disposal/models/__init__.py b/account_asset_disposal/models/__init__.py index c70d53409..9db1bd823 100644 --- a/account_asset_disposal/models/__init__.py +++ b/account_asset_disposal/models/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from . import account_asset_asset +from . import account_asset diff --git a/account_asset_disposal/models/account_asset.py b/account_asset_disposal/models/account_asset.py new file mode 100644 index 000000000..04b2bda70 --- /dev/null +++ b/account_asset_disposal/models/account_asset.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 Antonio Espinosa - +# Copyright 2017 Luis M. Ontalba - +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, fields, models + + +class AccountAssetCategory(models.Model): + _inherit = "account.asset.category" + + def _default_loss_account_id(self): + exp_type = self.env.ref('account.data_account_type_expenses') + first_expense = self.env['account.account'].search([ + ('internal_type', '=', 'other'), + ('user_type_id', '=', exp_type.id), + ], limit=1) + return first_expense + + loss_account_id = fields.Many2one( + comodel_name="account.account", string="Loss Account", required=True, + domain=[('internal_type', '=', 'other')], + default=lambda self: self._default_loss_account_id()) + + +class AccountAssetAsset(models.Model): + _inherit = "account.asset.asset" + + state = fields.Selection( + selection_add=[('disposed', 'Disposed')], + ) + disposal_date = fields.Date(string="Disposal date") + disposal_move_id = fields.Many2one( + comodel_name='account.move', string="Disposal move") + + def get_disposal_date(self): + return fields.Date.context_today(self) + + @api.multi + def set_to_close(self): + value_residual_prev = self.value_residual + res = super(AccountAssetAsset, self).set_to_close() + if res: + date = self.get_disposal_date() + loss_account = self.category_id.loss_account_id + self.value_residual = value_residual_prev + move = self.disposal_move_create(date, loss_account) + res['res_id'] = move.id + self.disposal_move_id = res['res_id'] + self.disposal_move_id.post() + self.write({ + 'state': 'disposed', + 'disposal_date': self.get_disposal_date(), + }) + return res + + @api.multi + def action_disposal_undo(self): + for asset in self.with_context(asset_disposal_undo=True): + if asset.disposal_move_id: + asset.disposal_move_id.button_cancel() + asset.disposal_move_id.unlink() + last_line = self.depreciation_line_ids[-1] + last_line.move_id = False + last_line.unlink() + asset.state = 'open' + asset.method_end = asset.category_id.method_end + asset.method_number = asset.category_id.method_number + asset.compute_depreciation_board() + return self.write({ + 'disposal_date': False, + 'disposal_move_id': False, + }) + + def _disposal_line_asset_prepare(self, date, journal): + return { + 'name': _('Asset disposal'), + 'journal_id': journal.id, + 'account_id': self.category_id.account_asset_id.id, + 'date': date, + 'debit': 0.0, + 'credit': self.value, + } + + def _disposal_line_depreciation_prepare(self, date, journal, + depreciation_value): + return { + 'name': _('Asset depreciation'), + 'journal_id': journal.id, + 'account_id': self.category_id.account_depreciation_id.id, + 'date': date, + 'debit': depreciation_value, + 'credit': 0.0, + } + + def _disposal_line_loss_prepare(self, date, journal, loss_account, + loss_value): + return { + 'name': _('Asset loss'), + 'journal_id': journal.id, + 'account_id': loss_account.id, + 'analytic_account_id': self.category_id.account_analytic_id.id, + 'date': date, + 'debit': loss_value, + 'credit': 0.0, + } + + def _disposal_move_prepare(self, date, loss_account): + journal = self.category_id.journal_id + loss_value = self.salvage_value + self.value_residual + depreciation_value = self.value - loss_value + line_asset = self._disposal_line_asset_prepare(date, journal) + line_depreciation = self._disposal_line_depreciation_prepare( + date, journal, depreciation_value) + lines = [ + (0, False, line_asset), + (0, False, line_depreciation), + ] + if loss_value: + line_loss = self._disposal_line_loss_prepare( + date, journal, loss_account, loss_value) + lines.append((0, False, line_loss)) + return { + 'journal_id': journal.id, + 'ref': self.name, + 'date': date, + 'line_ids': lines, + } + + def disposal_move_create(self, date, loss_account): + vals = self._disposal_move_prepare(date, loss_account) + move = self.env['account.move'].create(vals) + return move + + +class AccountAssetDepreciationLine(models.Model): + _inherit = 'account.asset.depreciation.line' + + @api.multi + def post_lines_and_close_asset(self): + disposed_lines = self.filtered(lambda r: r.asset_id.state == + 'disposed') + super(AccountAssetDepreciationLine, self).post_lines_and_close_asset() + disposed_lines.mapped('asset_id').write({'state': 'disposed'}) diff --git a/account_asset_disposal/models/account_asset_asset.py b/account_asset_disposal/models/account_asset_asset.py deleted file mode 100644 index 33955486b..000000000 --- a/account_asset_disposal/models/account_asset_asset.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2016 Antonio Espinosa - -# Copyright 2017 Luis M. Ontalba - -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from odoo import api, fields, models - - -class AccountAssetAsset(models.Model): - _inherit = "account.asset.asset" - - state = fields.Selection( - selection_add=[('disposed', 'Disposed')], - ) - disposal_date = fields.Date(string="Disposal date") - disposal_move_id = fields.Many2one( - comodel_name='account.move', string="Disposal move") - - def get_disposal_date(self): - return fields.Date.context_today(self) - - @api.multi - def set_to_close(self): - res = super(AccountAssetAsset, self).set_to_close() - if res: - self.disposal_move_id = res['res_id'] - self.disposal_move_id.post() - self.write({ - 'state': 'disposed', - 'disposal_date': self.get_disposal_date(), - }) - return res - - @api.multi - def action_disposal_undo(self): - for asset in self.with_context(asset_disposal_undo=True): - if asset.disposal_move_id: - asset.disposal_move_id.button_cancel() - asset.disposal_move_id.unlink() - if asset.currency_id.is_zero(asset.value_residual): - asset.state = 'close' - else: - asset.state = 'open' - asset.method_end = asset.category_id.method_end - asset.method_number = asset.category_id.method_number - asset.compute_depreciation_board() - return self.write({ - 'disposal_date': False, - 'disposal_move_id': False, - }) - - -class AccountAssetDepreciationLine(models.Model): - _inherit = 'account.asset.depreciation.line' - - @api.multi - def post_lines_and_close_asset(self): - disposed_lines = self.filtered(lambda r: r.asset_id.state == - 'disposed') - super(AccountAssetDepreciationLine, self).post_lines_and_close_asset() - disposed_lines.mapped('asset_id').write({'state': 'disposed'}) diff --git a/account_asset_disposal/tests/test_account_asset_disposal.py b/account_asset_disposal/tests/test_account_asset_disposal.py index 5be4b8d52..d08723872 100644 --- a/account_asset_disposal/tests/test_account_asset_disposal.py +++ b/account_asset_disposal/tests/test_account_asset_disposal.py @@ -67,6 +67,6 @@ class TestAccountAssetDisposal(common.SavepointCase): def test_asset_amortized(self): self.asset.depreciation_line_ids.create_move() - self.asset.set_to_close() - self.asset.action_disposal_undo() + for line in self.asset.depreciation_line_ids: + line.move_id.post() self.assertEqual(self.asset.state, 'close') diff --git a/account_asset_disposal/views/account_asset_asset_view.xml b/account_asset_disposal/views/account_asset_view.xml similarity index 67% rename from account_asset_disposal/views/account_asset_asset_view.xml rename to account_asset_disposal/views/account_asset_view.xml index 703d0b0a6..1edf0e826 100644 --- a/account_asset_disposal/views/account_asset_asset_view.xml +++ b/account_asset_disposal/views/account_asset_view.xml @@ -2,6 +2,21 @@ + + Add loss account + account.asset.category + + + +
+
+ + +
+
+ Add disposal fields account.asset.asset