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.

75 lines
2.7 KiB

  1. # -*- coding: utf-8 -*-
  2. import logging
  3. import StringIO
  4. from openerp import api, models
  5. from openerp.tools.translate import _
  6. from openerp.exceptions import Warning as UserError
  7. from .ofx import OfxParser, OfxParser_ok
  8. _logger = logging.getLogger(__name__)
  9. class AccountBankStatementImport(models.TransientModel):
  10. _inherit = 'account.bank.statement.import'
  11. @api.model
  12. def _check_ofx(self, data_file):
  13. if not OfxParser_ok:
  14. return False
  15. try:
  16. ofx = OfxParser.parse(StringIO.StringIO(data_file))
  17. except Exception as e:
  18. _logger.debug(e)
  19. return False
  20. return ofx
  21. @api.model
  22. def _parse_file(self, data_file):
  23. ofx = self._check_ofx(data_file)
  24. if not ofx:
  25. return super(AccountBankStatementImport, self)._parse_file(
  26. data_file)
  27. transactions = []
  28. total_amt = 0.00
  29. try:
  30. for transaction in ofx.account.statement.transactions:
  31. # Since ofxparse doesn't provide account numbers, we'll have
  32. # to find res.partner and res.partner.bank here
  33. # (normal behavious is to provide 'account_number', which the
  34. # generic module uses to find partner/bank)
  35. bank_account_id = partner_id = False
  36. banks = self.env['res.partner.bank'].search(
  37. [('bank_name', '=', transaction.payee)], limit=1)
  38. if banks:
  39. bank_account = banks[0]
  40. bank_account_id = bank_account.id
  41. partner_id = bank_account.partner_id.id
  42. vals_line = {
  43. 'date': transaction.date,
  44. 'name': transaction.payee + (
  45. transaction.memo and ': ' + transaction.memo or ''),
  46. 'ref': transaction.id,
  47. 'amount': transaction.amount,
  48. 'unique_import_id': transaction.id,
  49. 'bank_account_id': bank_account_id,
  50. 'partner_id': partner_id,
  51. }
  52. total_amt += float(transaction.amount)
  53. transactions.append(vals_line)
  54. except Exception, e:
  55. raise UserError(_("The following problem occurred during import. "
  56. "The file might not be valid.\n\n %s" % e.message))
  57. vals_bank_statement = {
  58. 'name': ofx.account.routing_number,
  59. 'transactions': transactions,
  60. 'balance_start': ofx.account.statement.balance,
  61. 'balance_end_real':
  62. float(ofx.account.statement.balance) + total_amt,
  63. }
  64. return ofx.account.statement.currency, ofx.account.number, [
  65. vals_bank_statement]