diff --git a/fusion_accounting_assets/__manifest__.py b/fusion_accounting_assets/__manifest__.py index c056e6c3..fc859a2b 100644 --- a/fusion_accounting_assets/__manifest__.py +++ b/fusion_accounting_assets/__manifest__.py @@ -1,6 +1,6 @@ { 'name': 'Fusion Accounting Assets', - 'version': '19.0.1.0.10', + 'version': '19.0.1.0.11', 'category': 'Accounting/Accounting', 'summary': 'AI-augmented asset management with depreciation schedules.', 'description': """ diff --git a/fusion_accounting_assets/models/__init__.py b/fusion_accounting_assets/models/__init__.py index f2533127..080d1944 100644 --- a/fusion_accounting_assets/models/__init__.py +++ b/fusion_accounting_assets/models/__init__.py @@ -3,3 +3,4 @@ from . import fusion_asset from . import fusion_asset_depreciation_line from . import fusion_asset_disposal from . import fusion_asset_anomaly +from . import account_move diff --git a/fusion_accounting_assets/models/account_move.py b/fusion_accounting_assets/models/account_move.py new file mode 100644 index 00000000..afd87b8a --- /dev/null +++ b/fusion_accounting_assets/models/account_move.py @@ -0,0 +1,34 @@ +"""Inherit account.move.line to link to fusion.asset records. + +Lets us trace assets back to their source invoice line. +""" + +from odoo import fields, models + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + fusion_asset_id = fields.Many2one( + 'fusion.asset', string='Created Asset', + copy=False, ondelete='set null', + help="Fusion asset record created from this invoice line.", + ) + + fusion_asset_count = fields.Integer(compute='_compute_fusion_asset_count') + + def _compute_fusion_asset_count(self): + for line in self: + line.fusion_asset_count = 1 if line.fusion_asset_id else 0 + + def action_open_fusion_asset(self): + self.ensure_one() + if not self.fusion_asset_id: + return + return { + 'type': 'ir.actions.act_window', + 'res_model': 'fusion.asset', + 'res_id': self.fusion_asset_id.id, + 'view_mode': 'form', + 'target': 'current', + } diff --git a/fusion_accounting_assets/tests/__init__.py b/fusion_accounting_assets/tests/__init__.py index bd3a87a9..b7a828c4 100644 --- a/fusion_accounting_assets/tests/__init__.py +++ b/fusion_accounting_assets/tests/__init__.py @@ -8,3 +8,4 @@ from . import test_fusion_asset_depreciation_line from . import test_fusion_asset_category from . import test_fusion_asset_disposal from . import test_fusion_asset_anomaly +from . import test_account_move_inherit diff --git a/fusion_accounting_assets/tests/test_account_move_inherit.py b/fusion_accounting_assets/tests/test_account_move_inherit.py new file mode 100644 index 00000000..92ef79b6 --- /dev/null +++ b/fusion_accounting_assets/tests/test_account_move_inherit.py @@ -0,0 +1,47 @@ +from datetime import date + +from odoo.tests.common import TransactionCase +from odoo.tests import tagged + + +@tagged('post_install', '-at_install') +class TestAccountMoveLineFusionAsset(TransactionCase): + + def setUp(self): + super().setUp() + self.asset = self.env['fusion.asset'].create({ + 'name': 'Asset From Invoice', + 'cost': 8000, + 'acquisition_date': date(2026, 1, 1), + }) + self.partner = self.env['res.partner'].create({'name': 'Vendor X'}) + product = self.env['product.product'].create({'name': 'Test Asset Item'}) + bill = self.env['account.move'].create({ + 'move_type': 'in_invoice', + 'partner_id': self.partner.id, + 'invoice_date': date(2026, 1, 1), + 'invoice_line_ids': [(0, 0, { + 'product_id': product.id, + 'name': 'Test asset purchase', + 'quantity': 1, + 'price_unit': 8000, + })], + }) + self.invoice_line = bill.invoice_line_ids[0] + + def test_line_starts_without_asset_link(self): + self.assertFalse(self.invoice_line.fusion_asset_id) + self.assertEqual(self.invoice_line.fusion_asset_count, 0) + + def test_link_invoice_line_to_asset(self): + self.invoice_line.fusion_asset_id = self.asset + self.assertEqual(self.invoice_line.fusion_asset_id, self.asset) + self.invoice_line.invalidate_recordset(['fusion_asset_count']) + self.assertEqual(self.invoice_line.fusion_asset_count, 1) + + def test_action_open_fusion_asset_returns_window_action(self): + self.invoice_line.fusion_asset_id = self.asset + action = self.invoice_line.action_open_fusion_asset() + self.assertEqual(action['res_model'], 'fusion.asset') + self.assertEqual(action['res_id'], self.asset.id) + self.assertEqual(action['view_mode'], 'form')