]> piware.de Git - bin.git/blobdiff - consors-report.py
build-cockpit-toolbox: Add hashbang to flatpak-spawn wrappers
[bin.git] / consors-report.py
index 4c55d83d75a8a8abae46b3a412299a461ea3e8ad..f76deb3ea6211cc68e5b117548f8ea5e028fb1a8 100755 (executable)
@@ -2,6 +2,7 @@
 
 import argparse
 import collections
+import csv
 import itertools
 import re
 from collections import namedtuple
@@ -14,16 +15,18 @@ CATEGORIES = {
     'Gehalt/Steuern': re.compile('Gehalt/Rente|RED HAT|Finanzamt|FK Guenzburg', re.I),
     'Wohnung': re.compile('Telekom|hands4home|Goetzfried|Green Planet Energy|Beitragsservice.*Rundfunk', re.I),
     'Medizin': re.compile(r'Apotheke|MVZ|\bmed\b|ZAB Abrechnung|Caika|HNOeins|PVS|Dr\..*Sellier|'
-                          r'BFS Health|Streifeneder|(Drescher.*Lung)|(Debeka.*Überweisung)', re.I),
-    'Versicherung': re.compile('(debeka|DKV|Hallesche KV|Versicherung|Alte Leipziger|ConceptIF|'
-                               'Baloise).*Lastschrift', re.I),
-    'Transport': re.compile('DB Vertrieb|Deutsche Bahn|Nextbike', re.I),
-    'Lebensmittel': re.compile('BIOS|Wolf|Ruta|Rewe', re.I),
+                          r'BFS Health|Streifeneder|Labor|Physio|(Drescher.*Lung)|Osteopath|'
+                          '(Dr.*Borchers)|(Debeka.*Überweisung)|(DKV.*Überweisung)|Beihilfe|Klinik', re.I),
+    'Versicherung': re.compile('((debeka|DKV|Hallesche|Versicherung|Alte Leipziger|ConceptIF|'
+                               'Baloise).*Lastschrift)|Hallesche.*Bonu', re.I),
+    'Transport': re.compile('DB Vertrieb|Deutsche Bahn|Nextbike|Carsharing', re.I),
+    'Lebensmittel': re.compile('BIOS|Bäcker|Baecker|Ruta|Rewe', re.I),
     'Eigentumswohnungen': re.compile('Rechnung Darl.-Leistung|Semmelweis', re.I),
-    'Hobby/Sport': re.compile('Holstein|Mrs. Sporty|Kieser|DJK', re.I),
-    'Sparen': re.compile('Bausparkasse Mainz AG|FIL Fondsbank|MIG GmbH|Netfonds AG', re.I),
+    'Hobby/Sport': re.compile('Holstein|Mrs. Sporty|Kieser|DJK|Dimaso', re.I),
+    'Sparen': re.compile('Bausparkasse Mainz AG|FIL Fondsbank|MIG (Fonds|GmbH)|Netfonds AG', re.I),
     'Spenden': re.compile('Spende|Signal Foundation|nebenan.de|(paypal.*Sabine.Hossenf)|'
-                          'Patreon|Umwelthilfe|Foerderer|(Aktion Tier.*Mensch)', re.I),
+                          'Patreon|Umwelthilfe|Foerderer|Malteser|(Aktion Tier.*Mensch)|'
+                          'campact|Amnesty', re.I),
 }
 
 
@@ -42,8 +45,8 @@ def get_category(item: str) -> str:
     return 'Sonstiges'
 
 
-def parse_entry(line: str) -> Entry:
-    fields = [f.strip() for f in line.strip().split(';')]
+def parse_entry(raw_fields: Iterable[str]) -> Entry:
+    fields = [f.strip() for f in raw_fields]
     # last field is the value, parse as float
     value = float(fields.pop().replace('.', '').replace(',', '.'))
     # match on who, IBAN, type, or desc
@@ -61,9 +64,12 @@ def parse_csv(path: Path, date_filter: str) -> Iterable[Entry]:
         return filter_re.search(entry.date)
 
     with path.open() as f:
+        reader = csv.reader(f)
+        next(reader)  # skip header
         # first line is the column headers, chop it off
-        entries = map(parse_entry, f.readlines()[1:])
-        return filter(filter_entry, entries)
+        entries = map(parse_entry, reader)
+        # do the actual iteration here, as the files get closed afterwards
+        return list(filter(filter_entry, entries))
 
 
 def main():