diff --git a/config.py b/config.py new file mode 100644 index 0000000..618cd3a --- /dev/null +++ b/config.py @@ -0,0 +1,15 @@ +# config.py + +import sys +import os + +# Voeg de map van dit bestand toe aan de Python-zoekpaden. +# Dit zorgt ervoor dat je importer gevonden kan worden. +sys.path.insert(0, os.path.dirname(__file__)) + +# De importregel hieronder zal nu correct werken +from postbank_csv_importer import MyCSVImporter + +CONFIG = [ + MyCSVImporter() +] \ No newline at end of file diff --git a/postbank_csv_importer.py b/postbank_csv_importer.py index a5a8608..9de31da 100644 --- a/postbank_csv_importer.py +++ b/postbank_csv_importer.py @@ -3,6 +3,7 @@ from beancount.core import data from beancount.core.number import D import csv +import datetime class MyCSVImporter(importer.ImporterProtocol): """A Beancount importer for CSV files""" @@ -27,14 +28,12 @@ class MyCSVImporter(importer.ImporterProtocol): """Extracts entries from a files.""" entries = [] - with open(file.contents, encoding='utf-8') - as f: - reader = csv.reader(f, delimiter=';') - for skip in range(0,8): - next(reader, None) - - for index, row in enumerate(reader): - if not row or not row[0]: + # file.contents + with open(file.name, encoding='utf-8') as f: + csv_reader = csv.reader(f, delimiter=';') + # Gebruik enumerate() om een teller (index) te krijgen + for index, row in enumerate(csv_reader): + if len(row) < 18 or row[17] != "EUR": continue # De index begint bij 0, dus de 12e kolom is index 11. @@ -50,11 +49,15 @@ class MyCSVImporter(importer.ImporterProtocol): valuta = row[17] dag, maand, jaar = datum_str.split('.') - transactie_datum = data.D(int(jaar)), int(maand), int(dag)) - + transactie_datum = datetime.date(int(jaar), int(maand), int(dag)) + payee = ontvanger narration = omschrijving_str - bedrag = D(bedrag_str).replace(',','.') + # Verwijder eerst de duizendtallen-scheidingstekens (de punten) + bedrag_str = bedrag_str.replace('.', '') + # Vervang daarna de komma door een punt + bedrag_str = bedrag_str.replace(',', '.') + bedrag = D(bedrag_str) currency = valuta meta = data.new_metadata(file.name, index) @@ -64,17 +67,25 @@ class MyCSVImporter(importer.ImporterProtocol): # Uitgave: bedrag is negatief. # Geld gaat van de bankrekening naar een uitgavenrekening. tegenrekening = self._map_payee_to_account(payee + " " + omschrijving_str) + + #FORMAT: data.Posting(account, units, cost=None, price=None, flag=None, meta=None) postings = [ - data.Posting(self.file_account(file), bedrag, data.get_currency_meta(currency), None, None, None), - data.Posting(tegenrekening, -bedrag, data.get_currency_meta(currency), None, None, None), + #data.Posting(self.file_account(file), bedrag, currency, None, None, None), + data.Posting(self.file_account(file), data.Amount(bedrag, currency), None, None, None, None), + #data.Posting(tegenrekening, -bedrag, currency, None, None, None), + data.Posting(tegenrekening, data.Amount(bedrag, currency), None, None, None, None), ] else: # Inkomsten: bedrag is positief. # Geld gaat van een inkomstenrekening naar de bankrekening. tegenrekening = self._map_payee_to_account(payee + " " + omschrijving_str) + + #FORMAT: data.Posting(account, units, cost=None, price=None, flag=None, meta=None) postings = [ - data.Posting(tegenrekening, -bedrag, data.get_currency_meta(currency), None, None, None), - data.Posting(self.file_account(file), bedrag, data.get_currency_meta(currency), None, None, None), + #data.Posting(tegenrekening, -bedrag, currency, None, None, None), + data.Posting(tegenrekening, data.Amount(-bedrag, currency), None, None, None, None), + #data.Posting(self.file_account(file), bedrag, currency, None, None, None), + data.Posting(self.file_account(file), data.Amount(bedrag, currency), None, None, None, None), ] transaction = data.Transaction( @@ -83,8 +94,8 @@ class MyCSVImporter(importer.ImporterProtocol): flag='*', payee=payee, narration=narration, - tags=data.frozenset(), - links=data.frozenset(), + tags=frozenset(), + links=frozenset(), postings=postings ) diff --git a/test_Path.py.py b/test_Path.py.py new file mode 100644 index 0000000..dda5fae --- /dev/null +++ b/test_Path.py.py @@ -0,0 +1,7 @@ +import sys +import os + +print("Python executable:", sys.executable) +print("sys.path (zoekpaden):") +for p in sys.path: + print(" ", p) \ No newline at end of file diff --git a/test_amount_parsing.py b/test_amount_parsing.py new file mode 100644 index 0000000..d94e710 --- /dev/null +++ b/test_amount_parsing.py @@ -0,0 +1,20 @@ +import unittest +from beancount.core.amount import D + +class TestAmountParsing(unittest.TestCase): + + def clean_bedrag_str(self, bedrag_str): + bedrag_str = bedrag_str.replace('.','') + bedrag_str = bedrag_str.replace(',', '.') + return bedrag_str + + # Europese notatie - het werkt dus prima + def test_correct_amount_parsing(self): + test_bedrag = "1.699,62" + expected_decimal = D("1699.62") + cleaned_string = self.clean_bedrag_str(test_bedrag) + + self.assertEqual(D(cleaned_string), expected_decimal) + +if __name__ == '__main__': + unittest.main() diff --git a/test_importer.py b/test_importer.py new file mode 100644 index 0000000..2e52519 --- /dev/null +++ b/test_importer.py @@ -0,0 +1,33 @@ +import os +from beancount.ingest import importer +from beancount.core import data +from beancount.ingest.importers import csv +from beancount.format import format_entry +from beancount.ingest import identify + +# Een dummy-klasse die een bestand representeert, zoals Beancount dat zou doen. +class DummyFile: + def __init__(self, filename): + self.name = filename + +from postbank_csv_importer import MyCSVImporter +importer = MyCSVImporter() +bestand_pad = 'PostbankGiro_25-01_08.csv' + +# Controleer of de importer het bestand herkent. +if importer.identify(bestand_pad): + print("Importer identified the file. Extracting entries...") + # Roep de extract methode aan om de transacties te verwerken. + extracted_entries = importer.extract(bestand_pad) +else: + # We maken een dummy-bestand aan met testdata + with open(bestand_pad, 'w', encoding='utf-8') as f: + f.write("Datum;Omschrijving;Rekening;Tegenrekening;Bedrag;Valuta\n") + f.write("01-01-2025;Boodschappen;Bank;Supermarkt;50.00;EUR\n") + f.write("02-01-2025;Salaris;Werkgever;Bank;2500.00;EUR\n") + f.write("03-01-2025;Huur;Bank;Huisbaas;750.00;EUR\n") + extracted_entries = importer_instance.extract(DummyFile(bestand_pad), None) + +print("; Geëxtraheerde transacties:") +for entry in extracted_entries: + print(format_entry(entry)) \ No newline at end of file