-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathimport_revolut.py
More file actions
64 lines (51 loc) · 1.81 KB
/
Copy pathimport_revolut.py
File metadata and controls
64 lines (51 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
from beancount.core import data
import beangulp
from beancount_importers.bank_classifier import payee_to_account_mapping
from beangulp.importers import csv
Col = csv.Col
# UNCATEGORIZED_EXPENSES_ACCOUNT = "Expenses:Uncategorized:Revolut"
UNCATEGORIZED_EXPENSES_ACCOUNT = "Expenses:FIXME"
def categorizer(txn, row):
payee = row[4]
comment = row[4]
if comment.startswith("To "):
payee = comment[3:]
posting_account = None
if txn.postings[0].units.number < 0:
# Expenses
posting_account = payee_to_account_mapping.get(payee)
# Default by category
if not posting_account:
posting_account = UNCATEGORIZED_EXPENSES_ACCOUNT
else:
if "Withdrawing savings" in comment:
posting_account = "Assets:Revolut:Savings"
elif "Metal Cashback" in comment:
posting_account = "Income:Revolut:Cashback"
elif "Referral reward" in comment:
posting_account = "Income:Revolut:Referrals"
else:
posting_account = "Income:Uncategorized:Revolut"
# Ignore most incoming transactions as they will mostly duplicate Monzo's
txn.meta["skip_transaction"] = True
txn.postings.append(
data.Posting(posting_account, -txn.postings[0].units, None, None, None, None)
)
return txn
def get_importer(account, currency):
return csv.CSVImporter(
{
Col.DATE: "Started Date",
Col.NARRATION: "Description",
Col.AMOUNT: "Amount",
Col.PAYEE: "Description",
Col.CURRENCY: "Currency",
Col.BALANCE: "Balance",
},
account,
currency,
categorizer=categorizer,
)
if __name__ == "__main__":
ingest = beangulp.Ingest([get_importer("Assets:Revolut:Cash", "GBP")], [])
ingest()