68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
import csv
|
|
import sys
|
|
|
|
import click
|
|
import dateparser
|
|
|
|
from ofx_processor.utils.processor import Processor, Line
|
|
|
|
|
|
def _amount_str_to_float(amount):
|
|
if amount:
|
|
return float(amount.replace(",", "."))
|
|
return ""
|
|
|
|
|
|
class RevolutLine(Line):
|
|
def __init__(self, data: dict = None):
|
|
super(RevolutLine, self).__init__(data)
|
|
|
|
def _process_inflow(self):
|
|
return _amount_str_to_float(self.data.get("Paid In (EUR)"))
|
|
|
|
def _process_outflow(self):
|
|
return _amount_str_to_float(self.data.get("Paid Out (EUR)"))
|
|
|
|
def get_date(self):
|
|
return dateparser.parse(self.data.get("Completed Date")).strftime("%Y-%m-%d")
|
|
|
|
def get_amount(self):
|
|
outflow = self._process_outflow()
|
|
inflow = self._process_inflow()
|
|
amount = -outflow if outflow else inflow
|
|
amount = int(amount * 1000)
|
|
return amount
|
|
|
|
def get_memo(self):
|
|
return " - ".join(
|
|
filter(
|
|
None,
|
|
map(
|
|
str.strip,
|
|
[self.data.get("Category", ""), self.data.get("Exchange Rate", "")],
|
|
),
|
|
)
|
|
)
|
|
|
|
def get_payee(self):
|
|
return self.data.get("Reference")
|
|
|
|
|
|
class RevolutProcessor(Processor):
|
|
line_class = RevolutLine
|
|
account_name = "revolut"
|
|
|
|
def parse_file(self):
|
|
try:
|
|
with open(self.filename, encoding="utf-8") as f:
|
|
reader = csv.DictReader(f, delimiter=";")
|
|
return [line for line in reader]
|
|
except FileNotFoundError:
|
|
click.secho("File not found", fg="red")
|
|
sys.exit(1)
|
|
|
|
@staticmethod
|
|
@click.command("revolut", help="Process Revolut bank statement (CSV)")
|
|
@click.argument("csv_filename")
|
|
def main(csv_filename):
|
|
RevolutProcessor(csv_filename).push_to_ynab()
|