Skip to content

Commit

Permalink
[IMP] l10n_it_asset_management: Recharge asset
Browse files Browse the repository at this point in the history
  • Loading branch information
SirAionTech committed Jul 17, 2024
1 parent a85b5d2 commit f5a3577
Show file tree
Hide file tree
Showing 12 changed files with 439 additions and 28 deletions.
1 change: 1 addition & 0 deletions l10n_it_asset_management/models/account_move.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ def open_wizard_manage_asset(self):
{
"default_company_id": self.company_id.id,
"default_dismiss_date": self.invoice_date or self.invoice_date_due,
"default_recharge_date": self.invoice_date or self.invoice_date_due,
"default_move_ids": [Command.set(self.ids)],
"default_move_line_ids": [Command.set(lines.ids)],
"default_purchase_date": self.invoice_date or self.invoice_date_due,
Expand Down
1 change: 1 addition & 0 deletions l10n_it_asset_management/models/asset_accounting_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class AssetAccountingInfo(models.Model):
relation_type = fields.Selection(
[
("create", "Asset Creation"),
("partial_recharge", "Partial Recharge"),
("update", "Asset Update"),
("partial_dismiss", "Asset Partial Dismissal"),
("dismiss", "Asset Dismissal"),
Expand Down
2 changes: 1 addition & 1 deletion l10n_it_asset_management/models/asset_depreciation.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ def _compute_last_depreciation_date(self):
for dep in self:
dep_lines = dep.line_ids.filtered(
lambda line: line.move_type == "depreciated"
and not line.partial_dismissal
and not (line.partial_dismissal or line.partial_recharge)
)
if dep_lines:
dep.last_depreciation_date = max(dep_lines.mapped("date"))
Expand Down
20 changes: 15 additions & 5 deletions l10n_it_asset_management/models/asset_depreciation_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ class AssetDepreciationLine(models.Model):
)

partial_dismissal = fields.Boolean()
partial_recharge = fields.Boolean()

percentage = fields.Float(string="%")

Expand Down Expand Up @@ -265,9 +266,8 @@ def get_update_move_types(self):
def is_depreciation_nr_required(self):
"""Defines if a line requires to be numbered"""
self.ensure_one()
return (
self.move_type in self.get_numbered_move_types()
and not self.partial_dismissal
return self.move_type in self.get_numbered_move_types() and not (
self.partial_dismissal or self.partial_recharge
)

def make_name(self):
Expand Down Expand Up @@ -394,15 +394,22 @@ def get_depreciated_account_move_line_vals(self):
self.ensure_one()

# Asset depreciation
if not self.partial_dismissal:
if not (self.partial_dismissal or self.partial_recharge):
credit_account_id = self.asset_id.category_id.fund_account_id.id
debit_account_id = self.asset_id.category_id.depreciation_account_id.id

# Asset partial dismissal
else:
# Asset partial dismissal
debit_account_id = self.asset_id.category_id.fund_account_id.id
credit_account_id = self.asset_id.category_id.asset_account_id.id

# Asset partial recharge
if self.partial_recharge:
credit_account_id, debit_account_id = (
debit_account_id,
credit_account_id,
)

amt = abs(self.amount)
credit_line_vals = {
"account_id": credit_account_id,
Expand Down Expand Up @@ -495,3 +502,6 @@ def post_partial_dismiss_asset(self):
)
if to_create_move:
to_create_move.generate_account_move()

def post_partial_recharge_asset(self):
return self.post_partial_dismiss_asset()
4 changes: 2 additions & 2 deletions l10n_it_asset_management/report/asset_journal.py
Original file line number Diff line number Diff line change
Expand Up @@ -728,7 +728,7 @@ def get_report_dep_line_year_data(self):
line.amount
for line in self.dep_line_ids.filtered(
lambda line: line.move_type == "depreciated"
and not line.partial_dismissal
and not (line.partial_dismissal or line.partial_recharge)
)
]
)
Expand All @@ -737,7 +737,7 @@ def get_report_dep_line_year_data(self):
line.amount
for line in self.dep_line_ids.filtered(
lambda line: line.move_type == "depreciated"
and line.partial_dismissal
and (line.partial_dismissal or line.partial_recharge)
)
]
)
Expand Down
8 changes: 5 additions & 3 deletions l10n_it_asset_management/report/asset_previsional.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,9 @@ def generate_structure(self):
if fyear.date_to >= dep.date_start:
prev = not lines or not any(
line.move_type == "depreciated"
and not line.partial_dismissal
and not (
line.partial_dismissal or line.partial_recharge
)
for line in lines
)
sequence += 1
Expand Down Expand Up @@ -797,7 +799,7 @@ def get_report_dep_line_year_data(self):
line.amount
for line in self.dep_line_ids.filtered(
lambda line: line.move_type == "depreciated"
and not line.partial_dismissal
and not (line.partial_dismissal or line.partial_recharge)
)
]
)
Expand All @@ -806,7 +808,7 @@ def get_report_dep_line_year_data(self):
line.amount
for line in self.dep_line_ids.filtered(
lambda line: line.move_type == "depreciated"
and line.partial_dismissal
and (line.partial_dismissal or line.partial_recharge)
)
]
)
Expand Down
79 changes: 67 additions & 12 deletions l10n_it_asset_management/tests/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from datetime import date

from odoo.fields import Command, first
from odoo.tests.common import TransactionCase, Form
from odoo.tests.common import Form, TransactionCase


class Common(TransactionCase):
Expand Down Expand Up @@ -65,6 +65,12 @@ def setUpClass(cls):
],
limit=1,
)
cls.sale_journal = cls.env["account.journal"].search(
[
("type", "=", "sale"),
],
limit=1,
)

cls.civilistico_asset_dep_type = cls.env.ref(
"l10n_it_asset_management.ad_type_civilistico"
Expand Down Expand Up @@ -208,6 +214,49 @@ def _create_purchase_invoice(self, invoice_date, tax_ids=False, amount=7000):
self.assertEqual(purchase_invoice.state, "posted")
return purchase_invoice

def _create_sale_invoice(self, asset, amount=7000, invoice_date=None, post=True):
sale_invoice = self.env["account.move"].create(
{
"move_type": "out_invoice",
"invoice_date": invoice_date,
"partner_id": self.env.ref("base.partner_demo").id,
"journal_id": self.sale_journal.id,
"invoice_line_ids": [
Command.create(
{
"account_id": asset.category_id.asset_account_id.id,
"quantity": 1,
"price_unit": amount,
},
)
],
}
)
if post:
sale_invoice.action_post()
return sale_invoice

def _refund_move(self, move, method="cancel", ref_date=None):
reverse_context = {
"active_model": move._name,
"active_ids": move.ids,
}
refund_wizard_form = Form(
self.env["account.move.reversal"].with_context(**reverse_context)
)
refund_wizard_form.reason = "test"
if ref_date:
refund_wizard_form.date_mode = "custom"
refund_wizard_form.date = ref_date
refund_wizard_form.refund_method = method
refund_wizard = refund_wizard_form.save()

refund_action = refund_wizard.reverse_moves()
refund_move = self.env[refund_action["res_model"]].browse(
refund_action["res_id"]
)
return refund_move

def _civil_depreciate_asset(self, asset):
# Keep only one civil depreciation
civil_depreciation_type = self.env.ref(
Expand Down Expand Up @@ -298,15 +347,21 @@ def _create_entry(self, account, amount, post=True):
self.assertEqual(entry.move_type, "entry")
return entry

def _update_asset(self, entry, asset):
"""Execute the wizard on `entry` to update `asset`."""
wizard_action = entry.open_wizard_manage_asset()
wizard_model = self.env[wizard_action["res_model"]]
wizard_context = wizard_action["context"]
def _link_asset_move(self, move, link_management_type, wiz_values=None):
"""Link `move` to an asset with mode `link_management_type`.
`wiz_values` are values to be set in the wizard.
"""
if wiz_values is None:
wiz_values = {}

Check warning on line 355 in l10n_it_asset_management/tests/common.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_asset_management/tests/common.py#L355

Added line #L355 was not covered by tests

wizard_form = Form(wizard_model.with_context(**wizard_context))
wizard_form.management_type = "update"
wizard_form.asset_id = asset
wizard = wizard_form.save()

return wizard.link_asset()
wiz_action_values = move.open_wizard_manage_asset()
wiz_form = Form(
self.env["wizard.account.move.manage.asset"].with_context(
**wiz_action_values["context"]
)
)
wiz_form.management_type = link_management_type
for field_name, field_value in wiz_values.items():
setattr(wiz_form, field_name, field_value)
wiz = wiz_form.save()
return wiz.link_asset()
144 changes: 142 additions & 2 deletions l10n_it_asset_management/tests/test_assets_management.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
# Copyright 2023 Simone Rubino - Aion Tech
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

import datetime
from datetime import date

from odoo import fields
Expand Down Expand Up @@ -456,7 +457,13 @@ def test_entry_in_update_asset(self):
self.assertFalse(asset.asset_accounting_info_ids)

# Act
self._update_asset(entry, asset)
self._link_asset_move(
entry,
"update",
wiz_values={
"asset_id": asset,
},
)

# Assert
accounting_info = asset.asset_accounting_info_ids
Expand All @@ -476,7 +483,13 @@ def test_entry_out_update_asset(self):
self.assertFalse(asset.asset_accounting_info_ids)

# Act
self._update_asset(entry, asset)
self._link_asset_move(
entry,
"update",
wiz_values={
"asset_id": asset,
},
)

# Assert
accounting_info = asset.asset_accounting_info_ids
Expand Down Expand Up @@ -508,3 +521,130 @@ def test_journal_prev_year(self):
total = report.report_total_ids
self.assertEqual(total.amount_depreciation_fund_curr_year, 1000)
self.assertEqual(total.amount_depreciation_fund_prev_year, 1000)

def test_purchase_sale_refund_recharge(self):
"""A sale refund can be used to restore asset value."""
# Create with purchase
purchase_amount = 2500
purchase_invoice = self._create_purchase_invoice(
datetime.date(2020, month=1, day=1), amount=purchase_amount
)
asset = self._link_asset_move(
purchase_invoice,
"create",
{
"category_id": self.asset_category_1,
"name": "Test recharge asset",
},
)
civ_depreciation = asset.depreciation_ids.filtered(
lambda x: x.type_id
== self.env.ref("l10n_it_asset_management.ad_type_civilistico")
)
self.assertEqual(civ_depreciation.amount_depreciable_updated, purchase_amount)

# Partial dismiss with sale
asset_account_amount = asset_fund_amount = 1000
sale_invoice = self._create_sale_invoice(
asset, amount=8000, invoice_date=datetime.date(2020, month=3, day=1)
)
self._link_asset_move(
sale_invoice,
"partial_dismiss",
wiz_values={
"asset_id": asset,
"depreciated_fund_amount": asset_account_amount,
"asset_purchase_amount": asset_fund_amount,
},
)
civ_depreciation_lines = civ_depreciation.line_ids
self.assertRecordValues(
civ_depreciation_lines.sorted("move_type"),
[
{
"move_type": "depreciated",
"amount": -1000.0,
},
{
"move_type": "gain",
"amount": 8000.0,
},
{
"move_type": "out",
"amount": 1000.0,
},
],
)
civ_depreciation_move_lines = civ_depreciation_lines.filtered(
lambda cdl: cdl.move_type == "depreciated"
).move_id.line_ids
self.assertRecordValues(
civ_depreciation_move_lines.sorted("balance"),
[
{
"account_id": asset.category_id.asset_account_id.id,
"balance": -1000,
},
{
"account_id": asset.category_id.fund_account_id.id,
"balance": 1000,
},
],
)
self.assertEqual(
civ_depreciation.amount_depreciable_updated,
purchase_amount - asset_account_amount,
)

# Refund and recharge
sale_refund = self._refund_move(
sale_invoice, ref_date=datetime.date(2020, month=7, day=1)
)
recharge_purchase_amount = recharge_fund_amount = 1000
self._link_asset_move(
sale_refund,
"partial_recharge",
wiz_values={
"asset_id": asset,
"recharge_purchase_amount": recharge_purchase_amount,
"recharge_fund_amount": recharge_fund_amount,
},
)
civ_depreciation_lines = civ_depreciation.line_ids - civ_depreciation_lines
self.assertRecordValues(
civ_depreciation_lines.sorted("move_type"),
[
{
"move_type": "depreciated",
"amount": 1000.0,
},
{
"move_type": "in",
"amount": 1000.0,
},
{
"move_type": "loss",
"amount": 8000.0,
},
],
)
civ_depreciation_move_lines = civ_depreciation_lines.filtered(
lambda cdl: cdl.move_type == "depreciated"
).move_id.line_ids
self.assertRecordValues(
civ_depreciation_move_lines.sorted("balance"),
[
{
"account_id": asset.category_id.fund_account_id.id,
"balance": -1000,
},
{
"account_id": asset.category_id.asset_account_id.id,
"balance": 1000,
},
],
)
self.assertEqual(
civ_depreciation.amount_depreciable_updated,
purchase_amount,
)
Loading

0 comments on commit f5a3577

Please sign in to comment.