From 3d9a478729e2dd020591df31dfe87d4d8d919a26 Mon Sep 17 00:00:00 2001 From: Kitti U Date: Mon, 17 Jan 2022 15:14:41 +0700 Subject: [PATCH 01/19] [14.0][ADD] account_asset_transfer, AUC -> Asset --- account_asset_transfer/__init__.py | 4 + account_asset_transfer/__manifest__.py | 19 ++ account_asset_transfer/models/__init__.py | 3 + .../models/account_asset.py | 61 +++++ .../models/account_asset_profile.py | 15 ++ account_asset_transfer/readme/CONFIGURE.rst | 1 + .../readme/CONTRIBUTORS.rst | 3 + account_asset_transfer/readme/DESCRIPTION.rst | 5 + account_asset_transfer/readme/USAGE.rst | 8 + .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes account_asset_transfer/tests/__init__.py | 1 + .../tests/test_account_asset_transfer.py | 112 +++++++++ .../views/account_asset.xml | 45 ++++ .../views/account_asset_profile.xml | 16 ++ account_asset_transfer/wizard/__init__.py | 1 + .../wizard/account_asset_transfer.py | 216 ++++++++++++++++++ .../wizard/account_asset_transfer.xml | 88 +++++++ 18 files changed, 601 insertions(+) create mode 100644 account_asset_transfer/__init__.py create mode 100644 account_asset_transfer/__manifest__.py create mode 100644 account_asset_transfer/models/__init__.py create mode 100644 account_asset_transfer/models/account_asset.py create mode 100644 account_asset_transfer/models/account_asset_profile.py create mode 100644 account_asset_transfer/readme/CONFIGURE.rst create mode 100644 account_asset_transfer/readme/CONTRIBUTORS.rst create mode 100644 account_asset_transfer/readme/DESCRIPTION.rst create mode 100644 account_asset_transfer/readme/USAGE.rst create mode 100644 account_asset_transfer/security/ir.model.access.csv create mode 100644 account_asset_transfer/static/description/icon.png create mode 100644 account_asset_transfer/tests/__init__.py create mode 100644 account_asset_transfer/tests/test_account_asset_transfer.py create mode 100644 account_asset_transfer/views/account_asset.xml create mode 100644 account_asset_transfer/views/account_asset_profile.xml create mode 100644 account_asset_transfer/wizard/__init__.py create mode 100644 account_asset_transfer/wizard/account_asset_transfer.py create mode 100644 account_asset_transfer/wizard/account_asset_transfer.xml diff --git a/account_asset_transfer/__init__.py b/account_asset_transfer/__init__.py new file mode 100644 index 000000000..4d7a49b5e --- /dev/null +++ b/account_asset_transfer/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models +from . import wizard diff --git a/account_asset_transfer/__manifest__.py b/account_asset_transfer/__manifest__.py new file mode 100644 index 000000000..c97baa049 --- /dev/null +++ b/account_asset_transfer/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Asset Transfer from AUC to Asset", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "depends": ["account_asset_management"], + "author": "Ecosoft, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/account-financial-tools", + "category": "Accounting & Finance", + "data": [ + "security/ir.model.access.csv", + "views/account_asset.xml", + "views/account_asset_profile.xml", + "wizard/account_asset_transfer.xml", + ], + "maintainers": ["kittiu"], +} diff --git a/account_asset_transfer/models/__init__.py b/account_asset_transfer/models/__init__.py new file mode 100644 index 000000000..b5f1e68b9 --- /dev/null +++ b/account_asset_transfer/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from . import account_asset +from . import account_asset_profile diff --git a/account_asset_transfer/models/account_asset.py b/account_asset_transfer/models/account_asset.py new file mode 100644 index 000000000..3a0667196 --- /dev/null +++ b/account_asset_transfer/models/account_asset.py @@ -0,0 +1,61 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models +from odoo.exceptions import ValidationError + + +class AccountAsset(models.Model): + _inherit = "account.asset" + + can_transfer = fields.Boolean( + compute="_compute_can_transfer", + search="_search_can_transfer", + help="Allow transfer AUC (running) to Asset", + ) + + def _compute_can_transfer(self): + for asset in self: + asset.can_transfer = ( + not asset.method_number + and asset.value_residual + and asset.state == "open" + and asset.account_move_line_ids + ) + + def _search_can_transfer(self, operator, value): + if operator == "=": + return [ + ("method_number", "=", 0), + ("value_residual", ">", 0), + ("state", "=", "open"), + ("account_move_line_ids", "!=", False), + ] + if operator == "!=": + return [ + "|", + "|", + "|", + ("method_number", ">", 0), + ("value_residual", "=", 0), + ("state", "!=", "open"), + ("account_move_line_ids", "=", False), + ] + + def _check_can_transfer(self): + if not all(self.mapped("can_transfer")): + raise ValidationError( + _("Only running assets without depreciation (AUC) can transfer") + ) + + def transfer(self): + ctx = dict(self.env.context, active_ids=self.ids) + self._check_can_transfer() + return { + "name": _("Transfer AUC to Asset & Create Transfer Journal Entry"), + "view_mode": "form", + "res_model": "account.asset.transfer", + "target": "new", + "type": "ir.actions.act_window", + "context": ctx, + } diff --git a/account_asset_transfer/models/account_asset_profile.py b/account_asset_transfer/models/account_asset_profile.py new file mode 100644 index 000000000..831f32034 --- /dev/null +++ b/account_asset_transfer/models/account_asset_profile.py @@ -0,0 +1,15 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountAssetProfile(models.Model): + _inherit = "account.asset.profile" + + transfer_journal_id = fields.Many2one( + comodel_name="account.journal", + domain="[('type', '=', 'general'), ('company_id', '=', company_id)]", + string="Transfer Journal", + check_company=True, + ) diff --git a/account_asset_transfer/readme/CONFIGURE.rst b/account_asset_transfer/readme/CONFIGURE.rst new file mode 100644 index 000000000..7a1b303b0 --- /dev/null +++ b/account_asset_transfer/readme/CONFIGURE.rst @@ -0,0 +1 @@ +On asset profile, user can setup default Transfer Journal, to be used during transfer. diff --git a/account_asset_transfer/readme/CONTRIBUTORS.rst b/account_asset_transfer/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..25763ec76 --- /dev/null +++ b/account_asset_transfer/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Ecosoft `__: + + * Kitti U. diff --git a/account_asset_transfer/readme/DESCRIPTION.rst b/account_asset_transfer/readme/DESCRIPTION.rst new file mode 100644 index 000000000..02c311f15 --- /dev/null +++ b/account_asset_transfer/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +This module allow transferring assets under construction (AUC) to normal assets. + +AUC is Asset under construction where some assets are in construction phase and +cost needs to be captured for the time being. Once asset is fully completed then +cost would be transferred to final asset diff --git a/account_asset_transfer/readme/USAGE.rst b/account_asset_transfer/readme/USAGE.rst new file mode 100644 index 000000000..3954a025a --- /dev/null +++ b/account_asset_transfer/readme/USAGE.rst @@ -0,0 +1,8 @@ +Given asset under construction has been created, i.e., by vendor bill. + +- Go to asset menu +- Filter "Transferrable" assets and look for desired assets to transfer +- Select assets to transfer, and click actoin "Transfer Asset" +- On asset transfer wizard, on the "To New Asset" tab, choose new profile(s) +- Click "Transfer" button +- Odoo will create journal entry as well as new asset(s) diff --git a/account_asset_transfer/security/ir.model.access.csv b/account_asset_transfer/security/ir.model.access.csv new file mode 100644 index 000000000..5558b0da0 --- /dev/null +++ b/account_asset_transfer/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_asset_transfer_user,account.asset.transfer,model_account_asset_transfer,account.group_account_user,1,1,1,1 +access_account_asset_transfer_line_user,account.asset.transfer.line,model_account_asset_transfer_line,account.group_account_user,1,1,1,1 diff --git a/account_asset_transfer/static/description/icon.png b/account_asset_transfer/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/account_asset_transfer/tests/__init__.py b/account_asset_transfer/tests/__init__.py new file mode 100644 index 000000000..29f2356fd --- /dev/null +++ b/account_asset_transfer/tests/__init__.py @@ -0,0 +1 @@ +from . import test_account_asset_transfer diff --git a/account_asset_transfer/tests/test_account_asset_transfer.py b/account_asset_transfer/tests/test_account_asset_transfer.py new file mode 100644 index 000000000..0f6bc2b14 --- /dev/null +++ b/account_asset_transfer/tests/test_account_asset_transfer.py @@ -0,0 +1,112 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import fields +from odoo.exceptions import UserError +from odoo.tests.common import Form + +from odoo.addons.account_asset_management.tests.test_account_asset_management import ( + TestAssetManagement, +) + + +class TestAccountAssetTransfer(TestAssetManagement): + @classmethod + def setUpClass(cls): + super().setUpClass() + # Profile Under Construction + cls.profile_uac = 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, + "transfer_journal_id": cls.company_data["default_journal_misc"].id, + "name": "Asset Under Construction", + "method_time": "year", + "method_number": 0, + "method_period": "year", + } + ) + + # Profile normal asset + cls.profile_asset = 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": "Room - 5 Years", + "method_time": "year", + "method_number": 5, + "method_period": "year", + } + ) + + def test_01_asset_transfer_uac_to_asset(self): + """Create UAC and then transfer to normal asset class, + I expect a new journal entry will be created""" + # Create 3 UAC assets from an invoice + move_form = Form( + self.env["account.move"].with_context( + default_move_type="in_invoice", check_move_validity=False + ) + ) + move_form.invoice_date = fields.Date.context_today(self.env.user) + move_form.partner_id = self.partner + with move_form.invoice_line_ids.new() as line_form: + line_form.name = "Wall" + line_form.price_unit = 2000.00 + line_form.asset_profile_id = self.profile_uac + with move_form.invoice_line_ids.new() as line_form: + line_form.name = "Roof" + line_form.price_unit = 10000.00 + line_form.asset_profile_id = self.profile_uac + with move_form.invoice_line_ids.new() as line_form: + line_form.name = "Floor" + line_form.price_unit = 10000.00 + line_form.asset_profile_id = self.profile_uac + self.invoice_uac = move_form.save() + self.invoice_uac.invoice_line_ids.write( + {"asset_profile_id": self.profile_uac.id} + ) + self.invoice_uac.action_post() + # Test can can_review status + assets = self.invoice_uac.invoice_line_ids.mapped("asset_id") + self.assertFalse(list(set(assets.mapped("can_transfer")))[0]) + assets.validate() + assets.invalidate_cache() + # can_transfer = True after validate + self.assertTrue(list(set(assets.mapped("can_transfer")))[0]) + + # Create Asset Transfer + transfer_form = Form( + self.env["account.asset.transfer"].with_context(active_ids=assets.ids) + ) + transfer_wiz = transfer_form.save() + with self.assertRaises(UserError): + transfer_wiz.transfer() + with transfer_form.to_asset_ids.new() as to_asset: + to_asset.asset_name = "Asset 1" + to_asset.asset_profile_id = self.profile_asset + to_asset.asset_value = 2000 + with transfer_form.to_asset_ids.new() as to_asset: + to_asset.asset_name = "Asset 2" + to_asset.asset_profile_id = self.profile_asset + to_asset.asset_value = 20000 + transfer_form.save() + res = transfer_wiz.transfer() + transfer_move = self.env["account.move"].browse(res["domain"][0][2]) + assets = transfer_move.invoice_line_ids.mapped("asset_id") + # 2 new assets created, and value equal to original assets + new_assets = assets.filtered(lambda l: l.state == "draft") + self.assertEqual(sum(new_assets.mapped("purchase_value")), 22000) diff --git a/account_asset_transfer/views/account_asset.xml b/account_asset_transfer/views/account_asset.xml new file mode 100644 index 000000000..2072cf37d --- /dev/null +++ b/account_asset_transfer/views/account_asset.xml @@ -0,0 +1,45 @@ + + + + account.asset.form + account.asset + + + + + + + + account.asset.search + account.asset + + + + + + + + + + diff --git a/account_asset_transfer/views/account_asset_profile.xml b/account_asset_transfer/views/account_asset_profile.xml new file mode 100644 index 000000000..beff5dc6f --- /dev/null +++ b/account_asset_transfer/views/account_asset_profile.xml @@ -0,0 +1,16 @@ + + + account.asset.profile.form + account.asset.profile + + + + + + + + + diff --git a/account_asset_transfer/wizard/__init__.py b/account_asset_transfer/wizard/__init__.py new file mode 100644 index 000000000..2bf6e4128 --- /dev/null +++ b/account_asset_transfer/wizard/__init__.py @@ -0,0 +1 @@ +from . import account_asset_transfer diff --git a/account_asset_transfer/wizard/account_asset_transfer.py b/account_asset_transfer/wizard/account_asset_transfer.py new file mode 100644 index 000000000..d70191777 --- /dev/null +++ b/account_asset_transfer/wizard/account_asset_transfer.py @@ -0,0 +1,216 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import UserError +from odoo.tools import float_compare + + +class AccountAssetTransfer(models.TransientModel): + _name = "account.asset.transfer" + _description = "Transfer Asset" + _check_company_auto = True + + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + readonly=True, + required=True, + ) + currency_id = fields.Many2one( + comodel_name="res.currency", + related="company_id.currency_id", + ) + transfer_journal_id = fields.Many2one( + comodel_name="account.journal", + domain="[('type', '=', 'general'), ('company_id', '=', company_id)]", + string="Transfer Journal", + required=True, + check_company=True, + ) + date_transfer = fields.Date( + string="Transfer Date", + required=True, + default=fields.Date.today, + help="Transfer date must be after the asset journal entry", + ) + note = fields.Text("Notes") + from_asset_ids = fields.Many2many( + comodel_name="account.asset", + string="From Asset(s)", + readonly=True, + ) + to_asset_ids = fields.One2many( + comodel_name="account.asset.transfer.line", + inverse_name="transfer_id", + string="To Asset(s)", + ) + from_asset_value = fields.Monetary( + string="From Value", + compute="_compute_asset_value", + ) + to_asset_value = fields.Monetary( + string="To Value", + compute="_compute_asset_value", + ) + balance = fields.Monetary( + compute="_compute_asset_value", + ) + partner_id = fields.Many2one( + comodel_name="res.partner", + string="Partner", + ) + analytic_account_id = fields.Many2one( + comodel_name="account.analytic.account", + string="Analytic account", + ) + analytic_tag_ids = fields.Many2many( + comodel_name="account.analytic.tag", + string="Analytic tags", + ) + + @api.model + def default_get(self, field_list): + res = super().default_get(field_list) + from_asset_ids = self.env.context.get("active_ids") + assets = self.env["account.asset"].browse(from_asset_ids) + # Prepare default values + company = assets.mapped("company_id") + company.ensure_one() + journals = assets.mapped("profile_id.transfer_journal_id") + partners = assets.mapped("partner_id") + analytics = assets.mapped("account_analytic_id") + tags = assets[:1].analytic_tag_ids + for asset in assets: + if asset.analytic_tag_ids != tags: + # When not all tags are the same, no default + tags = self.env["account.analytic.tag"] + break + # Assign values + res["company_id"] = company.id + res["partner_id"] = partners[0].id if len(partners) == 1 else False + res["from_asset_ids"] = [(4, asset_id) for asset_id in assets.ids] + res["transfer_journal_id"] = journals[:1].id + res["analytic_account_id"] = analytics[0].id if len(analytics) == 1 else False + res["analytic_tag_ids"] = [(4, tag_id) for tag_id in tags.ids] + return res + + @api.depends("from_asset_ids", "to_asset_ids") + def _compute_asset_value(self): + for rec in self: + rec.from_asset_value = sum(rec.from_asset_ids.mapped("purchase_value")) + rec.to_asset_value = sum(rec.to_asset_ids.mapped("asset_value")) + balance = rec.from_asset_value - rec.to_asset_value + rec.balance = balance if balance > 0 else 0 + + def _check_amount_trasnfer(self): + self.ensure_one() + if float_compare(self.from_asset_value, self.to_asset_value, 2) != 0: + raise UserError(_("Total values of new assets must equal to source assets")) + if self.to_asset_ids.filtered(lambda l: l.asset_value <= 0): + raise UserError(_("Value of new asset must greater than 0.0")) + + def _get_new_move_transfer(self): + return { + "date": self.date_transfer, + "journal_id": self.transfer_journal_id.id, + "narration": self.note, + } + + def transfer(self): + self.ensure_one() + self.from_asset_ids._check_can_transfer() + self._check_amount_trasnfer() + # Create transfer journal entry + move_vals = self._get_new_move_transfer() + move = self.env["account.move"].create(move_vals) + move_lines = self._get_transfer_data() + move.with_context(allow_asset=True).write({"line_ids": move_lines}) + # Post move and create new assets + move.action_post() + # Set source assets as removed + self.from_asset_ids.write( + {"state": "removed", "date_remove": self.date_transfer} + ) + return { + "name": _("Asset Transfer Journal Entry"), + "view_mode": "tree,form", + "res_model": "account.move", + "view_id": False, + "type": "ir.actions.act_window", + "context": self.env.context, + "domain": [("id", "=", move.id)], + } + + def _get_move_line_from_asset(self, move_line): + return { + "name": move_line.name, + "account_id": move_line.account_id.id, + "analytic_account_id": move_line.analytic_account_id.id, + "analytic_tag_ids": [(4, tag.id) for tag in move_line.analytic_tag_ids], + "debit": move_line.credit, + "credit": move_line.debit, + "partner_id": move_line.partner_id.id, + "asset_id": move_line.asset_id.id, # Link to existing asset + } + + def _get_move_line_to_asset(self, to_asset): + return { + "name": to_asset.asset_name, + "account_id": to_asset.asset_profile_id.account_asset_id.id, + "analytic_account_id": to_asset.analytic_account_id.id, + "analytic_tag_ids": [(4, tag.id) for tag in to_asset.analytic_tag_ids], + "debit": to_asset.asset_value, + "credit": 0.0, + "partner_id": to_asset.partner_id.id, + "asset_profile_id": to_asset.asset_profile_id.id, # To create new asset + "price_subtotal": to_asset.asset_value, + } + + def _get_transfer_data(self): + move_lines = [] + # Create lines from assets + for asset in self.from_asset_ids: + asset.account_move_line_ids.ensure_one() + move_line = asset.account_move_line_ids[0] + move_line_vals = self._get_move_line_from_asset(move_line) + move_lines.append((0, 0, move_line_vals)) + # Create lines for new assets + move_lines += [ + (0, 0, self._get_move_line_to_asset(to_asset)) + for to_asset in self.to_asset_ids + ] + return move_lines + + +class AccountAssetTransferLine(models.TransientModel): + _name = "account.asset.transfer.line" + _description = "Transfer To Asset" + + transfer_id = fields.Many2one( + comodel_name="account.asset.transfer", + index=True, + ) + asset_profile_id = fields.Many2one( + comodel_name="account.asset.profile", + string="Asset Profile", + required=True, + ) + asset_name = fields.Char(required=True) + asset_value = fields.Float( + string="Asset Value", + required=True, + default=0.0, + ) + partner_id = fields.Many2one( + comodel_name="res.partner", + string="Partner", + ) + analytic_account_id = fields.Many2one( + comodel_name="account.analytic.account", + string="Analytic account", + ) + analytic_tag_ids = fields.Many2many( + comodel_name="account.analytic.tag", + string="Analytic tags", + ) diff --git a/account_asset_transfer/wizard/account_asset_transfer.xml b/account_asset_transfer/wizard/account_asset_transfer.xml new file mode 100644 index 000000000..c402e59d7 --- /dev/null +++ b/account_asset_transfer/wizard/account_asset_transfer.xml @@ -0,0 +1,88 @@ + + + + account.asset.transfer.form + account.asset.transfer + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + Transfer Asset + + + + list + code + +if records: + action = records.transfer() + + + +
From ba0901ee05e4657ea620ee5584c729cfdabe6755 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 17 Jan 2022 08:39:13 +0000 Subject: [PATCH 02/19] [UPD] Update account_asset_transfer.pot --- .../i18n/account_asset_transfer.pot | 251 ++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 account_asset_transfer/i18n/account_asset_transfer.pot diff --git a/account_asset_transfer/i18n/account_asset_transfer.pot b/account_asset_transfer/i18n/account_asset_transfer.pot new file mode 100644 index 000000000..d2e4dc5eb --- /dev/null +++ b/account_asset_transfer/i18n/account_asset_transfer.pot @@ -0,0 +1,251 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_asset_transfer +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_asset_transfer +#: model:ir.model.fields,help:account_asset_transfer.field_account_asset__can_transfer +msgid "Allow transfer AUC (running) to Asset" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__analytic_account_id +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__analytic_account_id +msgid "Analytic account" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__analytic_tag_ids +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__analytic_tag_ids +msgid "Analytic tags" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model,name:account_asset_transfer.model_account_asset +msgid "Asset" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__asset_name +msgid "Asset Name" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__asset_profile_id +msgid "Asset Profile" +msgstr "" + +#. module: account_asset_transfer +#: code:addons/account_asset_transfer/wizard/account_asset_transfer.py:0 +#, python-format +msgid "Asset Transfer Journal Entry" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__asset_value +msgid "Asset Value" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model,name:account_asset_transfer.model_account_asset_profile +msgid "Asset profile" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__balance +msgid "Balance" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset__can_transfer +msgid "Can Transfer" +msgstr "" + +#. module: account_asset_transfer +#: model_terms:ir.ui.view,arch_db:account_asset_transfer.account_asset_view_search +msgid "Can be transferred" +msgstr "" + +#. module: account_asset_transfer +#: model_terms:ir.ui.view,arch_db:account_asset_transfer.account_asset_transfer_view_form +msgid "Cancel" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__company_id +msgid "Company" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__create_uid +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__create_uid +msgid "Created by" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__create_date +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__create_date +msgid "Created on" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__currency_id +msgid "Currency" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset__display_name +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_profile__display_name +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__display_name +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__display_name +msgid "Display Name" +msgstr "" + +#. module: account_asset_transfer +#: model_terms:ir.ui.view,arch_db:account_asset_transfer.account_asset_transfer_view_form +msgid "From" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__from_asset_ids +msgid "From Asset(s)" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__from_asset_value +msgid "From Value" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset__id +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_profile__id +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__id +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__id +msgid "ID" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset____last_update +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_profile____last_update +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer____last_update +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__write_uid +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__write_date +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__note +#: model_terms:ir.ui.view,arch_db:account_asset_transfer.account_asset_transfer_view_form +msgid "Notes" +msgstr "" + +#. module: account_asset_transfer +#: code:addons/account_asset_transfer/models/account_asset.py:0 +#, python-format +msgid "Only running assets without depreciation (AUC) can transfer" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__partner_id +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__partner_id +msgid "Partner" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__to_asset_ids +msgid "To Asset(s)" +msgstr "" + +#. module: account_asset_transfer +#: model_terms:ir.ui.view,arch_db:account_asset_transfer.account_asset_transfer_view_form +msgid "To New Asset" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__to_asset_value +msgid "To Value" +msgstr "" + +#. module: account_asset_transfer +#: code:addons/account_asset_transfer/wizard/account_asset_transfer.py:0 +#, python-format +msgid "Total values of new assets must equal to source assets" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer_line__transfer_id +#: model_terms:ir.ui.view,arch_db:account_asset_transfer.account_asset_transfer_view_form +#: model_terms:ir.ui.view,arch_db:account_asset_transfer.account_asset_view_form +msgid "Transfer" +msgstr "" + +#. module: account_asset_transfer +#: code:addons/account_asset_transfer/models/account_asset.py:0 +#, python-format +msgid "Transfer AUC to Asset & Create Transfer Journal Entry" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.actions.server,name:account_asset_transfer.action_asset_transfer_from_list +#: model:ir.model,name:account_asset_transfer.model_account_asset_transfer +#: model_terms:ir.ui.view,arch_db:account_asset_transfer.account_asset_transfer_view_form +msgid "Transfer Asset" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__date_transfer +msgid "Transfer Date" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_profile__transfer_journal_id +#: model:ir.model.fields,field_description:account_asset_transfer.field_account_asset_transfer__transfer_journal_id +msgid "Transfer Journal" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model,name:account_asset_transfer.model_account_asset_transfer_line +msgid "Transfer To Asset" +msgstr "" + +#. module: account_asset_transfer +#: model_terms:ir.ui.view,arch_db:account_asset_transfer.account_asset_view_form +msgid "Transfer asset from AUC to Asset" +msgstr "" + +#. module: account_asset_transfer +#: model:ir.model.fields,help:account_asset_transfer.field_account_asset_transfer__date_transfer +msgid "Transfer date must be after the asset journal entry" +msgstr "" + +#. module: account_asset_transfer +#: model_terms:ir.ui.view,arch_db:account_asset_transfer.account_asset_view_search +msgid "Transferable" +msgstr "" + +#. module: account_asset_transfer +#: code:addons/account_asset_transfer/wizard/account_asset_transfer.py:0 +#, python-format +msgid "Value of new asset must greater than 0.0" +msgstr "" From d47a05466abdad68863b7a35971e6c5ec4a29024 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 17 Jan 2022 08:58:00 +0000 Subject: [PATCH 03/19] [UPD] README.rst --- account_asset_transfer/README.rst | 104 ++++ .../static/description/index.html | 445 ++++++++++++++++++ 2 files changed, 549 insertions(+) create mode 100644 account_asset_transfer/README.rst create mode 100644 account_asset_transfer/static/description/index.html diff --git a/account_asset_transfer/README.rst b/account_asset_transfer/README.rst new file mode 100644 index 000000000..da2257621 --- /dev/null +++ b/account_asset_transfer/README.rst @@ -0,0 +1,104 @@ +================================ +Asset Transfer from AUC to Asset +================================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |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/14.0/account_asset_transfer + :alt: OCA/account-financial-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-financial-tools-14-0/account-financial-tools-14-0-account_asset_transfer + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/92/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allow transferring assets under construction (AUC) to normal assets. + +AUC is Asset under construction where some assets are in construction phase and +cost needs to be captured for the time being. Once asset is fully completed then +cost would be transferred to final asset + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +On asset profile, user can setup default Transfer Journal, to be used during transfer. + +Usage +===== + +Given asset under construction has been created, i.e., by vendor bill. + +- Go to asset menu +- Filter "Transferrable" assets and look for desired assets to transfer +- Select assets to transfer, and click actoin "Transfer Asset" +- On asset transfer wizard, on the "To New Asset" tab, choose new profile(s) +- Click "Transfer" button +- Odoo will create journal entry as well as new asset(s) + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +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 +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Ecosoft + +Contributors +~~~~~~~~~~~~ + +* `Ecosoft `__: + + * Kitti U. + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-kittiu| image:: https://github.com/kittiu.png?size=40px + :target: https://github.com/kittiu + :alt: kittiu + +Current `maintainer `__: + +|maintainer-kittiu| + +This module is part of the `OCA/account-financial-tools `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_asset_transfer/static/description/index.html b/account_asset_transfer/static/description/index.html new file mode 100644 index 000000000..568382a6f --- /dev/null +++ b/account_asset_transfer/static/description/index.html @@ -0,0 +1,445 @@ + + + + + + +Asset Transfer from AUC to Asset + + + +
+

Asset Transfer from AUC to Asset

+ + +

Beta License: AGPL-3 OCA/account-financial-tools Translate me on Weblate Try me on Runbot

+

This module allow transferring assets under construction (AUC) to normal assets.

+

AUC is Asset under construction where some assets are in construction phase and +cost needs to be captured for the time being. Once asset is fully completed then +cost would be transferred to final asset

+

Table of contents

+ +
+

Configuration

+

On asset profile, user can setup default Transfer Journal, to be used during transfer.

+
+
+

Usage

+

Given asset under construction has been created, i.e., by vendor bill.

+
    +
  • Go to asset menu
  • +
  • Filter “Transferrable” assets and look for desired assets to transfer
  • +
  • Select assets to transfer, and click actoin “Transfer Asset”
  • +
  • On asset transfer wizard, on the “To New Asset” tab, choose new profile(s)
  • +
  • Click “Transfer” button
  • +
  • Odoo will create journal entry as well as new asset(s)
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +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 +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Ecosoft
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

kittiu

+

This module is part of the OCA/account-financial-tools project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From 447cc20db213f2f932be7b462070b5ed68161fd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Mon, 18 Apr 2022 14:57:34 +0200 Subject: [PATCH 04/19] [FIX] account_asset_transfer: Add post_install tag in tests to prevent test errors since https://github.com/odoo/odoo/commit/81aac30dd2278e43a43cf8fd6cef31e1e8c60f3f TT33774 --- account_asset_transfer/tests/test_account_asset_transfer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/account_asset_transfer/tests/test_account_asset_transfer.py b/account_asset_transfer/tests/test_account_asset_transfer.py index 0f6bc2b14..a2862f30b 100644 --- a/account_asset_transfer/tests/test_account_asset_transfer.py +++ b/account_asset_transfer/tests/test_account_asset_transfer.py @@ -4,6 +4,7 @@ from odoo import fields from odoo.exceptions import UserError +from odoo.tests import tagged from odoo.tests.common import Form from odoo.addons.account_asset_management.tests.test_account_asset_management import ( @@ -11,6 +12,7 @@ from odoo.addons.account_asset_management.tests.test_account_asset_management im ) +@tagged("post_install", "-at_install") class TestAccountAssetTransfer(TestAssetManagement): @classmethod def setUpClass(cls): From c29e35cf3e84e0ca6c1dbd32e1c8830b05b765b9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 18 Apr 2022 13:30:58 +0000 Subject: [PATCH 05/19] account_asset_transfer 14.0.1.0.1 --- account_asset_transfer/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_asset_transfer/__manifest__.py b/account_asset_transfer/__manifest__.py index c97baa049..b1eee78cc 100644 --- a/account_asset_transfer/__manifest__.py +++ b/account_asset_transfer/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Asset Transfer from AUC to Asset", - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "license": "AGPL-3", "depends": ["account_asset_management"], "author": "Ecosoft, Odoo Community Association (OCA)", From 264349eda3a98e233ab4f168935b71ab9bdcde2f Mon Sep 17 00:00:00 2001 From: ps-tubtim Date: Mon, 6 Jun 2022 13:41:23 +0700 Subject: [PATCH 06/19] [ENH] account_asset_transfer: allow transfer asset without moves --- account_asset_transfer/README.rst | 5 ++ .../models/account_asset.py | 3 -- .../readme/CONTRIBUTORS.rst | 1 + account_asset_transfer/readme/DESCRIPTION.rst | 4 ++ .../static/description/index.html | 7 ++- .../tests/test_account_asset_transfer.py | 40 ++++++++++------ .../views/account_asset.xml | 10 ++++ .../wizard/account_asset_transfer.py | 47 ++++++++++++------- 8 files changed, 82 insertions(+), 35 deletions(-) diff --git a/account_asset_transfer/README.rst b/account_asset_transfer/README.rst index da2257621..95d6af282 100644 --- a/account_asset_transfer/README.rst +++ b/account_asset_transfer/README.rst @@ -31,6 +31,10 @@ AUC is Asset under construction where some assets are in construction phase and cost needs to be captured for the time being. Once asset is fully completed then cost would be transferred to final asset +**Note:** + +* If the asset don't have journal entries, asset transfer will use account settings from the asset/asset profile instead. + **Table of contents** .. contents:: @@ -77,6 +81,7 @@ Contributors * `Ecosoft `__: * Kitti U. + * Pimolnat Suntian Maintainers ~~~~~~~~~~~ diff --git a/account_asset_transfer/models/account_asset.py b/account_asset_transfer/models/account_asset.py index 3a0667196..eed3f32b4 100644 --- a/account_asset_transfer/models/account_asset.py +++ b/account_asset_transfer/models/account_asset.py @@ -20,7 +20,6 @@ class AccountAsset(models.Model): not asset.method_number and asset.value_residual and asset.state == "open" - and asset.account_move_line_ids ) def _search_can_transfer(self, operator, value): @@ -29,7 +28,6 @@ class AccountAsset(models.Model): ("method_number", "=", 0), ("value_residual", ">", 0), ("state", "=", "open"), - ("account_move_line_ids", "!=", False), ] if operator == "!=": return [ @@ -39,7 +37,6 @@ class AccountAsset(models.Model): ("method_number", ">", 0), ("value_residual", "=", 0), ("state", "!=", "open"), - ("account_move_line_ids", "=", False), ] def _check_can_transfer(self): diff --git a/account_asset_transfer/readme/CONTRIBUTORS.rst b/account_asset_transfer/readme/CONTRIBUTORS.rst index 25763ec76..b64335f20 100644 --- a/account_asset_transfer/readme/CONTRIBUTORS.rst +++ b/account_asset_transfer/readme/CONTRIBUTORS.rst @@ -1,3 +1,4 @@ * `Ecosoft `__: * Kitti U. + * Pimolnat Suntian diff --git a/account_asset_transfer/readme/DESCRIPTION.rst b/account_asset_transfer/readme/DESCRIPTION.rst index 02c311f15..176f2cbd1 100644 --- a/account_asset_transfer/readme/DESCRIPTION.rst +++ b/account_asset_transfer/readme/DESCRIPTION.rst @@ -3,3 +3,7 @@ This module allow transferring assets under construction (AUC) to normal assets. AUC is Asset under construction where some assets are in construction phase and cost needs to be captured for the time being. Once asset is fully completed then cost would be transferred to final asset + +**Note:** + +* If the asset don't have journal entries, asset transfer will use account settings from the asset/asset profile instead. diff --git a/account_asset_transfer/static/description/index.html b/account_asset_transfer/static/description/index.html index 568382a6f..62227baf7 100644 --- a/account_asset_transfer/static/description/index.html +++ b/account_asset_transfer/static/description/index.html @@ -3,7 +3,7 @@ - + Asset Transfer from AUC to Asset