Browse Source

[FIX] account_financial_report: general_ledger

* centralization is only calculated on accounts where 'centralized' is True
* Cumul. Balance of each move_line fixed
* Ordering move_lines by date
* Fix trial_balance xlsx when not show_partner_details
pull/670/head
Joan Sisquella 5 years ago
parent
commit
66c0ab5926
  1. 78
      account_financial_report/report/general_ledger.py
  2. 18
      account_financial_report/report/general_ledger_xlsx.py
  3. 24
      account_financial_report/report/templates/general_ledger.xml
  4. 8
      account_financial_report/report/trial_balance_xlsx.py

78
account_financial_report/report/general_ledger.py

@ -25,6 +25,7 @@ class GeneralLedgerReport(models.AbstractModel):
"group_id": account.group_id.id, "group_id": account.group_id.id,
"currency_id": account.currency_id or False, "currency_id": account.currency_id or False,
"currency_name": account.currency_id.name, "currency_name": account.currency_id.name,
"centralized": account.centralized,
} }
} }
) )
@ -235,6 +236,7 @@ class GeneralLedgerReport(models.AbstractModel):
else: else:
prt_id = gl["partner_id"][0] prt_id = gl["partner_id"][0]
prt_name = gl["partner_id"][1] prt_name = gl["partner_id"][1]
prt_name = prt_name._value
if prt_id not in partners_ids: if prt_id not in partners_ids:
partners_ids.add(prt_id) partners_ids.add(prt_id)
partners_data.update({prt_id: {"id": prt_id, "name": prt_name}}) partners_data.update({prt_id: {"id": prt_id, "name": prt_name}})
@ -298,7 +300,7 @@ class GeneralLedgerReport(models.AbstractModel):
"partner_name": move_line["partner_id"][1] "partner_name": move_line["partner_id"][1]
if move_line["partner_id"] if move_line["partner_id"]
else "", else "",
"ref": move_line["name"],
"ref": "" if not move_line["ref"] else move_line["ref"],
"tax_ids": move_line["tax_ids"], "tax_ids": move_line["tax_ids"],
"debit": move_line["debit"], "debit": move_line["debit"],
"credit": move_line["credit"], "credit": move_line["credit"],
@ -420,6 +422,7 @@ class GeneralLedgerReport(models.AbstractModel):
"tax_ids", "tax_ids",
"analytic_tag_ids", "analytic_tag_ids",
"amount_currency", "amount_currency",
"ref",
] ]
move_lines = self.env["account.move.line"].search_read( move_lines = self.env["account.move.line"].search_read(
domain=domain, fields=ml_fields domain=domain, fields=ml_fields
@ -461,19 +464,9 @@ class GeneralLedgerReport(models.AbstractModel):
if not move_line["partner_id"]: if not move_line["partner_id"]:
prt_id = 0 prt_id = 0
partner_name = "Missing Partner" partner_name = "Missing Partner"
if gen_ld_data:
if prt_id not in gen_ld_data[acc_id]:
if prt_id not in partners_ids:
partners_ids.append(prt_id)
partners_data.update(
{prt_id: {"id": prt_id, "name": partner_name}}
)
gen_ld_data = self._initialize_partner(
gen_ld_data, acc_id, prt_id, foreign_currency
)
else:
partners_ids.append(prt_id) partners_ids.append(prt_id)
partners_data.update({prt_id: {"id": prt_id, "name": partner_name}}) partners_data.update({prt_id: {"id": prt_id, "name": partner_name}})
if prt_id not in gen_ld_data[acc_id]:
gen_ld_data = self._initialize_partner( gen_ld_data = self._initialize_partner(
gen_ld_data, acc_id, prt_id, foreign_currency gen_ld_data, acc_id, prt_id, foreign_currency
) )
@ -510,6 +503,13 @@ class GeneralLedgerReport(models.AbstractModel):
tags_data, tags_data,
) )
@api.model
def _recalculate_cumul_balance(self, move_lines, last_cumul_balance):
for move_line in move_lines:
move_line["balance"] += last_cumul_balance
last_cumul_balance = move_line["balance"]
return move_lines
@api.model @api.model
def _create_general_ledger(self, gen_led_data, accounts_data): def _create_general_ledger(self, gen_led_data, accounts_data):
general_ledger = [] general_ledger = []
@ -521,6 +521,7 @@ class GeneralLedgerReport(models.AbstractModel):
"name": accounts_data[acc_id]["name"], "name": accounts_data[acc_id]["name"],
"type": "account", "type": "account",
"currency_id": accounts_data[acc_id]["currency_id"], "currency_id": accounts_data[acc_id]["currency_id"],
"centralized": accounts_data[acc_id]["centralized"],
} }
) )
if not gen_led_data[acc_id]["partners"]: if not gen_led_data[acc_id]["partners"]:
@ -530,6 +531,10 @@ class GeneralLedgerReport(models.AbstractModel):
account.update({ml_id: gen_led_data[acc_id][ml_id]}) account.update({ml_id: gen_led_data[acc_id][ml_id]})
else: else:
move_lines += [gen_led_data[acc_id][ml_id]] move_lines += [gen_led_data[acc_id][ml_id]]
move_lines = sorted(move_lines, key=lambda k: (k["date"]))
move_lines = self._recalculate_cumul_balance(
move_lines, gen_led_data[acc_id]["init_bal"]["balance"]
)
account.update({"move_lines": move_lines}) account.update({"move_lines": move_lines})
else: else:
list_partner = [] list_partner = []
@ -546,6 +551,11 @@ class GeneralLedgerReport(models.AbstractModel):
) )
else: else:
move_lines += [gen_led_data[acc_id][prt_id][ml_id]] move_lines += [gen_led_data[acc_id][prt_id][ml_id]]
move_lines = sorted(move_lines, key=lambda k: (k["date"]))
move_lines = self._recalculate_cumul_balance(
move_lines,
gen_led_data[acc_id][prt_id]["init_bal"]["balance"],
)
partner.update({"move_lines": move_lines}) partner.update({"move_lines": move_lines})
list_partner += [partner] list_partner += [partner]
account.update({"list_partner": list_partner}) account.update({"list_partner": list_partner})
@ -553,12 +563,7 @@ class GeneralLedgerReport(models.AbstractModel):
return general_ledger return general_ledger
@api.model @api.model
def _get_centralized_ml(self, partners, date_to):
centralized_ml = {}
if isinstance(date_to, str):
date_to = datetime.datetime.strptime(date_to, "%Y-%m-%d").date()
for partner in partners:
for move_line in partner["move_lines"]:
def _calculate_centralization(self, centralized_ml, move_line, date_to):
jnl_id = move_line["journal_id"] jnl_id = move_line["journal_id"]
month = move_line["date"].month month = move_line["date"].month
if jnl_id not in centralized_ml.keys(): if jnl_id not in centralized_ml.keys():
@ -566,9 +571,7 @@ class GeneralLedgerReport(models.AbstractModel):
if month not in centralized_ml[jnl_id].keys(): if month not in centralized_ml[jnl_id].keys():
centralized_ml[jnl_id][month] = {} centralized_ml[jnl_id][month] = {}
last_day_month = calendar.monthrange(move_line["date"].year, month) last_day_month = calendar.monthrange(move_line["date"].year, month)
date = datetime.date(
move_line["date"].year, month, last_day_month[1]
)
date = datetime.date(move_line["date"].year, month, last_day_month[1])
if date > date_to: if date > date_to:
date = date_to date = date_to
centralized_ml[jnl_id][month].update( centralized_ml[jnl_id][month].update(
@ -592,8 +595,28 @@ class GeneralLedgerReport(models.AbstractModel):
) )
centralized_ml[jnl_id][month]["debit"] += move_line["debit"] centralized_ml[jnl_id][month]["debit"] += move_line["debit"]
centralized_ml[jnl_id][month]["credit"] += move_line["credit"] centralized_ml[jnl_id][month]["credit"] += move_line["credit"]
centralized_ml[jnl_id][month]["balance"] += move_line["balance"]
centralized_ml[jnl_id][month]["balance"] += (
move_line["debit"] - move_line["credit"]
)
centralized_ml[jnl_id][month]["bal_curr"] += move_line["bal_curr"] centralized_ml[jnl_id][month]["bal_curr"] += move_line["bal_curr"]
return centralized_ml
@api.model
def _get_centralized_ml(self, account, date_to):
centralized_ml = {}
if isinstance(date_to, str):
date_to = datetime.datetime.strptime(date_to, "%Y-%m-%d").date()
if account["partners"]:
for partner in account["list_partner"]:
for move_line in partner["move_lines"]:
centralized_ml = self._calculate_centralization(
centralized_ml, move_line, date_to,
)
else:
for move_line in account["move_lines"]:
centralized_ml = self._calculate_centralization(
centralized_ml, move_line, date_to,
)
list_centralized_ml = [] list_centralized_ml = []
for jnl_id in centralized_ml.keys(): for jnl_id in centralized_ml.keys():
list_centralized_ml += list(centralized_ml[jnl_id].values()) list_centralized_ml += list(centralized_ml[jnl_id].values())
@ -659,11 +682,14 @@ class GeneralLedgerReport(models.AbstractModel):
general_ledger = self._create_general_ledger(gen_ld_data, accounts_data) general_ledger = self._create_general_ledger(gen_ld_data, accounts_data)
if centralize: if centralize:
for account in general_ledger: for account in general_ledger:
if account["partners"]:
centralized_ml = self._get_centralized_ml(
account["list_partner"], date_to
)
if account["centralized"]:
centralized_ml = self._get_centralized_ml(account, date_to)
account["move_lines"] = centralized_ml account["move_lines"] = centralized_ml
account["move_lines"] = self._recalculate_cumul_balance(
account["move_lines"],
gen_ld_data[account["id"]]["init_bal"]["balance"],
)
if account["partners"]:
account["partners"] = False account["partners"] = False
del account["list_partner"] del account["list_partner"]
general_ledger = sorted(general_ledger, key=lambda k: k["code"]) general_ledger = sorted(general_ledger, key=lambda k: k["code"])

18
account_financial_report/report/general_ledger_xlsx.py

@ -189,6 +189,19 @@ class GeneralLedgerXslx(models.AbstractModel):
{"taxes_description": taxes_description, "tags": tags} {"taxes_description": taxes_description, "tags": tags}
) )
self.write_line_from_dict(line) self.write_line_from_dict(line)
# Display ending balance line for account
account.update(
{
"final_debit": account["fin_bal"]["debit"],
"final_credit": account["fin_bal"]["credit"],
"final_balance": account["fin_bal"]["balance"],
}
)
if foreign_currency:
account.update(
{"final_bal_curr": account["fin_bal"]["bal_curr"],}
)
self.write_ending_balance_from_dict(account)
else: else:
# For each partner # For each partner
@ -258,7 +271,6 @@ class GeneralLedgerXslx(models.AbstractModel):
# Line break # Line break
self.row_pos += 1 self.row_pos += 1
# Display ending balance line for account
if not filter_partner_ids: if not filter_partner_ids:
account.update( account.update(
{ {
@ -268,7 +280,9 @@ class GeneralLedgerXslx(models.AbstractModel):
} }
) )
if foreign_currency: if foreign_currency:
account.update({"final_bal_curr": account["fin_bal"]["bal_curr"]})
account.update(
{"final_bal_curr": account["fin_bal"]["bal_curr"],}
)
self.write_ending_balance_from_dict(account) self.write_ending_balance_from_dict(account)
# 2 lines break # 2 lines break

24
account_financial_report/report/templates/general_ledger.xml

@ -12,6 +12,7 @@
<template id="report_general_ledger_base"> <template id="report_general_ledger_base">
<!-- Saved flag fields into variables, used to define columns display --> <!-- Saved flag fields into variables, used to define columns display -->
<t t-set="foreign_currency" t-value="foreign_currency" /> <t t-set="foreign_currency" t-value="foreign_currency" />
<t t-set="filter_partner_ids" t-value="filter_partner_ids" />
<!-- Defines global variables used by internal layout --> <!-- Defines global variables used by internal layout -->
<t t-set="title">General Ledger - <t t-raw="company_name" /> - <t <t t-set="title">General Ledger - <t t-raw="company_name" /> - <t
t-raw="currency_name" t-raw="currency_name"
@ -46,10 +47,16 @@
> >
<t t-set="account_or_partner_object" t-value="account" /> <t t-set="account_or_partner_object" t-value="account" />
</t> </t>
<!-- Display account footer -->
<t
t-call="account_financial_report.report_general_ledger_ending_cumul"
>
<t t-set="account_or_partner_object" t-value="account" />
<t t-set="type" t-value='"account_type"' />
</t>
</t> </t>
<t t-if="account['partners']"> <t t-if="account['partners']">
<!-- Display account partners --> <!-- Display account partners -->
<t t-if="not centralize">
<t t-foreach="account['list_partner']" t-as="partner"> <t t-foreach="account['list_partner']" t-as="partner">
<t t-set="type" t-value='"partner_type"' /> <t t-set="type" t-value='"partner_type"' />
<div class="page_break"> <div class="page_break">
@ -78,18 +85,21 @@
/> />
<t t-set="type" t-value='"partner_type"' /> <t t-set="type" t-value='"partner_type"' />
</t> </t>
</div>
</t>
</t>
</t>
<!-- Display account footer --> <!-- Display account footer -->
<t t-if="not filter_partner_ids">
<t <t
t-if="not account['partners']"
t-call="account_financial_report.report_general_ledger_ending_cumul" t-call="account_financial_report.report_general_ledger_ending_cumul"
> >
<t t-set="account_or_partner_object" t-value="account" />
<t
t-set="account_or_partner_object"
t-value="account"
/>
<t t-set="type" t-value='"account_type"' /> <t t-set="type" t-value='"account_type"' />
</t> </t>
</t>
</div>
</t>
</t>
</div> </div>
</t> </t>
</div> </div>

8
account_financial_report/report/trial_balance_xlsx.py

@ -45,13 +45,13 @@ class TrialBalanceXslx(models.AbstractModel):
}, },
5: { 5: {
"header": _("Period balance"), "header": _("Period balance"),
"field": "period_balance",
"field": "balance",
"type": "amount", "type": "amount",
"width": 14, "width": 14,
}, },
6: { 6: {
"header": _("Ending balance"), "header": _("Ending balance"),
"field": "final_balance",
"field": "ending_balance",
"type": "amount", "type": "amount",
"width": 14, "width": 14,
}, },
@ -67,13 +67,13 @@ class TrialBalanceXslx(models.AbstractModel):
}, },
8: { 8: {
"header": _("Initial balance"), "header": _("Initial balance"),
"field": "initial_balance_foreign_currency",
"field": "initial_currency_balance",
"type": "amount_currency", "type": "amount_currency",
"width": 14, "width": 14,
}, },
9: { 9: {
"header": _("Ending balance"), "header": _("Ending balance"),
"field": "final_balance_foreign_currency",
"field": "ending_currency_balance",
"type": "amount_currency", "type": "amount_currency",
"width": 14, "width": 14,
}, },

Loading…
Cancel
Save