diff --git a/account_financial_report/report/general_ledger.py b/account_financial_report/report/general_ledger.py index b427bb8c..43677d69 100644 --- a/account_financial_report/report/general_ledger.py +++ b/account_financial_report/report/general_ledger.py @@ -25,6 +25,7 @@ class GeneralLedgerReport(models.AbstractModel): "group_id": account.group_id.id, "currency_id": account.currency_id or False, "currency_name": account.currency_id.name, + "centralized": account.centralized, } } ) @@ -235,6 +236,7 @@ class GeneralLedgerReport(models.AbstractModel): else: prt_id = gl["partner_id"][0] prt_name = gl["partner_id"][1] + prt_name = prt_name._value if prt_id not in partners_ids: partners_ids.add(prt_id) 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] if move_line["partner_id"] else "", - "ref": move_line["name"], + "ref": "" if not move_line["ref"] else move_line["ref"], "tax_ids": move_line["tax_ids"], "debit": move_line["debit"], "credit": move_line["credit"], @@ -420,6 +422,7 @@ class GeneralLedgerReport(models.AbstractModel): "tax_ids", "analytic_tag_ids", "amount_currency", + "ref", ] move_lines = self.env["account.move.line"].search_read( domain=domain, fields=ml_fields @@ -461,19 +464,9 @@ class GeneralLedgerReport(models.AbstractModel): if not move_line["partner_id"]: prt_id = 0 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_data.update({prt_id: {"id": prt_id, "name": partner_name}}) + partners_ids.append(prt_id) + 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, acc_id, prt_id, foreign_currency ) @@ -510,6 +503,13 @@ class GeneralLedgerReport(models.AbstractModel): 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 def _create_general_ledger(self, gen_led_data, accounts_data): general_ledger = [] @@ -521,6 +521,7 @@ class GeneralLedgerReport(models.AbstractModel): "name": accounts_data[acc_id]["name"], "type": "account", "currency_id": accounts_data[acc_id]["currency_id"], + "centralized": accounts_data[acc_id]["centralized"], } ) 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]}) else: 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}) else: list_partner = [] @@ -546,6 +551,11 @@ class GeneralLedgerReport(models.AbstractModel): ) else: 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}) list_partner += [partner] account.update({"list_partner": list_partner}) @@ -553,47 +563,60 @@ class GeneralLedgerReport(models.AbstractModel): return general_ledger @api.model - def _get_centralized_ml(self, partners, date_to): + def _calculate_centralization(self, centralized_ml, move_line, date_to): + jnl_id = move_line["journal_id"] + month = move_line["date"].month + if jnl_id not in centralized_ml.keys(): + centralized_ml[jnl_id] = {} + if month not in centralized_ml[jnl_id].keys(): + centralized_ml[jnl_id][month] = {} + last_day_month = calendar.monthrange(move_line["date"].year, month) + date = datetime.date(move_line["date"].year, month, last_day_month[1]) + if date > date_to: + date = date_to + centralized_ml[jnl_id][month].update( + { + "journal_id": jnl_id, + "ref": "Centralized entries", + "date": date, + "debit": 0.0, + "credit": 0.0, + "balance": 0.0, + "bal_curr": 0.0, + "partner_id": False, + "rec_id": 0, + "entry_id": False, + "tax_ids": [], + "full_reconcile_id": False, + "id": False, + "tag_ids": False, + "currency_id": False, + } + ) + centralized_ml[jnl_id][month]["debit"] += move_line["debit"] + centralized_ml[jnl_id][month]["credit"] += move_line["credit"] + centralized_ml[jnl_id][month]["balance"] += ( + move_line["debit"] - move_line["credit"] + ) + 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() - for partner in partners: - for move_line in partner["move_lines"]: - jnl_id = move_line["journal_id"] - month = move_line["date"].month - if jnl_id not in centralized_ml.keys(): - centralized_ml[jnl_id] = {} - if month not in centralized_ml[jnl_id].keys(): - centralized_ml[jnl_id][month] = {} - last_day_month = calendar.monthrange(move_line["date"].year, month) - date = datetime.date( - move_line["date"].year, month, last_day_month[1] - ) - if date > date_to: - date = date_to - centralized_ml[jnl_id][month].update( - { - "journal_id": jnl_id, - "ref": "Centralized entries", - "date": date, - "debit": 0.0, - "credit": 0.0, - "balance": 0.0, - "bal_curr": 0.0, - "partner_id": False, - "rec_id": 0, - "entry_id": False, - "tax_ids": [], - "full_reconcile_id": False, - "id": False, - "tag_ids": False, - "currency_id": False, - } + 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, ) - centralized_ml[jnl_id][month]["debit"] += move_line["debit"] - centralized_ml[jnl_id][month]["credit"] += move_line["credit"] - centralized_ml[jnl_id][month]["balance"] += move_line["balance"] - centralized_ml[jnl_id][month]["bal_curr"] += move_line["bal_curr"] + else: + for move_line in account["move_lines"]: + centralized_ml = self._calculate_centralization( + centralized_ml, move_line, date_to, + ) list_centralized_ml = [] for jnl_id in centralized_ml.keys(): list_centralized_ml += list(centralized_ml[jnl_id].values()) @@ -659,13 +682,16 @@ class GeneralLedgerReport(models.AbstractModel): general_ledger = self._create_general_ledger(gen_ld_data, accounts_data) if centralize: 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["partners"] = False - del account["list_partner"] + account["move_lines"] = self._recalculate_cumul_balance( + account["move_lines"], + gen_ld_data[account["id"]]["init_bal"]["balance"], + ) + if account["partners"]: + account["partners"] = False + del account["list_partner"] general_ledger = sorted(general_ledger, key=lambda k: k["code"]) return { "doc_ids": [wizard_id], diff --git a/account_financial_report/report/general_ledger_xlsx.py b/account_financial_report/report/general_ledger_xlsx.py index bfe8c112..ff2da940 100644 --- a/account_financial_report/report/general_ledger_xlsx.py +++ b/account_financial_report/report/general_ledger_xlsx.py @@ -189,6 +189,19 @@ class GeneralLedgerXslx(models.AbstractModel): {"taxes_description": taxes_description, "tags": tags} ) 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: # For each partner @@ -258,18 +271,19 @@ class GeneralLedgerXslx(models.AbstractModel): # Line break self.row_pos += 1 - # Display ending balance line for account - if not filter_partner_ids: - 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) + if not filter_partner_ids: + 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) # 2 lines break self.row_pos += 2 diff --git a/account_financial_report/report/templates/general_ledger.xml b/account_financial_report/report/templates/general_ledger.xml index 8e40ceb7..cf1f13cb 100644 --- a/account_financial_report/report/templates/general_ledger.xml +++ b/account_financial_report/report/templates/general_ledger.xml @@ -12,6 +12,7 @@