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.

369 lines
12 KiB

  1. # Copyright 2017 ACSONE SA/NV
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. import time
  4. from datetime import datetime
  5. from dateutil.relativedelta import relativedelta
  6. from odoo.fields import Date
  7. from odoo.tests.common import TransactionCase
  8. from . import abstract_test_foreign_currency as a_t_f_c
  9. class TestJournalLedger(a_t_f_c.AbstractTestForeignCurrency):
  10. """
  11. Technical tests for General Ledger Report.
  12. """
  13. def _getReportModel(self):
  14. return self.env['report_journal_ledger']
  15. def _getQwebReportName(self):
  16. return 'account_financial_report.report_journal_ledger_qweb'
  17. def _getHtmlReportName(self):
  18. return 'account_financial_report.report_journal_ledger_html_qweb'
  19. def _getXlsxReportName(self):
  20. return 'a_f_r.report_journal_ledger_xlsx'
  21. def _getXlsxReportActionName(self):
  22. return 'account_financial_report.' \
  23. 'action_report_journal_ledger_xlsx'
  24. def _getReportTitle(self):
  25. return 'Odoo'
  26. def _getBaseFilters(self):
  27. return {
  28. 'date_from': time.strftime('%Y-01-01'),
  29. 'date_to': time.strftime('%Y-12-31'),
  30. 'company_id': self.company.id,
  31. 'journal_ids': [(6, 0, self.journal_sale.ids)]
  32. }
  33. def _getAdditionalFiltersToBeTested(self):
  34. return [
  35. {'move_target': "All",
  36. 'sort_option': "Date",
  37. 'group_option': "Journal",
  38. 'with_account_name': True,
  39. 'foreign_currency': True},
  40. ]
  41. def test_02_generation_report_html(self):
  42. """Check if report HTML is correctly generated"""
  43. # Check if returned report action is correct
  44. report_type = 'qweb-html'
  45. report_action = self.report.print_report(report_type)
  46. self.assertDictContainsSubset(
  47. {
  48. 'type': 'ir.actions.report',
  49. 'report_name': self.html_report_name,
  50. 'report_type': 'qweb-html',
  51. },
  52. report_action
  53. )
  54. # Check if report template is correct
  55. report = self.env['ir.actions.report'].search(
  56. [('report_name', '=', self.html_report_name),
  57. ('report_type', '=', report_type)], limit=1)
  58. self.assertEqual(report.report_type, 'qweb-html')
  59. rep = report.render(self.report.ids, {})
  60. self.assertTrue(self.report_title.encode('utf8') in rep[0])
  61. self.assertTrue(
  62. self.report.journal_ids[0].name.encode('utf8') in rep[0]
  63. )
  64. def test_04_compute_data(self):
  65. return True
  66. class TestJournalReport(TransactionCase):
  67. def setUp(self):
  68. super(TestJournalReport, self).setUp()
  69. self.AccountObj = self.env['account.account']
  70. self.InvoiceObj = self.env['account.invoice']
  71. self.JournalObj = self.env['account.journal']
  72. self.JournalReportObj = self.env['journal.ledger.report.wizard']
  73. self.MoveObj = self.env['account.move']
  74. self.ReportJournalLedger = self.env['report_journal_ledger']
  75. self.TaxObj = self.env['account.tax']
  76. self.company = self.env.ref('base.main_company')
  77. today = datetime.today()
  78. last_year = today - relativedelta(years=1)
  79. self.previous_fy_date_start = Date.to_string(
  80. last_year.replace(month=1, day=1))
  81. self.previous_fy_date_end = Date.to_string(
  82. last_year.replace(month=12, day=31))
  83. self.fy_date_start = Date.to_string(
  84. today.replace(month=1, day=1))
  85. self.fy_date_end = Date.to_string(
  86. today.replace(month=12, day=31))
  87. self.receivable_account = self.AccountObj.search([
  88. ('user_type_id.name', '=', 'Receivable')
  89. ], limit=1)
  90. self.income_account = self.AccountObj.search([
  91. ('user_type_id.name', '=', 'Income')
  92. ], limit=1)
  93. self.payable_account = self.AccountObj.search([
  94. ('user_type_id.name', '=', 'Payable')
  95. ], limit=1)
  96. self.journal_sale = self.JournalObj.create({
  97. 'name': "Test journal sale",
  98. 'code': "TST-JRNL-S",
  99. 'type': 'sale',
  100. 'company_id': self.company.id,
  101. })
  102. self.journal_purchase = self.JournalObj.create({
  103. 'name': "Test journal purchase",
  104. 'code': "TST-JRNL-P",
  105. 'type': 'sale',
  106. 'company_id': self.company.id,
  107. })
  108. self.tax_15_s = self.TaxObj.create({
  109. 'sequence': 30,
  110. 'name': 'Tax 15.0% (Percentage of Price)',
  111. 'amount': 15.0,
  112. 'amount_type': 'percent',
  113. 'include_base_amount': False,
  114. 'type_tax_use': 'sale',
  115. })
  116. self.tax_20_s = self.TaxObj.create({
  117. 'sequence': 30,
  118. 'name': 'Tax 20.0% (Percentage of Price)',
  119. 'amount': 20.0,
  120. 'amount_type': 'percent',
  121. 'include_base_amount': False,
  122. 'type_tax_use': 'sale',
  123. })
  124. self.tax_15_p = self.TaxObj.create({
  125. 'sequence': 30,
  126. 'name': 'Tax 15.0% (Percentage of Price)',
  127. 'amount': 15.0,
  128. 'amount_type': 'percent',
  129. 'include_base_amount': False,
  130. 'type_tax_use': 'purchase',
  131. })
  132. self.tax_20_p = self.TaxObj.create({
  133. 'sequence': 30,
  134. 'name': 'Tax 20.0% (Percentage of Price)',
  135. 'amount': 20.0,
  136. 'amount_type': 'percent',
  137. 'include_base_amount': False,
  138. 'type_tax_use': 'purchase',
  139. })
  140. self.partner_2 = self.env.ref('base.res_partner_2')
  141. def _add_move(
  142. self, date, journal,
  143. receivable_debit, receivable_credit, income_debit, income_credit):
  144. move_name = 'move name'
  145. move_vals = {
  146. 'journal_id': journal.id,
  147. 'date': date,
  148. 'line_ids': [
  149. (0, 0, {
  150. 'name': move_name,
  151. 'debit': receivable_debit,
  152. 'credit': receivable_credit,
  153. 'account_id': self.receivable_account.id
  154. }),
  155. (0, 0, {
  156. 'name': move_name,
  157. 'debit': income_debit,
  158. 'credit': income_credit,
  159. 'account_id': self.income_account.id
  160. }),
  161. ]
  162. }
  163. return self.MoveObj.create(move_vals)
  164. def check_report_journal_debit_credit(
  165. self, report, expected_debit, expected_credit):
  166. self.assertEqual(
  167. expected_debit,
  168. sum([journal.debit for journal in
  169. report.report_journal_ledger_ids])
  170. )
  171. self.assertEqual(
  172. expected_credit,
  173. sum([journal.credit for journal in
  174. report.report_journal_ledger_ids])
  175. )
  176. def check_report_journal_debit_credit_taxes(
  177. self, report,
  178. expected_base_debit, expected_base_credit,
  179. expected_tax_debit, expected_tax_credit):
  180. self.assertEqual(
  181. expected_base_debit,
  182. sum([
  183. journal.base_debit
  184. for journal in report.report_journal_ledger_tax_line_ids
  185. ])
  186. )
  187. self.assertEqual(
  188. expected_base_credit,
  189. sum([
  190. journal.base_credit
  191. for journal in report.report_journal_ledger_tax_line_ids
  192. ])
  193. )
  194. self.assertEqual(
  195. expected_tax_debit,
  196. sum([
  197. journal.tax_debit
  198. for journal in report.report_journal_ledger_tax_line_ids
  199. ])
  200. )
  201. self.assertEqual(
  202. expected_tax_credit,
  203. sum([
  204. journal.tax_credit
  205. for journal in report.report_journal_ledger_tax_line_ids
  206. ])
  207. )
  208. def test_01_test_total(self):
  209. today_date = Date.today()
  210. last_year_date = Date.to_string(
  211. datetime.today() - relativedelta(years=1))
  212. move1 = self._add_move(
  213. today_date, self.journal_sale,
  214. 0, 100, 100, 0)
  215. move2 = self._add_move(
  216. last_year_date, self.journal_sale,
  217. 0, 100, 100, 0)
  218. report = self.ReportJournalLedger.create({
  219. 'date_from': self.fy_date_start,
  220. 'date_to': self.fy_date_end,
  221. 'company_id': self.company.id,
  222. 'journal_ids': [(6, 0, self.journal_sale.ids)]
  223. })
  224. report.compute_data_for_report()
  225. self.check_report_journal_debit_credit(report, 100, 100)
  226. move3 = self._add_move(
  227. today_date, self.journal_sale,
  228. 0, 100, 100, 0)
  229. report.compute_data_for_report()
  230. self.check_report_journal_debit_credit(report, 200, 200)
  231. report.move_target = 'posted'
  232. report.compute_data_for_report()
  233. self.check_report_journal_debit_credit(report, 0, 0)
  234. move1.post()
  235. report.compute_data_for_report()
  236. self.check_report_journal_debit_credit(report, 100, 100)
  237. move2.post()
  238. report.compute_data_for_report()
  239. self.check_report_journal_debit_credit(report, 100, 100)
  240. move3.post()
  241. report.compute_data_for_report()
  242. self.check_report_journal_debit_credit(report, 200, 200)
  243. report.date_from = self.previous_fy_date_start
  244. report.compute_data_for_report()
  245. self.check_report_journal_debit_credit(report, 300, 300)
  246. def test_02_test_taxes_out_invoice(self):
  247. invoice_values = {
  248. 'journal_id': self.journal_sale.id,
  249. 'partner_id': self.partner_2.id,
  250. 'type': 'out_invoice',
  251. 'invoice_line_ids': [
  252. (0, 0, {
  253. 'quantity': 1.0,
  254. 'price_unit': 100,
  255. 'account_id': self.receivable_account.id,
  256. 'name': "Test",
  257. 'invoice_line_tax_ids': [(6, 0, [self.tax_15_s.id])],
  258. }),
  259. (0, 0, {
  260. 'quantity': 1.0,
  261. 'price_unit': 100,
  262. 'account_id': self.receivable_account.id,
  263. 'name': "Test",
  264. 'invoice_line_tax_ids': [(6, 0, [
  265. self.tax_15_s.id, self.tax_20_s.id
  266. ])],
  267. })
  268. ]
  269. }
  270. invoice = self.InvoiceObj.create(invoice_values)
  271. invoice.action_invoice_open()
  272. report = self.ReportJournalLedger.create({
  273. 'date_from': self.fy_date_start,
  274. 'date_to': self.fy_date_end,
  275. 'company_id': self.company.id,
  276. 'journal_ids': [(6, 0, self.journal_sale.ids)]
  277. })
  278. report.compute_data_for_report()
  279. self.check_report_journal_debit_credit(report, 250, 250)
  280. self.check_report_journal_debit_credit_taxes(report, 0, 300, 0, 50)
  281. def test_03_test_taxes_in_invoice(self):
  282. invoice_values = {
  283. 'journal_id': self.journal_sale.id,
  284. 'partner_id': self.partner_2.id,
  285. 'type': 'in_invoice',
  286. 'invoice_line_ids': [
  287. (0, 0, {
  288. 'quantity': 1.0,
  289. 'price_unit': 100,
  290. 'account_id': self.payable_account.id,
  291. 'name': "Test",
  292. 'invoice_line_tax_ids': [(6, 0, [self.tax_15_p.id])],
  293. }),
  294. (0, 0, {
  295. 'quantity': 1.0,
  296. 'price_unit': 100,
  297. 'account_id': self.payable_account.id,
  298. 'name': "Test",
  299. 'invoice_line_tax_ids': [(6, 0, [
  300. self.tax_15_p.id, self.tax_20_p.id
  301. ])],
  302. })
  303. ]
  304. }
  305. invoice = self.InvoiceObj.create(invoice_values)
  306. invoice.action_invoice_open()
  307. report = self.ReportJournalLedger.create({
  308. 'date_from': self.fy_date_start,
  309. 'date_to': self.fy_date_end,
  310. 'company_id': self.company.id,
  311. 'journal_ids': [(6, 0, self.journal_sale.ids)]
  312. })
  313. report.compute_data_for_report()
  314. self.check_report_journal_debit_credit(report, 250, 250)
  315. self.check_report_journal_debit_credit_taxes(report, 300, 0, 50, 0)