from beancount.core.number import D from beancount.ingest import importer from beancount.core import amount from beancount.core import flags from beancount.core import data from dateutil.parser import parse from titlecase import titlecase import csv import os import re class CitiImporter(importer.ImporterProtocol): def __init__(self): self.account = 'Liabilities:CC:Citi:ThankYou' def identify(self, f): return re.match('MC_377_CURRENT_VIEW.CSV', os.path.basename(f.name)) def file_account(self, f): return self.account def extract(self, f): entries = [] with open(f.name) as f: for index, row in enumerate(csv.DictReader(f)): trans_date = parse(row['Date']).date() #rstrip removes trailing new line characters trans_desc = titlecase(row['Description'].rstrip()) if bool(row['Debit']): trans_amt = "-" + row['Debit'] else: trans_amt = row['Credit'] meta = data.new_metadata(f.name, index) txn = data.Transaction( meta=meta, date=trans_date, flag=flags.FLAG_OKAY, payee=trans_desc, narration="", tags=set(), links=set(), postings=[] ) txn.postings.append( data.Posting(self.account, amount.Amount(D(trans_amt), 'USD'), None, None, None, None) ) entries.append(txn) return entries