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.

65 lines
2.7 KiB

  1. # -*- coding: utf-8 -*-
  2. # © 2017 Compassion CH <http://www.compassion.ch>
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. from odoo import models
  5. from odoo.tools import OrderedDict
  6. class CamtDetailsParser(models.AbstractModel):
  7. """Parser for camt bank statement import files."""
  8. _inherit = 'account.bank.statement.import.camt.parser'
  9. def parse_transaction_details(self, ns, node, transaction):
  10. """Parse transaction details (message, party, account...)."""
  11. super(CamtDetailsParser, self).parse_transaction_details(
  12. ns, node, transaction)
  13. # remote party values
  14. party_type = 'Dbtr'
  15. party_type_node = node.xpath(
  16. '../../ns:CdtDbtInd', namespaces={'ns': ns})
  17. if party_type_node and party_type_node[0].text != 'CRDT':
  18. party_type = 'Cdtr'
  19. address_node = node.xpath(
  20. './ns:RltdPties/ns:%s/ns:PstlAdr' % party_type,
  21. namespaces={'ns': ns})
  22. if address_node and not transaction.get('partner_address'):
  23. address_values = OrderedDict()
  24. street_node = address_node[0].xpath(
  25. './ns:StrtNm', namespaces={'ns': ns})
  26. if street_node:
  27. address_values['street'] = street_node[0].text
  28. building_node = address_node[0].xpath(
  29. './ns:BldgNb', namespaces={'ns': ns})
  30. if building_node:
  31. address_values['building'] = building_node[0].text
  32. zip_node = address_node[0].xpath(
  33. './ns:PstCd', namespaces={'ns': ns})
  34. if zip_node:
  35. address_values['zip'] = zip_node[0].text
  36. city_node = address_node[0].xpath(
  37. './ns:TwnNm', namespaces={'ns': ns})
  38. if city_node:
  39. address_values['city'] = city_node[0].text
  40. transaction['partner_address'] = self._format_partner_address(
  41. address_values)
  42. # BIC node
  43. bic_node = node.xpath(
  44. './ns:RltdAgts/ns:%sAgt/ns:FinInstnId/ns:BIC' % party_type,
  45. namespaces={'ns': ns})
  46. if bic_node:
  47. transaction['partner_bic'] = bic_node[0].text
  48. # Transfer account info in fields
  49. transaction['partner_account'] = transaction.get('account_number')
  50. def _format_partner_address(self, address_values):
  51. """
  52. Hook for formatting the partner address read in CAMT bank statement.
  53. :param address_values: dict: all address values found in statement
  54. Possible keys are ['street', 'building', 'zip', 'city']
  55. Not all keys may be present.
  56. :return: str: formatted address
  57. """
  58. return ', '.join(address_values.values())