[MIG] account_asset_management: Migration to v14
TT26410
This commit is contained in:
parent
2aa11d4e40
commit
dd7e4e08df
@ -14,13 +14,13 @@ Assets Management
|
|||||||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
:alt: License: AGPL-3
|
:alt: License: AGPL-3
|
||||||
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github
|
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github
|
||||||
:target: https://github.com/OCA/account-financial-tools/tree/13.0/account_asset_management
|
:target: https://github.com/OCA/account-financial-tools/tree/14.0/account_asset_management
|
||||||
:alt: OCA/account-financial-tools
|
:alt: OCA/account-financial-tools
|
||||||
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
||||||
:target: https://translation.odoo-community.org/projects/account-financial-tools-13-0/account-financial-tools-13-0-account_asset_management
|
:target: https://translation.odoo-community.org/projects/account-financial-tools-14-0/account-financial-tools-14-0-account_asset_management
|
||||||
:alt: Translate me on Weblate
|
:alt: Translate me on Weblate
|
||||||
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
|
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
|
||||||
:target: https://runbot.odoo-community.org/runbot/92/13.0
|
:target: https://runbot.odoo-community.org/runbot/92/14.0
|
||||||
:alt: Try me on Runbot
|
:alt: Try me on Runbot
|
||||||
|
|
||||||
|badge1| |badge2| |badge3| |badge4| |badge5|
|
|badge1| |badge2| |badge3| |badge4| |badge5|
|
||||||
@ -60,6 +60,11 @@ The module in NOT compatible with the standard account_asset module.
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
14.0.1.0.0 (2021-01-08)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* [BREAKING] Removed all functionality associated with `account.fiscal.year`
|
||||||
|
|
||||||
13.0.1.0.0 (2019-10-21)
|
13.0.1.0.0 (2019-10-21)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@ -94,7 +99,7 @@ Bug Tracker
|
|||||||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-tools/issues>`_.
|
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-tools/issues>`_.
|
||||||
In case of trouble, please check there if your issue has already been reported.
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
`feedback <https://github.com/OCA/account-financial-tools/issues/new?body=module:%20account_asset_management%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
`feedback <https://github.com/OCA/account-financial-tools/issues/new?body=module:%20account_asset_management%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||||
|
|
||||||
Do not contact contributors directly about support or help with technical issues.
|
Do not contact contributors directly about support or help with technical issues.
|
||||||
|
|
||||||
@ -124,6 +129,7 @@ Contributors
|
|||||||
|
|
||||||
* Ernesto Tejeda
|
* Ernesto Tejeda
|
||||||
* Pedro M. Baeza
|
* Pedro M. Baeza
|
||||||
|
* João Marques
|
||||||
|
|
||||||
Maintainers
|
Maintainers
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
@ -138,6 +144,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
|
|||||||
mission is to support the collaborative development of Odoo features and
|
mission is to support the collaborative development of Odoo features and
|
||||||
promote its widespread use.
|
promote its widespread use.
|
||||||
|
|
||||||
This module is part of the `OCA/account-financial-tools <https://github.com/OCA/account-financial-tools/tree/13.0/account_asset_management>`_ project on GitHub.
|
This module is part of the `OCA/account-financial-tools <https://github.com/OCA/account-financial-tools/tree/14.0/account_asset_management>`_ project on GitHub.
|
||||||
|
|
||||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
# Copyright 2009-2018 Noviat
|
# Copyright 2009-2018 Noviat
|
||||||
# Copyright 2019 Tecnativa - Pedro M. Baeza
|
# Copyright 2019 Tecnativa - Pedro M. Baeza
|
||||||
|
# Copyright 2021 Tecnativa - João Marques
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "Assets Management",
|
"name": "Assets Management",
|
||||||
"version": "13.0.1.3.2",
|
"version": "14.0.1.0.0",
|
||||||
"license": "AGPL-3",
|
"license": "AGPL-3",
|
||||||
"depends": ["account"],
|
"depends": ["account"],
|
||||||
"excludes": ["account_asset"],
|
"excludes": ["account_asset"],
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
|
||||||
|
|
||||||
from odoo import SUPERUSER_ID, api
|
|
||||||
|
|
||||||
|
|
||||||
def migrate(cr, version):
|
|
||||||
with api.Environment.manage():
|
|
||||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
|
||||||
domain = "['|',('company_id','=',False),('company_id','in',company_ids)]"
|
|
||||||
rule = env.ref(
|
|
||||||
"account_asset_management.account_asset_profile_multi_company_rule",
|
|
||||||
raise_if_not_found=False,
|
|
||||||
)
|
|
||||||
if rule:
|
|
||||||
rule.write({"domain_force": domain})
|
|
||||||
rule = env.ref(
|
|
||||||
"account_asset_management.account_asset_multi_company_rule",
|
|
||||||
raise_if_not_found=False,
|
|
||||||
)
|
|
||||||
if rule:
|
|
||||||
rule.write({"domain_force": domain})
|
|
||||||
rule = env.ref(
|
|
||||||
"account_asset_management.account_asset_group_multi_company_rule",
|
|
||||||
raise_if_not_found=False,
|
|
||||||
)
|
|
||||||
if rule:
|
|
||||||
rule.write({"domain_force": domain})
|
|
@ -4,5 +4,4 @@ from . import account_asset_group
|
|||||||
from . import account_asset_profile
|
from . import account_asset_profile
|
||||||
from . import account_asset_line
|
from . import account_asset_line
|
||||||
from . import account_asset_recompute_trigger
|
from . import account_asset_recompute_trigger
|
||||||
from . import account_fiscal_year
|
|
||||||
from . import account_move
|
from . import account_move
|
||||||
|
@ -45,8 +45,16 @@ class AccountAsset(models.Model):
|
|||||||
move_line_check = fields.Boolean(
|
move_line_check = fields.Boolean(
|
||||||
compute="_compute_move_line_check", string="Has accounting entries"
|
compute="_compute_move_line_check", string="Has accounting entries"
|
||||||
)
|
)
|
||||||
name = fields.Char(string="Asset Name", required=True, states=READONLY_STATES,)
|
name = fields.Char(
|
||||||
code = fields.Char(string="Reference", size=32, states=READONLY_STATES,)
|
string="Asset Name",
|
||||||
|
required=True,
|
||||||
|
states=READONLY_STATES,
|
||||||
|
)
|
||||||
|
code = fields.Char(
|
||||||
|
string="Reference",
|
||||||
|
size=32,
|
||||||
|
states=READONLY_STATES,
|
||||||
|
)
|
||||||
purchase_value = fields.Float(
|
purchase_value = fields.Float(
|
||||||
string="Purchase Value",
|
string="Purchase Value",
|
||||||
required=True,
|
required=True,
|
||||||
@ -133,7 +141,9 @@ class AccountAsset(models.Model):
|
|||||||
)
|
)
|
||||||
active = fields.Boolean(default=True)
|
active = fields.Boolean(default=True)
|
||||||
partner_id = fields.Many2one(
|
partner_id = fields.Many2one(
|
||||||
comodel_name="res.partner", string="Partner", states=READONLY_STATES,
|
comodel_name="res.partner",
|
||||||
|
string="Partner",
|
||||||
|
states=READONLY_STATES,
|
||||||
)
|
)
|
||||||
method = fields.Selection(
|
method = fields.Selection(
|
||||||
selection=lambda self: self.env["account.asset.profile"]._selection_method(),
|
selection=lambda self: self.env["account.asset.profile"]._selection_method(),
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
# Copyright 2009-2018 Noviat
|
# Copyright 2009-2018 Noviat
|
||||||
|
# Copyright 2021 Tecnativa - João Marques
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import _, api, fields, models
|
from odoo import _, api, fields, models
|
||||||
@ -255,7 +256,7 @@ class AccountAssetLine(models.Model):
|
|||||||
depreciation_date, exp_acc, "expense", move
|
depreciation_date, exp_acc, "expense", move
|
||||||
)
|
)
|
||||||
self.env["account.move.line"].with_context(ctx).create(aml_e_vals)
|
self.env["account.move.line"].with_context(ctx).create(aml_e_vals)
|
||||||
move.post()
|
move.action_post()
|
||||||
line.with_context(allow_asset_line_update=True).write({"move_id": move.id})
|
line.with_context(allow_asset_line_update=True).write({"move_id": move.id})
|
||||||
created_move_ids.append(move.id)
|
created_move_ids.append(move.id)
|
||||||
asset_ids.add(asset.id)
|
asset_ids.add(asset.id)
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
# Copyright 2009-2017 Noviat
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import time
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
from dateutil.relativedelta import relativedelta
|
|
||||||
|
|
||||||
from odoo import api, models
|
|
||||||
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class AccountFiscalYear(models.Model):
|
|
||||||
_inherit = "account.fiscal.year"
|
|
||||||
|
|
||||||
@api.model
|
|
||||||
def create(self, vals):
|
|
||||||
date_from = datetime.strptime(vals.get("date_from"), "%Y-%m-%d")
|
|
||||||
date_to = datetime.strptime(vals.get("date_to"), "%Y-%m-%d")
|
|
||||||
if not date_to == date_from + relativedelta(years=1, days=-1):
|
|
||||||
recompute_vals = {
|
|
||||||
"reason": "creation of fiscalyear %s" % vals.get("name"),
|
|
||||||
"company_id": vals.get("company_id") or self.env.user.company_id.id,
|
|
||||||
"date_trigger": time.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
|
||||||
"state": "open",
|
|
||||||
}
|
|
||||||
self.env["account.asset.recompute.trigger"].sudo().create(recompute_vals)
|
|
||||||
return super().create(vals)
|
|
||||||
|
|
||||||
def write(self, vals):
|
|
||||||
if vals.get("date_from") or vals.get("date_to"):
|
|
||||||
for fy in self:
|
|
||||||
recompute_vals = {
|
|
||||||
"reason": "duration change of fiscalyear %s" % fy.name,
|
|
||||||
"company_id": fy.company_id.id,
|
|
||||||
"date_trigger": time.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
|
||||||
"state": "open",
|
|
||||||
}
|
|
||||||
self.env["account.asset.recompute.trigger"].sudo().create(
|
|
||||||
recompute_vals
|
|
||||||
)
|
|
||||||
return super().write(vals)
|
|
@ -1,4 +1,5 @@
|
|||||||
# Copyright 2009-2018 Noviat
|
# Copyright 2009-2018 Noviat
|
||||||
|
# Copyright 2021 Tecnativa - João Marques
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
@ -58,11 +59,11 @@ class AccountMove(models.Model):
|
|||||||
)
|
)
|
||||||
return super().write(vals)
|
return super().write(vals)
|
||||||
|
|
||||||
def post(self):
|
def action_post(self):
|
||||||
super().post()
|
super().action_post()
|
||||||
for move in self:
|
for move in self:
|
||||||
for aml in move.line_ids.filtered("asset_profile_id"):
|
for aml in move.line_ids.filtered("asset_profile_id"):
|
||||||
depreciation_base = aml.debit or -aml.credit
|
depreciation_base = aml.price_subtotal
|
||||||
vals = {
|
vals = {
|
||||||
"name": aml.name,
|
"name": aml.name,
|
||||||
"code": move.name,
|
"code": move.name,
|
||||||
|
@ -13,3 +13,4 @@
|
|||||||
|
|
||||||
* Ernesto Tejeda
|
* Ernesto Tejeda
|
||||||
* Pedro M. Baeza
|
* Pedro M. Baeza
|
||||||
|
* João Marques
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
14.0.1.0.0 (2021-01-08)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* [BREAKING] Removed all functionality associated with `account.fiscal.year`
|
||||||
|
|
||||||
13.0.1.0.0 (2019-10-21)
|
13.0.1.0.0 (2019-10-21)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@ -13,3 +13,5 @@ access_account_asset_recompute_trigger_manager,account.asset.recompute.trigger,m
|
|||||||
access_account_asset_group_invoice,account.asset.group,model_account_asset_group,account.group_account_invoice,1,0,0,0
|
access_account_asset_group_invoice,account.asset.group,model_account_asset_group,account.group_account_invoice,1,0,0,0
|
||||||
access_account_asset_group_user,account.asset.group,model_account_asset_group,account.group_account_user,1,0,0,0
|
access_account_asset_group_user,account.asset.group,model_account_asset_group,account.group_account_user,1,0,0,0
|
||||||
access_account_asset_group_manager,account.asset.group,model_account_asset_group,account.group_account_manager,1,1,1,1
|
access_account_asset_group_manager,account.asset.group,model_account_asset_group,account.group_account_manager,1,1,1,1
|
||||||
|
access_account_asset_remove_user,account.asset.remove,model_account_asset_remove,account.group_account_user,1,1,1,1
|
||||||
|
access_account_asset_compute_user,account.asset.compute,model_account_asset_compute,account.group_account_user,1,1,1,1
|
||||||
|
|
@ -3,7 +3,7 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
|
||||||
<title>Assets Management</title>
|
<title>Assets Management</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
|
|
||||||
@ -367,7 +367,7 @@ ul.auto-toc {
|
|||||||
!! This file is generated by oca-gen-addon-readme !!
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
!! changes will be overwritten. !!
|
!! changes will be overwritten. !!
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||||
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/account-financial-tools/tree/13.0/account_asset_management"><img alt="OCA/account-financial-tools" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-financial-tools-13-0/account-financial-tools-13-0-account_asset_management"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/92/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
|
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/account-financial-tools/tree/14.0/account_asset_management"><img alt="OCA/account-financial-tools" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-financial-tools-14-0/account-financial-tools-14-0-account_asset_management"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/92/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
|
||||||
<p>This Module manages the assets owned by a company. It will keep
|
<p>This Module manages the assets owned by a company. It will keep
|
||||||
track of depreciation’s occurred on those assets. And it allows to create
|
track of depreciation’s occurred on those assets. And it allows to create
|
||||||
accounting entries from the depreciation lines.</p>
|
accounting entries from the depreciation lines.</p>
|
||||||
@ -387,30 +387,39 @@ the standard account_asset module from Odoo.</p>
|
|||||||
<p><strong>Table of contents</strong></p>
|
<p><strong>Table of contents</strong></p>
|
||||||
<div class="contents local topic" id="contents">
|
<div class="contents local topic" id="contents">
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference internal" href="#usage" id="id4">Usage</a></li>
|
<li><a class="reference internal" href="#usage" id="id5">Usage</a></li>
|
||||||
<li><a class="reference internal" href="#changelog" id="id5">Changelog</a><ul>
|
<li><a class="reference internal" href="#changelog" id="id6">Changelog</a><ul>
|
||||||
<li><a class="reference internal" href="#id1" id="id6">13.0.1.0.0 (2019-10-21)</a></li>
|
<li><a class="reference internal" href="#id1" id="id7">14.0.1.0.0 (2021-01-08)</a></li>
|
||||||
<li><a class="reference internal" href="#id2" id="id7">12.0.2.1.0 (2019-10-21)</a></li>
|
<li><a class="reference internal" href="#id2" id="id8">13.0.1.0.0 (2019-10-21)</a></li>
|
||||||
<li><a class="reference internal" href="#id3" id="id8">12.0.1.0.0 (2019-01-13)</a></li>
|
<li><a class="reference internal" href="#id3" id="id9">12.0.2.1.0 (2019-10-21)</a></li>
|
||||||
|
<li><a class="reference internal" href="#id4" id="id10">12.0.1.0.0 (2019-01-13)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="reference internal" href="#bug-tracker" id="id9">Bug Tracker</a></li>
|
<li><a class="reference internal" href="#bug-tracker" id="id11">Bug Tracker</a></li>
|
||||||
<li><a class="reference internal" href="#credits" id="id10">Credits</a><ul>
|
<li><a class="reference internal" href="#credits" id="id12">Credits</a><ul>
|
||||||
<li><a class="reference internal" href="#authors" id="id11">Authors</a></li>
|
<li><a class="reference internal" href="#authors" id="id13">Authors</a></li>
|
||||||
<li><a class="reference internal" href="#contributors" id="id12">Contributors</a></li>
|
<li><a class="reference internal" href="#contributors" id="id14">Contributors</a></li>
|
||||||
<li><a class="reference internal" href="#maintainers" id="id13">Maintainers</a></li>
|
<li><a class="reference internal" href="#maintainers" id="id15">Maintainers</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="usage">
|
<div class="section" id="usage">
|
||||||
<h1><a class="toc-backref" href="#id4">Usage</a></h1>
|
<h1><a class="toc-backref" href="#id5">Usage</a></h1>
|
||||||
<p>The module in NOT compatible with the standard account_asset module.</p>
|
<p>The module in NOT compatible with the standard account_asset module.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="changelog">
|
<div class="section" id="changelog">
|
||||||
<h1><a class="toc-backref" href="#id5">Changelog</a></h1>
|
<h1><a class="toc-backref" href="#id6">Changelog</a></h1>
|
||||||
<div class="section" id="id1">
|
<div class="section" id="id1">
|
||||||
<h2><a class="toc-backref" href="#id6">13.0.1.0.0 (2019-10-21)</a></h2>
|
<h2><a class="toc-backref" href="#id7">14.0.1.0.0 (2021-01-08)</a></h2>
|
||||||
|
<blockquote>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>[BREAKING] Removed all functionality associated with <cite>account.fiscal.year</cite></li>
|
||||||
|
</ul>
|
||||||
|
</blockquote>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="id2">
|
||||||
|
<h2><a class="toc-backref" href="#id8">13.0.1.0.0 (2019-10-21)</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li>Python code and views were adapted to be compatible with v13.</li>
|
<li>Python code and views were adapted to be compatible with v13.</li>
|
||||||
<li>When assets are created through accounting journal items,
|
<li>When assets are created through accounting journal items,
|
||||||
@ -427,14 +436,14 @@ allow the module to be uninstalled by unchecking that configuration option.</li>
|
|||||||
<li>Tests were adapted.</li>
|
<li>Tests were adapted.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="id2">
|
<div class="section" id="id3">
|
||||||
<h2><a class="toc-backref" href="#id7">12.0.2.1.0 (2019-10-21)</a></h2>
|
<h2><a class="toc-backref" href="#id9">12.0.2.1.0 (2019-10-21)</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li>[IMP] Add option to calculate depreciation table by days</li>
|
<li>[IMP] Add option to calculate depreciation table by days</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="id3">
|
<div class="section" id="id4">
|
||||||
<h2><a class="toc-backref" href="#id8">12.0.1.0.0 (2019-01-13)</a></h2>
|
<h2><a class="toc-backref" href="#id10">12.0.1.0.0 (2019-01-13)</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li>[BREAKING] account.asset: parent_path has replaced parent_left & parent_right (TODO: migration script)</li>
|
<li>[BREAKING] account.asset: parent_path has replaced parent_left & parent_right (TODO: migration script)</li>
|
||||||
<li>[BREAKING] account.asset.recompute.trigger: depends on date_range.py (TODO: re-implement in account_fiscal_year.py)</li>
|
<li>[BREAKING] account.asset.recompute.trigger: depends on date_range.py (TODO: re-implement in account_fiscal_year.py)</li>
|
||||||
@ -442,23 +451,23 @@ allow the module to be uninstalled by unchecking that configuration option.</li>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="bug-tracker">
|
<div class="section" id="bug-tracker">
|
||||||
<h1><a class="toc-backref" href="#id9">Bug Tracker</a></h1>
|
<h1><a class="toc-backref" href="#id11">Bug Tracker</a></h1>
|
||||||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-financial-tools/issues">GitHub Issues</a>.
|
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-financial-tools/issues">GitHub Issues</a>.
|
||||||
In case of trouble, please check there if your issue has already been reported.
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
<a class="reference external" href="https://github.com/OCA/account-financial-tools/issues/new?body=module:%20account_asset_management%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
<a class="reference external" href="https://github.com/OCA/account-financial-tools/issues/new?body=module:%20account_asset_management%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||||
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="credits">
|
<div class="section" id="credits">
|
||||||
<h1><a class="toc-backref" href="#id10">Credits</a></h1>
|
<h1><a class="toc-backref" href="#id12">Credits</a></h1>
|
||||||
<div class="section" id="authors">
|
<div class="section" id="authors">
|
||||||
<h2><a class="toc-backref" href="#id11">Authors</a></h2>
|
<h2><a class="toc-backref" href="#id13">Authors</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li>Noviat</li>
|
<li>Noviat</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="contributors">
|
<div class="section" id="contributors">
|
||||||
<h2><a class="toc-backref" href="#id12">Contributors</a></h2>
|
<h2><a class="toc-backref" href="#id14">Contributors</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li>OpenERP SA</li>
|
<li>OpenERP SA</li>
|
||||||
<li>Luc De Meyer (Noviat)</li>
|
<li>Luc De Meyer (Noviat)</li>
|
||||||
@ -474,18 +483,19 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
|
|||||||
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
|
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
|
||||||
<li>Ernesto Tejeda</li>
|
<li>Ernesto Tejeda</li>
|
||||||
<li>Pedro M. Baeza</li>
|
<li>Pedro M. Baeza</li>
|
||||||
|
<li>João Marques</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="maintainers">
|
<div class="section" id="maintainers">
|
||||||
<h2><a class="toc-backref" href="#id13">Maintainers</a></h2>
|
<h2><a class="toc-backref" href="#id15">Maintainers</a></h2>
|
||||||
<p>This module is maintained by the OCA.</p>
|
<p>This module is maintained by the OCA.</p>
|
||||||
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
|
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
|
||||||
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
|
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
|
||||||
mission is to support the collaborative development of Odoo features and
|
mission is to support the collaborative development of Odoo features and
|
||||||
promote its widespread use.</p>
|
promote its widespread use.</p>
|
||||||
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-tools/tree/13.0/account_asset_management">OCA/account-financial-tools</a> project on GitHub.</p>
|
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-tools/tree/14.0/account_asset_management">OCA/account-financial-tools</a> project on GitHub.</p>
|
||||||
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
|
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,67 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<odoo>
|
|
||||||
<data noupdate="1">
|
|
||||||
<record id="account_fiscal_year_current" model="account.fiscal.year">
|
|
||||||
<field name="name">FY_assets</field>
|
|
||||||
<field name="date_from" eval="time.strftime('%Y-01-01')" />
|
|
||||||
<field name="date_to" eval="time.strftime('%Y-12-31')" />
|
|
||||||
<field name="company_id" ref="base.main_company" />
|
|
||||||
</record>
|
|
||||||
<record id="account_fiscal_year_previous" model="account.fiscal.year">
|
|
||||||
<field name="name">FY_assets previous</field>
|
|
||||||
<field
|
|
||||||
name="date_from"
|
|
||||||
eval="(datetime.now() - relativedelta(years=1, month=1, day=1)).strftime('%Y-%m-%d')"
|
|
||||||
/>
|
|
||||||
<field
|
|
||||||
name="date_to"
|
|
||||||
eval="(datetime.now() - relativedelta(years=1, month=12, day=31)).strftime('%Y-%m-%d')"
|
|
||||||
/>
|
|
||||||
<field name="company_id" ref="base.main_company" />
|
|
||||||
</record>
|
|
||||||
<!-- Asset profiles -->
|
|
||||||
<record id="account_asset_profile_ict_3Y" model="account.asset.profile">
|
|
||||||
<field name="account_expense_depreciation_id" ref="account.a_expense" />
|
|
||||||
<field name="account_asset_id" ref="account.xfa" />
|
|
||||||
<field name="account_depreciation_id" ref="account.xfa" />
|
|
||||||
<field name="journal_id" ref="account.expenses_journal" />
|
|
||||||
<field name="name">Hardware - 3 Years</field>
|
|
||||||
<field name="method_time">year</field>
|
|
||||||
<field name="method_number" eval="3" />
|
|
||||||
<field name="method_period">year</field>
|
|
||||||
</record>
|
|
||||||
<record id="account_asset_profile_car_5Y" model="account.asset.profile">
|
|
||||||
<field name="account_expense_depreciation_id" ref="account.a_expense" />
|
|
||||||
<field name="account_asset_id" ref="account.xfa" />
|
|
||||||
<field name="account_depreciation_id" ref="account.xfa" />
|
|
||||||
<field name="journal_id" ref="account.expenses_journal" />
|
|
||||||
<field name="name">Cars - 5 Years</field>
|
|
||||||
<field name="method_time">year</field>
|
|
||||||
<field name="method_number" eval="5" />
|
|
||||||
<field name="method_period">year</field>
|
|
||||||
</record>
|
|
||||||
<!-- Assets -->
|
|
||||||
<record id="account_asset_asset_ict0" model="account.asset">
|
|
||||||
<field name="state">draft</field>
|
|
||||||
<field name="method_time">year</field>
|
|
||||||
<field name="method_number" eval="3" />
|
|
||||||
<field name="method_period">year</field>
|
|
||||||
<field name="date_start" eval="time.strftime('%Y-01-01')" />
|
|
||||||
<field name="name">Laptop</field>
|
|
||||||
<field name="code">PI00101</field>
|
|
||||||
<field name="purchase_value" eval="1500.0" />
|
|
||||||
<field name="profile_id" ref="account_asset_profile_ict_3Y" />
|
|
||||||
</record>
|
|
||||||
<record id="account_asset_asset_vehicle0" model="account.asset">
|
|
||||||
<field name="state">draft</field>
|
|
||||||
<field name="method_time">year</field>
|
|
||||||
<field name="method_number" eval="5" />
|
|
||||||
<field name="method_period">year</field>
|
|
||||||
<field name="date_start" eval="time.strftime('%Y-01-01')" />
|
|
||||||
<field name="name">CEO's Car</field>
|
|
||||||
<field name="purchase_value" eval="12000.0" />
|
|
||||||
<field name="salvage_value" eval="2000.0" />
|
|
||||||
<field name="profile_id" ref="account_asset_profile_car_5Y" />
|
|
||||||
</record>
|
|
||||||
</data>
|
|
||||||
</odoo>
|
|
@ -1,82 +1,49 @@
|
|||||||
# Copyright (c) 2014 ACSONE SA/NV (acsone.eu).
|
# Copyright (c) 2014 ACSONE SA/NV (acsone.eu).
|
||||||
# Copyright 2009-2018 Noviat
|
# Copyright 2009-2018 Noviat
|
||||||
|
# Copyright 2021 Tecnativa - João Marques
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
import calendar
|
import calendar
|
||||||
import time
|
import time
|
||||||
from datetime import date, datetime
|
from datetime import date, datetime
|
||||||
|
|
||||||
from odoo import tools
|
from odoo.tests.common import Form
|
||||||
from odoo.modules.module import get_resource_path
|
|
||||||
from odoo.tests.common import Form, SavepointCase
|
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
|
||||||
|
|
||||||
|
|
||||||
class TestAssetManagement(SavepointCase):
|
class TestAssetManagement(AccountTestInvoicingCommon):
|
||||||
@classmethod
|
|
||||||
def _load(cls, module, *args):
|
|
||||||
tools.convert_file(
|
|
||||||
cls.cr,
|
|
||||||
module,
|
|
||||||
get_resource_path(module, *args),
|
|
||||||
{},
|
|
||||||
"init",
|
|
||||||
False,
|
|
||||||
"test",
|
|
||||||
cls.registry._assertion_report,
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
super().setUpClass()
|
super().setUpClass()
|
||||||
|
|
||||||
cls._load("account", "test", "account_minimal_test.xml")
|
|
||||||
cls._load("account_asset_management", "tests", "account_asset_test_data.xml")
|
|
||||||
|
|
||||||
# ENVIRONEMENTS
|
# ENVIRONEMENTS
|
||||||
cls.asset_model = cls.env["account.asset"]
|
cls.asset_model = cls.env["account.asset"]
|
||||||
|
cls.asset_profile_model = cls.env["account.asset.profile"]
|
||||||
cls.dl_model = cls.env["account.asset.line"]
|
cls.dl_model = cls.env["account.asset.line"]
|
||||||
cls.remove_model = cls.env["account.asset.remove"]
|
cls.remove_model = cls.env["account.asset.remove"]
|
||||||
cls.account_invoice = cls.env["account.move"]
|
|
||||||
cls.account_move_line = cls.env["account.move.line"]
|
|
||||||
cls.account_account = cls.env["account.account"]
|
|
||||||
cls.account_journal = cls.env["account.journal"]
|
|
||||||
cls.account_invoice_line = cls.env["account.move.line"]
|
|
||||||
|
|
||||||
# INSTANCES
|
# INSTANCES
|
||||||
|
cls.partner = cls.env["res.partner"].create({"name": "Test Partner"})
|
||||||
# Instance: company
|
cls.product = cls.env["product.product"].create(
|
||||||
cls.company = cls.env.ref("base.main_company")
|
{"name": "Test", "standard_price": 500.0}
|
||||||
|
)
|
||||||
# Instance: partner
|
|
||||||
cls.partner = cls.env.ref("base.res_partner_2")
|
|
||||||
|
|
||||||
# Instance: journal
|
|
||||||
cls.journal = cls.account_journal.search([("type", "=", "purchase")])[0]
|
|
||||||
|
|
||||||
# Instance: product
|
|
||||||
cls.product = cls.env.ref("product.product_product_4")
|
|
||||||
|
|
||||||
move_form = Form(
|
move_form = Form(
|
||||||
cls.env["account.move"].with_context(
|
cls.env["account.move"].with_context(
|
||||||
default_type="in_invoice", check_move_validity=False
|
default_move_type="in_invoice", check_move_validity=False
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
move_form.partner_id = cls.partner
|
move_form.partner_id = cls.partner
|
||||||
move_form.journal_id = cls.journal
|
|
||||||
with move_form.invoice_line_ids.new() as line_form:
|
with move_form.invoice_line_ids.new() as line_form:
|
||||||
line_form.name = "test"
|
line_form.name = "test"
|
||||||
line_form.product_id = cls.product
|
line_form.product_id = cls.product
|
||||||
line_form.price_unit = 2000.00
|
line_form.price_unit = 2000.00
|
||||||
line_form.quantity = 1
|
line_form.quantity = 1
|
||||||
cls.invoice = move_form.save()
|
cls.invoice = move_form.save()
|
||||||
|
|
||||||
move_form = Form(
|
move_form = Form(
|
||||||
cls.env["account.move"].with_context(
|
cls.env["account.move"].with_context(
|
||||||
default_type="in_invoice", check_move_validity=False
|
default_move_type="in_invoice", check_move_validity=False
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
move_form.partner_id = cls.partner
|
move_form.partner_id = cls.partner
|
||||||
move_form.journal_id = cls.journal
|
|
||||||
with move_form.invoice_line_ids.new() as line_form:
|
with move_form.invoice_line_ids.new() as line_form:
|
||||||
line_form.name = "test 2"
|
line_form.name = "test 2"
|
||||||
line_form.product_id = cls.product
|
line_form.product_id = cls.product
|
||||||
@ -88,30 +55,85 @@ class TestAssetManagement(SavepointCase):
|
|||||||
line_form.price_unit = 20000.00
|
line_form.price_unit = 20000.00
|
||||||
line_form.quantity = 1
|
line_form.quantity = 1
|
||||||
cls.invoice_2 = move_form.save()
|
cls.invoice_2 = move_form.save()
|
||||||
|
# Asset Profile 1
|
||||||
|
cls.ict3Y = cls.asset_profile_model.create(
|
||||||
|
{
|
||||||
|
"account_expense_depreciation_id": cls.company_data[
|
||||||
|
"default_account_expense"
|
||||||
|
].id,
|
||||||
|
"account_asset_id": cls.company_data["default_account_assets"].id,
|
||||||
|
"account_depreciation_id": cls.company_data[
|
||||||
|
"default_account_assets"
|
||||||
|
].id,
|
||||||
|
"journal_id": cls.company_data["default_journal_purchase"].id,
|
||||||
|
"name": "Hardware - 3 Years",
|
||||||
|
"method_time": "year",
|
||||||
|
"method_number": 3,
|
||||||
|
"method_period": "year",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Asset Profile 2
|
||||||
|
cls.car5y = cls.asset_profile_model.create(
|
||||||
|
{
|
||||||
|
"account_expense_depreciation_id": cls.company_data[
|
||||||
|
"default_account_expense"
|
||||||
|
].id,
|
||||||
|
"account_asset_id": cls.company_data["default_account_assets"].id,
|
||||||
|
"account_depreciation_id": cls.company_data[
|
||||||
|
"default_account_assets"
|
||||||
|
].id,
|
||||||
|
"journal_id": cls.company_data["default_journal_purchase"].id,
|
||||||
|
"name": "Cars - 5 Years",
|
||||||
|
"method_time": "year",
|
||||||
|
"method_number": 5,
|
||||||
|
"method_period": "year",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
def test_01_nonprorata_basic(self):
|
def test_01_nonprorata_basic(self):
|
||||||
"""Basic tests of depreciation board computations and postings."""
|
"""Basic tests of depreciation board computations and postings."""
|
||||||
#
|
# First create demo assets and do some sanity checks
|
||||||
# first load demo assets and do some sanity checks
|
# Asset Model 1
|
||||||
#
|
ict0 = self.asset_model.create(
|
||||||
ict0 = self.browse_ref("account_asset_management." "account_asset_asset_ict0")
|
{
|
||||||
|
"state": "draft",
|
||||||
|
"method_time": "year",
|
||||||
|
"method_number": 3,
|
||||||
|
"method_period": "year",
|
||||||
|
"name": "Laptop",
|
||||||
|
"code": "PI00101",
|
||||||
|
"purchase_value": 1500.0,
|
||||||
|
"profile_id": self.ict3Y.id,
|
||||||
|
"date_start": time.strftime("%Y-01-01"),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Sanity checks
|
||||||
self.assertEqual(ict0.state, "draft")
|
self.assertEqual(ict0.state, "draft")
|
||||||
self.assertEqual(ict0.purchase_value, 1500)
|
self.assertEqual(ict0.purchase_value, 1500)
|
||||||
self.assertEqual(ict0.salvage_value, 0)
|
self.assertEqual(ict0.salvage_value, 0)
|
||||||
self.assertEqual(ict0.depreciation_base, 1500)
|
self.assertEqual(ict0.depreciation_base, 1500)
|
||||||
self.assertEqual(len(ict0.depreciation_line_ids), 1)
|
self.assertEqual(len(ict0.depreciation_line_ids), 1)
|
||||||
vehicle0 = self.browse_ref(
|
# Asset Model 2
|
||||||
"account_asset_management." "account_asset_asset_vehicle0"
|
vehicle0 = self.asset_model.create(
|
||||||
|
{
|
||||||
|
"state": "draft",
|
||||||
|
"method_time": "year",
|
||||||
|
"method_number": 5,
|
||||||
|
"method_period": "year",
|
||||||
|
"name": "CEO's Car",
|
||||||
|
"purchase_value": 12000.0,
|
||||||
|
"salvage_value": 2000.0,
|
||||||
|
"profile_id": self.car5y.id,
|
||||||
|
"date_start": time.strftime("%Y-01-01"),
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
# Sanity checks
|
||||||
self.assertEqual(vehicle0.state, "draft")
|
self.assertEqual(vehicle0.state, "draft")
|
||||||
self.assertEqual(vehicle0.purchase_value, 12000)
|
self.assertEqual(vehicle0.purchase_value, 12000)
|
||||||
self.assertEqual(vehicle0.salvage_value, 2000)
|
self.assertEqual(vehicle0.salvage_value, 2000)
|
||||||
self.assertEqual(vehicle0.depreciation_base, 10000)
|
self.assertEqual(vehicle0.depreciation_base, 10000)
|
||||||
self.assertEqual(len(vehicle0.depreciation_line_ids), 1)
|
self.assertEqual(len(vehicle0.depreciation_line_ids), 1)
|
||||||
|
# Compute the depreciation boards
|
||||||
#
|
|
||||||
# I compute the depreciation boards
|
|
||||||
#
|
|
||||||
ict0.compute_depreciation_board()
|
ict0.compute_depreciation_board()
|
||||||
ict0.refresh()
|
ict0.refresh()
|
||||||
self.assertEqual(len(ict0.depreciation_line_ids), 4)
|
self.assertEqual(len(ict0.depreciation_line_ids), 4)
|
||||||
@ -120,10 +142,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
vehicle0.refresh()
|
vehicle0.refresh()
|
||||||
self.assertEqual(len(vehicle0.depreciation_line_ids), 6)
|
self.assertEqual(len(vehicle0.depreciation_line_ids), 6)
|
||||||
self.assertEqual(vehicle0.depreciation_line_ids[1].amount, 2000)
|
self.assertEqual(vehicle0.depreciation_line_ids[1].amount, 2000)
|
||||||
|
# Post the first depreciation line
|
||||||
#
|
|
||||||
# I post the first depreciation line
|
|
||||||
#
|
|
||||||
ict0.validate()
|
ict0.validate()
|
||||||
ict0.depreciation_line_ids[1].create_move()
|
ict0.depreciation_line_ids[1].create_move()
|
||||||
ict0.refresh()
|
ict0.refresh()
|
||||||
@ -142,9 +161,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset",
|
"name": "test asset",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 3333,
|
"purchase_value": 3333,
|
||||||
"salvage_value": 0,
|
"salvage_value": 0,
|
||||||
"date_start": time.strftime("%Y-07-07"),
|
"date_start": time.strftime("%Y-07-07"),
|
||||||
@ -180,13 +197,11 @@ class TestAssetManagement(SavepointCase):
|
|||||||
|
|
||||||
def test_03_proprata_init_prev_year(self):
|
def test_03_proprata_init_prev_year(self):
|
||||||
"""Prorata temporis depreciation with init value in prev year."""
|
"""Prorata temporis depreciation with init value in prev year."""
|
||||||
# I create an asset in current year
|
# Create an asset in current year
|
||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset",
|
"name": "test asset",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 3333,
|
"purchase_value": 3333,
|
||||||
"salvage_value": 0,
|
"salvage_value": 0,
|
||||||
"date_start": "%d-07-07" % (datetime.now().year - 1,),
|
"date_start": "%d-07-07" % (datetime.now().year - 1,),
|
||||||
@ -196,7 +211,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
"prorata": True,
|
"prorata": True,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# I create a initial depreciation line in previous year
|
# Create a initial depreciation line in previous year
|
||||||
self.dl_model.create(
|
self.dl_model.create(
|
||||||
{
|
{
|
||||||
"asset_id": asset.id,
|
"asset_id": asset.id,
|
||||||
@ -209,9 +224,9 @@ class TestAssetManagement(SavepointCase):
|
|||||||
self.assertEqual(len(asset.depreciation_line_ids), 2)
|
self.assertEqual(len(asset.depreciation_line_ids), 2)
|
||||||
asset.compute_depreciation_board()
|
asset.compute_depreciation_board()
|
||||||
asset.refresh()
|
asset.refresh()
|
||||||
# I check the depreciated value is the initial value
|
# check the depreciated value is the initial value
|
||||||
self.assertAlmostEqual(asset.value_depreciated, 325.08, places=2)
|
self.assertAlmostEqual(asset.value_depreciated, 325.08, places=2)
|
||||||
# I check computed values in the depreciation board
|
# check computed values in the depreciation board
|
||||||
self.assertAlmostEqual(asset.depreciation_line_ids[3].amount, 55.55, places=2)
|
self.assertAlmostEqual(asset.depreciation_line_ids[3].amount, 55.55, places=2)
|
||||||
if calendar.isleap(date.today().year - 1):
|
if calendar.isleap(date.today().year - 1):
|
||||||
# for leap years the first year depreciation amount of 325.08
|
# for leap years the first year depreciation amount of 325.08
|
||||||
@ -239,9 +254,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset",
|
"name": "test asset",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 3333,
|
"purchase_value": 3333,
|
||||||
"salvage_value": 0,
|
"salvage_value": 0,
|
||||||
"date_start": time.strftime("%Y-07-07"),
|
"date_start": time.strftime("%Y-07-07"),
|
||||||
@ -263,9 +276,9 @@ class TestAssetManagement(SavepointCase):
|
|||||||
self.assertEqual(len(asset.depreciation_line_ids), 2)
|
self.assertEqual(len(asset.depreciation_line_ids), 2)
|
||||||
asset.compute_depreciation_board()
|
asset.compute_depreciation_board()
|
||||||
asset.refresh()
|
asset.refresh()
|
||||||
# I check the depreciated value is the initial value
|
# check the depreciated value is the initial value
|
||||||
self.assertAlmostEqual(asset.value_depreciated, 279.44, places=2)
|
self.assertAlmostEqual(asset.value_depreciated, 279.44, places=2)
|
||||||
# I check computed values in the depreciation board
|
# check computed values in the depreciation board
|
||||||
if calendar.isleap(date.today().year):
|
if calendar.isleap(date.today().year):
|
||||||
self.assertAlmostEqual(
|
self.assertAlmostEqual(
|
||||||
asset.depreciation_line_ids[2].amount, 44.75, places=2
|
asset.depreciation_line_ids[2].amount, 44.75, places=2
|
||||||
@ -286,14 +299,11 @@ class TestAssetManagement(SavepointCase):
|
|||||||
|
|
||||||
def test_05_degressive_linear(self):
|
def test_05_degressive_linear(self):
|
||||||
"""Degressive-Linear with annual and quarterly depreciation."""
|
"""Degressive-Linear with annual and quarterly depreciation."""
|
||||||
|
|
||||||
# annual depreciation
|
# annual depreciation
|
||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset",
|
"name": "test asset",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 1000,
|
"purchase_value": 1000,
|
||||||
"salvage_value": 0,
|
"salvage_value": 0,
|
||||||
"date_start": time.strftime("%Y-07-07"),
|
"date_start": time.strftime("%Y-07-07"),
|
||||||
@ -307,21 +317,17 @@ class TestAssetManagement(SavepointCase):
|
|||||||
)
|
)
|
||||||
asset.compute_depreciation_board()
|
asset.compute_depreciation_board()
|
||||||
asset.refresh()
|
asset.refresh()
|
||||||
|
|
||||||
# check values in the depreciation board
|
# check values in the depreciation board
|
||||||
self.assertEqual(len(asset.depreciation_line_ids), 5)
|
self.assertEqual(len(asset.depreciation_line_ids), 5)
|
||||||
self.assertAlmostEqual(asset.depreciation_line_ids[1].amount, 400.00, places=2)
|
self.assertAlmostEqual(asset.depreciation_line_ids[1].amount, 400.00, places=2)
|
||||||
self.assertAlmostEqual(asset.depreciation_line_ids[2].amount, 240.00, places=2)
|
self.assertAlmostEqual(asset.depreciation_line_ids[2].amount, 240.00, places=2)
|
||||||
self.assertAlmostEqual(asset.depreciation_line_ids[3].amount, 200.00, places=2)
|
self.assertAlmostEqual(asset.depreciation_line_ids[3].amount, 200.00, places=2)
|
||||||
self.assertAlmostEqual(asset.depreciation_line_ids[4].amount, 160.00, places=2)
|
self.assertAlmostEqual(asset.depreciation_line_ids[4].amount, 160.00, places=2)
|
||||||
|
|
||||||
# quarterly depreciation
|
# quarterly depreciation
|
||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset",
|
"name": "test asset",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 1000,
|
"purchase_value": 1000,
|
||||||
"salvage_value": 0,
|
"salvage_value": 0,
|
||||||
"date_start": time.strftime("%Y-07-07"),
|
"date_start": time.strftime("%Y-07-07"),
|
||||||
@ -335,7 +341,6 @@ class TestAssetManagement(SavepointCase):
|
|||||||
)
|
)
|
||||||
asset.compute_depreciation_board()
|
asset.compute_depreciation_board()
|
||||||
asset.refresh()
|
asset.refresh()
|
||||||
|
|
||||||
# check values in the depreciation board
|
# check values in the depreciation board
|
||||||
self.assertEqual(len(asset.depreciation_line_ids), 15)
|
self.assertEqual(len(asset.depreciation_line_ids), 15)
|
||||||
# lines prior to asset start period are grouped in the first entry
|
# lines prior to asset start period are grouped in the first entry
|
||||||
@ -349,9 +354,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset",
|
"name": "test asset",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 1000,
|
"purchase_value": 1000,
|
||||||
"salvage_value": 100,
|
"salvage_value": 100,
|
||||||
"date_start": time.strftime("%Y-07-07"),
|
"date_start": time.strftime("%Y-07-07"),
|
||||||
@ -365,7 +368,6 @@ class TestAssetManagement(SavepointCase):
|
|||||||
)
|
)
|
||||||
asset.compute_depreciation_board()
|
asset.compute_depreciation_board()
|
||||||
asset.refresh()
|
asset.refresh()
|
||||||
|
|
||||||
# check values in the depreciation board
|
# check values in the depreciation board
|
||||||
self.assertEqual(len(asset.depreciation_line_ids), 6)
|
self.assertEqual(len(asset.depreciation_line_ids), 6)
|
||||||
self.assertAlmostEqual(asset.depreciation_line_ids[1].amount, 400.00, places=2)
|
self.assertAlmostEqual(asset.depreciation_line_ids[1].amount, 400.00, places=2)
|
||||||
@ -379,9 +381,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset",
|
"name": "test asset",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 1000,
|
"purchase_value": 1000,
|
||||||
"salvage_value": 100,
|
"salvage_value": 100,
|
||||||
"date_start": time.strftime("%Y-07-07"),
|
"date_start": time.strftime("%Y-07-07"),
|
||||||
@ -394,7 +394,6 @@ class TestAssetManagement(SavepointCase):
|
|||||||
)
|
)
|
||||||
asset.compute_depreciation_board()
|
asset.compute_depreciation_board()
|
||||||
asset.refresh()
|
asset.refresh()
|
||||||
|
|
||||||
# check values in the depreciation board
|
# check values in the depreciation board
|
||||||
self.assertEqual(len(asset.depreciation_line_ids), 6)
|
self.assertEqual(len(asset.depreciation_line_ids), 6)
|
||||||
self.assertAlmostEqual(asset.depreciation_line_ids[1].amount, 200.00, places=2)
|
self.assertAlmostEqual(asset.depreciation_line_ids[1].amount, 200.00, places=2)
|
||||||
@ -405,9 +404,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset removal",
|
"name": "test asset removal",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 5000,
|
"purchase_value": 5000,
|
||||||
"salvage_value": 0,
|
"salvage_value": 0,
|
||||||
"date_start": "2019-01-01",
|
"date_start": "2019-01-01",
|
||||||
@ -425,8 +422,10 @@ class TestAssetManagement(SavepointCase):
|
|||||||
"date_remove": "2019-01-31",
|
"date_remove": "2019-01-31",
|
||||||
"sale_value": 0.0,
|
"sale_value": 0.0,
|
||||||
"posting_regime": "gain_loss_on_sale",
|
"posting_regime": "gain_loss_on_sale",
|
||||||
"account_plus_value_id": self.ref("account.a_sale"),
|
"account_plus_value_id": self.company_data[
|
||||||
"account_min_value_id": self.ref("account.a_expense"),
|
"default_account_revenue"
|
||||||
|
].id,
|
||||||
|
"account_min_value_id": self.company_data["default_account_expense"].id,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
wiz.remove()
|
wiz.remove()
|
||||||
@ -438,9 +437,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
def test_09_asset_from_invoice(self):
|
def test_09_asset_from_invoice(self):
|
||||||
all_asset = self.env["account.asset"].search([])
|
all_asset = self.env["account.asset"].search([])
|
||||||
invoice = self.invoice
|
invoice = self.invoice
|
||||||
asset_profile = self.env.ref(
|
asset_profile = self.car5y
|
||||||
"account_asset_management.account_asset_profile_car_5Y"
|
|
||||||
)
|
|
||||||
asset_profile.asset_product_item = False
|
asset_profile.asset_product_item = False
|
||||||
self.assertTrue(len(invoice.invoice_line_ids) > 0)
|
self.assertTrue(len(invoice.invoice_line_ids) > 0)
|
||||||
line = invoice.invoice_line_ids[0]
|
line = invoice.invoice_line_ids[0]
|
||||||
@ -450,14 +447,14 @@ class TestAssetManagement(SavepointCase):
|
|||||||
line_form.quantity = 2
|
line_form.quantity = 2
|
||||||
line_form.asset_profile_id = asset_profile
|
line_form.asset_profile_id = asset_profile
|
||||||
invoice = move_form.save()
|
invoice = move_form.save()
|
||||||
invoice.post()
|
invoice.action_post()
|
||||||
# I get all asset after invoice validation
|
# get all asset after invoice validation
|
||||||
current_asset = self.env["account.asset"].search([])
|
current_asset = self.env["account.asset"].search([])
|
||||||
# I get the new asset
|
# get the new asset
|
||||||
new_asset = current_asset - all_asset
|
new_asset = current_asset - all_asset
|
||||||
# I check that a new asset is created
|
# check that a new asset is created
|
||||||
self.assertEqual(len(new_asset), 1)
|
self.assertEqual(len(new_asset), 1)
|
||||||
# I check that the new asset has the correct purchase value
|
# check that the new asset has the correct purchase value
|
||||||
self.assertAlmostEqual(
|
self.assertAlmostEqual(
|
||||||
new_asset.purchase_value, line.price_unit * line.quantity, places=2
|
new_asset.purchase_value, line.price_unit * line.quantity, places=2
|
||||||
)
|
)
|
||||||
@ -465,9 +462,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
def test_10_asset_from_invoice_product_item(self):
|
def test_10_asset_from_invoice_product_item(self):
|
||||||
all_asset = self.env["account.asset"].search([])
|
all_asset = self.env["account.asset"].search([])
|
||||||
invoice = self.invoice
|
invoice = self.invoice
|
||||||
asset_profile = self.env.ref(
|
asset_profile = self.car5y
|
||||||
"account_asset_management.account_asset_profile_car_5Y"
|
|
||||||
)
|
|
||||||
asset_profile.asset_product_item = True
|
asset_profile.asset_product_item = True
|
||||||
self.assertTrue(len(invoice.invoice_line_ids) > 0)
|
self.assertTrue(len(invoice.invoice_line_ids) > 0)
|
||||||
line = invoice.invoice_line_ids[0]
|
line = invoice.invoice_line_ids[0]
|
||||||
@ -475,40 +470,36 @@ class TestAssetManagement(SavepointCase):
|
|||||||
line.quantity = 2
|
line.quantity = 2
|
||||||
line.asset_profile_id = asset_profile
|
line.asset_profile_id = asset_profile
|
||||||
self.assertEqual(len(invoice.invoice_line_ids), 2)
|
self.assertEqual(len(invoice.invoice_line_ids), 2)
|
||||||
invoice.post()
|
invoice.action_post()
|
||||||
# I get all asset after invoice validation
|
# get all asset after invoice validation
|
||||||
current_asset = self.env["account.asset"].search([])
|
current_asset = self.env["account.asset"].search([])
|
||||||
# I get the new asset
|
# get the new asset
|
||||||
new_asset = current_asset - all_asset
|
new_asset = current_asset - all_asset
|
||||||
# I check that a new asset is created
|
# check that a new asset is created
|
||||||
self.assertEqual(len(new_asset), 2)
|
self.assertEqual(len(new_asset), 2)
|
||||||
for asset in new_asset:
|
for asset in new_asset:
|
||||||
# I check that the new asset has the correct purchase value
|
# check that the new asset has the correct purchase value
|
||||||
self.assertAlmostEqual(asset.purchase_value, line.price_unit, places=2)
|
self.assertAlmostEqual(asset.purchase_value, line.price_unit, places=2)
|
||||||
|
|
||||||
def test_11_assets_from_invoice(self):
|
def test_11_assets_from_invoice(self):
|
||||||
all_assets = self.env["account.asset"].search([])
|
all_assets = self.env["account.asset"].search([])
|
||||||
ctx = dict(self.invoice_2._context)
|
ctx = dict(self.invoice_2._context)
|
||||||
del ctx["default_type"]
|
del ctx["default_move_type"]
|
||||||
invoice = self.invoice_2.with_context(ctx)
|
invoice = self.invoice_2.with_context(ctx)
|
||||||
asset_profile = self.env.ref(
|
asset_profile = self.car5y
|
||||||
"account_asset_management.account_asset_profile_car_5Y"
|
|
||||||
)
|
|
||||||
asset_profile.asset_product_item = True
|
asset_profile.asset_product_item = True
|
||||||
# Compute depreciation lines on invoice validation
|
# Compute depreciation lines on invoice validation
|
||||||
asset_profile.open_asset = True
|
asset_profile.open_asset = True
|
||||||
|
|
||||||
self.assertTrue(len(invoice.invoice_line_ids) == 2)
|
self.assertTrue(len(invoice.invoice_line_ids) == 2)
|
||||||
invoice.invoice_line_ids.write(
|
invoice.invoice_line_ids.write(
|
||||||
{"quantity": 1, "asset_profile_id": asset_profile.id}
|
{"quantity": 1, "asset_profile_id": asset_profile.id}
|
||||||
)
|
)
|
||||||
invoice.post()
|
invoice.action_post()
|
||||||
# Retrieve all assets after invoice validation
|
# Retrieve all assets after invoice validation
|
||||||
current_assets = self.env["account.asset"].search([])
|
current_assets = self.env["account.asset"].search([])
|
||||||
# What are the new assets?
|
# What are the new assets?
|
||||||
new_assets = current_assets - all_assets
|
new_assets = current_assets - all_assets
|
||||||
self.assertEqual(len(new_assets), 2)
|
self.assertEqual(len(new_assets), 2)
|
||||||
|
|
||||||
for asset in new_assets:
|
for asset in new_assets:
|
||||||
dlines = asset.depreciation_line_ids.filtered(
|
dlines = asset.depreciation_line_ids.filtered(
|
||||||
lambda l: l.type == "depreciate"
|
lambda l: l.type == "depreciate"
|
||||||
@ -522,9 +513,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset",
|
"name": "test asset",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 3333,
|
"purchase_value": 3333,
|
||||||
"salvage_value": 0,
|
"salvage_value": 0,
|
||||||
"date_start": "2019-07-07",
|
"date_start": "2019-07-07",
|
||||||
@ -556,9 +545,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset",
|
"name": "test asset",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 10000,
|
"purchase_value": 10000,
|
||||||
"salvage_value": 0,
|
"salvage_value": 0,
|
||||||
"date_start": time.strftime("2019-01-01"),
|
"date_start": time.strftime("2019-01-01"),
|
||||||
@ -587,9 +574,7 @@ class TestAssetManagement(SavepointCase):
|
|||||||
asset = self.asset_model.create(
|
asset = self.asset_model.create(
|
||||||
{
|
{
|
||||||
"name": "test asset",
|
"name": "test asset",
|
||||||
"profile_id": self.ref(
|
"profile_id": self.car5y.id,
|
||||||
"account_asset_management." "account_asset_profile_car_5Y"
|
|
||||||
),
|
|
||||||
"purchase_value": 10000,
|
"purchase_value": 10000,
|
||||||
"salvage_value": 0,
|
"salvage_value": 0,
|
||||||
"date_start": time.strftime("2019-01-01"),
|
"date_start": time.strftime("2019-01-01"),
|
||||||
|
@ -374,12 +374,13 @@
|
|||||||
<field name="view_id" ref="account_asset_view_tree" />
|
<field name="view_id" ref="account_asset_view_tree" />
|
||||||
<field name="search_view_id" ref="account_asset_view_search" />
|
<field name="search_view_id" ref="account_asset_view_search" />
|
||||||
</record>
|
</record>
|
||||||
<act_window
|
<record id="act_entries_open" model="ir.actions.act_window">
|
||||||
id="act_entries_open"
|
<field name="name">Journal Items</field>
|
||||||
name="Journal Items"
|
<field name="binding_model_id" ref="model_account_asset" />
|
||||||
binding_model="account.asset"
|
<field name="binding_view_types">form</field>
|
||||||
binding_views="form"
|
<field name="res_model">account.move.line</field>
|
||||||
res_model="account.move.line"
|
<field
|
||||||
domain="['|',('asset_id','in',context.get('active_ids')),('asset_id','=','active_id')]"
|
name="domain"
|
||||||
/>
|
>['|',('asset_id','in',context.get('active_ids')),('asset_id','=','active_id')]</field>
|
||||||
|
</record>
|
||||||
</odoo>
|
</odoo>
|
||||||
|
@ -11,11 +11,11 @@
|
|||||||
>
|
>
|
||||||
<field
|
<field
|
||||||
name="asset_profile_id"
|
name="asset_profile_id"
|
||||||
attrs="{'invisible': [('parent.type', 'not in', ('in_invoice', 'in_refund'))]}"
|
attrs="{'invisible': [('parent.move_type', 'not in', ('in_invoice', 'in_refund'))]}"
|
||||||
/>
|
/>
|
||||||
<field
|
<field
|
||||||
name="asset_id"
|
name="asset_id"
|
||||||
attrs="{'invisible': [('parent.type', 'not in', ('out_invoice', 'out_refund'))]}"
|
attrs="{'invisible': [('parent.move_type', 'not in', ('out_invoice', 'out_refund'))]}"
|
||||||
groups="account.group_account_manager"
|
groups="account.group_account_manager"
|
||||||
/>
|
/>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
# Copyright 2009-2018 Noviat
|
# Copyright 2009-2018 Noviat
|
||||||
|
# Copyright 2021 Tecnativa - João Marques
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
@ -83,7 +84,7 @@ class AccountAssetRemove(models.TransientModel):
|
|||||||
inv_lines = self.env["account.move.line"].search(
|
inv_lines = self.env["account.move.line"].search(
|
||||||
[
|
[
|
||||||
("asset_id", "=", asset_id),
|
("asset_id", "=", asset_id),
|
||||||
("move_id.type", "in", ("out_invoice", "out_refund")),
|
("move_id.move_type", "in", ("out_invoice", "out_refund")),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
for line in inv_lines:
|
for line in inv_lines:
|
||||||
|
Loading…
Reference in New Issue
Block a user