You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

753 lines
32 KiB

  1. # © 2016 Julien Coux (Camptocamp)
  2. # © 2018 Forest and Biomass Romania SA
  3. # Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com)
  4. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  5. from odoo import api, models
  6. class TrialBalanceReport(models.AbstractModel):
  7. _name = "report.account_financial_report.trial_balance"
  8. _description = "Trial Balance Report"
  9. @api.model
  10. def get_html(self, given_context=None):
  11. return self._get_html()
  12. def _get_html(self):
  13. result = {}
  14. rcontext = {}
  15. context = dict(self.env.context)
  16. rcontext.update(context.get("data"))
  17. active_id = context.get("active_id")
  18. wiz = self.env["open.items.report.wizard"].browse(active_id)
  19. rcontext["o"] = wiz
  20. result["html"] = self.env.ref(
  21. "account_financial_report.report_trial_balance"
  22. ).render(rcontext)
  23. return result
  24. def _get_accounts_data(self, account_ids):
  25. accounts = self.env["account.account"].browse(account_ids)
  26. accounts_data = {}
  27. for account in accounts:
  28. accounts_data.update(
  29. {
  30. account.id: {
  31. "id": account.id,
  32. "code": account.code,
  33. "name": account.name,
  34. "group_id": account.group_id.id,
  35. "hide_account": False,
  36. "currency_id": account.currency_id or False,
  37. "currency_name": account.currency_id.name,
  38. }
  39. }
  40. )
  41. return accounts_data
  42. def _get_initial_balances_bs_ml_domain(
  43. self,
  44. account_ids,
  45. journal_ids,
  46. partner_ids,
  47. company_id,
  48. date_from,
  49. only_posted_moves,
  50. show_partner_details,
  51. ):
  52. accounts_domain = [
  53. ("company_id", "=", company_id),
  54. ("user_type_id.include_initial_balance", "=", True),
  55. ]
  56. if account_ids:
  57. accounts_domain += [("id", "in", account_ids)]
  58. domain = [("date", "<", date_from)]
  59. accounts = self.env["account.account"].search(accounts_domain)
  60. domain += [("account_id", "in", accounts.ids)]
  61. if company_id:
  62. domain += [("company_id", "=", company_id)]
  63. if journal_ids:
  64. domain += [("journal_id", "in", journal_ids)]
  65. if partner_ids:
  66. domain += [("partner_id", "in", partner_ids)]
  67. if only_posted_moves:
  68. domain += [("move_id.state", "=", "posted")]
  69. if show_partner_details:
  70. domain += [("account_id.internal_type", "in", ["receivable", "payable"])]
  71. return domain
  72. def _get_initial_balances_pl_ml_domain(
  73. self,
  74. account_ids,
  75. journal_ids,
  76. partner_ids,
  77. company_id,
  78. date_from,
  79. only_posted_moves,
  80. show_partner_details,
  81. fy_start_date,
  82. ):
  83. accounts_domain = [
  84. ("company_id", "=", company_id),
  85. ("user_type_id.include_initial_balance", "=", False),
  86. ]
  87. if account_ids:
  88. accounts_domain += [("id", "in", account_ids)]
  89. domain = [("date", "<", date_from), ("date", ">=", fy_start_date)]
  90. accounts = self.env["account.account"].search(accounts_domain)
  91. domain += [("account_id", "in", accounts.ids)]
  92. if company_id:
  93. domain += [("company_id", "=", company_id)]
  94. if journal_ids:
  95. domain += [("journal_id", "in", journal_ids)]
  96. if partner_ids:
  97. domain += [("partner_id", "in", partner_ids)]
  98. if only_posted_moves:
  99. domain += [("move_id.state", "=", "posted")]
  100. if show_partner_details:
  101. domain += [("account_id.internal_type", "in", ["receivable", "payable"])]
  102. return domain
  103. @api.model
  104. def _get_period_ml_domain(
  105. self,
  106. account_ids,
  107. journal_ids,
  108. partner_ids,
  109. company_id,
  110. date_to,
  111. date_from,
  112. only_posted_moves,
  113. show_partner_details,
  114. ):
  115. domain = [
  116. ("display_type", "=", False),
  117. ("date", ">=", date_from),
  118. ("date", "<=", date_to),
  119. ]
  120. if company_id:
  121. domain += [("company_id", "=", company_id)]
  122. if account_ids:
  123. domain += [("account_id", "in", account_ids)]
  124. if journal_ids:
  125. domain += [("journal_id", "in", journal_ids)]
  126. if partner_ids:
  127. domain += [("partner_id", "in", partner_ids)]
  128. if only_posted_moves:
  129. domain += [("move_id.state", "=", "posted")]
  130. if show_partner_details:
  131. domain += [("account_id.internal_type", "in", ["receivable", "payable"])]
  132. return domain
  133. def _get_initial_balance_fy_pl_ml_domain(
  134. self,
  135. account_ids,
  136. journal_ids,
  137. partner_ids,
  138. company_id,
  139. fy_start_date,
  140. only_posted_moves,
  141. show_partner_details,
  142. ):
  143. accounts_domain = [
  144. ("company_id", "=", company_id),
  145. ("user_type_id.include_initial_balance", "=", False),
  146. ]
  147. if account_ids:
  148. accounts_domain += [("id", "in", account_ids)]
  149. domain = [("date", "<", fy_start_date)]
  150. accounts = self.env["account.account"].search(accounts_domain)
  151. domain += [("account_id", "in", accounts.ids)]
  152. if company_id:
  153. domain += [("company_id", "=", company_id)]
  154. if journal_ids:
  155. domain += [("journal_id", "in", journal_ids)]
  156. if partner_ids:
  157. domain += [("partner_id", "in", partner_ids)]
  158. if only_posted_moves:
  159. domain += [("move_id.state", "=", "posted")]
  160. if show_partner_details:
  161. domain += [("account_id.internal_type", "in", ["receivable", "payable"])]
  162. return domain
  163. def _get_pl_initial_balance(
  164. self,
  165. account_ids,
  166. journal_ids,
  167. partner_ids,
  168. company_id,
  169. fy_start_date,
  170. only_posted_moves,
  171. show_partner_details,
  172. foreign_currency,
  173. ):
  174. domain = self._get_initial_balance_fy_pl_ml_domain(
  175. account_ids,
  176. journal_ids,
  177. partner_ids,
  178. company_id,
  179. fy_start_date,
  180. only_posted_moves,
  181. show_partner_details,
  182. )
  183. initial_balances = self.env["account.move.line"].read_group(
  184. domain=domain,
  185. fields=["account_id", "balance", "amount_currency"],
  186. groupby=["account_id"],
  187. )
  188. pl_initial_balance = 0.0
  189. pl_initial_currency_balance = 0.0
  190. for initial_balance in initial_balances:
  191. pl_initial_balance += initial_balance["balance"]
  192. if foreign_currency:
  193. pl_initial_currency_balance += round(
  194. initial_balance["amount_currency"], 2
  195. )
  196. return pl_initial_balance, pl_initial_currency_balance
  197. def _get_data(
  198. self,
  199. account_ids,
  200. journal_ids,
  201. partner_ids,
  202. company_id,
  203. date_to,
  204. date_from,
  205. foreign_currency,
  206. only_posted_moves,
  207. show_partner_details,
  208. hide_account_at_0,
  209. unaffected_earnings_account,
  210. fy_start_date,
  211. ):
  212. accounts_domain = [("company_id", "=", company_id)]
  213. if account_ids:
  214. accounts_domain += [("id", "in", account_ids)]
  215. accounts = self.env["account.account"].search(accounts_domain)
  216. tb_initial_acc = []
  217. for account in accounts:
  218. tb_initial_acc.append(
  219. {"account_id": account.id, "balance": 0.0, "amount_currency": 0.0}
  220. )
  221. initial_domain_bs = self._get_initial_balances_bs_ml_domain(
  222. account_ids,
  223. journal_ids,
  224. partner_ids,
  225. company_id,
  226. date_from,
  227. only_posted_moves,
  228. show_partner_details,
  229. )
  230. tb_initial_acc_bs = self.env["account.move.line"].read_group(
  231. domain=initial_domain_bs,
  232. fields=["account_id", "balance", "amount_currency"],
  233. groupby=["account_id"],
  234. )
  235. initial_domain_pl = self._get_initial_balances_pl_ml_domain(
  236. account_ids,
  237. journal_ids,
  238. partner_ids,
  239. company_id,
  240. date_from,
  241. only_posted_moves,
  242. show_partner_details,
  243. fy_start_date,
  244. )
  245. tb_initial_acc_pl = self.env["account.move.line"].read_group(
  246. domain=initial_domain_pl,
  247. fields=["account_id", "balance", "amount_currency"],
  248. groupby=["account_id"],
  249. )
  250. tb_initial_acc_rg = tb_initial_acc_bs + tb_initial_acc_pl
  251. for account_rg in tb_initial_acc_rg:
  252. element = list(
  253. filter(
  254. lambda acc_dict: acc_dict["account_id"]
  255. == account_rg["account_id"][0],
  256. tb_initial_acc,
  257. )
  258. )
  259. if element:
  260. element[0]["balance"] += account_rg["balance"]
  261. element[0]["amount_currency"] += account_rg["amount_currency"]
  262. if hide_account_at_0:
  263. tb_initial_acc = [p for p in tb_initial_acc if p["balance"] != 0]
  264. period_domain = self._get_period_ml_domain(
  265. account_ids,
  266. journal_ids,
  267. partner_ids,
  268. company_id,
  269. date_to,
  270. date_from,
  271. only_posted_moves,
  272. show_partner_details,
  273. )
  274. tb_period_acc = self.env["account.move.line"].read_group(
  275. domain=period_domain,
  276. fields=["account_id", "debit", "credit", "balance", "amount_currency"],
  277. groupby=["account_id"],
  278. )
  279. if show_partner_details:
  280. tb_initial_prt_bs = self.env["account.move.line"].read_group(
  281. domain=initial_domain_bs,
  282. fields=["account_id", "partner_id", "balance", "amount_currency"],
  283. groupby=["account_id", "partner_id"],
  284. lazy=False,
  285. )
  286. tb_initial_prt_pl = self.env["account.move.line"].read_group(
  287. domain=initial_domain_pl,
  288. fields=["account_id", "partner_id", "balance", "amount_currency"],
  289. groupby=["account_id", "partner_id"],
  290. )
  291. tb_initial_prt = tb_initial_prt_bs + tb_initial_prt_pl
  292. if hide_account_at_0:
  293. tb_initial_prt = [p for p in tb_initial_prt if p["balance"] != 0]
  294. tb_period_prt = self.env["account.move.line"].read_group(
  295. domain=period_domain,
  296. fields=[
  297. "account_id",
  298. "partner_id",
  299. "debit",
  300. "credit",
  301. "balance",
  302. "amount_currency",
  303. ],
  304. groupby=["account_id", "partner_id"],
  305. lazy=False,
  306. )
  307. total_amount = {}
  308. partners_data = []
  309. for tb in tb_period_acc:
  310. acc_id = tb["account_id"][0]
  311. total_amount[acc_id] = {}
  312. total_amount[acc_id]["credit"] = tb["credit"]
  313. total_amount[acc_id]["debit"] = tb["debit"]
  314. total_amount[acc_id]["balance"] = tb["balance"]
  315. total_amount[acc_id]["initial_balance"] = 0.0
  316. total_amount[acc_id]["ending_balance"] = tb["balance"]
  317. if foreign_currency:
  318. total_amount[acc_id]["initial_currency_balance"] = 0.0
  319. total_amount[acc_id]["ending_currency_balance"] = round(
  320. tb["amount_currency"], 2
  321. )
  322. for tb in tb_initial_acc:
  323. acc_id = tb["account_id"]
  324. if acc_id not in total_amount.keys():
  325. total_amount[acc_id] = {}
  326. total_amount[acc_id]["credit"] = 0.0
  327. total_amount[acc_id]["debit"] = 0.0
  328. total_amount[acc_id]["balance"] = 0.0
  329. total_amount[acc_id]["initial_balance"] = tb["balance"]
  330. total_amount[acc_id]["ending_balance"] = tb["balance"]
  331. if foreign_currency:
  332. total_amount[acc_id]["initial_currency_balance"] = round(
  333. tb["amount_currency"], 2
  334. )
  335. total_amount[acc_id]["ending_currency_balance"] = round(
  336. tb["amount_currency"], 2
  337. )
  338. else:
  339. total_amount[acc_id]["initial_balance"] = tb["balance"]
  340. total_amount[acc_id]["ending_balance"] += tb["balance"]
  341. if foreign_currency:
  342. total_amount[acc_id]["initial_currency_balance"] = round(
  343. tb["amount_currency"], 2
  344. )
  345. total_amount[acc_id]["ending_currency_balance"] += round(
  346. tb["amount_currency"], 2
  347. )
  348. if show_partner_details:
  349. partners_ids = set()
  350. partners_data = {}
  351. for tb in tb_period_prt:
  352. acc_id = tb["account_id"][0]
  353. if tb["partner_id"]:
  354. prt_id = tb["partner_id"][0]
  355. if tb["partner_id"] not in partners_ids:
  356. partners_data.update(
  357. {prt_id: {"id": prt_id, "name": tb["partner_id"][1]}}
  358. )
  359. total_amount[acc_id][prt_id] = {}
  360. total_amount[acc_id][prt_id]["credit"] = tb["credit"]
  361. total_amount[acc_id][prt_id]["debit"] = tb["debit"]
  362. total_amount[acc_id][prt_id]["balance"] = tb["balance"]
  363. total_amount[acc_id][prt_id]["initial_balance"] = 0.0
  364. total_amount[acc_id][prt_id]["ending_balance"] = tb["balance"]
  365. if foreign_currency:
  366. total_amount[acc_id][prt_id]["initial_currency_balance"] = 0.0
  367. total_amount[acc_id][prt_id]["ending_currency_balance"] = round(
  368. tb["amount_currency"], 2
  369. )
  370. partners_ids.add(tb["partner_id"])
  371. for tb in tb_initial_prt:
  372. acc_id = tb["account_id"][0]
  373. if tb["partner_id"]:
  374. prt_id = tb["partner_id"][0]
  375. if tb["partner_id"] not in partners_ids:
  376. partners_data.update(
  377. {prt_id: {"id": prt_id, "name": tb["partner_id"][1]}}
  378. )
  379. if acc_id not in total_amount.keys():
  380. total_amount[acc_id][prt_id] = {}
  381. total_amount[acc_id][prt_id]["credit"] = 0.0
  382. total_amount[acc_id][prt_id]["debit"] = 0.0
  383. total_amount[acc_id][prt_id]["balance"] = 0.0
  384. total_amount[acc_id][prt_id]["initial_balance"] = tb["balance"]
  385. total_amount[acc_id][prt_id]["ending_balance"] = tb["balance"]
  386. if foreign_currency:
  387. total_amount[acc_id][prt_id][
  388. "initial_currency_balance"
  389. ] = round(tb["amount_currency"], 2)
  390. total_amount[acc_id][prt_id][
  391. "ending_currency_balance"
  392. ] = round(tb["amount_currency"], 2)
  393. partners_ids.add(tb["partner_id"])
  394. elif prt_id not in total_amount[acc_id].keys():
  395. total_amount[acc_id][prt_id] = {}
  396. total_amount[acc_id][prt_id]["credit"] = 0.0
  397. total_amount[acc_id][prt_id]["debit"] = 0.0
  398. total_amount[acc_id][prt_id]["balance"] = 0.0
  399. total_amount[acc_id][prt_id]["initial_balance"] = tb["balance"]
  400. total_amount[acc_id][prt_id]["ending_balance"] = tb["balance"]
  401. if foreign_currency:
  402. total_amount[acc_id][prt_id][
  403. "initial_currency_balance"
  404. ] = round(tb["amount_currency"], 2)
  405. total_amount[acc_id][prt_id][
  406. "ending_currency_balance"
  407. ] = round(tb["amount_currency"], 2)
  408. partners_ids.add(tb["partner_id"])
  409. else:
  410. total_amount[acc_id][prt_id]["initial_balance"] += tb["balance"]
  411. total_amount[acc_id][prt_id]["ending_balance"] += tb["balance"]
  412. if foreign_currency:
  413. total_amount[acc_id][prt_id][
  414. "initial_currency_balance"
  415. ] += round(tb["amount_currency"], 2)
  416. total_amount[acc_id][prt_id][
  417. "ending_currency_balance"
  418. ] += round(tb["amount_currency"], 2)
  419. accounts_ids = list(total_amount.keys())
  420. unaffected_id = unaffected_earnings_account
  421. if unaffected_id not in accounts_ids:
  422. accounts_ids.append(unaffected_id)
  423. total_amount[unaffected_id] = {}
  424. total_amount[unaffected_id]["initial_balance"] = 0.0
  425. total_amount[unaffected_id]["balance"] = 0.0
  426. total_amount[unaffected_id]["credit"] = 0.0
  427. total_amount[unaffected_id]["debit"] = 0.0
  428. total_amount[unaffected_id]["ending_balance"] = 0.0
  429. if foreign_currency:
  430. total_amount[unaffected_id]["initial_currency_balance"] = 0.0
  431. total_amount[unaffected_id]["ending_currency_balance"] = 0.0
  432. accounts_data = self._get_accounts_data(accounts_ids)
  433. pl_initial_balance, pl_initial_currency_balance = self._get_pl_initial_balance(
  434. account_ids,
  435. journal_ids,
  436. partner_ids,
  437. company_id,
  438. fy_start_date,
  439. only_posted_moves,
  440. show_partner_details,
  441. foreign_currency,
  442. )
  443. total_amount[unaffected_id]["ending_balance"] += pl_initial_balance
  444. total_amount[unaffected_id]["initial_balance"] += pl_initial_balance
  445. if foreign_currency:
  446. total_amount[unaffected_id][
  447. "ending_currency_balance"
  448. ] += pl_initial_currency_balance
  449. total_amount[unaffected_id][
  450. "initial_currency_balance"
  451. ] += pl_initial_currency_balance
  452. return total_amount, accounts_data, partners_data
  453. def _get_hierarchy_groups(
  454. self, group_ids, groups_data, old_groups_ids, foreign_currency
  455. ):
  456. new_parents = False
  457. for group_id in group_ids:
  458. if groups_data[group_id]["parent_id"]:
  459. new_parents = True
  460. nw_id = groups_data[group_id]["parent_id"]
  461. if nw_id in groups_data.keys():
  462. groups_data[nw_id]["initial_balance"] += groups_data[group_id][
  463. "initial_balance"
  464. ]
  465. groups_data[nw_id]["debit"] += groups_data[group_id]["debit"]
  466. groups_data[nw_id]["credit"] += groups_data[group_id]["credit"]
  467. groups_data[nw_id]["balance"] += groups_data[group_id]["balance"]
  468. groups_data[nw_id]["ending_balance"] += groups_data[group_id][
  469. "ending_balance"
  470. ]
  471. if foreign_currency:
  472. groups_data[nw_id]["initial_currency_balance"] += groups_data[
  473. group_id
  474. ]["initial_currency_balance"]
  475. groups_data[nw_id]["ending_currency_balance"] += groups_data[
  476. group_id
  477. ]["ending_currency_balance"]
  478. else:
  479. groups_data[nw_id] = {}
  480. groups_data[nw_id]["initial_balance"] = groups_data[group_id][
  481. "initial_balance"
  482. ]
  483. groups_data[nw_id]["debit"] = groups_data[group_id]["debit"]
  484. groups_data[nw_id]["credit"] = groups_data[group_id]["credit"]
  485. groups_data[nw_id]["balance"] = groups_data[group_id]["balance"]
  486. groups_data[nw_id]["ending_balance"] = groups_data[group_id][
  487. "ending_balance"
  488. ]
  489. if foreign_currency:
  490. groups_data[nw_id]["initial_currency_balance"] = groups_data[
  491. group_id
  492. ]["initial_currency_balance"]
  493. groups_data[nw_id]["ending_currency_balance"] = groups_data[
  494. group_id
  495. ]["ending_currency_balance"]
  496. if new_parents:
  497. nw_groups_ids = []
  498. for group_id in list(groups_data.keys()):
  499. if group_id not in old_groups_ids:
  500. nw_groups_ids.append(group_id)
  501. old_groups_ids.append(group_id)
  502. groups = self.env["account.group"].browse(nw_groups_ids)
  503. for group in groups:
  504. groups_data[group.id].update(
  505. {
  506. "id": group.id,
  507. "code": group.code_prefix,
  508. "name": group.name,
  509. "parent_id": group.parent_id.id,
  510. "parent_path": group.parent_path,
  511. "complete_code": group.complete_code,
  512. "account_ids": group.compute_account_ids.ids,
  513. "type": "group_type",
  514. }
  515. )
  516. groups_data = self._get_hierarchy_groups(
  517. nw_groups_ids, groups_data, old_groups_ids, foreign_currency
  518. )
  519. return groups_data
  520. def _get_groups_data(self, accounts_data, total_amount, foreign_currency):
  521. accounts_ids = list(accounts_data.keys())
  522. accounts = self.env["account.account"].browse(accounts_ids)
  523. account_group_relation = {}
  524. for account in accounts:
  525. accounts_data[account.id]["complete_code"] = (
  526. account.group_id.complete_code if account.group_id.id else ""
  527. )
  528. if account.group_id.id:
  529. if account.group_id.id not in account_group_relation.keys():
  530. account_group_relation.update({account.group_id.id: [account.id]})
  531. else:
  532. account_group_relation[account.group_id.id].append(account.id)
  533. groups = self.env["account.group"].browse(account_group_relation.keys())
  534. groups_data = {}
  535. for group in groups:
  536. groups_data.update(
  537. {
  538. group.id: {
  539. "id": group.id,
  540. "code": group.code_prefix,
  541. "name": group.name,
  542. "parent_id": group.parent_id.id,
  543. "parent_path": group.parent_path,
  544. "type": "group_type",
  545. "complete_code": group.complete_code,
  546. "account_ids": group.compute_account_ids.ids,
  547. "initial_balance": 0.0,
  548. "credit": 0.0,
  549. "debit": 0.0,
  550. "balance": 0.0,
  551. "ending_balance": 0.0,
  552. }
  553. }
  554. )
  555. if foreign_currency:
  556. groups_data[group.id]["initial_currency_balance"] = 0.0
  557. groups_data[group.id]["ending_currency_balance"] = 0.0
  558. for group_id in account_group_relation.keys():
  559. for account_id in account_group_relation[group_id]:
  560. groups_data[group_id]["initial_balance"] += total_amount[account_id][
  561. "initial_balance"
  562. ]
  563. groups_data[group_id]["debit"] += total_amount[account_id]["debit"]
  564. groups_data[group_id]["credit"] += total_amount[account_id]["credit"]
  565. groups_data[group_id]["balance"] += total_amount[account_id]["balance"]
  566. groups_data[group_id]["ending_balance"] += total_amount[account_id][
  567. "ending_balance"
  568. ]
  569. if foreign_currency:
  570. groups_data[group_id]["initial_currency_balance"] += total_amount[
  571. account_id
  572. ]["initial_currency_balance"]
  573. groups_data[group_id]["ending_currency_balance"] += total_amount[
  574. account_id
  575. ]["ending_currency_balance"]
  576. group_ids = list(groups_data.keys())
  577. old_group_ids = list(groups_data.keys())
  578. groups_data = self._get_hierarchy_groups(
  579. group_ids, groups_data, old_group_ids, foreign_currency
  580. )
  581. return groups_data
  582. def _get_computed_groups_data(self, accounts_data, total_amount, foreign_currency):
  583. groups = self.env["account.group"].search([("id", "!=", False)])
  584. groups_data = {}
  585. for group in groups:
  586. len_group_code = len(group.code_prefix)
  587. groups_data.update(
  588. {
  589. group.id: {
  590. "id": group.id,
  591. "code": group.code_prefix,
  592. "name": group.name,
  593. "parent_id": group.parent_id.id,
  594. "parent_path": group.parent_path,
  595. "type": "group_type",
  596. "complete_code": group.complete_code,
  597. "account_ids": group.compute_account_ids.ids,
  598. "initial_balance": 0.0,
  599. "credit": 0.0,
  600. "debit": 0.0,
  601. "balance": 0.0,
  602. "ending_balance": 0.0,
  603. }
  604. }
  605. )
  606. if foreign_currency:
  607. groups_data[group.id]["initial_currency_balance"] = 0.0
  608. groups_data[group.id]["ending_currency_balance"] = 0.0
  609. for account in accounts_data.values():
  610. if group.code_prefix == account["code"][:len_group_code]:
  611. acc_id = account["id"]
  612. group_id = group.id
  613. groups_data[group_id]["initial_balance"] += total_amount[acc_id][
  614. "initial_balance"
  615. ]
  616. groups_data[group_id]["debit"] += total_amount[acc_id]["debit"]
  617. groups_data[group_id]["credit"] += total_amount[acc_id]["credit"]
  618. groups_data[group_id]["balance"] += total_amount[acc_id]["balance"]
  619. groups_data[group_id]["ending_balance"] += total_amount[acc_id][
  620. "ending_balance"
  621. ]
  622. if foreign_currency:
  623. groups_data[group_id][
  624. "initial_currency_balance"
  625. ] += total_amount[acc_id]["initial_currency_balance"]
  626. groups_data[group_id][
  627. "ending_currency_balance"
  628. ] += total_amount[acc_id]["ending_currency_balance"]
  629. return groups_data
  630. def _get_report_values(self, docids, data):
  631. show_partner_details = data["show_partner_details"]
  632. wizard_id = data["wizard_id"]
  633. company = self.env["res.company"].browse(data["company_id"])
  634. company_id = data["company_id"]
  635. partner_ids = data["partner_ids"]
  636. journal_ids = data["journal_ids"]
  637. account_ids = data["account_ids"]
  638. date_to = data["date_to"]
  639. date_from = data["date_from"]
  640. hide_account_at_0 = data["hide_account_at_0"]
  641. hierarchy_on = data["hierarchy_on"]
  642. show_hierarchy_level = data["show_hierarchy_level"]
  643. foreign_currency = data["foreign_currency"]
  644. only_posted_moves = data["only_posted_moves"]
  645. unaffected_earnings_account = data["unaffected_earnings_account"]
  646. fy_start_date = data["fy_start_date"]
  647. total_amount, accounts_data, partners_data = self._get_data(
  648. account_ids,
  649. journal_ids,
  650. partner_ids,
  651. company_id,
  652. date_to,
  653. date_from,
  654. foreign_currency,
  655. only_posted_moves,
  656. show_partner_details,
  657. hide_account_at_0,
  658. unaffected_earnings_account,
  659. fy_start_date,
  660. )
  661. trial_balance = []
  662. if not show_partner_details:
  663. for account_id in accounts_data.keys():
  664. accounts_data[account_id].update(
  665. {
  666. "initial_balance": total_amount[account_id]["initial_balance"],
  667. "credit": total_amount[account_id]["credit"],
  668. "debit": total_amount[account_id]["debit"],
  669. "balance": total_amount[account_id]["balance"],
  670. "ending_balance": total_amount[account_id]["ending_balance"],
  671. "type": "account_type",
  672. }
  673. )
  674. if foreign_currency:
  675. accounts_data[account_id].update(
  676. {
  677. "ending_currency_balance": total_amount[account_id][
  678. "ending_currency_balance"
  679. ],
  680. "initial_currency_balance": total_amount[account_id][
  681. "initial_currency_balance"
  682. ],
  683. }
  684. )
  685. if hierarchy_on == "relation":
  686. groups_data = self._get_groups_data(
  687. accounts_data, total_amount, foreign_currency
  688. )
  689. trial_balance = list(groups_data.values())
  690. trial_balance += list(accounts_data.values())
  691. trial_balance = sorted(trial_balance, key=lambda k: k["complete_code"])
  692. for trial in trial_balance:
  693. counter = trial["complete_code"].count("/")
  694. trial["level"] = counter
  695. if hierarchy_on == "computed":
  696. groups_data = self._get_computed_groups_data(
  697. accounts_data, total_amount, foreign_currency
  698. )
  699. trial_balance = list(groups_data.values())
  700. trial_balance += list(accounts_data.values())
  701. trial_balance = sorted(trial_balance, key=lambda k: k["code"])
  702. if hierarchy_on == "none":
  703. trial_balance = list(accounts_data.values())
  704. trial_balance = sorted(trial_balance, key=lambda k: k["code"])
  705. else:
  706. if foreign_currency:
  707. for account_id in accounts_data.keys():
  708. total_amount[account_id]["currency_id"] = accounts_data[account_id][
  709. "currency_id"
  710. ]
  711. total_amount[account_id]["currency_name"] = accounts_data[
  712. account_id
  713. ]["currency_name"]
  714. return {
  715. "doc_ids": [wizard_id],
  716. "doc_model": "trial.balance.report.wizard",
  717. "docs": self.env["trial.balance.report.wizard"].browse(wizard_id),
  718. "foreign_currency": data["foreign_currency"],
  719. "company_name": company.display_name,
  720. "company_currency": company.currency_id,
  721. "currency_name": company.currency_id.name,
  722. "date_from": data["date_from"],
  723. "date_to": data["date_to"],
  724. "only_posted_moves": data["only_posted_moves"],
  725. "hide_account_at_0": data["hide_account_at_0"],
  726. "show_partner_details": data["show_partner_details"],
  727. "limit_hierarchy_level": data["limit_hierarchy_level"],
  728. "hierarchy_on": hierarchy_on,
  729. "trial_balance": trial_balance,
  730. "total_amount": total_amount,
  731. "accounts_data": accounts_data,
  732. "partners_data": partners_data,
  733. "show_hierarchy_level": show_hierarchy_level,
  734. }