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.

154 lines
6.0 KiB

9 years ago
  1. # -*- coding: utf-8 -*-
  2. # © 2014-2015 ACSONE SA/NV (<http://acsone.eu>)
  3. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
  4. import datetime
  5. from openerp import fields
  6. import openerp.tests.common as common
  7. from openerp.tools.safe_eval import safe_eval
  8. from ..models.aep import AccountingExpressionProcessor as AEP
  9. from ..models.accounting_none import AccountingNone
  10. class TestAEP(common.TransactionCase):
  11. def setUp(self):
  12. super(TestAEP, self).setUp()
  13. self.account_model = self.env['account.account']
  14. self.move_model = self.env['account.move']
  15. self.journal_model = self.env['account.journal']
  16. self.curr_year = datetime.date.today().year
  17. self.prev_year = self.curr_year - 1
  18. # create receivable bs account
  19. type_ar = self.browse_ref('account.data_account_type_receivable')
  20. self.account_ar = self.account_model.create({
  21. 'code': '400AR',
  22. 'name': 'Receivable',
  23. 'user_type_id': type_ar.id,
  24. 'reconcile': True})
  25. # create income pl account
  26. type_in = self.browse_ref('account.data_account_type_revenue')
  27. self.account_in = self.account_model.create({
  28. 'code': '700IN',
  29. 'name': 'Income',
  30. 'user_type_id': type_in.id})
  31. # create journal
  32. self.journal = self.journal_model.create({
  33. 'name': 'Sale journal',
  34. 'code': 'VEN',
  35. 'type': 'sale'})
  36. # create the AEP, and prepare the expressions we'll need
  37. self.aep = AEP(self.env)
  38. self.aep.parse_expr("bali[]")
  39. self.aep.parse_expr("bale[]")
  40. self.aep.parse_expr("balp[]")
  41. self.aep.parse_expr("balu[]")
  42. self.aep.done_parsing(self.env.user.company_id)
  43. def _create_move(self, date, amount, debit_acc, credit_acc):
  44. move = self.move_model.create({
  45. 'journal_id': self.journal.id,
  46. 'date': fields.Date.to_string(date),
  47. 'line_ids': [(0, 0, {
  48. 'name': '/',
  49. 'debit': amount,
  50. 'account_id': debit_acc.id,
  51. }), (0, 0, {
  52. 'name': '/',
  53. 'credit': amount,
  54. 'account_id': credit_acc.id,
  55. })]})
  56. move.post()
  57. return move
  58. def _do_queries(self, date_from, date_to):
  59. self.aep.do_queries(
  60. date_from=fields.Date.to_string(date_from),
  61. date_to=fields.Date.to_string(date_to),
  62. target_move='posted',
  63. company=self.env.user.company_id
  64. )
  65. def _eval(self, expr, acc=None):
  66. eval_dict = {'AccountingNone': AccountingNone}
  67. if acc:
  68. return safe_eval(
  69. self.aep.replace_expr(expr, account_ids_filter=[acc.id]),
  70. eval_dict)
  71. else:
  72. return safe_eval(
  73. self.aep.replace_expr(expr),
  74. eval_dict)
  75. def test_sanity_check(self):
  76. self.assertEquals(self.env.user.company_id.fiscalyear_last_day, 31)
  77. self.assertEquals(self.env.user.company_id.fiscalyear_last_month, 12)
  78. def test_aep_1(self):
  79. # create move in december last year
  80. self._create_move(
  81. date=datetime.date(self.prev_year, 12, 1),
  82. amount=100,
  83. debit_acc=self.account_ar,
  84. credit_acc=self.account_in)
  85. # create move in january this year
  86. self._create_move(
  87. date=datetime.date(self.curr_year, 1, 1),
  88. amount=300,
  89. debit_acc=self.account_ar,
  90. credit_acc=self.account_in)
  91. # create move in february this year
  92. self._create_move(
  93. date=datetime.date(self.curr_year, 3, 1),
  94. amount=500,
  95. debit_acc=self.account_ar,
  96. credit_acc=self.account_in)
  97. # let's query for december
  98. self._do_queries(
  99. datetime.date(self.prev_year, 12, 1),
  100. datetime.date(self.prev_year, 12, 31))
  101. # initial balance must be None
  102. self.assertIs(self._eval('bali[]', self.account_in), AccountingNone)
  103. self.assertIs(self._eval('bali[]', self.account_ar), AccountingNone)
  104. # check variation
  105. self.assertEquals(self._eval('balp[]', self.account_in), -100)
  106. self.assertEquals(self._eval('balp[]', self.account_ar), 100)
  107. # check ending balance
  108. self.assertEquals(self._eval('bale[]', self.account_in), -100)
  109. self.assertEquals(self._eval('bale[]', self.account_ar), 100)
  110. # let's query for January
  111. self._do_queries(
  112. datetime.date(self.curr_year, 1, 1),
  113. datetime.date(self.curr_year, 1, 31))
  114. # initial balance is None for income account (it's not carried over)
  115. self.assertIs(self._eval('bali[]', self.account_in), AccountingNone)
  116. self.assertEquals(self._eval('bali[]', self.account_ar), 100)
  117. # check variation
  118. self.assertEquals(self._eval('balp[]', self.account_in), -300)
  119. self.assertEquals(self._eval('balp[]', self.account_ar), 300)
  120. # check ending balance
  121. self.assertEquals(self._eval('bale[]', self.account_in), -300)
  122. self.assertEquals(self._eval('bale[]', self.account_ar), 400)
  123. # let's query for March
  124. self._do_queries(
  125. datetime.date(self.curr_year, 3, 1),
  126. datetime.date(self.curr_year, 3, 31))
  127. # initial balance is the ending balance fo January
  128. self.assertEquals(self._eval('bali[]', self.account_in), -300)
  129. self.assertEquals(self._eval('bali[]', self.account_ar), 400)
  130. # check variation
  131. self.assertEquals(self._eval('balp[]', self.account_in), -500)
  132. self.assertEquals(self._eval('balp[]', self.account_ar), 500)
  133. # check ending balance
  134. self.assertEquals(self._eval('bale[]', self.account_in), -800)
  135. self.assertEquals(self._eval('bale[]', self.account_ar), 900)
  136. # unallocated p&l from previous year
  137. self.assertEquals(self._eval('balu[]'), -100)
  138. # TODO allocate profits, and then...