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.

563 lines
22 KiB

  1. # Author: Julien Coux
  2. # Copyright 2016 Camptocamp SA
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. import time
  5. from datetime import date
  6. from odoo import fields
  7. from odoo.tests import common
  8. from . import abstract_test_foreign_currency as a_t_f_c
  9. class TestGeneralLedger(a_t_f_c.AbstractTestForeignCurrency):
  10. """
  11. Technical tests for General Ledger Report.
  12. """
  13. def _getReportModel(self):
  14. return self.env["report_general_ledger"]
  15. def _getQwebReportName(self):
  16. return "account_financial_report.report_general_ledger_qweb"
  17. def _getXlsxReportName(self):
  18. return "a_f_r.report_general_ledger_xlsx"
  19. def _getXlsxReportActionName(self):
  20. return "account_financial_report." "action_report_general_ledger_xlsx"
  21. def _getReportTitle(self):
  22. return "Odoo"
  23. def _getBaseFilters(self):
  24. return {
  25. "date_from": date(date.today().year, 1, 1),
  26. "date_to": date(date.today().year, 12, 31),
  27. "company_id": self.company.id,
  28. "fy_start_date": date(date.today().year, 1, 1),
  29. "foreign_currency": True,
  30. }
  31. def _getAdditionalFiltersToBeTested(self):
  32. additional_filters = [
  33. {"only_posted_moves": True},
  34. {"hide_account_at_0": True},
  35. {"centralize": True},
  36. {"only_posted_moves": True, "hide_account_at_0": True},
  37. {"only_posted_moves": True, "centralize": True},
  38. {"hide_account_at_0": True, "centralize": True},
  39. {"only_posted_moves": True, "hide_account_at_0": True, "centralize": True},
  40. ]
  41. # Add `show_analytic_tags` filter on each cases
  42. additional_filters_with_show_tags = []
  43. for additional_filter in additional_filters:
  44. additional_filter["show_analytic_tags"] = True
  45. additional_filters_with_show_tags.append(additional_filter)
  46. additional_filters += additional_filters_with_show_tags
  47. # Add `filter_analytic_tag_ids` filter on each cases
  48. analytic_tag = self.env["account.analytic.tag"].create({"name": "TEST tag"})
  49. # Define all move lines on this tag
  50. # (this test just check with the all filters, all works technically)
  51. move_lines = self.env["account.move.line"].search([])
  52. move_lines.write(
  53. {"analytic_tag_ids": [(6, False, analytic_tag.ids)],}
  54. )
  55. additional_filters_with_filter_tags = []
  56. for additional_filter in additional_filters:
  57. additional_filter["filter_analytic_tag_ids"] = [
  58. (6, False, analytic_tag.ids)
  59. ]
  60. additional_filters_with_filter_tags.append(additional_filter)
  61. additional_filters += additional_filters_with_filter_tags
  62. return additional_filters
  63. class TestGeneralLedgerReport(common.TransactionCase):
  64. def setUp(self):
  65. super(TestGeneralLedgerReport, self).setUp()
  66. self.before_previous_fy_year = fields.Date.from_string("2014-05-05")
  67. self.previous_fy_date_start = fields.Date.from_string("2015-01-01")
  68. self.previous_fy_date_end = fields.Date.from_string("2015-12-31")
  69. self.fy_date_start = fields.Date.from_string("2016-01-01")
  70. self.fy_date_end = fields.Date.from_string("2016-12-31")
  71. self.receivable_account = self.env["account.account"].search(
  72. [("user_type_id.name", "=", "Receivable")], limit=1
  73. )
  74. self.income_account = self.env["account.account"].search(
  75. [("user_type_id.name", "=", "Income")], limit=1
  76. )
  77. self.unaffected_account = self.env["account.account"].search(
  78. [
  79. (
  80. "user_type_id",
  81. "=",
  82. self.env.ref("account.data_unaffected_earnings").id,
  83. )
  84. ],
  85. limit=1,
  86. )
  87. def _add_move(
  88. self,
  89. date,
  90. receivable_debit,
  91. receivable_credit,
  92. income_debit,
  93. income_credit,
  94. unaffected_debit=0,
  95. unaffected_credit=0,
  96. ):
  97. move_name = "expense accrual"
  98. journal = self.env["account.journal"].search([], limit=1)
  99. partner = self.env.ref("base.res_partner_12")
  100. move_vals = {
  101. "journal_id": journal.id,
  102. "name": move_name,
  103. "date": date,
  104. "line_ids": [
  105. (
  106. 0,
  107. 0,
  108. {
  109. "name": move_name,
  110. "debit": receivable_debit,
  111. "credit": receivable_credit,
  112. "account_id": self.receivable_account.id,
  113. "partner_id": partner.id,
  114. },
  115. ),
  116. (
  117. 0,
  118. 0,
  119. {
  120. "name": move_name,
  121. "debit": income_debit,
  122. "credit": income_credit,
  123. "account_id": self.income_account.id,
  124. "partner_id": partner.id,
  125. },
  126. ),
  127. (
  128. 0,
  129. 0,
  130. {
  131. "name": move_name,
  132. "debit": unaffected_debit,
  133. "credit": unaffected_credit,
  134. "account_id": self.unaffected_account.id,
  135. "partner_id": partner.id,
  136. },
  137. ),
  138. ],
  139. }
  140. move = self.env["account.move"].create(move_vals)
  141. move.post()
  142. def _get_report_lines(self, with_partners=False):
  143. company = self.env.ref("base.main_company")
  144. general_ledger = self.env["report_general_ledger"].create(
  145. {
  146. "date_from": self.fy_date_start,
  147. "date_to": self.fy_date_end,
  148. "only_posted_moves": True,
  149. "hide_account_at_0": False,
  150. "company_id": company.id,
  151. "fy_start_date": self.fy_date_start,
  152. }
  153. )
  154. general_ledger.compute_data_for_report(
  155. with_line_details=True, with_partners=with_partners
  156. )
  157. lines = {}
  158. report_account_model = self.env["report_general_ledger_account"]
  159. lines["receivable"] = report_account_model.search(
  160. [
  161. ("report_id", "=", general_ledger.id),
  162. ("account_id", "=", self.receivable_account.id),
  163. ]
  164. )
  165. lines["income"] = report_account_model.search(
  166. [
  167. ("report_id", "=", general_ledger.id),
  168. ("account_id", "=", self.income_account.id),
  169. ]
  170. )
  171. lines["unaffected"] = report_account_model.search(
  172. [
  173. ("report_id", "=", general_ledger.id),
  174. ("account_id", "=", self.unaffected_account.id),
  175. ]
  176. )
  177. if with_partners:
  178. report_partner_model = self.env["report_general_ledger_partner"]
  179. lines["partner_receivable"] = report_partner_model.search(
  180. [
  181. ("report_account_id", "=", lines["receivable"].id),
  182. ("partner_id", "=", self.env.ref("base.res_partner_12").id),
  183. ]
  184. )
  185. return lines
  186. def test_01_account_balance(self):
  187. # Generate the general ledger line
  188. lines = self._get_report_lines()
  189. self.assertEqual(len(lines["receivable"]), 0)
  190. self.assertEqual(len(lines["income"]), 0)
  191. # Add a move at the previous day of the first day of fiscal year
  192. # to check the initial balance
  193. self._add_move(
  194. date=self.previous_fy_date_end,
  195. receivable_debit=1000,
  196. receivable_credit=0,
  197. income_debit=0,
  198. income_credit=1000,
  199. )
  200. # Re Generate the general ledger line
  201. lines = self._get_report_lines()
  202. self.assertEqual(len(lines["receivable"]), 1)
  203. self.assertEqual(len(lines["income"]), 0)
  204. # Check the initial and final balance
  205. self.assertEqual(lines["receivable"].initial_debit, 1000)
  206. self.assertEqual(lines["receivable"].initial_credit, 0)
  207. self.assertEqual(lines["receivable"].initial_balance, 1000)
  208. self.assertEqual(lines["receivable"].final_debit, 1000)
  209. self.assertEqual(lines["receivable"].final_credit, 0)
  210. self.assertEqual(lines["receivable"].final_balance, 1000)
  211. # Add reversale move of the initial move the first day of fiscal year
  212. # to check the first day of fiscal year is not used
  213. # to compute the initial balance
  214. self._add_move(
  215. date=self.fy_date_start,
  216. receivable_debit=0,
  217. receivable_credit=1000,
  218. income_debit=1000,
  219. income_credit=0,
  220. )
  221. # Re Generate the general ledger line
  222. lines = self._get_report_lines()
  223. self.assertEqual(len(lines["receivable"]), 1)
  224. self.assertEqual(len(lines["income"]), 1)
  225. # Check the initial and final balance
  226. self.assertEqual(lines["receivable"].initial_debit, 1000)
  227. self.assertEqual(lines["receivable"].initial_credit, 0)
  228. self.assertEqual(lines["receivable"].initial_balance, 1000)
  229. self.assertEqual(lines["receivable"].final_debit, 1000)
  230. self.assertEqual(lines["receivable"].final_credit, 1000)
  231. self.assertEqual(lines["receivable"].final_balance, 0)
  232. self.assertEqual(lines["income"].initial_debit, 0)
  233. self.assertEqual(lines["income"].initial_credit, 0)
  234. self.assertEqual(lines["income"].initial_balance, 0)
  235. self.assertEqual(lines["income"].final_debit, 1000)
  236. self.assertEqual(lines["income"].final_credit, 0)
  237. self.assertEqual(lines["income"].final_balance, 1000)
  238. # Add another move at the end day of fiscal year
  239. # to check that it correctly used on report
  240. self._add_move(
  241. date=self.fy_date_end,
  242. receivable_debit=0,
  243. receivable_credit=1000,
  244. income_debit=1000,
  245. income_credit=0,
  246. )
  247. # Re Generate the general ledger line
  248. lines = self._get_report_lines()
  249. self.assertEqual(len(lines["receivable"]), 1)
  250. self.assertEqual(len(lines["income"]), 1)
  251. # Check the initial and final balance
  252. self.assertEqual(lines["receivable"].initial_debit, 1000)
  253. self.assertEqual(lines["receivable"].initial_credit, 0)
  254. self.assertEqual(lines["receivable"].initial_balance, 1000)
  255. self.assertEqual(lines["receivable"].final_debit, 1000)
  256. self.assertEqual(lines["receivable"].final_credit, 2000)
  257. self.assertEqual(lines["receivable"].final_balance, -1000)
  258. self.assertEqual(lines["income"].initial_debit, 0)
  259. self.assertEqual(lines["income"].initial_credit, 0)
  260. self.assertEqual(lines["income"].initial_balance, 0)
  261. self.assertEqual(lines["income"].final_debit, 2000)
  262. self.assertEqual(lines["income"].final_credit, 0)
  263. self.assertEqual(lines["income"].final_balance, 2000)
  264. def test_02_partner_balance(self):
  265. # Generate the general ledger line
  266. lines = self._get_report_lines(with_partners=True)
  267. self.assertEqual(len(lines["partner_receivable"]), 0)
  268. # Add a move at the previous day of the first day of fiscal year
  269. # to check the initial balance
  270. self._add_move(
  271. date=self.previous_fy_date_end,
  272. receivable_debit=1000,
  273. receivable_credit=0,
  274. income_debit=0,
  275. income_credit=1000,
  276. )
  277. # Re Generate the general ledger line
  278. lines = self._get_report_lines(with_partners=True)
  279. self.assertEqual(len(lines["partner_receivable"]), 1)
  280. # Check the initial and final balance
  281. self.assertEqual(lines["partner_receivable"].initial_debit, 1000)
  282. self.assertEqual(lines["partner_receivable"].initial_credit, 0)
  283. self.assertEqual(lines["partner_receivable"].initial_balance, 1000)
  284. self.assertEqual(lines["partner_receivable"].final_debit, 1000)
  285. self.assertEqual(lines["partner_receivable"].final_credit, 0)
  286. self.assertEqual(lines["partner_receivable"].final_balance, 1000)
  287. # Add reversale move of the initial move the first day of fiscal year
  288. # to check the first day of fiscal year is not used
  289. # to compute the initial balance
  290. self._add_move(
  291. date=self.fy_date_start,
  292. receivable_debit=0,
  293. receivable_credit=1000,
  294. income_debit=1000,
  295. income_credit=0,
  296. )
  297. # Re Generate the general ledger line
  298. lines = self._get_report_lines(with_partners=True)
  299. self.assertEqual(len(lines["partner_receivable"]), 1)
  300. # Check the initial and final balance
  301. self.assertEqual(lines["partner_receivable"].initial_debit, 1000)
  302. self.assertEqual(lines["partner_receivable"].initial_credit, 0)
  303. self.assertEqual(lines["partner_receivable"].initial_balance, 1000)
  304. self.assertEqual(lines["partner_receivable"].final_debit, 1000)
  305. self.assertEqual(lines["partner_receivable"].final_credit, 1000)
  306. self.assertEqual(lines["partner_receivable"].final_balance, 0)
  307. # Add another move at the end day of fiscal year
  308. # to check that it correctly used on report
  309. self._add_move(
  310. date=self.fy_date_end,
  311. receivable_debit=0,
  312. receivable_credit=1000,
  313. income_debit=1000,
  314. income_credit=0,
  315. )
  316. # Re Generate the general ledger line
  317. lines = self._get_report_lines(with_partners=True)
  318. self.assertEqual(len(lines["partner_receivable"]), 1)
  319. # Check the initial and final balance
  320. self.assertEqual(lines["partner_receivable"].initial_debit, 1000)
  321. self.assertEqual(lines["partner_receivable"].initial_credit, 0)
  322. self.assertEqual(lines["partner_receivable"].initial_balance, 1000)
  323. self.assertEqual(lines["partner_receivable"].final_debit, 1000)
  324. self.assertEqual(lines["partner_receivable"].final_credit, 2000)
  325. self.assertEqual(lines["partner_receivable"].final_balance, -1000)
  326. def test_03_unaffected_account_balance(self):
  327. # Generate the general ledger line
  328. lines = self._get_report_lines()
  329. self.assertEqual(len(lines["unaffected"]), 1)
  330. # Check the initial and final balance
  331. self.assertEqual(lines["unaffected"].initial_debit, 0)
  332. self.assertEqual(lines["unaffected"].initial_credit, 0)
  333. self.assertEqual(lines["unaffected"].initial_balance, 0)
  334. self.assertEqual(lines["unaffected"].final_debit, 0)
  335. self.assertEqual(lines["unaffected"].final_credit, 0)
  336. self.assertEqual(lines["unaffected"].final_balance, 0)
  337. # Add a move at the previous day of the first day of fiscal year
  338. # to check the initial balance
  339. self._add_move(
  340. date=self.previous_fy_date_end,
  341. receivable_debit=1000,
  342. receivable_credit=0,
  343. income_debit=0,
  344. income_credit=1000,
  345. )
  346. # Re Generate the general ledger line
  347. lines = self._get_report_lines()
  348. self.assertEqual(len(lines["unaffected"]), 1)
  349. # Check the initial and final balance
  350. self.assertEqual(lines["unaffected"].initial_debit, 0)
  351. self.assertEqual(lines["unaffected"].initial_credit, 1000)
  352. self.assertEqual(lines["unaffected"].initial_balance, -1000)
  353. self.assertEqual(lines["unaffected"].final_debit, 0)
  354. self.assertEqual(lines["unaffected"].final_credit, 1000)
  355. self.assertEqual(lines["unaffected"].final_balance, -1000)
  356. # Add reversale move of the initial move the first day of fiscal year
  357. # to check the first day of fiscal year is not used
  358. # to compute the initial balance
  359. self._add_move(
  360. date=self.fy_date_start,
  361. receivable_debit=0,
  362. receivable_credit=0,
  363. income_debit=0,
  364. income_credit=1000,
  365. unaffected_debit=1000,
  366. unaffected_credit=0,
  367. )
  368. # Re Generate the general ledger line
  369. lines = self._get_report_lines()
  370. self.assertEqual(len(lines["unaffected"]), 1)
  371. # Check the initial and final balance
  372. self.assertEqual(lines["unaffected"].initial_debit, 0)
  373. self.assertEqual(lines["unaffected"].initial_credit, 1000)
  374. self.assertEqual(lines["unaffected"].initial_balance, -1000)
  375. self.assertEqual(lines["unaffected"].final_debit, 1000)
  376. self.assertEqual(lines["unaffected"].final_credit, 1000)
  377. self.assertEqual(lines["unaffected"].final_balance, 0)
  378. # Add another move at the end day of fiscal year
  379. # to check that it correctly used on report
  380. self._add_move(
  381. date=self.fy_date_end,
  382. receivable_debit=3000,
  383. receivable_credit=0,
  384. income_debit=0,
  385. income_credit=0,
  386. unaffected_debit=0,
  387. unaffected_credit=3000,
  388. )
  389. # Re Generate the general ledger line
  390. lines = self._get_report_lines()
  391. self.assertEqual(len(lines["unaffected"]), 1)
  392. # Check the initial and final balance
  393. self.assertEqual(lines["unaffected"].initial_debit, 0)
  394. self.assertEqual(lines["unaffected"].initial_credit, 1000)
  395. self.assertEqual(lines["unaffected"].initial_balance, -1000)
  396. self.assertEqual(lines["unaffected"].final_debit, 1000)
  397. self.assertEqual(lines["unaffected"].final_credit, 4000)
  398. self.assertEqual(lines["unaffected"].final_balance, -3000)
  399. def test_04_unaffected_account_balance_2_years(self):
  400. # Generate the general ledger line
  401. lines = self._get_report_lines()
  402. self.assertEqual(len(lines["unaffected"]), 1)
  403. # Check the initial and final balance
  404. self.assertEqual(lines["unaffected"].initial_debit, 0)
  405. self.assertEqual(lines["unaffected"].initial_credit, 0)
  406. self.assertEqual(lines["unaffected"].initial_balance, 0)
  407. self.assertEqual(lines["unaffected"].final_debit, 0)
  408. self.assertEqual(lines["unaffected"].final_credit, 0)
  409. self.assertEqual(lines["unaffected"].final_balance, 0)
  410. # Add a move at any date 2 years before the balance
  411. # (to create an historic)
  412. self._add_move(
  413. date=self.before_previous_fy_year,
  414. receivable_debit=0,
  415. receivable_credit=1000,
  416. income_debit=1000,
  417. income_credit=0,
  418. )
  419. # Re Generate the general ledger line
  420. lines = self._get_report_lines()
  421. self.assertEqual(len(lines["unaffected"]), 1)
  422. # Check the initial and final balance
  423. self.assertEqual(lines["unaffected"].initial_debit, 1000)
  424. self.assertEqual(lines["unaffected"].initial_credit, 0)
  425. self.assertEqual(lines["unaffected"].initial_balance, 1000)
  426. self.assertEqual(lines["unaffected"].final_debit, 1000)
  427. self.assertEqual(lines["unaffected"].final_credit, 0)
  428. self.assertEqual(lines["unaffected"].final_balance, 1000)
  429. # Affect the company's result last year
  430. self._add_move(
  431. date=self.previous_fy_date_start,
  432. receivable_debit=1000,
  433. receivable_credit=0,
  434. income_debit=0,
  435. income_credit=0,
  436. unaffected_debit=0,
  437. unaffected_credit=1000,
  438. )
  439. # Add another move last year to test the initial balance this year
  440. self._add_move(
  441. date=self.previous_fy_date_start,
  442. receivable_debit=0,
  443. receivable_credit=500,
  444. income_debit=500,
  445. income_credit=0,
  446. unaffected_debit=0,
  447. unaffected_credit=0,
  448. )
  449. # Re Generate the general ledger line
  450. lines = self._get_report_lines()
  451. self.assertEqual(len(lines["unaffected"]), 1)
  452. # Check the initial and final balance
  453. self.assertEqual(lines["unaffected"].initial_debit, 500)
  454. self.assertEqual(lines["unaffected"].initial_credit, 0)
  455. self.assertEqual(lines["unaffected"].initial_balance, 500)
  456. self.assertEqual(lines["unaffected"].final_debit, 500)
  457. self.assertEqual(lines["unaffected"].final_credit, 0)
  458. self.assertEqual(lines["unaffected"].final_balance, 500)
  459. def test_partner_filter(self):
  460. partner_1 = self.env.ref("base.res_partner_1")
  461. partner_2 = self.env.ref("base.res_partner_2")
  462. partner_3 = self.env.ref("base.res_partner_3")
  463. partner_4 = self.env.ref("base.res_partner_4")
  464. partner_1.write({"is_company": False, "parent_id": partner_2.id})
  465. partner_3.write({"is_company": False})
  466. expected_list = [partner_2.id, partner_3.id, partner_4.id]
  467. context = {
  468. "active_ids": [partner_1.id, partner_2.id, partner_3.id, partner_4.id],
  469. "active_model": "res.partner",
  470. }
  471. wizard = self.env["general.ledger.report.wizard"].with_context(context)
  472. self.assertEqual(wizard._default_partners(), expected_list)
  473. def test_validate_date(self):
  474. company_id = self.env.ref("base.main_company")
  475. company_id.write(
  476. {"fiscalyear_last_day": 31, "fiscalyear_last_month": 12,}
  477. )
  478. user = self.env.ref("base.user_root").with_context(company_id=company_id.id)
  479. wizard = self.env["general.ledger.report.wizard"].with_context(user=user.id)
  480. self.assertEqual(wizard._init_date_from(), time.strftime("%Y") + "-01-01")
  481. def test_validate_date_range(self):
  482. data_type = self.env["date.range.type"].create(
  483. {"name": "Fiscal year", "company_id": False, "allow_overlap": False}
  484. )
  485. dr = self.env["date.range"].create(
  486. {
  487. "name": "FS2015",
  488. "date_start": "2018-01-01",
  489. "date_end": "2018-12-31",
  490. "type_id": data_type.id,
  491. }
  492. )
  493. wizard = self.env["general.ledger.report.wizard"].create(
  494. {"date_range_id": dr.id}
  495. )
  496. wizard.onchange_date_range_id()
  497. self.assertEqual(wizard.date_from, date(2018, 1, 1))
  498. self.assertEqual(wizard.date_to, date(2018, 12, 31))