63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
from beancount.ingest import importer
|
|
from beancount.core import data
|
|
from beancount.core.number import D
|
|
|
|
import csv
|
|
|
|
class MyCSVImporter(importer.ImporterProtocol):
|
|
"""A Beancount importer for CSV files"""
|
|
|
|
def identify(self, file):
|
|
return file.name.endswith('.csv')
|
|
|
|
def file_account(self, file):
|
|
return "Assets:Bank:POSTBANK"
|
|
|
|
def file_date(self, file):
|
|
"""Returns the unique date of the file, if any."""
|
|
# Optioneel: als je bestandsnaam een datum bevat
|
|
return None
|
|
|
|
def file_name(self, file):
|
|
"""Returns the unique name of the file, if any."""
|
|
# Optioneel: als je een unieke naam wilt baseren op het bestand
|
|
return None
|
|
|
|
def extract(self, file, existing_entries=None):
|
|
"""Extracts entries from a files."""
|
|
entries = []
|
|
|
|
with open(file.contents, encoding='utf-8')
|
|
as f:
|
|
reader = csv.reader(f, delimiter=',')
|
|
next(reader, None)
|
|
|
|
for index, row in enumerate(reader):
|
|
if not row or not row[0]:
|
|
continue
|
|
|
|
datum_str = row[0]
|
|
omschrijving = row[1]
|
|
bedrag_str = row[2]
|
|
|
|
dag, maand, jaar = datum_str.split('.')
|
|
transactie_datum = data.D(int(jaar)), int(maand), int(dag))
|
|
bedrag = D(bedrag_str)
|
|
|
|
meta = data.new_metadata(file.name, index)
|
|
|
|
transaction = data.Transaction(
|
|
meta=meta,
|
|
date=transactie_datum,
|
|
flag='*',
|
|
payee=omschrijving,
|
|
narration="",
|
|
tags=data.frozenset(),
|
|
links=data.frozenset(),
|
|
postings=[
|
|
data.Posting(self.file_account(file)), - bedrag, data.get_currency_meta('EUR'), None, None, None),
|
|
data.Posting("Expenses:Uncategorized", bedrag, data.get_currency_meta('EUR'), None, None, None),
|
|
]
|
|
)
|
|
entries.append(transaction)
|
|
return entries |