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.

729 lines
26 KiB

  1. # © 2016 Julien Coux (Camptocamp)
  2. # © 2018 Forest and Biomass Romania SA
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. from odoo import models, fields, api
  5. class TrialBalanceReport(models.TransientModel):
  6. """ Here, we just define class fields.
  7. For methods, go more bottom at this file.
  8. The class hierarchy is :
  9. * TrialBalanceReport
  10. *** TrialBalanceReportAccount
  11. **** TrialBalanceReportPartner
  12. If "show_partner_details" is selected
  13. """
  14. _name = 'report_trial_balance'
  15. _inherit = 'account_financial_report_abstract'
  16. # Filters fields, used for data computation
  17. date_from = fields.Date()
  18. date_to = fields.Date()
  19. fy_start_date = fields.Date()
  20. only_posted_moves = fields.Boolean()
  21. hide_account_at_0 = fields.Boolean()
  22. foreign_currency = fields.Boolean()
  23. company_id = fields.Many2one(comodel_name='res.company')
  24. filter_account_ids = fields.Many2many(comodel_name='account.account')
  25. filter_partner_ids = fields.Many2many(comodel_name='res.partner')
  26. filter_journal_ids = fields.Many2many(comodel_name='account.journal')
  27. show_partner_details = fields.Boolean()
  28. hierarchy_on = fields.Selection(
  29. [('computed', 'Computed Accounts'),
  30. ('relation', 'Child Accounts'),
  31. ('none', 'No hierarchy')],
  32. string='Hierarchy On',
  33. required=True,
  34. default='computed',
  35. help="""Computed Accounts: Use when the account group have codes
  36. that represent prefixes of the actual accounts.\n
  37. Child Accounts: Use when your account groups are hierarchical.\n
  38. No hierarchy: Use to display just the accounts, without any grouping.
  39. """,
  40. )
  41. # General Ledger Report Data fields,
  42. # used as base for compute the data reports
  43. general_ledger_id = fields.Many2one(
  44. comodel_name='report_general_ledger'
  45. )
  46. # Data fields, used to browse report data
  47. account_ids = fields.One2many(
  48. comodel_name='report_trial_balance_account',
  49. inverse_name='report_id'
  50. )
  51. class TrialBalanceReportAccount(models.TransientModel):
  52. _name = 'report_trial_balance_account'
  53. _inherit = 'account_financial_report_abstract'
  54. _order = 'sequence, code ASC, name'
  55. report_id = fields.Many2one(
  56. comodel_name='report_trial_balance',
  57. ondelete='cascade',
  58. index=True
  59. )
  60. # Data fields, used to keep link with real object
  61. sequence = fields.Integer(index=True, default=0)
  62. level = fields.Integer(index=True, default=0)
  63. # Data fields, used to keep link with real object
  64. account_id = fields.Many2one(
  65. 'account.account',
  66. index=True
  67. )
  68. account_group_id = fields.Many2one(
  69. 'account.group',
  70. index=True
  71. )
  72. parent_id = fields.Many2one(
  73. 'account.group',
  74. index=True
  75. )
  76. child_account_ids = fields.Char(
  77. string="Accounts")
  78. compute_account_ids = fields.Many2many(
  79. 'account.account',
  80. string="Accounts", store=True)
  81. # Data fields, used for report display
  82. code = fields.Char()
  83. name = fields.Char()
  84. currency_id = fields.Many2one('res.currency')
  85. initial_balance = fields.Float(digits=(16, 2))
  86. initial_balance_foreign_currency = fields.Float(digits=(16, 2))
  87. debit = fields.Float(digits=(16, 2))
  88. credit = fields.Float(digits=(16, 2))
  89. period_balance = fields.Float(digits=(16, 2))
  90. final_balance = fields.Float(digits=(16, 2))
  91. final_balance_foreign_currency = fields.Float(digits=(16, 2))
  92. # Data fields, used to browse report data
  93. partner_ids = fields.One2many(
  94. comodel_name='report_trial_balance_partner',
  95. inverse_name='report_account_id'
  96. )
  97. class TrialBalanceReportPartner(models.TransientModel):
  98. _name = 'report_trial_balance_partner'
  99. _inherit = 'account_financial_report_abstract'
  100. report_account_id = fields.Many2one(
  101. comodel_name='report_trial_balance_account',
  102. ondelete='cascade',
  103. index=True
  104. )
  105. # Data fields, used to keep link with real object
  106. partner_id = fields.Many2one(
  107. 'res.partner',
  108. index=True
  109. )
  110. # Data fields, used for report display
  111. name = fields.Char()
  112. currency_id = fields.Many2one('res.currency')
  113. initial_balance = fields.Float(digits=(16, 2))
  114. initial_balance_foreign_currency = fields.Float(digits=(16, 2))
  115. debit = fields.Float(digits=(16, 2))
  116. credit = fields.Float(digits=(16, 2))
  117. period_balance = fields.Float(digits=(16, 2))
  118. final_balance = fields.Float(digits=(16, 2))
  119. final_balance_foreign_currency = fields.Float(digits=(16, 2))
  120. @api.model
  121. def _generate_order_by(self, order_spec, query):
  122. """Custom order to display "No partner allocated" at last position."""
  123. return """
  124. ORDER BY
  125. CASE
  126. WHEN "report_trial_balance_partner"."partner_id" IS NOT NULL
  127. THEN 0
  128. ELSE 1
  129. END,
  130. "report_trial_balance_partner"."name"
  131. """
  132. class TrialBalanceReportCompute(models.TransientModel):
  133. """ Here, we just define methods.
  134. For class fields, go more top at this file.
  135. """
  136. _inherit = 'report_trial_balance'
  137. @api.multi
  138. def print_report(self, report_type):
  139. self.ensure_one()
  140. if report_type == 'xlsx':
  141. report_name = 'a_f_r.report_trial_balance_xlsx'
  142. else:
  143. report_name = 'account_financial_report.' \
  144. 'report_trial_balance_qweb'
  145. return self.env['ir.actions.report'].search(
  146. [('report_name', '=', report_name),
  147. ('report_type', '=', report_type)], limit=1).report_action(self)
  148. def _get_html(self):
  149. result = {}
  150. rcontext = {}
  151. context = dict(self.env.context)
  152. report = self.browse(context.get('active_id'))
  153. if report:
  154. rcontext['o'] = report
  155. result['html'] = self.env.ref(
  156. 'account_financial_report.report_trial_balance').render(
  157. rcontext)
  158. return result
  159. @api.model
  160. def get_html(self, given_context=None):
  161. return self._get_html()
  162. def _prepare_report_general_ledger(self, account_ids):
  163. self.ensure_one()
  164. return {
  165. 'date_from': self.date_from,
  166. 'date_to': self.date_to,
  167. 'only_posted_moves': self.only_posted_moves,
  168. 'hide_account_at_0': self.hide_account_at_0,
  169. 'foreign_currency': self.foreign_currency,
  170. 'company_id': self.company_id.id,
  171. 'filter_account_ids': [(6, 0, account_ids.ids)],
  172. 'filter_partner_ids': [(6, 0, self.filter_partner_ids.ids)],
  173. 'filter_journal_ids': [(6, 0, self.filter_journal_ids.ids)],
  174. 'fy_start_date': self.fy_start_date,
  175. }
  176. @api.multi
  177. def compute_data_for_report(self):
  178. self.ensure_one()
  179. # Compute General Ledger Report Data.
  180. # The data of Trial Balance Report
  181. # are based on General Ledger Report data.
  182. model = self.env['report_general_ledger']
  183. if self.filter_account_ids:
  184. account_ids = self.filter_account_ids
  185. else:
  186. account_ids = self.env['account.account'].search(
  187. [('company_id', '=', self.company_id.id)])
  188. self.general_ledger_id = model.create(
  189. self._prepare_report_general_ledger(account_ids)
  190. )
  191. self.general_ledger_id.compute_data_for_report(
  192. with_line_details=False, with_partners=self.show_partner_details
  193. )
  194. # Compute report data
  195. self._inject_account_values(account_ids)
  196. if self.show_partner_details:
  197. self._inject_partner_values()
  198. if not self.filter_account_ids:
  199. self._inject_account_group_values()
  200. if self.hierarchy_on != 'none':
  201. if self.hierarchy_on == 'computed':
  202. self._update_account_group_computed_values()
  203. else:
  204. self._update_account_group_child_values()
  205. self._update_account_sequence()
  206. self._add_account_group_account_values()
  207. self.refresh()
  208. if not self.filter_account_ids and self.hierarchy_on != 'none':
  209. self._compute_group_accounts()
  210. else:
  211. for line in self.account_ids:
  212. line.write({'level': 0})
  213. if self.hide_account_at_0:
  214. self.env.cr.execute("""
  215. DELETE FROM report_trial_balance_account
  216. WHERE report_id=%s
  217. AND (initial_balance IS NULL OR initial_balance = 0)
  218. AND (debit IS NULL OR debit = 0)
  219. AND (credit IS NULL OR credit = 0)
  220. AND (final_balance IS NULL OR final_balance = 0)
  221. """, [self.id])
  222. def _inject_account_values(self, account_ids):
  223. """Inject report values for report_trial_balance_account"""
  224. query_inject_account = """
  225. INSERT INTO
  226. report_trial_balance_account
  227. (
  228. report_id,
  229. create_uid,
  230. create_date,
  231. account_id,
  232. parent_id,
  233. code,
  234. name,
  235. initial_balance,
  236. debit,
  237. credit,
  238. period_balance,
  239. final_balance,
  240. currency_id,
  241. initial_balance_foreign_currency,
  242. final_balance_foreign_currency
  243. )
  244. SELECT
  245. %s AS report_id,
  246. %s AS create_uid,
  247. NOW() AS create_date,
  248. acc.id,
  249. acc.group_id,
  250. acc.code,
  251. acc.name,
  252. coalesce(rag.initial_balance, 0) AS initial_balance,
  253. coalesce(rag.final_debit - rag.initial_debit, 0) AS debit,
  254. coalesce(rag.final_credit - rag.initial_credit, 0) AS credit,
  255. coalesce(rag.final_balance - rag.initial_balance, 0) AS period_balance,
  256. coalesce(rag.final_balance, 0) AS final_balance,
  257. rag.currency_id AS currency_id,
  258. coalesce(rag.initial_balance_foreign_currency, 0)
  259. AS initial_balance_foreign_currency,
  260. coalesce(rag.final_balance_foreign_currency, 0)
  261. AS final_balance_foreign_currency
  262. FROM
  263. account_account acc
  264. LEFT OUTER JOIN report_general_ledger_account AS rag
  265. ON rag.account_id = acc.id AND rag.report_id = %s
  266. WHERE
  267. acc.id in %s
  268. """
  269. query_inject_account_params = (
  270. self.id,
  271. self.env.uid,
  272. self.general_ledger_id.id,
  273. account_ids._ids,
  274. )
  275. self.env.cr.execute(query_inject_account, query_inject_account_params)
  276. # Inject current period debits and credits for the unaffected earnings
  277. # account.
  278. account_type = self.env.ref('account.data_unaffected_earnings')
  279. unaffected_earnings_account = self.env['account.account'].search(
  280. [
  281. ('user_type_id', '=', account_type.id),
  282. ('company_id', '=', self.company_id.id)
  283. ])
  284. if self.filter_account_ids and unaffected_earnings_account not in \
  285. self.filter_account_ids:
  286. return True
  287. query_unaffected_earnings_account_ids = """
  288. SELECT a.id
  289. FROM account_account as a
  290. INNER JOIN account_account_type as at
  291. ON at.id = a.user_type_id
  292. WHERE at.include_initial_balance = FALSE
  293. """
  294. self.env.cr.execute(query_unaffected_earnings_account_ids)
  295. pl_account_ids = [r[0] for r in self.env.cr.fetchall()]
  296. unaffected_earnings_account_ids = pl_account_ids + [
  297. unaffected_earnings_account.id]
  298. query_select_period_balances = """
  299. SELECT sum(aml.debit) as sum_debit,
  300. sum(aml.credit) as sum_credit
  301. FROM account_move_line as aml
  302. INNER JOIN account_move as am
  303. ON am.id = aml.move_id
  304. WHERE aml.date >= %(date_from)s
  305. AND aml.date <= %(date_to)s
  306. AND aml.company_id = %(company_id)s
  307. AND aml.account_id IN %(account_ids)s
  308. """
  309. if self.only_posted_moves:
  310. query_select_period_balances += """
  311. AND am.state = 'posted'
  312. """
  313. query_select_period_balances_params = {
  314. 'date_from': self.date_from,
  315. 'date_to': self.date_to,
  316. 'company_id': self.company_id.id,
  317. 'account_ids': tuple(unaffected_earnings_account_ids)
  318. }
  319. self.env.cr.execute(query_select_period_balances,
  320. query_select_period_balances_params)
  321. sum_debit, sum_credit = self.env.cr.fetchone()
  322. query_update_unaffected_earnings_account = """
  323. UPDATE report_trial_balance_account
  324. SET
  325. name = %(unaffected_earnings_account_name)s,
  326. debit = %(sum_debit)s,
  327. credit = %(sum_credit)s
  328. WHERE account_id = %(unaffected_earning_account_id)s
  329. """
  330. query_update_unaffected_earnings_account_params = {
  331. 'sum_debit': sum_debit,
  332. 'sum_credit': sum_credit,
  333. 'unaffected_earning_account_id': unaffected_earnings_account.id,
  334. 'unaffected_earnings_account_name':
  335. unaffected_earnings_account.name,
  336. }
  337. self.env.cr.execute(query_update_unaffected_earnings_account,
  338. query_update_unaffected_earnings_account_params)
  339. # P&L allocated in the current fiscal year.
  340. date = fields.Datetime.from_string(self.date_from)
  341. res = self.company_id.compute_fiscalyear_dates(date)
  342. fy_start_date = res['date_from']
  343. # Fetch the initial balance
  344. query_select_initial_pl_balance = """
  345. SELECT
  346. sum(aml.balance) as sum_balance
  347. FROM
  348. account_move_line as aml
  349. INNER JOIN
  350. account_move as am
  351. ON am.id = aml.move_id
  352. WHERE aml.date >= %(date_from)s
  353. AND aml.date < %(date_to)s
  354. AND aml.company_id = %(company_id)s
  355. AND aml.account_id IN %(account_ids)s
  356. """
  357. if self.only_posted_moves:
  358. query_select_initial_pl_balance += """
  359. AND am.state = 'posted'
  360. """
  361. query_select_initial_pl_balance_params = {
  362. 'date_from': fy_start_date,
  363. 'date_to': self.date_from,
  364. 'company_id': self.company_id.id,
  365. 'account_ids': tuple(pl_account_ids),
  366. }
  367. self.env.cr.execute(query_select_initial_pl_balance,
  368. query_select_initial_pl_balance_params)
  369. res = self.env.cr.fetchone()
  370. allocated_pl_initial_balance = res[0] or 0.0
  371. # Fetch the period balance
  372. query_select_period_pl_balance = """
  373. SELECT
  374. sum(aml.debit) as sum_debit,
  375. sum(aml.credit) as sum_credit
  376. FROM account_move_line as aml
  377. INNER JOIN account_move as am
  378. ON am.id = aml.move_id
  379. WHERE am.date >= %(date_from)s
  380. AND aml.date <= %(date_to)s
  381. AND aml.company_id = %(company_id)s
  382. AND aml.account_id IN %(account_ids)s
  383. """
  384. if self.only_posted_moves:
  385. query_select_period_pl_balance += """
  386. AND am.state = 'posted'
  387. """
  388. query_select_period_pl_balance_params = {
  389. 'date_from': self.date_from,
  390. 'date_to': self.date_to,
  391. 'company_id': self.company_id.id,
  392. 'account_ids': tuple(pl_account_ids),
  393. }
  394. self.env.cr.execute(query_select_period_pl_balance,
  395. query_select_period_pl_balance_params)
  396. res = self.env.cr.fetchone()
  397. allocated_pl_debit = res[0] or 0.0
  398. allocated_pl_credit = res[1] or 0.0
  399. allocated_pl_period_balance = allocated_pl_credit - allocated_pl_debit
  400. allocated_pl_final_balance = \
  401. allocated_pl_initial_balance + allocated_pl_period_balance
  402. allocated_pl_initial_balance = allocated_pl_initial_balance * -1
  403. query_inject_pl_allocation = """
  404. INSERT INTO
  405. report_trial_balance_account (
  406. report_id,
  407. create_uid,
  408. create_date,
  409. account_id,
  410. code,
  411. name,
  412. initial_balance,
  413. debit,
  414. credit,
  415. period_balance,
  416. final_balance,
  417. initial_balance_foreign_currency,
  418. final_balance_foreign_currency)
  419. VALUES (
  420. %(report_id)s,
  421. %(create_uid)s,
  422. NOW(),
  423. %(account_id)s,
  424. %(code)s,
  425. %(name)s,
  426. %(initial_balance)s,
  427. %(debit)s,
  428. %(credit)s,
  429. %(period_balance)s,
  430. %(final_balance)s,
  431. 0.0,
  432. 0.0
  433. )
  434. """
  435. query_inject_pl_allocation_params = {
  436. 'report_id': self.id,
  437. 'create_uid': self.env.uid,
  438. 'account_id': unaffected_earnings_account.id,
  439. 'code': unaffected_earnings_account.code,
  440. 'name': '%s (*)' % unaffected_earnings_account.name,
  441. 'initial_balance': allocated_pl_initial_balance,
  442. 'debit': allocated_pl_credit,
  443. 'credit': allocated_pl_debit,
  444. 'period_balance': allocated_pl_period_balance,
  445. 'final_balance': allocated_pl_final_balance
  446. }
  447. self.env.cr.execute(query_inject_pl_allocation,
  448. query_inject_pl_allocation_params)
  449. def _inject_partner_values(self):
  450. """Inject report values for report_trial_balance_partner"""
  451. query_inject_partner = """
  452. INSERT INTO
  453. report_trial_balance_partner
  454. (
  455. report_account_id,
  456. create_uid,
  457. create_date,
  458. partner_id,
  459. name,
  460. initial_balance,
  461. initial_balance_foreign_currency,
  462. debit,
  463. credit,
  464. period_balance,
  465. final_balance,
  466. final_balance_foreign_currency
  467. )
  468. SELECT
  469. ra.id AS report_account_id,
  470. %s AS create_uid,
  471. NOW() AS create_date,
  472. rpg.partner_id,
  473. rpg.name,
  474. rpg.initial_balance AS initial_balance,
  475. rpg.initial_balance_foreign_currency AS initial_balance_foreign_currency,
  476. rpg.final_debit - rpg.initial_debit AS debit,
  477. rpg.final_credit - rpg.initial_credit AS credit,
  478. rpg.final_balance - rpg.initial_balance AS period_balance,
  479. rpg.final_balance AS final_balance,
  480. rpg.final_balance_foreign_currency AS final_balance_foreign_currency
  481. FROM
  482. report_general_ledger_partner rpg
  483. INNER JOIN
  484. report_general_ledger_account rag ON rpg.report_account_id = rag.id
  485. INNER JOIN
  486. report_trial_balance_account ra ON rag.code = ra.code
  487. WHERE
  488. rag.report_id = %s
  489. AND ra.report_id = %s
  490. """
  491. query_inject_partner_params = (
  492. self.env.uid,
  493. self.general_ledger_id.id,
  494. self.id,
  495. )
  496. self.env.cr.execute(query_inject_partner, query_inject_partner_params)
  497. def _inject_account_group_values(self):
  498. """Inject report values for report_trial_balance_account"""
  499. query_inject_account_group = """
  500. INSERT INTO
  501. report_trial_balance_account
  502. (
  503. report_id,
  504. create_uid,
  505. create_date,
  506. account_group_id,
  507. parent_id,
  508. code,
  509. name,
  510. sequence,
  511. level
  512. )
  513. SELECT
  514. %s AS report_id,
  515. %s AS create_uid,
  516. NOW() AS create_date,
  517. accgroup.id,
  518. accgroup.parent_id,
  519. coalesce(accgroup.code_prefix, accgroup.name),
  520. accgroup.name,
  521. accgroup.parent_left * 100000,
  522. accgroup.level
  523. FROM
  524. account_group accgroup"""
  525. query_inject_account_params = (
  526. self.id,
  527. self.env.uid,
  528. )
  529. self.env.cr.execute(query_inject_account_group,
  530. query_inject_account_params)
  531. def _update_account_group_child_values(self):
  532. """Compute values for report_trial_balance_account group in child."""
  533. query_update_account_group = """
  534. WITH computed AS (WITH RECURSIVE cte AS (
  535. SELECT account_group_id, code, account_group_id AS parent_id,
  536. initial_balance, initial_balance_foreign_currency, debit, credit,
  537. final_balance, final_balance_foreign_currency
  538. FROM report_trial_balance_account
  539. WHERE report_id = %s
  540. GROUP BY report_trial_balance_account.id
  541. UNION ALL
  542. SELECT c.account_group_id, c.code, p.account_group_id,
  543. p.initial_balance, p.initial_balance_foreign_currency, p.debit, p.credit,
  544. p.final_balance, p.final_balance_foreign_currency
  545. FROM cte c
  546. JOIN report_trial_balance_account p USING (parent_id)
  547. WHERE p.report_id = %s
  548. )
  549. SELECT account_group_id, code,
  550. sum(initial_balance) AS initial_balance,
  551. sum(initial_balance_foreign_currency) AS initial_balance_foreign_currency,
  552. sum(debit) AS debit,
  553. sum(credit) AS credit,
  554. sum(final_balance) AS final_balance,
  555. sum(final_balance_foreign_currency) AS final_balance_foreign_currency
  556. FROM cte
  557. GROUP BY cte.account_group_id, cte.code
  558. ORDER BY account_group_id
  559. )
  560. UPDATE report_trial_balance_account
  561. SET initial_balance = computed.initial_balance,
  562. initial_balance_foreign_currency =
  563. computed.initial_balance_foreign_currency,
  564. debit = computed.debit,
  565. credit = computed.credit,
  566. final_balance = computed.final_balance,
  567. final_balance_foreign_currency =
  568. computed.final_balance_foreign_currency
  569. FROM computed
  570. WHERE report_trial_balance_account.account_group_id = computed.account_group_id
  571. AND report_trial_balance_account.report_id = %s
  572. """
  573. query_update_account_params = (self.id, self.id, self.id,)
  574. self.env.cr.execute(query_update_account_group,
  575. query_update_account_params)
  576. def _add_account_group_account_values(self):
  577. """Compute values for report_trial_balance_account group in child."""
  578. query_update_account_group = """
  579. DROP AGGREGATE IF EXISTS array_concat_agg(anyarray);
  580. CREATE AGGREGATE array_concat_agg(anyarray) (
  581. SFUNC = array_cat,
  582. STYPE = anyarray
  583. );
  584. WITH aggr AS(WITH computed AS (WITH RECURSIVE cte AS (
  585. SELECT account_group_id, account_group_id AS parent_id,
  586. ARRAY[account_id]::int[] as child_account_ids
  587. FROM report_trial_balance_account
  588. WHERE report_id = %s
  589. GROUP BY report_trial_balance_account.id
  590. UNION ALL
  591. SELECT c.account_group_id, p.account_group_id, ARRAY[p.account_id]::int[]
  592. FROM cte c
  593. JOIN report_trial_balance_account p USING (parent_id)
  594. WHERE p.report_id = %s
  595. )
  596. SELECT account_group_id,
  597. array_concat_agg(DISTINCT child_account_ids)::int[] as child_account_ids
  598. FROM cte
  599. GROUP BY cte.account_group_id, cte.child_account_ids
  600. ORDER BY account_group_id
  601. )
  602. SELECT account_group_id,
  603. array_concat_agg(DISTINCT child_account_ids)::int[]
  604. AS child_account_ids from computed
  605. GROUP BY account_group_id)
  606. UPDATE report_trial_balance_account
  607. SET child_account_ids = aggr.child_account_ids
  608. FROM aggr
  609. WHERE report_trial_balance_account.account_group_id = aggr.account_group_id
  610. AND report_trial_balance_account.report_id = %s
  611. """
  612. query_update_account_params = (self.id, self.id, self.id,)
  613. self.env.cr.execute(query_update_account_group,
  614. query_update_account_params)
  615. def _update_account_group_computed_values(self):
  616. """Compute values for report_trial_balance_account group in compute."""
  617. query_update_account_group = """
  618. WITH RECURSIVE accgroup AS
  619. (SELECT
  620. accgroup.id,
  621. sum(coalesce(ra.initial_balance, 0)) as initial_balance,
  622. sum(coalesce(ra.initial_balance_foreign_currency, 0))
  623. as initial_balance_foreign_currency,
  624. sum(coalesce(ra.debit, 0)) as debit,
  625. sum(coalesce(ra.credit, 0)) as credit,
  626. sum(coalesce(ra.final_balance, 0)) as final_balance,
  627. sum(coalesce(ra.final_balance_foreign_currency, 0))
  628. as final_balance_foreign_currency
  629. FROM
  630. account_group accgroup
  631. LEFT OUTER JOIN account_account AS acc
  632. ON strpos(acc.code, accgroup.code_prefix) = 1
  633. LEFT OUTER JOIN report_trial_balance_account AS ra
  634. ON ra.account_id = acc.id
  635. WHERE ra.report_id = %s
  636. GROUP BY accgroup.id
  637. )
  638. UPDATE report_trial_balance_account
  639. SET initial_balance = accgroup.initial_balance,
  640. initial_balance_foreign_currency =
  641. accgroup.initial_balance_foreign_currency,
  642. debit = accgroup.debit,
  643. credit = accgroup.credit,
  644. final_balance = accgroup.final_balance,
  645. final_balance_foreign_currency =
  646. accgroup.final_balance_foreign_currency
  647. FROM accgroup
  648. WHERE report_trial_balance_account.account_group_id = accgroup.id
  649. """
  650. query_update_account_params = (self.id,)
  651. self.env.cr.execute(query_update_account_group,
  652. query_update_account_params)
  653. def _update_account_sequence(self):
  654. """Compute sequence, level for report_trial_balance_account account."""
  655. query_update_account_group = """
  656. UPDATE report_trial_balance_account
  657. SET sequence = newline.sequence + 1,
  658. level = newline.level + 1
  659. FROM report_trial_balance_account as newline
  660. WHERE newline.account_group_id = report_trial_balance_account.parent_id
  661. AND report_trial_balance_account.report_id = newline.report_id
  662. AND report_trial_balance_account.account_id is not null
  663. AND report_trial_balance_account.report_id = %s"""
  664. query_update_account_params = (self.id,)
  665. self.env.cr.execute(query_update_account_group,
  666. query_update_account_params)
  667. def _compute_group_accounts(self):
  668. groups = self.account_ids.filtered(
  669. lambda a: a.account_group_id is not False)
  670. for group in groups:
  671. if self.hierarchy_on == 'compute':
  672. group.compute_account_ids = \
  673. group.account_group_id.compute_account_ids
  674. else:
  675. if group.child_account_ids:
  676. chacc = group.child_account_ids.replace(
  677. '}', '').replace('{', '').split(',')
  678. if 'NULL' in chacc:
  679. chacc.remove('NULL')
  680. if chacc:
  681. group.compute_account_ids = [
  682. (6, 0, [int(g) for g in chacc])]