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.

240 lines
9.7 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright 2017 Onestein (<http://www.onestein.eu>)
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. import base64
  5. from mock import patch
  6. from odoo.tests.common import TransactionCase
  7. from odoo.modules.module import get_module_resource
  8. from ..mt940 import MT940, get_subfields, handle_common_subfields
  9. class TestImport(TransactionCase):
  10. """Run test to import mt940 import."""
  11. transactions = [
  12. {
  13. 'account_number': 'NL46ABNA0499998748',
  14. 'amount': -754.25,
  15. 'ref': '435005714488-ABNO33052620',
  16. 'name': 'test line',
  17. },
  18. ]
  19. def setUp(self):
  20. super(TestImport, self).setUp()
  21. bank1 = self.env['res.partner.bank'].create({
  22. 'acc_number': 'NL77INGB0574908765',
  23. 'partner_id': self.env.ref('base.main_partner').id,
  24. 'company_id': self.env.ref('base.main_company').id,
  25. 'bank_id': self.env.ref('base.res_bank_1').id,
  26. })
  27. self.env['account.journal'].create({
  28. 'name': 'Bank Journal - (test1 mt940)',
  29. 'code': 'TBNK1MT940',
  30. 'type': 'bank',
  31. 'bank_account_id': bank1.id,
  32. 'currency_id': self.env.ref('base.EUR').id,
  33. })
  34. bank2 = self.env['res.partner.bank'].create({
  35. 'acc_number': 'NL34RABO0142623393',
  36. 'partner_id': self.env.ref('base.main_partner').id,
  37. 'company_id': self.env.ref('base.main_company').id,
  38. 'bank_id': self.env.ref('base.res_bank_1').id,
  39. })
  40. self.env['account.journal'].create({
  41. 'name': 'Bank Journal - (test2 mt940)',
  42. 'code': 'TBNK2MT940',
  43. 'type': 'bank',
  44. 'bank_account_id': bank2.id,
  45. 'currency_id': self.env.ref('base.EUR').id,
  46. })
  47. bank3 = self.env['res.partner.bank'].create({
  48. 'acc_number': 'NL05SNSB0908244436',
  49. 'partner_id': self.env.ref('base.main_partner').id,
  50. 'company_id': self.env.ref('base.main_company').id,
  51. 'bank_id': self.env.ref('base.res_bank_1').id,
  52. })
  53. self.env['account.journal'].create({
  54. 'name': 'Bank Journal - (test3 mt940)',
  55. 'code': 'TBNK3MT940',
  56. 'type': 'bank',
  57. 'bank_account_id': bank3.id,
  58. 'currency_id': self.env.ref('base.EUR').id,
  59. })
  60. self.data =\
  61. "/BENM//NAME/Cost/REMI/Period 01-10-2013 t/m 31-12-2013/ISDT/20"
  62. self.codewords = ['BENM', 'ADDR', 'NAME', 'CNTP', 'ISDT', 'REMI']
  63. def test_wrong_file_import(self):
  64. """Test wrong file import."""
  65. testfile = get_module_resource(
  66. 'account_bank_statement_import_mt940_base',
  67. 'test_files',
  68. 'test-wrong-file.940',
  69. )
  70. parser = MT940()
  71. datafile = open(testfile, 'rb').read()
  72. with self.assertRaises(ValueError):
  73. parser.parse(datafile, header_lines=1)
  74. def test_statement_import(self):
  75. """Test correct creation of single statement ING."""
  76. def _prepare_statement_lines(statements):
  77. transact = self.transactions[0]
  78. for st_vals in statements[2]:
  79. for line_vals in st_vals['transactions']:
  80. line_vals['amount'] = transact['amount']
  81. line_vals['name'] = transact['name']
  82. line_vals['account_number'] = transact['account_number']
  83. line_vals['ref'] = transact['ref']
  84. testfile = get_module_resource(
  85. 'account_bank_statement_import_mt940_base',
  86. 'test_files',
  87. 'test-ing.940',
  88. )
  89. parser = MT940()
  90. datafile = open(testfile, 'rb').read()
  91. statements = parser.parse(datafile, header_lines=1)
  92. _prepare_statement_lines(statements)
  93. path_addon = 'odoo.addons.account_bank_statement_import.'
  94. path_file = 'account_bank_statement_import.'
  95. path_class = 'AccountBankStatementImport.'
  96. method = path_addon + path_file + path_class + '_parse_file'
  97. with patch(method) as my_mock:
  98. my_mock.return_value = statements
  99. action = self.env['account.bank.statement.import'].create({
  100. 'data_file': base64.b64encode(datafile),
  101. }).import_file()
  102. transact = self.transactions[0]
  103. for statement in self.env['account.bank.statement'].browse(
  104. action['context']['statement_ids']):
  105. for line in statement.line_ids:
  106. self.assertTrue(
  107. line.bank_account_id.acc_number ==
  108. transact['account_number'])
  109. self.assertTrue(line.amount == transact['amount'])
  110. self.assertTrue(line.date == '2014-02-20')
  111. self.assertTrue(line.name == transact['name'])
  112. self.assertTrue(line.ref == transact['ref'])
  113. def test_get_subfields(self):
  114. """Unit Test function get_subfields()."""
  115. res = get_subfields(self.data, self.codewords)
  116. espected_res = {
  117. 'BENM': [''],
  118. 'NAME': ['Cost'],
  119. 'REMI': ['Period 01-10-2013 t', 'm 31-12-2013'],
  120. 'ISDT': ['20'],
  121. }
  122. self.assertTrue(res == espected_res)
  123. def test_handle_common_subfields(self):
  124. """Unit Test function handle_common_subfields()."""
  125. subfields = get_subfields(self.data, self.codewords)
  126. transaction = self.transactions[0]
  127. handle_common_subfields(transaction, subfields)
  128. def test_statement_import2(self):
  129. """Test correct creation of single statement RABO."""
  130. def _prepare_statement_lines(statements):
  131. transact = self.transactions[0]
  132. for st_vals in statements[2]:
  133. for line_vals in st_vals['transactions']:
  134. line_vals['amount'] = transact['amount']
  135. line_vals['name'] = transact['name']
  136. line_vals['account_number'] = transact['account_number']
  137. line_vals['ref'] = transact['ref']
  138. testfile = get_module_resource(
  139. 'account_bank_statement_import_mt940_base',
  140. 'test_files',
  141. 'test-rabo.swi',
  142. )
  143. parser = MT940()
  144. parser.header_regex = '^:940:' # Start of header
  145. parser.header_lines = 1 # Number of lines to skip
  146. datafile = open(testfile, 'rb').read()
  147. statements = parser.parse(datafile, header_lines=1)
  148. _prepare_statement_lines(statements)
  149. path_addon = 'odoo.addons.account_bank_statement_import.'
  150. path_file = 'account_bank_statement_import.'
  151. path_class = 'AccountBankStatementImport.'
  152. method = path_addon + path_file + path_class + '_parse_file'
  153. with patch(method) as my_mock:
  154. my_mock.return_value = statements
  155. action = self.env['account.bank.statement.import'].create({
  156. 'data_file': base64.b64encode(datafile),
  157. }).import_file()
  158. # The file contains 4 statements, but only 2 with transactions
  159. self.assertTrue(len(action['context']['statement_ids']) == 2)
  160. transact = self.transactions[0]
  161. for statement in self.env['account.bank.statement'].browse(
  162. action['context']['statement_ids']):
  163. for line in statement.line_ids:
  164. self.assertTrue(
  165. line.bank_account_id.acc_number ==
  166. transact['account_number'])
  167. self.assertTrue(line.amount == transact['amount'])
  168. self.assertTrue(line.date)
  169. self.assertTrue(line.name == transact['name'])
  170. self.assertTrue(line.ref == transact['ref'])
  171. def test_statement_import3(self):
  172. """Test correct creation of multiple statements SNS."""
  173. def _prepare_statement_lines(statements):
  174. transact = self.transactions[0]
  175. for st_vals in statements[2]:
  176. for line_vals in st_vals['transactions']:
  177. line_vals['amount'] = transact['amount']
  178. line_vals['name'] = transact['name']
  179. line_vals['account_number'] = transact['account_number']
  180. line_vals['ref'] = transact['ref']
  181. testfile = get_module_resource(
  182. 'account_bank_statement_import_mt940_base',
  183. 'test_files',
  184. 'test-sns.940',
  185. )
  186. parser = MT940()
  187. datafile = open(testfile, 'rb').read()
  188. statements = parser.parse(datafile, header_lines=1)
  189. _prepare_statement_lines(statements)
  190. path_addon = 'odoo.addons.account_bank_statement_import.'
  191. path_file = 'account_bank_statement_import.'
  192. path_class = 'AccountBankStatementImport.'
  193. method = path_addon + path_file + path_class + '_parse_file'
  194. with patch(method) as my_mock:
  195. my_mock.return_value = statements
  196. action = self.env['account.bank.statement.import'].create({
  197. 'data_file': base64.b64encode(datafile),
  198. }).import_file()
  199. self.assertTrue(len(action['context']['statement_ids']) == 3)
  200. transact = self.transactions[-1]
  201. for statement in self.env['account.bank.statement'].browse(
  202. action['context']['statement_ids'][-1]):
  203. for line in statement.line_ids:
  204. self.assertTrue(
  205. line.bank_account_id.acc_number ==
  206. transact['account_number'])
  207. self.assertTrue(line.amount == transact['amount'])
  208. self.assertTrue(line.date == statement.date)
  209. self.assertTrue(line.name == transact['name'])
  210. self.assertTrue(line.ref == transact['ref'])