[FIX] account_asset_management: don't set class attributes in reporting
Also, actually generate report in test plus other tests to make it to the codecov target
This commit is contained in:
parent
e4796d3bd5
commit
9352bd825c
@ -7,6 +7,11 @@ from odoo import _, models
|
|||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
from odoo.tools.translate import translate
|
from odoo.tools.translate import translate
|
||||||
|
|
||||||
|
from odoo.addons.report_xlsx_helper.report.report_xlsx_format import (
|
||||||
|
FORMATS,
|
||||||
|
XLS_HEADERS,
|
||||||
|
)
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ -24,7 +29,7 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
return val
|
return val
|
||||||
|
|
||||||
def _get_ws_params(self, wb, data, wiz):
|
def _get_ws_params(self, wb, data, wiz):
|
||||||
self._grouped_assets = self._get_assets(wiz)
|
self._get_assets(wiz, data)
|
||||||
s1 = self._get_acquisition_ws_params(wb, data, wiz)
|
s1 = self._get_acquisition_ws_params(wb, data, wiz)
|
||||||
s2 = self._get_active_ws_params(wb, data, wiz)
|
s2 = self._get_active_ws_params(wb, data, wiz)
|
||||||
s3 = self._get_removal_ws_params(wb, data, wiz)
|
s3 = self._get_removal_ws_params(wb, data, wiz)
|
||||||
@ -64,7 +69,7 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {"type": "string", "value": self._("Asset Start Date")},
|
"header": {"type": "string", "value": self._("Asset Start Date")},
|
||||||
"asset": {
|
"asset": {
|
||||||
"value": self._render("asset.date_start"),
|
"value": self._render("asset.date_start"),
|
||||||
"format": self.format_tcell_date_left,
|
"format": FORMATS["format_tcell_date_left"],
|
||||||
},
|
},
|
||||||
"width": 20,
|
"width": 20,
|
||||||
},
|
},
|
||||||
@ -72,7 +77,7 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {"type": "string", "value": self._("Asset Removal Date")},
|
"header": {"type": "string", "value": self._("Asset Removal Date")},
|
||||||
"asset": {
|
"asset": {
|
||||||
"value": self._render("asset.date_remove"),
|
"value": self._render("asset.date_remove"),
|
||||||
"format": self.format_tcell_date_left,
|
"format": FORMATS["format_tcell_date_left"],
|
||||||
},
|
},
|
||||||
"width": 20,
|
"width": 20,
|
||||||
},
|
},
|
||||||
@ -80,22 +85,22 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {
|
"header": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._("Depreciation Base"),
|
"value": self._("Depreciation Base"),
|
||||||
"format": self.format_theader_yellow_right,
|
"format": FORMATS["format_theader_yellow_right"],
|
||||||
},
|
},
|
||||||
"asset_group": {
|
"asset_group": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"value": self._render("group._depreciation_base"),
|
"value": self._render('group_entry["_depreciation_base"]'),
|
||||||
"format": self.format_theader_blue_amount_right,
|
"format": FORMATS["format_theader_blue_amount_right"],
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"value": self._render("asset.depreciation_base"),
|
"value": self._render("asset.depreciation_base"),
|
||||||
"format": self.format_tcell_amount_right,
|
"format": FORMATS["format_tcell_amount_right"],
|
||||||
},
|
},
|
||||||
"totals": {
|
"totals": {
|
||||||
"type": "formula",
|
"type": "formula",
|
||||||
"value": self._render("asset_total_formula"),
|
"value": self._render("asset_total_formula"),
|
||||||
"format": self.format_theader_yellow_amount_right,
|
"format": FORMATS["format_theader_yellow_amount_right"],
|
||||||
},
|
},
|
||||||
"width": 18,
|
"width": 18,
|
||||||
},
|
},
|
||||||
@ -103,22 +108,22 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {
|
"header": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._("Salvage Value"),
|
"value": self._("Salvage Value"),
|
||||||
"format": self.format_theader_yellow_right,
|
"format": FORMATS["format_theader_yellow_right"],
|
||||||
},
|
},
|
||||||
"asset_group": {
|
"asset_group": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"value": self._render("group._salvage_value"),
|
"value": self._render('group_entry["_salvage_value"]'),
|
||||||
"format": self.format_theader_blue_amount_right,
|
"format": FORMATS["format_theader_blue_amount_right"],
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"value": self._render("asset.salvage_value"),
|
"value": self._render("asset.salvage_value"),
|
||||||
"format": self.format_tcell_amount_right,
|
"format": FORMATS["format_tcell_amount_right"],
|
||||||
},
|
},
|
||||||
"totals": {
|
"totals": {
|
||||||
"type": "formula",
|
"type": "formula",
|
||||||
"value": self._render("salvage_total_formula"),
|
"value": self._render("salvage_total_formula"),
|
||||||
"format": self.format_theader_yellow_amount_right,
|
"format": FORMATS["format_theader_yellow_amount_right"],
|
||||||
},
|
},
|
||||||
"width": 18,
|
"width": 18,
|
||||||
},
|
},
|
||||||
@ -126,22 +131,22 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {
|
"header": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._("Period Start Value"),
|
"value": self._("Period Start Value"),
|
||||||
"format": self.format_theader_yellow_right,
|
"format": FORMATS["format_theader_yellow_right"],
|
||||||
},
|
},
|
||||||
"asset_group": {
|
"asset_group": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"value": self._render("group._period_start_value"),
|
"value": self._render('group_entry["_period_start_value"]'),
|
||||||
"format": self.format_theader_blue_amount_right,
|
"format": FORMATS["format_theader_blue_amount_right"],
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"value": self._render("asset._period_start_value"),
|
"value": self._render('asset_entry["_period_start_value"]'),
|
||||||
"format": self.format_tcell_amount_right,
|
"format": FORMATS["format_tcell_amount_right"],
|
||||||
},
|
},
|
||||||
"totals": {
|
"totals": {
|
||||||
"type": "formula",
|
"type": "formula",
|
||||||
"value": self._render("period_start_total_formula"),
|
"value": self._render("period_start_total_formula"),
|
||||||
"format": self.format_theader_yellow_amount_right,
|
"format": FORMATS["format_theader_yellow_amount_right"],
|
||||||
},
|
},
|
||||||
"width": 18,
|
"width": 18,
|
||||||
},
|
},
|
||||||
@ -149,22 +154,22 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {
|
"header": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._("Period Depreciation"),
|
"value": self._("Period Depreciation"),
|
||||||
"format": self.format_theader_yellow_right,
|
"format": FORMATS["format_theader_yellow_right"],
|
||||||
},
|
},
|
||||||
"asset_group": {
|
"asset_group": {
|
||||||
"type": "formula",
|
"type": "formula",
|
||||||
"value": self._render("period_diff_formula"),
|
"value": self._render("period_diff_formula"),
|
||||||
"format": self.format_theader_blue_amount_right,
|
"format": FORMATS["format_theader_blue_amount_right"],
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"type": "formula",
|
"type": "formula",
|
||||||
"value": self._render("period_diff_formula"),
|
"value": self._render("period_diff_formula"),
|
||||||
"format": self.format_tcell_amount_right,
|
"format": FORMATS["format_tcell_amount_right"],
|
||||||
},
|
},
|
||||||
"totals": {
|
"totals": {
|
||||||
"type": "formula",
|
"type": "formula",
|
||||||
"value": self._render("period_diff_formula"),
|
"value": self._render("period_diff_formula"),
|
||||||
"format": self.format_theader_yellow_amount_right,
|
"format": FORMATS["format_theader_yellow_amount_right"],
|
||||||
},
|
},
|
||||||
"width": 18,
|
"width": 18,
|
||||||
},
|
},
|
||||||
@ -172,22 +177,22 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {
|
"header": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._("Period End Value"),
|
"value": self._("Period End Value"),
|
||||||
"format": self.format_theader_yellow_right,
|
"format": FORMATS["format_theader_yellow_right"],
|
||||||
},
|
},
|
||||||
"asset_group": {
|
"asset_group": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"value": self._render("group._period_end_value"),
|
"value": self._render('group_entry["_period_end_value"]'),
|
||||||
"format": self.format_theader_blue_amount_right,
|
"format": FORMATS["format_theader_blue_amount_right"],
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"value": self._render("asset._period_end_value"),
|
"value": self._render('asset_entry["_period_end_value"]'),
|
||||||
"format": self.format_tcell_amount_right,
|
"format": FORMATS["format_tcell_amount_right"],
|
||||||
},
|
},
|
||||||
"totals": {
|
"totals": {
|
||||||
"type": "formula",
|
"type": "formula",
|
||||||
"value": self._render("period_end_total_formula"),
|
"value": self._render("period_end_total_formula"),
|
||||||
"format": self.format_theader_yellow_amount_right,
|
"format": FORMATS["format_theader_yellow_amount_right"],
|
||||||
},
|
},
|
||||||
"width": 18,
|
"width": 18,
|
||||||
},
|
},
|
||||||
@ -195,22 +200,22 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {
|
"header": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._("Tot. Depreciation"),
|
"value": self._("Tot. Depreciation"),
|
||||||
"format": self.format_theader_yellow_right,
|
"format": FORMATS["format_theader_yellow_right"],
|
||||||
},
|
},
|
||||||
"asset_group": {
|
"asset_group": {
|
||||||
"type": "formula",
|
"type": "formula",
|
||||||
"value": self._render("total_depr_formula"),
|
"value": self._render("total_depr_formula"),
|
||||||
"format": self.format_theader_blue_amount_right,
|
"format": FORMATS["format_theader_blue_amount_right"],
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"type": "formula",
|
"type": "formula",
|
||||||
"value": self._render("total_depr_formula"),
|
"value": self._render("total_depr_formula"),
|
||||||
"format": self.format_tcell_amount_right,
|
"format": FORMATS["format_tcell_amount_right"],
|
||||||
},
|
},
|
||||||
"totals": {
|
"totals": {
|
||||||
"type": "formula",
|
"type": "formula",
|
||||||
"value": self._render("total_depr_formula"),
|
"value": self._render("total_depr_formula"),
|
||||||
"format": self.format_theader_yellow_amount_right,
|
"format": FORMATS["format_theader_yellow_amount_right"],
|
||||||
},
|
},
|
||||||
"width": 18,
|
"width": 18,
|
||||||
},
|
},
|
||||||
@ -218,12 +223,12 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {
|
"header": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._("Comput. Method"),
|
"value": self._("Comput. Method"),
|
||||||
"format": self.format_theader_yellow_center,
|
"format": FORMATS["format_theader_yellow_center"],
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._render("asset.method or ''"),
|
"value": self._render("asset.method or ''"),
|
||||||
"format": self.format_tcell_center,
|
"format": FORMATS["format_tcell_center"],
|
||||||
},
|
},
|
||||||
"width": 20,
|
"width": 20,
|
||||||
},
|
},
|
||||||
@ -231,12 +236,12 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {
|
"header": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._("Number of Years"),
|
"value": self._("Number of Years"),
|
||||||
"format": self.format_theader_yellow_center,
|
"format": FORMATS["format_theader_yellow_center"],
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"value": self._render("asset.method_number"),
|
"value": self._render("asset.method_number"),
|
||||||
"format": self.format_tcell_integer_center,
|
"format": FORMATS["format_tcell_integer_center"],
|
||||||
},
|
},
|
||||||
"width": 20,
|
"width": 20,
|
||||||
},
|
},
|
||||||
@ -244,12 +249,12 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {
|
"header": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._("Prorata Temporis"),
|
"value": self._("Prorata Temporis"),
|
||||||
"format": self.format_theader_yellow_center,
|
"format": FORMATS["format_theader_yellow_center"],
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"value": self._render("asset.prorata"),
|
"value": self._render("asset.prorata"),
|
||||||
"format": self.format_tcell_center,
|
"format": FORMATS["format_tcell_center"],
|
||||||
},
|
},
|
||||||
"width": 20,
|
"width": 20,
|
||||||
},
|
},
|
||||||
@ -257,12 +262,12 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"header": {
|
"header": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._("Status"),
|
"value": self._("Status"),
|
||||||
"format": self.format_theader_yellow_center,
|
"format": FORMATS["format_theader_yellow_center"],
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": self._render("asset.state"),
|
"value": self._render("asset.state"),
|
||||||
"format": self.format_tcell_center,
|
"format": FORMATS["format_tcell_center"],
|
||||||
},
|
},
|
||||||
"width": 8,
|
"width": 8,
|
||||||
},
|
},
|
||||||
@ -359,10 +364,10 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
else:
|
else:
|
||||||
suffix = _("Removed Assets")
|
suffix = _("Removed Assets")
|
||||||
no_entries = _("No") + " " + suffix
|
no_entries = _("No") + " " + suffix
|
||||||
ws.write_string(row_pos, 0, no_entries, self.format_left_bold)
|
ws.write_string(row_pos, 0, no_entries, FORMATS["format_left_bold"])
|
||||||
|
|
||||||
def _get_assets(self, wiz):
|
|
||||||
|
|
||||||
|
def _get_assets(self, wiz, data):
|
||||||
|
""" Add the selected assets, both grouped and ungrouped, to `data` """
|
||||||
dom = [
|
dom = [
|
||||||
("date_start", "<=", wiz.date_to),
|
("date_start", "<=", wiz.date_to),
|
||||||
"|",
|
"|",
|
||||||
@ -394,10 +399,15 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
|
|
||||||
if not wiz.draft:
|
if not wiz.draft:
|
||||||
dom.append(("state", "!=", "draft"))
|
dom.append(("state", "!=", "draft"))
|
||||||
self._assets = self.env["account.asset"].search(dom)
|
assets = self.env["account.asset"].search(dom)
|
||||||
grouped_assets = {}
|
grouped_assets = {}
|
||||||
self._group_assets(self._assets, parent_group, grouped_assets)
|
self._group_assets(assets, parent_group, grouped_assets)
|
||||||
return grouped_assets
|
data.update(
|
||||||
|
{
|
||||||
|
"assets": assets,
|
||||||
|
"grouped_assets": grouped_assets,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def acquisition_filter(wiz, asset):
|
def acquisition_filter(wiz, asset):
|
||||||
@ -452,13 +462,17 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
return
|
return
|
||||||
|
|
||||||
asset_entries = []
|
asset_entries = []
|
||||||
group._depreciation_base = 0.0
|
group_entry = {
|
||||||
group._salvage_value = 0.0
|
"_depreciation_base": 0.0,
|
||||||
group._period_start_value = 0.0
|
"_salvage_value": 0.0,
|
||||||
group._period_end_value = 0.0
|
"_period_start_value": 0.0,
|
||||||
|
"_period_end_value": 0.0,
|
||||||
|
"group": group,
|
||||||
|
}
|
||||||
for asset in assets:
|
for asset in assets:
|
||||||
group._depreciation_base += asset.depreciation_base
|
asset_entry = {"asset": asset}
|
||||||
group._salvage_value += asset.salvage_value
|
group_entry["_depreciation_base"] += asset.depreciation_base
|
||||||
|
group_entry["_salvage_value"] += asset.salvage_value
|
||||||
dls_all = asset.depreciation_line_ids.filtered(
|
dls_all = asset.depreciation_line_ids.filtered(
|
||||||
lambda r: r.type == "depreciate"
|
lambda r: r.type == "depreciate"
|
||||||
)
|
)
|
||||||
@ -471,25 +485,29 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
value_depreciated = dls[-1].depreciated_value + dls[-1].amount
|
value_depreciated = dls[-1].depreciated_value + dls[-1].amount
|
||||||
else:
|
else:
|
||||||
value_depreciated = 0.0
|
value_depreciated = 0.0
|
||||||
asset._period_start_value = asset.depreciation_base - value_depreciated
|
asset_entry["_period_start_value"] = (
|
||||||
group._period_start_value += asset._period_start_value
|
asset.depreciation_base - value_depreciated
|
||||||
|
)
|
||||||
|
group_entry["_period_start_value"] += asset_entry["_period_start_value"]
|
||||||
# period_end_value
|
# period_end_value
|
||||||
dls = dls_all.filtered(lambda r: r.line_date <= wiz.date_to)
|
dls = dls_all.filtered(lambda r: r.line_date <= wiz.date_to)
|
||||||
if dls:
|
if dls:
|
||||||
value_depreciated = dls[-1].depreciated_value + dls[-1].amount
|
value_depreciated = dls[-1].depreciated_value + dls[-1].amount
|
||||||
else:
|
else:
|
||||||
value_depreciated = 0.0
|
value_depreciated = 0.0
|
||||||
asset._period_end_value = asset.depreciation_base - value_depreciated
|
asset_entry["_period_end_value"] = (
|
||||||
group._period_end_value += asset._period_end_value
|
asset.depreciation_base - value_depreciated
|
||||||
|
)
|
||||||
|
group_entry["_period_end_value"] += asset_entry["_period_end_value"]
|
||||||
|
|
||||||
asset_entries.append({"asset": asset})
|
asset_entries.append(asset_entry)
|
||||||
|
|
||||||
todos = []
|
todos = []
|
||||||
for g in group.child_ids:
|
for g in group.child_ids:
|
||||||
if _has_assets(g, group_val[g]):
|
if _has_assets(g, group_val[g]):
|
||||||
todos.append(g)
|
todos.append(g)
|
||||||
|
|
||||||
entries.append({"group": group})
|
entries.append(group_entry)
|
||||||
entries.extend(asset_entries)
|
entries.extend(asset_entries)
|
||||||
for todo in todos:
|
for todo in todos:
|
||||||
self._create_report_entries(
|
self._create_report_entries(
|
||||||
@ -501,8 +519,8 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
|
|
||||||
ws.set_portrait()
|
ws.set_portrait()
|
||||||
ws.fit_to_pages(1, 0)
|
ws.fit_to_pages(1, 0)
|
||||||
ws.set_header(self.xls_headers["standard"])
|
ws.set_header(XLS_HEADERS["xls_headers"]["standard"])
|
||||||
ws.set_footer(self.xls_footers["standard"])
|
ws.set_footer(XLS_HEADERS["xls_footers"]["standard"])
|
||||||
|
|
||||||
wl = ws_params["wanted_list"]
|
wl = ws_params["wanted_list"]
|
||||||
if "account" not in wl:
|
if "account" not in wl:
|
||||||
@ -523,7 +541,7 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
filter = getattr(self, "{}_filter".format(report))
|
filter = getattr(self, "{}_filter".format(report))
|
||||||
return filter(wiz, asset)
|
return filter(wiz, asset)
|
||||||
|
|
||||||
assets = self._assets.filtered(asset_filter)
|
assets = data["assets"].filtered(asset_filter)
|
||||||
|
|
||||||
if not assets:
|
if not assets:
|
||||||
return self._empty_report(ws, row_pos, ws_params, data, wiz)
|
return self._empty_report(ws, row_pos, ws_params, data, wiz)
|
||||||
@ -533,7 +551,7 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
row_pos,
|
row_pos,
|
||||||
ws_params,
|
ws_params,
|
||||||
col_specs_section="header",
|
col_specs_section="header",
|
||||||
default_format=self.format_theader_yellow_left,
|
default_format=FORMATS["format_theader_yellow_left"],
|
||||||
)
|
)
|
||||||
|
|
||||||
ws.freeze_panes(row_pos, 0)
|
ws.freeze_panes(row_pos, 0)
|
||||||
@ -550,7 +568,7 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
|
|
||||||
entries = []
|
entries = []
|
||||||
root = wiz.asset_group_id
|
root = wiz.asset_group_id
|
||||||
root_val = self._grouped_assets[root]
|
root_val = data["grouped_assets"][root]
|
||||||
error_dict = {
|
error_dict = {
|
||||||
"no_table": self.env["account.asset"],
|
"no_table": self.env["account.asset"],
|
||||||
"dups": self.env["account.asset"],
|
"dups": self.env["account.asset"],
|
||||||
@ -560,16 +578,18 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
|
|
||||||
# traverse entries in reverse order to calc totals
|
# traverse entries in reverse order to calc totals
|
||||||
for i, entry in enumerate(reversed(entries)):
|
for i, entry in enumerate(reversed(entries)):
|
||||||
group = entry.get("group")
|
|
||||||
if "group" in entry:
|
if "group" in entry:
|
||||||
parent = group.parent_id
|
parent = entry["group"].parent_id
|
||||||
for e in reversed(entries[: -i - 1]):
|
for parent_entry in reversed(entries[: -i - 1]):
|
||||||
g = e.get("group")
|
if "group" in parent_entry and parent_entry["group"] == parent:
|
||||||
if g == parent:
|
parent_entry["_depreciation_base"] += entry[
|
||||||
g._depreciation_base += group._depreciation_base
|
"_depreciation_base"
|
||||||
g._salvage_value += group._salvage_value
|
]
|
||||||
g._period_start_value += group._period_start_value
|
parent_entry["_salvage_value"] += entry["_salvage_value"]
|
||||||
g._period_end_value += group._period_end_value
|
parent_entry["_period_start_value"] += entry[
|
||||||
|
"_period_start_value"
|
||||||
|
]
|
||||||
|
parent_entry["_period_end_value"] += entry["_period_end_value"]
|
||||||
continue
|
continue
|
||||||
|
|
||||||
processed = []
|
processed = []
|
||||||
@ -599,10 +619,11 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
col_specs_section="asset_group",
|
col_specs_section="asset_group",
|
||||||
render_space={
|
render_space={
|
||||||
"group": entry["group"],
|
"group": entry["group"],
|
||||||
|
"group_entry": entry,
|
||||||
"period_diff_formula": period_diff_formula,
|
"period_diff_formula": period_diff_formula,
|
||||||
"total_depr_formula": total_depr_formula,
|
"total_depr_formula": total_depr_formula,
|
||||||
},
|
},
|
||||||
default_format=self.format_theader_blue_left,
|
default_format=FORMATS["format_theader_blue_left"],
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
@ -618,11 +639,12 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
ws_params,
|
ws_params,
|
||||||
col_specs_section="asset",
|
col_specs_section="asset",
|
||||||
render_space={
|
render_space={
|
||||||
"asset": asset,
|
"asset": entry["asset"],
|
||||||
|
"asset_entry": entry,
|
||||||
"period_diff_formula": period_diff_formula,
|
"period_diff_formula": period_diff_formula,
|
||||||
"total_depr_formula": total_depr_formula,
|
"total_depr_formula": total_depr_formula,
|
||||||
},
|
},
|
||||||
default_format=self.format_tcell_left,
|
default_format=FORMATS["format_tcell_left"],
|
||||||
)
|
)
|
||||||
|
|
||||||
asset_total_formula = depreciation_base_pos and self._rowcol_to_cell(
|
asset_total_formula = depreciation_base_pos and self._rowcol_to_cell(
|
||||||
@ -666,7 +688,7 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
"period_diff_formula": period_diff_formula,
|
"period_diff_formula": period_diff_formula,
|
||||||
"total_depr_formula": total_depr_formula,
|
"total_depr_formula": total_depr_formula,
|
||||||
},
|
},
|
||||||
default_format=self.format_theader_yellow_left,
|
default_format=FORMATS["format_theader_yellow_left"],
|
||||||
)
|
)
|
||||||
|
|
||||||
for k in error_dict:
|
for k in error_dict:
|
||||||
@ -681,4 +703,4 @@ class AssetReportXlsx(models.AbstractModel):
|
|||||||
err_msg = _("Assets to be corrected") + ": "
|
err_msg = _("Assets to be corrected") + ": "
|
||||||
err_msg += "%s" % [x[1] for x in error_dict[k].name_get()]
|
err_msg += "%s" % [x[1] for x in error_dict[k].name_get()]
|
||||||
err_msg += " - " + _("Reason") + ": " + reason
|
err_msg += " - " + _("Reason") + ": " + reason
|
||||||
ws.write_string(row_pos, 0, err_msg, self.format_left_bold)
|
ws.write_string(row_pos, 0, err_msg, FORMATS["format_left_bold"])
|
||||||
|
@ -623,3 +623,46 @@ class TestAssetManagement(AccountTestInvoicingCommon):
|
|||||||
# In the last month of the fiscal year we compensate for the small
|
# In the last month of the fiscal year we compensate for the small
|
||||||
# deviations if that is necessary.
|
# deviations if that is necessary.
|
||||||
self.assertAlmostEqual(asset.depreciation_line_ids[12].amount, 166.63, places=2)
|
self.assertAlmostEqual(asset.depreciation_line_ids[12].amount, 166.63, places=2)
|
||||||
|
|
||||||
|
def test_15_account_asset_group(self):
|
||||||
|
"""Group's name_get behaves differently depending on code and context"""
|
||||||
|
group_fa = self.env["account.asset.group"].create(
|
||||||
|
{
|
||||||
|
"name": "Fixed Assets",
|
||||||
|
"code": "FA",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
group_tfa = self.env["account.asset.group"].create(
|
||||||
|
{
|
||||||
|
"name": "Tangible Fixed Assets",
|
||||||
|
"code": "TFA",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Groups are displayed by code (if any) plus name
|
||||||
|
self.assertEqual(
|
||||||
|
self.env["account.asset.group"]._name_search("FA"),
|
||||||
|
[(group_fa.id, "FA Fixed Assets")],
|
||||||
|
)
|
||||||
|
# Groups with code are shown by code in list views
|
||||||
|
self.assertEqual(
|
||||||
|
self.env["account.asset.group"]
|
||||||
|
.with_context(params={"view_type": "list"})
|
||||||
|
._name_search("FA"),
|
||||||
|
[(group_fa.id, "FA")],
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
self.env["account.asset.group"]._name_search("TFA"),
|
||||||
|
[(group_tfa.id, "TFA Tangible Fixed Assets")],
|
||||||
|
)
|
||||||
|
group_tfa.code = False
|
||||||
|
group_fa.code = False
|
||||||
|
self.assertEqual(group_fa.name_get(), [(group_fa.id, "Fixed Assets")])
|
||||||
|
# Groups without code are shown by truncated name in lists
|
||||||
|
self.assertEqual(
|
||||||
|
group_tfa.name_get(), [(group_tfa.id, "Tangible Fixed Assets")]
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
group_tfa.with_context(params={"view_type": "list"}).name_get(),
|
||||||
|
[(group_tfa.id, "Tangible Fixed A...")],
|
||||||
|
)
|
||||||
|
self.assertFalse(self.env["account.asset.group"]._name_search("stessA dexiF"))
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
# Copyright 2009-2019 Noviat.
|
# Copyright 2009-2019 Noviat.
|
||||||
# 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 time
|
||||||
|
|
||||||
from odoo import fields
|
from odoo import fields
|
||||||
from odoo.tests.common import SavepointCase
|
|
||||||
|
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
|
||||||
|
|
||||||
|
|
||||||
class TestAssetManagementXls(SavepointCase):
|
class TestAssetManagementXls(AccountTestInvoicingCommon):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
super(TestAssetManagementXls, cls).setUpClass()
|
super(TestAssetManagementXls, cls).setUpClass()
|
||||||
@ -14,11 +16,54 @@ class TestAssetManagementXls(SavepointCase):
|
|||||||
cls.xls_report_name = "{}.asset_report_xls".format(module)
|
cls.xls_report_name = "{}.asset_report_xls".format(module)
|
||||||
cls.wiz_model = cls.env["wiz.account.asset.report"]
|
cls.wiz_model = cls.env["wiz.account.asset.report"]
|
||||||
cls.company = cls.env.ref("base.main_company")
|
cls.company = cls.env.ref("base.main_company")
|
||||||
asset_group_id = cls.wiz_model._default_asset_group_id()
|
# Ensure we have something to report on
|
||||||
|
group_fa = cls.env["account.asset.group"].create(
|
||||||
|
{
|
||||||
|
"name": "Fixed Assets",
|
||||||
|
"code": "FA",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
group_tfa = cls.env["account.asset.group"].create(
|
||||||
|
{
|
||||||
|
"name": "Tangible Fixed Assets",
|
||||||
|
"code": "TFA",
|
||||||
|
"parent_id": group_fa.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
ict3Y = cls.env["account.asset.profile"].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,
|
||||||
|
"group_ids": [(6, 0, group_tfa.ids)],
|
||||||
|
"journal_id": cls.company_data["default_journal_purchase"].id,
|
||||||
|
"name": "Hardware - 3 Years",
|
||||||
|
"method_time": "year",
|
||||||
|
"method_number": 3,
|
||||||
|
"method_period": "year",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
cls.env["account.asset"].create(
|
||||||
|
{
|
||||||
|
"state": "draft",
|
||||||
|
"method_time": "year",
|
||||||
|
"method_number": 3,
|
||||||
|
"method_period": "year",
|
||||||
|
"name": "Laptop",
|
||||||
|
"code": "PI00101",
|
||||||
|
"purchase_value": 1500.0,
|
||||||
|
"profile_id": ict3Y.id,
|
||||||
|
"date_start": time.strftime("%Y-01-01"),
|
||||||
|
}
|
||||||
|
).validate()
|
||||||
fy_dates = cls.company.compute_fiscalyear_dates(fields.date.today())
|
fy_dates = cls.company.compute_fiscalyear_dates(fields.date.today())
|
||||||
|
|
||||||
wiz_vals = {
|
wiz_vals = {
|
||||||
"asset_group_id": asset_group_id,
|
"asset_group_id": group_fa.id,
|
||||||
"date_from": fy_dates["date_from"],
|
"date_from": fy_dates["date_from"],
|
||||||
"date_to": fy_dates["date_to"],
|
"date_to": fy_dates["date_to"],
|
||||||
}
|
}
|
||||||
@ -26,7 +71,7 @@ class TestAssetManagementXls(SavepointCase):
|
|||||||
cls.report_action = cls.xls_report.xls_export()
|
cls.report_action = cls.xls_report.xls_export()
|
||||||
|
|
||||||
def test_01_action_xls(self):
|
def test_01_action_xls(self):
|
||||||
""" Check report XLS action """
|
""" Check report XLS action and generate report """
|
||||||
self.assertGreaterEqual(
|
self.assertGreaterEqual(
|
||||||
self.report_action.items(),
|
self.report_action.items(),
|
||||||
{
|
{
|
||||||
@ -35,3 +80,7 @@ class TestAssetManagementXls(SavepointCase):
|
|||||||
"report_name": self.xls_report_name,
|
"report_name": self.xls_report_name,
|
||||||
}.items(),
|
}.items(),
|
||||||
)
|
)
|
||||||
|
model = self.env["report.%s" % self.report_action["report_name"]].with_context(
|
||||||
|
active_model=self.xls_report._name, **self.report_action["context"]
|
||||||
|
)
|
||||||
|
model.create_xlsx_report(self.xls_report.ids, data=self.report_action["data"])
|
||||||
|
Loading…
Reference in New Issue
Block a user