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.

609 lines
28 KiB

  1. # © 2016 Julien Coux (Camptocamp)
  2. # Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com)
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. from odoo import models, api
  5. from operator import itemgetter
  6. from natsort import natsorted
  7. import calendar
  8. import datetime
  9. class GeneralLedgerReport(models.AbstractModel):
  10. _name = 'report.account_financial_report.general_ledger'
  11. def _get_accounts_data(self, account_ids):
  12. accounts = self.env['account.account'].browse(account_ids)
  13. accounts_data = {}
  14. for account in accounts:
  15. accounts_data.update({account.id: {
  16. 'id': account.id,
  17. 'code': account.code,
  18. 'name': account.name,
  19. 'group_id': account.group_id.id,
  20. 'currency_id': account.currency_id or False,
  21. 'currency_name': account.currency_id.name}
  22. })
  23. return accounts_data
  24. def _get_journals_data(self, journals_ids):
  25. journals = self.env['account.journal'].browse(journals_ids)
  26. journals_data = {}
  27. for journal in journals:
  28. journals_data.update({journal.id: {'id': journal.id,
  29. 'code': journal.code}})
  30. return journals_data
  31. def _get_tags_data(self, tags_ids):
  32. tags = self.env['account.analytic.tag'].browse(tags_ids)
  33. tags_data = {}
  34. for tag in tags:
  35. tags_data.update({tag.id: {'name': tag.name}})
  36. return tags_data
  37. def _get_taxes_data(self, taxes_ids):
  38. taxes = self.env['account.tax'].browse(taxes_ids)
  39. taxes_data = {}
  40. for tax in taxes:
  41. taxes_data.update({tax.id: {
  42. 'id': tax.id,
  43. 'amount': tax.amount,
  44. 'amount_type': tax.amount_type,
  45. }})
  46. if tax.amount_type == 'percent' or tax.amount_type == 'division':
  47. taxes_data[tax.id]['string'] = '%'
  48. else:
  49. taxes_data[tax.id]['string'] = ''
  50. return taxes_data
  51. def _get_acc_prt_accounts_ids(self, company_id):
  52. accounts_domain = [
  53. ('company_id', '=', company_id),
  54. ('internal_type', 'in', ['receivable', 'payable'])]
  55. acc_prt_accounts = self.env['account.account'].search(accounts_domain)
  56. return acc_prt_accounts.ids
  57. def _get_initial_balances_bs_ml_domain(self, account_ids,
  58. company_id, date_from,
  59. base_domain, acc_prt=False):
  60. accounts_domain = [
  61. ('company_id', '=', company_id),
  62. ('user_type_id.include_initial_balance', '=', True)]
  63. if account_ids:
  64. accounts_domain += [('id', 'in', account_ids)]
  65. domain = []
  66. domain += base_domain
  67. domain += [('date', '<', date_from)]
  68. accounts = self.env['account.account'].search(accounts_domain)
  69. domain += [('account_id', 'in', accounts.ids)]
  70. if acc_prt:
  71. domain += [('account_id.internal_type', 'in', [
  72. 'receivable', 'payable'])]
  73. return domain
  74. def _get_initial_balances_pl_ml_domain(self, account_ids,
  75. company_id, date_from,
  76. fy_start_date, base_domain):
  77. accounts_domain = [
  78. ('company_id', '=', company_id),
  79. ('user_type_id.include_initial_balance', '=', False)]
  80. if account_ids:
  81. accounts_domain += [('id', 'in', account_ids)]
  82. domain = []
  83. domain += base_domain
  84. domain += [('date', '<', date_from), ('date', '>=', fy_start_date)]
  85. accounts = self.env['account.account'].search(accounts_domain)
  86. domain += [('account_id', 'in', accounts.ids)]
  87. return domain
  88. def _get_accounts_initial_balance(self, initial_domain_bs,
  89. initial_domain_pl):
  90. gl_initial_acc_bs = self.env['account.move.line'].read_group(
  91. domain=initial_domain_bs,
  92. fields=['account_id', 'debit', 'credit', 'balance',
  93. 'amount_currency'],
  94. groupby=['account_id']
  95. )
  96. gl_initial_acc_pl = self.env['account.move.line'].read_group(
  97. domain=initial_domain_pl,
  98. fields=['account_id', 'debit', 'credit', 'balance',
  99. 'amount_currency'],
  100. groupby=['account_id'])
  101. gl_initial_acc = gl_initial_acc_bs + gl_initial_acc_pl
  102. return gl_initial_acc
  103. def _get_initial_balance_fy_pl_ml_domain(self, account_ids, company_id,
  104. fy_start_date, base_domain):
  105. accounts_domain = [
  106. ('company_id', '=', company_id),
  107. ('user_type_id.include_initial_balance', '=', False)]
  108. if account_ids:
  109. accounts_domain += [('id', 'in', account_ids)]
  110. domain = []
  111. domain += base_domain
  112. domain += [('date', '<', fy_start_date)]
  113. accounts = self.env['account.account'].search(accounts_domain)
  114. domain += [('account_id', 'in', accounts.ids)]
  115. return domain
  116. def _get_pl_initial_balance(self, account_ids, company_id,
  117. fy_start_date, foreign_currency, base_domain):
  118. domain = self._get_initial_balance_fy_pl_ml_domain(
  119. account_ids, company_id, fy_start_date, base_domain
  120. )
  121. initial_balances = self.env['account.move.line'].read_group(
  122. domain=domain,
  123. fields=[
  124. 'account_id',
  125. 'debit',
  126. 'credit',
  127. 'balance',
  128. 'amount_currency'],
  129. groupby=['account_id'])
  130. pl_initial_balance = {
  131. 'debit': 0.0,
  132. 'credit': 0.0,
  133. 'balance': 0.0,
  134. 'bal_curr': 0.0,
  135. }
  136. for initial_balance in initial_balances:
  137. pl_initial_balance['debit'] += initial_balance['debit']
  138. pl_initial_balance['credit'] += initial_balance['credit']
  139. pl_initial_balance['balance'] += initial_balance['balance']
  140. pl_initial_balance['bal_curr'] += initial_balance['amount_currency']
  141. return pl_initial_balance
  142. def _get_initial_balance_data(
  143. self, account_ids, partner_ids, company_id, date_from,
  144. foreign_currency, only_posted_moves, hide_account_at_0,
  145. unaffected_earnings_account, fy_start_date, analytic_tag_ids,
  146. cost_center_ids):
  147. base_domain = []
  148. if company_id:
  149. base_domain += [('company_id', '=', company_id)]
  150. if partner_ids:
  151. base_domain += [('partner_id', 'in', partner_ids)]
  152. if only_posted_moves:
  153. base_domain += [('move_id.state', '=', 'posted')]
  154. if analytic_tag_ids:
  155. base_domain += [('analytic_tag_ids', 'in', analytic_tag_ids)]
  156. if cost_center_ids:
  157. base_domain += [('analytic_account_id', 'in', cost_center_ids)]
  158. initial_domain_bs = self._get_initial_balances_bs_ml_domain(
  159. account_ids, company_id, date_from, base_domain
  160. )
  161. initial_domain_pl = self._get_initial_balances_pl_ml_domain(
  162. account_ids, company_id, date_from, fy_start_date, base_domain
  163. )
  164. gl_initial_acc = self._get_accounts_initial_balance(
  165. initial_domain_bs, initial_domain_pl
  166. )
  167. initial_domain_acc_prt = self._get_initial_balances_bs_ml_domain(
  168. account_ids, company_id, date_from, base_domain, acc_prt=True
  169. )
  170. gl_initial_acc_prt = self.env['account.move.line'].read_group(
  171. domain=initial_domain_acc_prt,
  172. fields=['account_id', 'partner_id',
  173. 'debit', 'credit', 'balance', 'amount_currency'],
  174. groupby=['account_id', 'partner_id'],
  175. lazy=False
  176. )
  177. gen_ld_data = {}
  178. for gl in gl_initial_acc:
  179. acc_id = gl['account_id'][0]
  180. gen_ld_data[acc_id] = {}
  181. gen_ld_data[acc_id]['id'] = acc_id
  182. gen_ld_data[acc_id]['partners'] = False
  183. gen_ld_data[acc_id]['init_bal'] = {}
  184. gen_ld_data[acc_id]['init_bal']['credit'] = gl['credit']
  185. gen_ld_data[acc_id]['init_bal']['debit'] = gl['debit']
  186. gen_ld_data[acc_id]['init_bal']['balance'] = gl['balance']
  187. gen_ld_data[acc_id]['fin_bal'] = {}
  188. gen_ld_data[acc_id]['fin_bal']['credit'] = gl['credit']
  189. gen_ld_data[acc_id]['fin_bal']['debit'] = gl['debit']
  190. gen_ld_data[acc_id]['fin_bal']['balance'] = gl['balance']
  191. gen_ld_data[acc_id]['init_bal']['bal_curr'] = gl['amount_currency']
  192. gen_ld_data[acc_id]['fin_bal']['bal_curr'] = gl['amount_currency']
  193. partners_data = {}
  194. partners_ids = set()
  195. if gl_initial_acc_prt:
  196. for gl in gl_initial_acc_prt:
  197. if not gl['partner_id']:
  198. prt_id = 0
  199. prt_name = 'Missing Partner'
  200. else:
  201. prt_id = gl['partner_id'][0]
  202. prt_name = gl['partner_id'][1]
  203. if prt_id not in partners_ids:
  204. partners_ids.add(prt_id)
  205. partners_data.update({
  206. prt_id: {'id': prt_id, 'name': prt_name}
  207. })
  208. acc_id = gl['account_id'][0]
  209. gen_ld_data[acc_id][prt_id] = {}
  210. gen_ld_data[acc_id][prt_id]['id'] = prt_id
  211. gen_ld_data[acc_id]['partners'] = True
  212. gen_ld_data[acc_id][prt_id]['init_bal'] = {}
  213. gen_ld_data[acc_id][prt_id][
  214. 'init_bal']['credit'] = gl['credit']
  215. gen_ld_data[acc_id][prt_id][
  216. 'init_bal']['debit'] = gl['debit']
  217. gen_ld_data[acc_id][prt_id][
  218. 'init_bal']['balance'] = gl['balance']
  219. gen_ld_data[acc_id][prt_id]['fin_bal'] = {}
  220. gen_ld_data[acc_id][prt_id][
  221. 'fin_bal']['credit'] = gl['credit']
  222. gen_ld_data[acc_id][prt_id][
  223. 'fin_bal']['debit'] = gl['debit']
  224. gen_ld_data[acc_id][prt_id][
  225. 'fin_bal']['balance'] = gl['balance']
  226. gen_ld_data[acc_id][prt_id]['init_bal'][
  227. 'bal_curr'] = gl['amount_currency']
  228. gen_ld_data[acc_id][prt_id]['fin_bal'][
  229. 'bal_curr'] = gl['amount_currency']
  230. accounts_ids = list(gen_ld_data.keys())
  231. unaffected_id = unaffected_earnings_account
  232. if unaffected_id not in accounts_ids:
  233. accounts_ids.append(unaffected_id)
  234. self._initialize_account(
  235. gen_ld_data, unaffected_id, foreign_currency
  236. )
  237. pl_initial_balance = self._get_pl_initial_balance(
  238. account_ids, company_id, fy_start_date,
  239. foreign_currency, base_domain
  240. )
  241. gen_ld_data[unaffected_id]['init_bal']['debit'] += \
  242. pl_initial_balance['debit']
  243. gen_ld_data[unaffected_id]['init_bal']['credit'] += \
  244. pl_initial_balance['credit']
  245. gen_ld_data[unaffected_id]['init_bal']['balance'] += \
  246. pl_initial_balance['balance']
  247. gen_ld_data[unaffected_id]['fin_bal']['debit'] += \
  248. pl_initial_balance['debit']
  249. gen_ld_data[unaffected_id]['fin_bal']['credit'] += \
  250. pl_initial_balance['credit']
  251. gen_ld_data[unaffected_id]['fin_bal']['balance'] += \
  252. pl_initial_balance['balance']
  253. if foreign_currency:
  254. gen_ld_data[unaffected_id]['init_bal']['bal_curr'] += \
  255. pl_initial_balance['bal_curr']
  256. gen_ld_data[unaffected_id]['fin_bal']['bal_curr'] += \
  257. pl_initial_balance['bal_curr']
  258. return gen_ld_data, partners_data, partner_ids
  259. @api.model
  260. def _get_move_line_data(self, move_line):
  261. move_line_data = {
  262. 'id': move_line['id'],
  263. 'date': move_line['date'],
  264. 'entry': move_line['move_id'][1],
  265. 'entry_id': move_line['move_id'][0],
  266. 'journal_id': move_line['journal_id'][0],
  267. 'account_id': move_line['account_id'][0],
  268. 'partner_id': move_line['partner_id'][0] if
  269. move_line['partner_id'] else False,
  270. 'partner_name': move_line['partner_id'][1] if
  271. move_line['partner_id'] else "",
  272. 'ref': move_line['name'],
  273. 'tax_ids': move_line['tax_ids'],
  274. 'debit': move_line['debit'],
  275. 'credit': move_line['credit'],
  276. 'balance': move_line['balance'],
  277. 'bal_curr': move_line['amount_currency'],
  278. 'rec_id': move_line['full_reconcile_id'][0] if
  279. move_line['full_reconcile_id'] else False,
  280. 'rec_name': move_line['full_reconcile_id'][1] if
  281. move_line['full_reconcile_id'] else "",
  282. 'tag_ids': move_line['analytic_tag_ids'],
  283. 'currency_id': move_line['currency_id'],
  284. }
  285. return move_line_data
  286. @api.model
  287. def _get_period_domain(
  288. self, account_ids, partner_ids, company_id, only_posted_moves,
  289. date_to, date_from, analytic_tag_ids, cost_center_ids):
  290. domain = [('date', '>=', date_from), ('date', '<=', date_to)]
  291. if account_ids:
  292. domain += [('account_id', 'in', account_ids)]
  293. if company_id:
  294. domain += [('company_id', '=', company_id)]
  295. if partner_ids:
  296. domain += [('partner_id', 'in', partner_ids)]
  297. if only_posted_moves:
  298. domain += [('move_id.state', '=', 'posted')]
  299. if analytic_tag_ids:
  300. domain += [('analytic_tag_ids', 'in', analytic_tag_ids)]
  301. if cost_center_ids:
  302. domain += [('analytic_account_id', 'in', cost_center_ids)]
  303. return domain
  304. @api.model
  305. def _initialize_partner(self, gen_ld_data, acc_id, prt_id,
  306. foreign_currency):
  307. gen_ld_data[acc_id]['partners'] = True
  308. gen_ld_data[acc_id][prt_id] = {}
  309. gen_ld_data[acc_id][prt_id]['id'] = prt_id
  310. gen_ld_data[acc_id][prt_id]['init_bal'] = {}
  311. gen_ld_data[acc_id][prt_id]['init_bal']['balance'] = 0.0
  312. gen_ld_data[acc_id][prt_id]['init_bal']['credit'] = 0.0
  313. gen_ld_data[acc_id][prt_id]['init_bal']['debit'] = 0.0
  314. gen_ld_data[acc_id][prt_id]['fin_bal'] = {}
  315. gen_ld_data[acc_id][prt_id]['fin_bal']['credit'] = 0.0
  316. gen_ld_data[acc_id][prt_id]['fin_bal']['debit'] = 0.0
  317. gen_ld_data[acc_id][prt_id]['fin_bal']['balance'] = 0.0
  318. if foreign_currency:
  319. gen_ld_data[acc_id][prt_id]['init_bal']['bal_curr'] = 0.0
  320. gen_ld_data[acc_id][prt_id]['fin_bal']['bal_curr'] = 0.0
  321. return gen_ld_data
  322. def _initialize_account(self, gen_ld_data, acc_id, foreign_currency):
  323. gen_ld_data[acc_id] = {}
  324. gen_ld_data[acc_id]['id'] = acc_id
  325. gen_ld_data[acc_id]['partners'] = False
  326. gen_ld_data[acc_id]['init_bal'] = {}
  327. gen_ld_data[acc_id]['init_bal']['balance'] = 0.0
  328. gen_ld_data[acc_id]['init_bal']['credit'] = 0.0
  329. gen_ld_data[acc_id]['init_bal']['debit'] = 0.0
  330. gen_ld_data[acc_id]['fin_bal'] = {}
  331. gen_ld_data[acc_id]['fin_bal']['credit'] = 0.0
  332. gen_ld_data[acc_id]['fin_bal']['debit'] = 0.0
  333. gen_ld_data[acc_id]['fin_bal']['balance'] = 0.0
  334. if foreign_currency:
  335. gen_ld_data[acc_id]['init_bal']['bal_curr'] = 0.0
  336. gen_ld_data[acc_id]['fin_bal']['bal_curr'] = 0.0
  337. return gen_ld_data
  338. def _get_period_ml_data(
  339. self, account_ids, partner_ids, company_id, foreign_currency,
  340. only_posted_moves, hide_account_at_0, date_from, date_to,
  341. partners_data, gen_ld_data, partners_ids, centralize,
  342. analytic_tag_ids, cost_center_ids):
  343. domain = self._get_period_domain(account_ids, partner_ids,
  344. company_id, only_posted_moves,
  345. date_to, date_from,
  346. analytic_tag_ids, cost_center_ids)
  347. ml_fields = [
  348. 'id', 'name', 'date', 'move_id', 'journal_id', 'account_id',
  349. 'partner_id', 'debit', 'credit', 'balance', 'currency_id',
  350. 'full_reconcile_id', 'tax_ids', 'analytic_tag_ids',
  351. 'amount_currency']
  352. move_lines = self.env['account.move.line'].search_read(
  353. domain=domain,
  354. fields=ml_fields)
  355. journal_ids = set()
  356. full_reconcile_ids = set()
  357. taxes_ids = set()
  358. tags_ids = set()
  359. full_reconcile_data = {}
  360. acc_prt_account_ids = self._get_acc_prt_accounts_ids(company_id)
  361. for move_line in move_lines:
  362. journal_ids.add(move_line['journal_id'][0])
  363. for tax_id in move_line['tax_ids']:
  364. taxes_ids.add(tax_id)
  365. for analytic_tag_id in move_line['analytic_tag_ids']:
  366. tags_ids.add(analytic_tag_id)
  367. if move_line['full_reconcile_id']:
  368. rec_id = move_line['full_reconcile_id'][0]
  369. if rec_id not in full_reconcile_ids:
  370. full_reconcile_data.update({
  371. rec_id: {
  372. 'id': rec_id,
  373. 'name': move_line['full_reconcile_id'][1]}
  374. })
  375. full_reconcile_ids.add(rec_id)
  376. acc_id = move_line['account_id'][0]
  377. ml_id = move_line['id']
  378. if move_line['partner_id']:
  379. prt_id = move_line['partner_id'][0]
  380. partner_name = move_line['partner_id'][1]
  381. if acc_id not in gen_ld_data.keys():
  382. gen_ld_data = self._initialize_account(gen_ld_data, acc_id,
  383. foreign_currency)
  384. if acc_id in acc_prt_account_ids:
  385. if not move_line['partner_id']:
  386. prt_id = 0
  387. partner_name = 'Missing Partner'
  388. if gen_ld_data:
  389. if prt_id not in gen_ld_data[acc_id]:
  390. if prt_id not in partners_ids:
  391. partners_ids.append(prt_id)
  392. partners_data.update({
  393. prt_id: {'id': prt_id,
  394. 'name': partner_name}
  395. })
  396. gen_ld_data = self._initialize_partner(
  397. gen_ld_data, acc_id, prt_id, foreign_currency
  398. )
  399. else:
  400. partners_ids.append(prt_id)
  401. partners_data.update({
  402. prt_id: {'id': prt_id,
  403. 'name': partner_name}
  404. })
  405. gen_ld_data = self._initialize_partner(
  406. gen_ld_data, acc_id, prt_id, foreign_currency
  407. )
  408. gen_ld_data[acc_id][prt_id][ml_id] = \
  409. self._get_move_line_data(move_line)
  410. gen_ld_data[acc_id][prt_id]['fin_bal']['credit'] += \
  411. move_line['credit']
  412. gen_ld_data[acc_id][prt_id]['fin_bal']['debit'] += \
  413. move_line['debit']
  414. gen_ld_data[acc_id][prt_id]['fin_bal']['balance'] += \
  415. move_line['balance']
  416. if foreign_currency:
  417. gen_ld_data[acc_id][prt_id]['fin_bal']['bal_curr'] += \
  418. move_line['amount_currency']
  419. else:
  420. gen_ld_data[acc_id][ml_id] = self._get_move_line_data(move_line)
  421. gen_ld_data[acc_id]['fin_bal']['credit'] += \
  422. move_line['credit']
  423. gen_ld_data[acc_id]['fin_bal']['debit'] += \
  424. move_line['debit']
  425. gen_ld_data[acc_id]['fin_bal']['balance'] += \
  426. move_line['balance']
  427. if foreign_currency:
  428. gen_ld_data[acc_id]['fin_bal']['bal_curr'] += \
  429. move_line['amount_currency']
  430. journals_data = self._get_journals_data(list(journal_ids))
  431. accounts_data = self._get_accounts_data(gen_ld_data.keys())
  432. taxes_data = self._get_taxes_data(list(taxes_ids))
  433. tags_data = self._get_tags_data(list(tags_ids))
  434. return gen_ld_data, accounts_data, partners_data, journals_data, \
  435. full_reconcile_data, taxes_data, tags_data
  436. @api.model
  437. def _create_general_ledger(self, gen_led_data, accounts_data):
  438. general_ledger = []
  439. for acc_id in gen_led_data.keys():
  440. account = {}
  441. account.update({
  442. 'code': accounts_data[acc_id]['code'],
  443. 'name': accounts_data[acc_id]['name'],
  444. 'type': 'account',
  445. 'currency_id': accounts_data[acc_id]['currency_id'],
  446. })
  447. if not gen_led_data[acc_id]['partners']:
  448. move_lines = []
  449. for ml_id in gen_led_data[acc_id].keys():
  450. if not isinstance(ml_id, int):
  451. account.update({ml_id: gen_led_data[acc_id][ml_id]})
  452. else:
  453. move_lines += [gen_led_data[acc_id][ml_id]]
  454. account.update({'move_lines': move_lines})
  455. else:
  456. list_partner = []
  457. for prt_id in gen_led_data[acc_id].keys():
  458. partner = {}
  459. move_lines = []
  460. if not isinstance(prt_id, int):
  461. account.update({prt_id: gen_led_data[acc_id][prt_id]})
  462. else:
  463. for ml_id in gen_led_data[acc_id][prt_id].keys():
  464. if not isinstance(ml_id, int):
  465. partner.update({ml_id: gen_led_data[acc_id][
  466. prt_id][ml_id]})
  467. else:
  468. move_lines += [
  469. gen_led_data[acc_id][prt_id][ml_id]]
  470. partner.update({'move_lines': move_lines})
  471. list_partner += [partner]
  472. account.update({'list_partner': list_partner})
  473. general_ledger += [account]
  474. return general_ledger
  475. @api.model
  476. def _get_centralized_ml(self, partners, date_to):
  477. centralized_ml = {}
  478. if isinstance(date_to, str):
  479. date_to = datetime.datetime.strptime(date_to, '%Y-%m-%d').date()
  480. for partner in partners:
  481. for move_line in partner['move_lines']:
  482. jnl_id = move_line['journal_id']
  483. month = move_line['date'].month
  484. if jnl_id not in centralized_ml.keys():
  485. centralized_ml[jnl_id] = {}
  486. if month not in centralized_ml[jnl_id].keys():
  487. centralized_ml[jnl_id][month] = {}
  488. last_day_month = \
  489. calendar.monthrange(move_line['date'].year, month)
  490. date = datetime.date(
  491. move_line['date'].year,
  492. month,
  493. last_day_month[1])
  494. if date > date_to:
  495. date = date_to
  496. centralized_ml[jnl_id][month].update({
  497. 'journal_id': jnl_id,
  498. 'ref': 'Centralized entries',
  499. 'date': date,
  500. 'debit': 0.0,
  501. 'credit': 0.0,
  502. 'balance': 0.0,
  503. 'bal_curr': 0.0,
  504. 'partner_id': False,
  505. 'rec_id': 0,
  506. 'entry_id': False,
  507. 'tax_ids': [],
  508. 'full_reconcile_id': False,
  509. 'id': False,
  510. 'tag_ids': False,
  511. 'currency_id': False,
  512. })
  513. centralized_ml[jnl_id][month]['debit'] += move_line['debit']
  514. centralized_ml[jnl_id][month]['credit'] += move_line['credit']
  515. centralized_ml[jnl_id][month]['balance'] += move_line['balance']
  516. centralized_ml[jnl_id][month]['bal_curr'] += move_line['bal_curr']
  517. list_centralized_ml = []
  518. for jnl_id in centralized_ml.keys():
  519. list_centralized_ml += list(centralized_ml[jnl_id].values())
  520. return list_centralized_ml
  521. @api.multi
  522. def _get_report_values(self, docids, data):
  523. wizard_id = data['wizard_id']
  524. company = self.env['res.company'].browse(data['company_id'])
  525. company_id = data['company_id']
  526. date_to = data['date_to']
  527. date_from = data['date_from']
  528. partner_ids = data['partner_ids']
  529. if not partner_ids:
  530. filter_partner_ids = False
  531. else:
  532. filter_partner_ids = True
  533. account_ids = data['account_ids']
  534. analytic_tag_ids = data['analytic_tag_ids']
  535. cost_center_ids = data['cost_center_ids']
  536. hide_account_at_0 = data['hide_account_at_0']
  537. foreign_currency = data['foreign_currency']
  538. only_posted_moves = data['only_posted_moves']
  539. unaffected_earnings_account = data['unaffected_earnings_account']
  540. fy_start_date = data['fy_start_date']
  541. gen_ld_data, partners_data, partners_ids = \
  542. self._get_initial_balance_data(
  543. account_ids, partner_ids, company_id, date_from,
  544. foreign_currency, only_posted_moves, hide_account_at_0,
  545. unaffected_earnings_account, fy_start_date, analytic_tag_ids,
  546. cost_center_ids)
  547. centralize = data['centralize']
  548. gen_ld_data, accounts_data, partners_data, journals_data, \
  549. full_reconcile_data, taxes_data, tags_data = \
  550. self._get_period_ml_data(
  551. account_ids, partner_ids, company_id, foreign_currency,
  552. only_posted_moves, hide_account_at_0, date_from, date_to,
  553. partners_data, gen_ld_data, partners_ids,
  554. centralize, analytic_tag_ids, cost_center_ids)
  555. general_ledger = self._create_general_ledger(gen_ld_data, accounts_data)
  556. if centralize:
  557. for account in general_ledger:
  558. if account['partners']:
  559. centralized_ml = self._get_centralized_ml(
  560. account['list_partner'], date_to)
  561. account['move_lines'] = centralized_ml
  562. account['partners'] = False
  563. del account['list_partner']
  564. general_ledger = natsorted(general_ledger, key=itemgetter('code'))
  565. return {
  566. 'doc_ids': [wizard_id],
  567. 'doc_model': 'general.ledger.report.wizard',
  568. 'docs': self.env['general.ledger.report.wizard'].browse(wizard_id),
  569. 'foreign_currency': data['foreign_currency'],
  570. 'company_name': company.display_name,
  571. 'company_currency': company.currency_id,
  572. 'currency_name': company.currency_id.name,
  573. 'date_from': data['date_from'],
  574. 'date_to': data['date_to'],
  575. 'only_posted_moves': data['only_posted_moves'],
  576. 'hide_account_at_0': data['hide_account_at_0'],
  577. 'show_analytic_tags': data['show_analytic_tags'],
  578. 'general_ledger': general_ledger,
  579. 'accounts_data': accounts_data,
  580. 'partners_data': partners_data,
  581. 'journals_data': journals_data,
  582. 'full_reconcile_data': full_reconcile_data,
  583. 'taxes_data': taxes_data,
  584. 'centralize': centralize,
  585. 'tags_data': tags_data,
  586. 'filter_partner_ids': filter_partner_ids,
  587. }