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.

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