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.

239 lines
9.7 KiB

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