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.

69 lines
3.0 KiB

  1. # -*- coding: utf-8 -*-
  2. # noqa: This is a backport from Odoo. OCA has no control over style here.
  3. # flake8: noqa
  4. import logging
  5. import StringIO
  6. from openerp.osv import osv
  7. from openerp.tools.translate import _
  8. from openerp.exceptions import Warning
  9. _logger = logging.getLogger(__name__)
  10. try:
  11. from ofxparse import OfxParser as ofxparser
  12. except ImportError:
  13. _logger.error("OFX parser unavailable because the `ofxparse` Python library cannot be found."
  14. "It can be downloaded and installed from `https://pypi.python.org/pypi/ofxparse`.")
  15. ofxparser = None
  16. class account_bank_statement_import(osv.TransientModel):
  17. _inherit = 'account.bank.statement.import'
  18. def _check_ofx(self, cr, uid, file, context=None):
  19. if ofxparser is None:
  20. return False
  21. try:
  22. ofx = ofxparser.parse(file)
  23. except:
  24. return False
  25. return ofx
  26. def _parse_file(self, cr, uid, data_file, context=None):
  27. ofx = self._check_ofx(cr, uid, StringIO.StringIO(data_file), context=context)
  28. if not ofx:
  29. return super(account_bank_statement_import, self)._parse_file(cr, uid, data_file, context=context)
  30. transactions = []
  31. total_amt = 0.00
  32. try:
  33. for transaction in ofx.account.statement.transactions:
  34. # Since ofxparse doesn't provide account numbers, we'll have to find res.partner and res.partner.bank here
  35. # (normal behavious is to provide 'account_number', which the generic module uses to find partner/bank)
  36. bank_account_id = partner_id = False
  37. ids = self.pool.get('res.partner.bank').search(cr, uid, [('owner_name', '=', transaction.payee)], context=context)
  38. if ids:
  39. bank_account_id = bank_account_id = ids[0]
  40. partner_id = self.pool.get('res.partner.bank').browse(cr, uid, bank_account_id, context=context).partner_id.id
  41. vals_line = {
  42. 'date': transaction.date,
  43. 'name': transaction.payee + (transaction.memo and ': ' + transaction.memo or ''),
  44. 'ref': transaction.id,
  45. 'amount': transaction.amount,
  46. 'unique_import_id': transaction.id,
  47. 'bank_account_id': bank_account_id,
  48. 'partner_id': partner_id,
  49. }
  50. total_amt += float(transaction.amount)
  51. transactions.append(vals_line)
  52. except Exception, e:
  53. raise Warning(_("The following problem occurred during import. The file might not be valid.\n\n %s" % e.message))
  54. vals_bank_statement = {
  55. 'name': ofx.account.routing_number,
  56. 'transactions': transactions,
  57. 'balance_start': float(ofx.account.statement.balance) - total_amt,
  58. 'balance_end_real': float(ofx.account.statement.balance),
  59. }
  60. return ofx.account.statement.currency, ofx.account.number, [vals_bank_statement]