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.

168 lines
5.7 KiB

  1. # Copyright 2019 Tecnativa - Vicent Cubells
  2. # Copyright 2019-2020 Brainbean Apps (https://brainbeanapps.com)
  3. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
  4. from odoo import api, fields, models, _
  5. from base64 import b64decode
  6. import json
  7. from os import path
  8. class AccountBankStatementImportPayPalMappingWizard(models.TransientModel):
  9. _name = 'account.bank.statement.import.paypal.mapping.wizard'
  10. _description = 'Account Bank Statement Import PayPal Mapping Wizard'
  11. _inherit = ['multi.step.wizard.mixin']
  12. data_file = fields.Binary(
  13. string='PayPal Report File',
  14. required=True,
  15. )
  16. filename = fields.Char()
  17. header = fields.Char()
  18. date_column = fields.Char(
  19. string='"Date" column',
  20. )
  21. time_column = fields.Char(
  22. string='"Time" column',
  23. )
  24. tz_column = fields.Char(
  25. string='"Timezone" column',
  26. )
  27. name_column = fields.Char(
  28. string='"Name" column',
  29. )
  30. currency_column = fields.Char(
  31. string='"Currency" column',
  32. )
  33. gross_column = fields.Char(
  34. string='"Gross" column',
  35. )
  36. fee_column = fields.Char(
  37. string='"Fee" column',
  38. )
  39. balance_column = fields.Char(
  40. string='"Balance" column',
  41. )
  42. transaction_id_column = fields.Char(
  43. string='"Transaction ID" column',
  44. )
  45. description_column = fields.Char(
  46. string='"Description" column',
  47. )
  48. type_column = fields.Char(
  49. string='"Type" column',
  50. )
  51. from_email_address_column = fields.Char(
  52. string='"From Email Address" column',
  53. )
  54. to_email_address_column = fields.Char(
  55. string='"To Email Address" column',
  56. )
  57. invoice_id_column = fields.Char(
  58. string='"Invoice ID" column',
  59. )
  60. subject_column = fields.Char(
  61. string='"Subject" column',
  62. )
  63. note_column = fields.Char(
  64. string='"Note" column',
  65. )
  66. bank_name_column = fields.Char(
  67. string='"Bank Name" column',
  68. )
  69. bank_account_column = fields.Char(
  70. string='"Bank Account" column',
  71. )
  72. @api.onchange('data_file')
  73. def _onchange_data_file(self):
  74. Parser = self.env['account.bank.statement.import.paypal.parser']
  75. if not self.data_file:
  76. return
  77. header = Parser.parse_header(b64decode(self.data_file))
  78. header = [column for column in header if column]
  79. self.header = json.dumps(header)
  80. if len(header) == 22:
  81. self.date_column = header[0]
  82. self.time_column = header[1]
  83. self.tz_column = header[2]
  84. self.name_column = header[3]
  85. self.currency_column = header[6]
  86. self.gross_column = header[7]
  87. self.fee_column = header[8]
  88. self.balance_column = header[18]
  89. self.transaction_id_column = header[12]
  90. self.type_column = header[4]
  91. self.from_email_address_column = header[10]
  92. self.to_email_address_column = header[11]
  93. self.invoice_id_column = header[16]
  94. self.subject_column = header[20]
  95. self.note_column = header[21]
  96. elif len(header) == 18:
  97. self.date_column = header[0]
  98. self.time_column = header[1]
  99. self.tz_column = header[2]
  100. self.name_column = header[11]
  101. self.currency_column = header[4]
  102. self.gross_column = header[5]
  103. self.fee_column = header[6]
  104. self.balance_column = header[8]
  105. self.transaction_id_column = header[9]
  106. self.description_column = header[3]
  107. self.from_email_address_column = header[10]
  108. self.invoice_id_column = header[16]
  109. self.bank_name_column = header[12]
  110. self.bank_account_column = header[13]
  111. @api.model
  112. def statement_columns(self):
  113. header = self.env.context.get('header')
  114. if not header:
  115. return []
  116. return [(x, x) for x in json.loads(header)]
  117. @api.multi
  118. def _get_mapping_values(self):
  119. """Hook for extension"""
  120. self.ensure_one()
  121. return {
  122. 'name': _('Mapping from %s') % path.basename(self.filename),
  123. 'float_thousands_sep': 'comma',
  124. 'float_decimal_sep': 'dot',
  125. 'date_format': '%d/%m/%Y',
  126. 'time_format': '%H:%M:%S',
  127. 'date_column': self.date_column,
  128. 'time_column': self.time_column,
  129. 'tz_column': self.tz_column,
  130. 'name_column': self.name_column,
  131. 'currency_column': self.currency_column,
  132. 'gross_column': self.gross_column,
  133. 'fee_column': self.fee_column,
  134. 'balance_column': self.balance_column,
  135. 'transaction_id_column': self.transaction_id_column,
  136. 'description_column': self.description_column,
  137. 'type_column': self.type_column,
  138. 'from_email_address_column': self.from_email_address_column,
  139. 'to_email_address_column': self.to_email_address_column,
  140. 'invoice_id_column': self.invoice_id_column,
  141. 'subject_column': self.subject_column,
  142. 'note_column': self.note_column,
  143. 'bank_name_column': self.bank_name_column,
  144. 'bank_account_column': self.bank_account_column,
  145. }
  146. @api.multi
  147. def import_mapping(self):
  148. self.ensure_one()
  149. mapping = self.env['account.bank.statement.import.paypal.mapping']\
  150. .create(self._get_mapping_values())
  151. return {
  152. 'type': 'ir.actions.act_window',
  153. 'name': _('Imported Mapping'),
  154. 'res_model': 'account.bank.statement.import.paypal.mapping',
  155. 'res_id': mapping.id,
  156. 'view_mode': 'form',
  157. 'view_id': False,
  158. 'target': 'new',
  159. }