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.

267 lines
9.7 KiB

  1. # Copyright 2019 Brainbean Apps (https://brainbeanapps.com)
  2. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
  3. from odoo import fields
  4. from odoo.tests import common
  5. from base64 import b64encode
  6. from unittest import mock
  7. _parse_file_method = (
  8. 'odoo.addons.account_bank_statement_import'
  9. '.account_bank_statement_import.AccountBankStatementImport._parse_file'
  10. )
  11. class TestAccountBankAccountStatementImportSplit(common.TransactionCase):
  12. def setUp(self):
  13. super().setUp()
  14. self.now = fields.Datetime.now()
  15. self.currency_usd = self.env.ref('base.USD')
  16. self.empty_data_file = b64encode(
  17. 'TestAccountBankAccountStatementImportSplit'.encode('utf-8')
  18. )
  19. self.AccountJournal = self.env['account.journal']
  20. self.AccountBankStatement = self.env['account.bank.statement']
  21. self.AccountBankStatementImport = self.env[
  22. 'account.bank.statement.import'
  23. ]
  24. def test_default_import_mode(self):
  25. journal = self.AccountJournal.create({
  26. 'name': 'Bank',
  27. 'type': 'bank',
  28. 'code': 'BANK',
  29. 'currency_id': self.currency_usd.id,
  30. })
  31. wizard = self.AccountBankStatementImport.with_context({
  32. 'journal_id': journal.id,
  33. }).create({
  34. 'filename': 'file.ext',
  35. 'data_file': self.empty_data_file,
  36. })
  37. data = (
  38. journal.currency_id.name,
  39. journal.bank_account_id.acc_number,
  40. [{
  41. 'name': 'STATEMENT',
  42. 'date': '2019-01-01',
  43. 'balance_start': 0.0,
  44. 'balance_end_real': 100.0,
  45. 'transactions': [{
  46. 'name': 'TRANSACTION',
  47. 'amount': '100.0',
  48. 'date': '2019-01-01',
  49. 'note': 'NOTE',
  50. 'unique_import_id': 'TRANSACTION-ID',
  51. }],
  52. }],
  53. )
  54. with mock.patch(_parse_file_method, return_value=data):
  55. wizard.with_context({
  56. 'journal_id': journal.id,
  57. }).import_file()
  58. statement = self.AccountBankStatement.search([
  59. ('journal_id', '=', journal.id),
  60. ])
  61. self.assertEqual(len(statement), 1)
  62. self.assertEqual(len(statement.line_ids), 1)
  63. def test_single_import_mode(self):
  64. journal = self.AccountJournal.create({
  65. 'name': 'Bank',
  66. 'type': 'bank',
  67. 'code': 'BANK',
  68. 'currency_id': self.currency_usd.id,
  69. })
  70. wizard = self.AccountBankStatementImport.with_context({
  71. 'journal_id': journal.id,
  72. }).create({
  73. 'filename': 'file.ext',
  74. 'data_file': self.empty_data_file,
  75. 'import_mode': 'single',
  76. })
  77. data = (
  78. journal.currency_id.name,
  79. journal.bank_account_id.acc_number,
  80. [{
  81. 'name': 'STATEMENT',
  82. 'date': '2019-01-01',
  83. 'balance_start': 0.0,
  84. 'balance_end_real': 100.0,
  85. 'transactions': [{
  86. 'name': 'TRANSACTION',
  87. 'amount': '100.0',
  88. 'date': '2019-01-01',
  89. 'note': 'NOTE',
  90. 'unique_import_id': 'TRANSACTION-ID',
  91. }],
  92. }],
  93. )
  94. with mock.patch(_parse_file_method, return_value=data):
  95. wizard.with_context({
  96. 'journal_id': journal.id,
  97. }).import_file()
  98. statement = self.AccountBankStatement.search([
  99. ('journal_id', '=', journal.id),
  100. ])
  101. self.assertEqual(len(statement), 1)
  102. self.assertEqual(len(statement.line_ids), 1)
  103. def test_daily_import_mode(self):
  104. journal = self.AccountJournal.create({
  105. 'name': 'Bank',
  106. 'type': 'bank',
  107. 'code': 'BANK',
  108. 'currency_id': self.currency_usd.id,
  109. })
  110. wizard = self.AccountBankStatementImport.with_context({
  111. 'journal_id': journal.id,
  112. }).create({
  113. 'filename': 'file.ext',
  114. 'data_file': self.empty_data_file,
  115. 'import_mode': 'daily',
  116. })
  117. data = (
  118. journal.currency_id.name,
  119. journal.bank_account_id.acc_number,
  120. [{
  121. 'name': 'STATEMENT',
  122. 'date': '2019-01-01',
  123. 'balance_start': 0.0,
  124. 'balance_end_real': 100.0,
  125. 'transactions': [{
  126. 'name': 'TRANSACTION-1',
  127. 'amount': '50.0',
  128. 'date': '2019-01-01',
  129. 'note': 'NOTE',
  130. 'unique_import_id': 'TRANSACTION-ID-1',
  131. }, {
  132. 'name': 'TRANSACTION-2',
  133. 'amount': '50.0',
  134. 'date': '2019-01-03',
  135. 'note': 'NOTE',
  136. 'unique_import_id': 'TRANSACTION-ID-2',
  137. }],
  138. }],
  139. )
  140. with mock.patch(_parse_file_method, return_value=data):
  141. wizard.with_context({
  142. 'journal_id': journal.id,
  143. }).import_file()
  144. statements = self.AccountBankStatement.search([
  145. ('journal_id', '=', journal.id),
  146. ]).sorted(key=lambda statement: statement.date)
  147. self.assertEqual(len(statements), 2)
  148. self.assertEqual(len(statements[0].line_ids), 1)
  149. self.assertEqual(statements[0].balance_start, 0.0)
  150. self.assertEqual(statements[0].balance_end_real, 50.0)
  151. self.assertEqual(len(statements[1].line_ids), 1)
  152. self.assertEqual(statements[1].balance_start, 50.0)
  153. self.assertEqual(statements[1].balance_end_real, 100.0)
  154. def test_weekly_import_mode(self):
  155. journal = self.AccountJournal.create({
  156. 'name': 'Bank',
  157. 'type': 'bank',
  158. 'code': 'BANK',
  159. 'currency_id': self.currency_usd.id,
  160. })
  161. wizard = self.AccountBankStatementImport.with_context({
  162. 'journal_id': journal.id,
  163. }).create({
  164. 'filename': 'file.ext',
  165. 'data_file': self.empty_data_file,
  166. 'import_mode': 'weekly',
  167. })
  168. data = (
  169. journal.currency_id.name,
  170. journal.bank_account_id.acc_number,
  171. [{
  172. 'name': 'STATEMENT',
  173. 'date': '2019-01-01',
  174. 'balance_start': 0.0,
  175. 'balance_end_real': 100.0,
  176. 'transactions': [{
  177. 'name': 'TRANSACTION-1',
  178. 'amount': '50.0',
  179. 'date': '2019-01-01',
  180. 'note': 'NOTE',
  181. 'unique_import_id': 'TRANSACTION-ID-1',
  182. }, {
  183. 'name': 'TRANSACTION-2',
  184. 'amount': '50.0',
  185. 'date': '2019-01-15',
  186. 'note': 'NOTE',
  187. 'unique_import_id': 'TRANSACTION-ID-2',
  188. }],
  189. }],
  190. )
  191. with mock.patch(_parse_file_method, return_value=data):
  192. wizard.with_context({
  193. 'journal_id': journal.id,
  194. }).import_file()
  195. statements = self.AccountBankStatement.search([
  196. ('journal_id', '=', journal.id),
  197. ]).sorted(key=lambda statement: statement.date)
  198. self.assertEqual(len(statements), 2)
  199. self.assertEqual(len(statements[0].line_ids), 1)
  200. self.assertEqual(statements[0].balance_start, 0.0)
  201. self.assertEqual(statements[0].balance_end_real, 50.0)
  202. self.assertEqual(len(statements[1].line_ids), 1)
  203. self.assertEqual(statements[1].balance_start, 50.0)
  204. self.assertEqual(statements[1].balance_end_real, 100.0)
  205. def test_monthly_import_mode(self):
  206. journal = self.AccountJournal.create({
  207. 'name': 'Bank',
  208. 'type': 'bank',
  209. 'code': 'BANK',
  210. 'currency_id': self.currency_usd.id,
  211. })
  212. wizard = self.AccountBankStatementImport.with_context({
  213. 'journal_id': journal.id,
  214. }).create({
  215. 'filename': 'file.ext',
  216. 'data_file': self.empty_data_file,
  217. 'import_mode': 'monthly',
  218. })
  219. data = (
  220. journal.currency_id.name,
  221. journal.bank_account_id.acc_number,
  222. [{
  223. 'name': 'STATEMENT',
  224. 'date': '2019-01-01',
  225. 'balance_start': 0.0,
  226. 'balance_end_real': 100.0,
  227. 'transactions': [{
  228. 'name': 'TRANSACTION-1',
  229. 'amount': '50.0',
  230. 'date': '2019-01-01',
  231. 'note': 'NOTE',
  232. 'unique_import_id': 'TRANSACTION-ID-1',
  233. }, {
  234. 'name': 'TRANSACTION-2',
  235. 'amount': '50.0',
  236. 'date': '2019-03-01',
  237. 'note': 'NOTE',
  238. 'unique_import_id': 'TRANSACTION-ID-2',
  239. }],
  240. }],
  241. )
  242. with mock.patch(_parse_file_method, return_value=data):
  243. wizard.with_context({
  244. 'journal_id': journal.id,
  245. }).import_file()
  246. statements = self.AccountBankStatement.search([
  247. ('journal_id', '=', journal.id),
  248. ]).sorted(key=lambda statement: statement.date)
  249. self.assertEqual(len(statements), 2)
  250. self.assertEqual(len(statements[0].line_ids), 1)
  251. self.assertEqual(statements[0].balance_start, 0.0)
  252. self.assertEqual(statements[0].balance_end_real, 50.0)
  253. self.assertEqual(len(statements[1].line_ids), 1)
  254. self.assertEqual(statements[1].balance_start, 50.0)
  255. self.assertEqual(statements[1].balance_end_real, 100.0)