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.

120 lines
4.6 KiB

  1. # -*- coding: utf-8 -*-
  2. '''
  3. Created on 09 Octobre 2016
  4. @author: Thibault Francois (thibault@françois.be)
  5. '''
  6. from StringIO import StringIO
  7. import csv
  8. import datetime
  9. from openerp import models, _
  10. ACCOUNT = "Compte donneur d'ordre"
  11. CURRENCY = "Devise"
  12. DATE = "Date"
  13. AMOUNT = "Montant"
  14. COUNTERPART_NUMBER = "Compte contrepartie"
  15. COUNTERPART_NAME = "Contrepartie"
  16. COMMUNICATION = "Communication"
  17. TRANSACTION_TYPE = "Type d'op\xc3\xa9ration"
  18. class CodaBankStatementImport(models.TransientModel):
  19. _inherit = 'account.bank.statement.import'
  20. _date_format = "%d/%m/%Y"
  21. _decimal_sep = "."
  22. _csv_delimiter = ";"
  23. _csv_quote = '"'
  24. _header = ['Date', 'Montant', 'Devise', 'Contrepartie', 'Compte contrepartie', "Type d'op\xc3\xa9ration", 'Communication', "Compte donneur d'ordre"]
  25. def _generate_note_crelan(self, move):
  26. notes = []
  27. notes.append("%s: %s" % (_('Counter Party Name'), move[COUNTERPART_NAME]))
  28. notes.append("%s: %s" % (_('Counter Party Account'), move[COUNTERPART_NUMBER]))
  29. notes.append("%s: %s" % (_('Communication'), move[COMMUNICATION]))
  30. return '\n'.join(notes)
  31. def _get_move_value_crelan(self, move, sequence):
  32. move_data = {
  33. 'name': move[TRANSACTION_TYPE] + ": " + move[COMMUNICATION],
  34. 'note': self._generate_note_crelan(move),
  35. 'date': self._to_iso_date(move[DATE]),
  36. 'amount': float(move[AMOUNT]),
  37. 'account_number': move[COUNTERPART_NUMBER], #ok
  38. 'partner_name': move[COUNTERPART_NAME], #ok
  39. 'ref': move[DATE] + '-' + move[AMOUNT] + '-' + move[COUNTERPART_NUMBER] + '-' + move[COUNTERPART_NAME],
  40. 'sequence': sequence, #ok
  41. 'unique_import_id' : move[DATE] + '-' + move[AMOUNT] + '-' + move[COUNTERPART_NUMBER] + '-' + move[COUNTERPART_NAME]
  42. }
  43. return move_data
  44. def _get_statement_data_crelan(self, balance_start, balance_end, begin_date, end_date):
  45. statement_data = {
  46. 'name' : _("Bank Statement from %s to %s") % (begin_date, end_date),
  47. 'date' : self._to_iso_date(end_date),
  48. 'balance_start': balance_start, #ok
  49. 'balance_end_real' : balance_end, #ok
  50. 'transactions' : []
  51. }
  52. return statement_data
  53. def _get_acc_number_crelan(self, acc_number):
  54. #Check if we match the exact acc_number or the end of an acc number
  55. journal = self.env['account.journal'].search([('bank_acc_number', '=like', '%' + acc_number)])
  56. if not journal or len(journal) > 1: #if not found or ambiguious
  57. return acc_number
  58. return journal.bank_acc_number
  59. def _get_acc_balance_crelan(self, acc_number):
  60. if not self.init_balance == None:
  61. return self.init_balance
  62. print "compute balance"
  63. journal = self.env['account.journal'].search([('bank_acc_number', '=like', '%' + acc_number)])
  64. if not journal or len(journal) > 1: #if not found or ambiguious
  65. self.init_balance = 0.0
  66. else:
  67. self.init_balance = float(journal.get_journal_dashboard_datas()['last_balance'][:-1].strip().replace(',', ''))
  68. return self.init_balance
  69. def _to_iso_date(self, orig_date):
  70. date_obj = datetime.datetime.strptime(orig_date, self._date_format)
  71. return date_obj.strftime('%Y-%m-%d')
  72. def _parse_file(self, data_file):
  73. try:
  74. csv_file = StringIO(data_file)
  75. data = csv.DictReader(csv_file, delimiter=self._csv_delimiter, quotechar=self._csv_quote)
  76. if not data.fieldnames == self._header:
  77. raise ValueError()
  78. except ValueError:
  79. return super(CodaBankStatementImport, self)._parse_file(data_file)
  80. currency_code = False
  81. account_number = False
  82. self.init_balance = None
  83. begin_date = False
  84. end_date = False
  85. transactions = []
  86. i = 1
  87. sum_transaction = 0
  88. for statement in data:
  89. begin_date = begin_date or statement[DATE]
  90. end_date = statement[DATE]
  91. account_number = statement[ACCOUNT]
  92. balance = self._get_acc_balance_crelan(account_number)
  93. currency_code = statement[CURRENCY]
  94. transactions.append(self._get_move_value_crelan(statement, i))
  95. sum_transaction += float(statement[AMOUNT])
  96. i += 1
  97. stmt = self._get_statement_data_crelan(balance, balance+ sum_transaction, begin_date, end_date)
  98. stmt['transactions'] = transactions
  99. return currency_code, self._get_acc_number_crelan(account_number), [stmt]