Advertisement
Guest User

Untitled

a guest
Aug 18th, 2019
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. from beancount.core.number import D
  4. from beancount.ingest import importer
  5. from beancount.core.amount import Amount
  6. from beancount.core import flags
  7. from beancount.core import data
  8. from beancount.core.position import Cost
  9.  
  10. from dateutil.parser import parse
  11.  
  12. import csv
  13. import os
  14. import re
  15.  
  16. class MintImporter(importer.ImporterProtocol):
  17. def __init__(self, account_mapping, category_mapping, category_flag_map):
  18. self.account_mapping = account_mapping
  19. self.category_mapping = category_mapping
  20. self.category_flag_map = category_flag_map
  21. self.unknown_categories = set()
  22. self.unknown_accounts = set()
  23.  
  24. def identify(self, f):
  25. return re.match('mint_transactions.*\.csv', os.path.basename(f.name))
  26.  
  27. def extract(self, f):
  28. entries = []
  29.  
  30. with open(f.name) as f:
  31. for index, row in enumerate(csv.reader(f)):
  32. date, desc, original_desc, amount, transaction_type, category, account, _, notes = row
  33. if date == "Date":
  34. continue
  35. trans_date = parse(date).date()
  36.  
  37. meta = data.new_metadata(f.name, index)
  38.  
  39. txn = data.Transaction(
  40. meta=meta,
  41. date=trans_date,
  42. flag=self.category_flag_map.get(category, flags.FLAG_OKAY),
  43. payee=original_desc,
  44. narration=notes,
  45. tags=set(),
  46. links=set(),
  47. postings=[],
  48. )
  49.  
  50. if account not in self.account_mapping:
  51. self.unknown_accounts.add(account)
  52. if category not in self.category_mapping:
  53. self.unknown_categories.add(category)
  54. try:
  55. account = self.account_mapping[account]
  56. to_account = self.category_mapping[category]
  57. except KeyError:
  58. continue
  59.  
  60. if transaction_type == "debit":
  61. counter_amount = amount
  62. amount = "-" + amount
  63. else:
  64. counter_amount = "-" + amount
  65.  
  66. txn.postings.append(
  67. data.Posting(account, Amount(D(amount), 'USD'), None, None, None, None))
  68. txn.postings.append(
  69. data.Posting(to_account, Amount(D(counter_amount), 'USD'), None, None, None, None))
  70.  
  71. entries.append(txn)
  72.  
  73. if len(self.unknown_categories) + len(self.unknown_accounts) > 0:
  74. raise LookupError('Unknown categories: {}, accounts: {}'.format(self.unknown_categories, self.unknown_accounts))
  75. return entries
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement