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.

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