boekhouding-beancount/import/rabobank.py

120 lines
3.4 KiB
Python

#!/usr/bin/env python3
from os.path import basename
from beangulp import mimetypes
from beangulp.importers import csvbase
from deelnemers import deelnemers
participants = deelnemers()
class RaboAmount(csvbase.Amount):
def __init__(self, col):
super().__init__(col, subs={"\\+": "", ",": "."})
class Importer(csvbase.Importer):
encoding = "iso-8859-15"
date = csvbase.Date("Datum", "%Y-%m-%d")
payee = csvbase.Columns("Naam tegenpartij", "Tegenrekening IBAN/BBAN", sep="; ")
narration = csvbase.Columns(
"Omschrijving-1", "Omschrijving-2", "Omschrijving-3", sep=" "
)
amount = RaboAmount("Bedrag")
balance = RaboAmount("Saldo na trn")
def identify(self, filepath):
mimetype, encoding = mimetypes.guess_type(filepath)
if mimetype != "text/csv":
return False
with open(filepath, "rb") as fd:
head = fd.read(1024)
return head.startswith(
b'"IBAN/BBAN","Munt","BIC","Volgnr","Datum","Rentedatum","Bedrag","Saldo na trn","Tegenrekening IBAN/BBAN"'
)
def filename(self, filepath):
return "rabobank." + basename(filepath)
def guess_contra(entry):
posting = entry.postings[0]
def have_keyword(*keywords):
l_description = entry.narration.lower()
return any(kw in l_description for kw in keywords)
if entry.payee == "Kosten" or (
entry.payee == "Rabobank; NL89RABO0111741386"
and entry.narration.startswith("Kosten")
):
return "Uitgaven:Bankkosten"
if entry.payee == "Stichting Bitlair; NL09RABO3159222187":
return "Activa:Spaarrekening"
if (
entry.payee == "Symbiose Beheer B.V.; NL84ABNA0630587221"
and posting.units.number < -3400
):
return "Uitgaven:Huur"
if (
entry.payee == "Stichting EventInfra; NL59RABO0312574800"
and entry.narration == "Verhuur opslagruimte "
):
return "Activa:Debiteuren:EventInfra"
if (
entry.payee == "JONGE ONDERZOEKERS AMERS; NL30ABNA0119774844"
and 590 < posting.units.number < 700
):
return "Activa:Debiteuren:DJO"
if (
entry.payee == "Furthermore B.V.; NL06REVO8135470894"
and 600 < posting.units.number < 800
):
return "Activa:Debiteuren:UnicornDept"
if entry.payee == "Gebr. Schurman GmbH; DE68441600141300702500":
return "Uitgaven:Bar:Mate"
if entry.payee == "Sligro ZB 5037":
return "Uitgaven:Bar:Snacks"
if entry.payee == "STATIEGELD NEDERLAND; NL59ABNA0100073913":
return "Uitgaven:Bar"
if entry.narration.startswith("Decla") and posting.units.number < 0:
return "Passiva:Declaraties"
if have_keyword(
"deposit",
"revbank",
" bar ",
"kassa vulling",
"desposit",
"(RB QR)",
"rev-bank",
" bank",
"elena transfer",
"barsaldo",
):
return "Passiva:RevBank"
if entry.payee == "Stichting Mollie Payments; NL70CITI2032329018":
return "Passiva:RevBank"
for p in participants:
if (
hasattr(p, "maandbedrag")
and hasattr(p, "ibans")
and p.maandbedrag == posting.units.number
and any(iban in entry.payee for iban in p.ibans)
):
return f"Activa:Debiteuren:Deelnemers:{p.nickname.title().replace('_', '')}"
return None