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.

90 lines
3.5 KiB

  1. # -*- coding: utf-8 -*-
  2. import dateutil.parser
  3. import StringIO
  4. from openerp.tools.translate import _
  5. from openerp import api, models
  6. from openerp.exceptions import Warning
  7. class AccountBankStatementImport(models.TransientModel):
  8. _inherit = "account.bank.statement.import"
  9. @api.model
  10. def _get_hide_journal_field(self):
  11. return self.env.context.get('journal_id') and True
  12. @api.model
  13. def _check_qif(self, data_file):
  14. return data_file.strip().startswith('!Type:')
  15. @api.model
  16. def _parse_file(self, data_file):
  17. if not self._check_qif(data_file):
  18. return super(AccountBankStatementImport, self)._parse_file(
  19. data_file)
  20. try:
  21. file_data = ""
  22. for line in StringIO.StringIO(data_file).readlines():
  23. file_data += line
  24. if '\r' in file_data:
  25. data_list = file_data.split('\r')
  26. else:
  27. data_list = file_data.split('\n')
  28. header = data_list[0].strip()
  29. header = header.split(":")[1]
  30. except:
  31. raise Warning(_('Could not decipher the QIF file.'))
  32. transactions = []
  33. vals_line = {}
  34. total = 0
  35. if header == "Bank":
  36. vals_bank_statement = {}
  37. for line in data_list:
  38. line = line.strip()
  39. if not line:
  40. continue
  41. if line[0] == 'D': # date of transaction
  42. vals_line['date'] = dateutil.parser.parse(
  43. line[1:], fuzzy=True).date()
  44. elif line[0] == 'T': # Total amount
  45. total += float(line[1:].replace(',', ''))
  46. vals_line['amount'] = float(line[1:].replace(',', ''))
  47. elif line[0] == 'N': # Check number
  48. vals_line['ref'] = line[1:]
  49. elif line[0] == 'P': # Payee
  50. vals_line['name'] = ('name' in vals_line and
  51. line[1:] + ': ' + vals_line['name'] or
  52. line[1:])
  53. # Since QIF doesn't provide account numbers, we'll have to
  54. # find res.partner and res.partner.bank here
  55. # (normal behavious is to provide 'account_number', which
  56. # the generic module uses to find partner/bank)
  57. banks = self.env['res.partner.bank'].search(
  58. [('owner_name', '=', line[1:])], limit=1)
  59. if banks:
  60. bank_account = banks[0]
  61. vals_line['bank_account_id'] = bank_account.id
  62. vals_line['partner_id'] = bank_account.partner_id.id
  63. elif line[0] == 'M': # Memo
  64. vals_line['name'] = ('name' in vals_line and
  65. vals_line['name'] + ': ' + line[1:] or
  66. line[1:])
  67. elif line[0] == '^': # end of item
  68. transactions.append(vals_line)
  69. vals_line = {}
  70. elif line[0] == '\n':
  71. transactions = []
  72. else:
  73. pass
  74. else:
  75. raise Warning(_('This file is either not a bank statement or is '
  76. 'not correctly formed.'))
  77. vals_bank_statement.update({
  78. 'balance_end_real': total,
  79. 'transactions': transactions
  80. })
  81. return None, None, [vals_bank_statement]