Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions rechnung/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
from .settings import get_settings_from_cwd, copy_assets, create_required_settings_file
from .invoice import create_invoices, render_invoices, send_invoices
from .contract import render_contracts, send_contract, get_contracts
from .transactions import read_csv_files


cwd = os.getcwd()

Expand Down Expand Up @@ -57,6 +59,19 @@ def print_contracts():
print(f"{cid}: {slug} {data['start']} {total_monthly}€")


@cli1.command()
@click.argument("year", type=int)
@click.argument("month", type=int)
def print_csv(year, month):
"""
Parse CSV files for a specific year/month combo
"""
settings = get_settings_from_cwd(cwd)
print(f"Parsing CSV files for {year}{month}")
for transaction in read_csv_files(settings, year, month):
print("{date}: {type[0]} {amount:>6}€ {sender}".format(**transaction))


@cli1.command()
def print_stats():
"""
Expand Down
1 change: 1 addition & 0 deletions rechnung/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"contract_mail_template_file": "contract_mail_template.j2",
"contract_template_file": "contract_template.j2.html",
"contracts_dir": "contracts",
"csv_dir": "csv",
"delivery_date_format": "%d. %B %Y",
"invoice_css_asset_file": "invoice.css",
"invoice_mail_template_file": "invoice_mail_template.j2",
Expand Down
54 changes: 54 additions & 0 deletions rechnung/transactions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import datetime
import locale
import os
import os.path
import yaml
import csv
import re
from dateutil.parser import parse

from pathlib import Path


def parser_gls(csv_path):
"""
Parses CSV files from the GLS bank
"""
groups = [
r"(?P<type>Dauerauftragsbelast|Dauerauftragsgutschr|Überweisungsauftrag|Basislastschrift|Überweisungsgutschr\.)",
r"(?P<subject>.*)IBAN:\s?(?P<iban>.+) BIC:\s?(?P<bic>.+)",
]
compiled_groups = re.compile("".join(groups))
transactions = []

with open(csv_path, encoding="iso-8859-1") as csv_file:
csv_reader = csv.reader(csv_file, delimiter=";")

for row in csv_reader:
match = compiled_groups.match(row[8].replace("\n", ""))
if match:
transactions.append(
{
**match.groupdict(),
"date": parse(row[0], dayfirst=True),
"sender": row[3],
"amount": float(row[11].replace(",", ".")),
}
)
return transactions


def read_csv_files(settings, year, month):
"""
Parses CSV files of a specific year/month combo
"""
transactions = []
for bank in settings.csv_dir.iterdir():
csv_path = bank / f"{year}{month:02}.csv"
if csv_path.is_file():
if bank.stem == "gls":
transactions.extend(parser_gls(csv_path))
else:
print("Unknown CSV format")

return transactions