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.

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