account-closing/account_multicurrency_revaluation/report/currency_unrealized_report.py

97 lines
3.5 KiB
Python
Raw Permalink Normal View History

2022-06-29 18:32:15 +00:00
# Copyright 2012-2018 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
from flectra import api, models
class ShellAccount(object):
"""Small class that avoid to override account account object.
only for pure performance reason.
Browsing an account account object is not efficient
because of function fields
This object aims to be easily transposed to account account if needed
"""
def __init__(self, account):
self.cursor = account.env.cr
tmp = account.read(["id", "name", "code", "currency_revaluation"])
self.account_id = tmp[0]["id"]
self.ordered_lines = []
self.keys_to_sum = [
"gl_foreign_balance",
"gl_currency_rate",
"gl_revaluated_balance",
"gl_balance",
"gl_ytd_balance",
]
def __contains__(self, key):
return hasattr(self, key)
def get_lines(self):
"""Get all line account move line that are need on report for current
account.
"""
sql = """SELECT res_partner.name,
account_move_line.date,
account_move_line.gl_foreign_balance,
account_move_line.gl_currency_rate,
account_move_line.gl_revaluated_balance,
account_move_line.gl_balance,
account_move_line.gl_revaluated_balance -
account_move_line.gl_balance as gl_ytd_balance,
res_currency.name as curr_name
FROM account_move_line
LEFT join res_partner on
(account_move_line.partner_id = res_partner.id)
LEFT join account_move on
(account_move_line.move_id = account_move.id)
LEFT join res_currency on
(account_move_line.currency_id = res_currency.id)
WHERE account_move_line.account_id = %s
AND account_move_line.gl_balance is not null
ORDER BY res_partner.name,
account_move_line.gl_foreign_balance,
account_move_line.date"""
self.cursor.execute(sql, [self.account_id])
self.ordered_lines = self.cursor.dictfetchall()
return self.ordered_lines
def compute_totals(self):
"""Compute the sum of values in self.ordered_lines"""
totals = dict.fromkeys(self.keys_to_sum, 0.0)
for line in self.ordered_lines:
for tot in self.keys_to_sum:
totals[tot] += line.get(tot, 0.0)
for key, val in totals.items():
setattr(self, key + "_total", val)
class CurrencyUnrealizedReport(models.AbstractModel):
_name = "report.account_multicurrency_revaluation.curr_unrealized_report"
_description = "Currency Unrealized Report"
@api.model
def _get_report_values(self, docids, data=None):
shell_accounts = {}
docs = self.env["account.account"]
data = data if data is not None else {}
accounts = docs.browse(docids)
for account in accounts:
acc = ShellAccount(account)
acc.get_lines()
if acc.ordered_lines:
docs |= account
shell_accounts[account.id] = acc
acc.compute_totals()
docargs = {
"doc_ids": docs.ids,
"doc_model": "account.account",
"docs": docs,
"shell_accounts": shell_accounts,
"data": data.get("form", False),
}
return docargs