delete requirements (see requirements.txt) & working script for beancount 2.3.4
This commit is contained in:
15
config.py
Normal file
15
config.py
Normal file
@@ -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()
|
||||||
|
]
|
||||||
@@ -3,6 +3,7 @@ from beancount.core import data
|
|||||||
from beancount.core.number import D
|
from beancount.core.number import D
|
||||||
|
|
||||||
import csv
|
import csv
|
||||||
|
import datetime
|
||||||
|
|
||||||
class MyCSVImporter(importer.ImporterProtocol):
|
class MyCSVImporter(importer.ImporterProtocol):
|
||||||
"""A Beancount importer for CSV files"""
|
"""A Beancount importer for CSV files"""
|
||||||
@@ -27,14 +28,12 @@ class MyCSVImporter(importer.ImporterProtocol):
|
|||||||
"""Extracts entries from a files."""
|
"""Extracts entries from a files."""
|
||||||
entries = []
|
entries = []
|
||||||
|
|
||||||
with open(file.contents, encoding='utf-8')
|
# file.contents
|
||||||
as f:
|
with open(file.name, encoding='utf-8') as f:
|
||||||
reader = csv.reader(f, delimiter=';')
|
csv_reader = csv.reader(f, delimiter=';')
|
||||||
for skip in range(0,8):
|
# Gebruik enumerate() om een teller (index) te krijgen
|
||||||
next(reader, None)
|
for index, row in enumerate(csv_reader):
|
||||||
|
if len(row) < 18 or row[17] != "EUR":
|
||||||
for index, row in enumerate(reader):
|
|
||||||
if not row or not row[0]:
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# De index begint bij 0, dus de 12e kolom is index 11.
|
# De index begint bij 0, dus de 12e kolom is index 11.
|
||||||
@@ -50,11 +49,15 @@ class MyCSVImporter(importer.ImporterProtocol):
|
|||||||
valuta = row[17]
|
valuta = row[17]
|
||||||
|
|
||||||
dag, maand, jaar = datum_str.split('.')
|
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
|
payee = ontvanger
|
||||||
narration = omschrijving_str
|
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
|
currency = valuta
|
||||||
|
|
||||||
meta = data.new_metadata(file.name, index)
|
meta = data.new_metadata(file.name, index)
|
||||||
@@ -64,17 +67,25 @@ class MyCSVImporter(importer.ImporterProtocol):
|
|||||||
# Uitgave: bedrag is negatief.
|
# Uitgave: bedrag is negatief.
|
||||||
# Geld gaat van de bankrekening naar een uitgavenrekening.
|
# Geld gaat van de bankrekening naar een uitgavenrekening.
|
||||||
tegenrekening = self._map_payee_to_account(payee + " " + omschrijving_str)
|
tegenrekening = self._map_payee_to_account(payee + " " + omschrijving_str)
|
||||||
|
|
||||||
|
#FORMAT: data.Posting(account, units, cost=None, price=None, flag=None, meta=None)
|
||||||
postings = [
|
postings = [
|
||||||
data.Posting(self.file_account(file), bedrag, data.get_currency_meta(currency), None, None, None),
|
#data.Posting(self.file_account(file), bedrag, currency, None, None, None),
|
||||||
data.Posting(tegenrekening, -bedrag, data.get_currency_meta(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:
|
else:
|
||||||
# Inkomsten: bedrag is positief.
|
# Inkomsten: bedrag is positief.
|
||||||
# Geld gaat van een inkomstenrekening naar de bankrekening.
|
# Geld gaat van een inkomstenrekening naar de bankrekening.
|
||||||
tegenrekening = self._map_payee_to_account(payee + " " + omschrijving_str)
|
tegenrekening = self._map_payee_to_account(payee + " " + omschrijving_str)
|
||||||
|
|
||||||
|
#FORMAT: data.Posting(account, units, cost=None, price=None, flag=None, meta=None)
|
||||||
postings = [
|
postings = [
|
||||||
data.Posting(tegenrekening, -bedrag, data.get_currency_meta(currency), None, None, None),
|
#data.Posting(tegenrekening, -bedrag, currency, None, None, None),
|
||||||
data.Posting(self.file_account(file), bedrag, data.get_currency_meta(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(
|
transaction = data.Transaction(
|
||||||
@@ -83,8 +94,8 @@ class MyCSVImporter(importer.ImporterProtocol):
|
|||||||
flag='*',
|
flag='*',
|
||||||
payee=payee,
|
payee=payee,
|
||||||
narration=narration,
|
narration=narration,
|
||||||
tags=data.frozenset(),
|
tags=frozenset(),
|
||||||
links=data.frozenset(),
|
links=frozenset(),
|
||||||
postings=postings
|
postings=postings
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
7
test_Path.py.py
Normal file
7
test_Path.py.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
print("Python executable:", sys.executable)
|
||||||
|
print("sys.path (zoekpaden):")
|
||||||
|
for p in sys.path:
|
||||||
|
print(" ", p)
|
||||||
20
test_amount_parsing.py
Normal file
20
test_amount_parsing.py
Normal file
@@ -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()
|
||||||
33
test_importer.py
Normal file
33
test_importer.py
Normal file
@@ -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))
|
||||||
Reference in New Issue
Block a user