[10.0][add] account_asset_disposal: disposal move with expenses

This commit is contained in:
Luis M. Ontalba
2017-11-23 10:40:39 +01:00
committed by OCA-git-bot
parent 8932f2b71d
commit 1379367e65
8 changed files with 198 additions and 70 deletions

View File

@@ -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
=====

View File

@@ -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",
],
}

View File

@@ -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"

View File

@@ -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

View File

@@ -0,0 +1,144 @@
# -*- coding: utf-8 -*-
# Copyright 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
# Copyright 2017 Luis M. Ontalba - <luis.martinez@tecnativa.com>
# 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'})

View File

@@ -1,61 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
# Copyright 2017 Luis M. Ontalba - <luis.martinez@tecnativa.com>
# 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'})

View File

@@ -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')

View File

@@ -2,6 +2,21 @@
<odoo>
<record model="ir.ui.view" id="view_account_asset_category_form">
<field name="name">Add loss account</field>
<field name="model">account.asset.category</field>
<field name="inherit_id" ref="account_asset.view_account_asset_category_form"/>
<field name="arch" type="xml">
<field name="account_depreciation_expense_id"
position="after">
<div>
<label for="loss_account_id"/>
</div>
<field name="loss_account_id" nolabel="1"/>
</field>
</field>
</record>
<record model="ir.ui.view" id="view_account_asset_asset_form">
<field name="name">Add disposal fields</field>
<field name="model">account.asset.asset</field>