|
1 | | -## Models |
| 1 | +# Models |
2 | 2 |
|
3 | | -### Datenbankeintrag für eine Transaktion |
| 3 | +## Dictionary einer Config |
| 4 | + |
| 5 | +``` |
| 6 | +{ |
| 7 | + 'uuid': str # (generated) |
| 8 | + 'metatype': str # (config) |
| 9 | + 'name': str, # Typ des Configeintrags (user, group, ui...) |
| 10 | +
|
| 11 | + -------- Zusatz je Config Typ ------- |
| 12 | +
|
| 13 | + **kwargs |
| 14 | + |
| 15 | + . . . . . . . z.B. User . . . . . . . |
| 16 | +
|
| 17 | + 'username': str, |
| 18 | + 'password': str # hashed |
| 19 | + 'ibans': list # Eigentümer |
| 20 | + 'rules': dict # private Regeln |
| 21 | + 'parser': dict # private Parser |
| 22 | +
|
| 23 | + . . . . . . . z.B. Gruppe . . . . . . |
| 24 | +
|
| 25 | + 'groupname': str |
| 26 | + "ibans": list, # IBANs, die zur Gruppe gheören |
| 27 | + "members": [ |
| 28 | + { "user": "anna", "role": "owner" }, |
| 29 | + { "user": "bob", "role": "viewer" } |
| 30 | + ] |
| 31 | +} |
| 32 | +``` |
| 33 | + |
| 34 | +## Datenbankeintrag für eine Transaktion |
4 | 35 |
|
5 | 36 | ``` |
6 | 37 | { |
|
17 | 48 | 'currency': str, |
18 | 49 | 'parsed': dict( str: str ) |
19 | 50 | 'category': str, |
20 | | - 'subcategory': str, |
21 | 51 | 'tags': list[str], |
22 | 52 | 'priority': int, |
23 | 53 | } |
24 | 54 | ``` |
25 | 55 |
|
26 | | -### Metadaten |
| 56 | +## Parsing Objects |
27 | 57 |
|
28 | | -#### Dictionary eines Rulesets (Tag/Parse) |
| 58 | +Beim Import eines Kontoauszugs werden die Transaktionen in ihre Grunddaten zerlegt und in einer Datenbankgespeichert. Das Parsing erkennt nach bestimmten Regeln Informationen, die sich aus den Rohdaten ergeben und reichert damit den Informationsgehalt der einzelnen Transaktion an. |
29 | 59 |
|
30 | | -Regeln können Attribute einer Transaktion untersuchen und anhand dessen klassifizieren oder taggen. Zu den Werten kann nicht die primäre Kategorie zählen, wohl aber andere Tags, parsing Informationen oder Regexes auf den Buchungstext (und mehr). |
| 60 | +Bei jeder Regex-Regel gilt, dass der Ausdruck genau eine Matching-Group ergeben muss, deren Informationen als Wert des Parsings übernommen wird. |
31 | 61 |
|
32 | 62 | ``` |
33 | 63 | { |
34 | | - 'uuid': str # (generated) |
35 | | - 'metatype': str # (config|rule|parser) |
| 64 | + 'metatype': str, |
36 | 65 | 'name': str, |
37 | | - 'regex': r-str( RegEx ), |
| 66 | + 'regex': r-str(RegEx) |
| 67 | +} |
| 68 | +``` |
38 | 69 |
|
39 | | - -------- Zusatz bei Rules ------- |
| 70 | +#### .metatype, str (`parser`) |
40 | 71 |
|
41 | | - 'category': str | None, |
42 | | - 'tags': list[str] | None, |
| 72 | +Klassifiziert das Objekt als Regel für das Parsing. |
| 73 | + |
| 74 | +#### .name, str |
| 75 | + |
| 76 | +Frei wählbarer Name der Regel. |
| 77 | + |
| 78 | +#### .regex, r-str (optional) |
43 | 79 |
|
44 | | - . . . . . . . optional . . . . . . |
| 80 | +Regex String, der auf den Buchungstext angewendet werden soll. Er muss genau eine Matching-Group enthalten. Der Wert dieses Treffers (der Gruppe) wird als Wert mit dem Namen der Regel in der Transaktion als Ergebnis gespeichert. |
45 | 81 |
|
46 | | - 'prioriry': int, |
| 82 | +## Rule Objects |
| 83 | + |
| 84 | +``` |
| 85 | +{ |
| 86 | + 'metatype': str |
| 87 | + 'name': str, |
| 88 | + 'multi': str, |
47 | 89 | 'parsed': dict( |
48 | | - 'multi': str, # (AND|OR) |
49 | | - 'query': dict # (key=Name, val=Value) |
| 90 | + key, str | int : value str | int | bool | list |
50 | 91 | ) |
| 92 | + 'filter': list( dict( |
| 93 | + 'key': str, |
| 94 | + 'value': int, str, bool, list, |
| 95 | + 'compare': str |
| 96 | + ) ) |
| 97 | + 'category': str | None, |
| 98 | + 'tags': list, |
| 99 | + 'prioriry': int | None |
51 | 100 | } |
52 | 101 | ``` |
53 | 102 |
|
54 | | -#### Dictionary einer Config |
| 103 | +Regeln können Attribute einer Transaktion untersuchen und anhand dessen klassifizieren oder taggen. Bei den Regeln zum Tagging können auch zuvor geparste Informationen zählen; bei den Regeln zum Kategorisieren zusätzlich auch bereits gesetzte Tags einer Transaktion. Beide Typen unterscheiden sich in der Angabe beim Schlüssel `metatype`, sind aber sonst sehr ähnlich. Persistente Regeln werden als `json` im Ordner `settings/rule` abgelegt. Die Nummerierung im Dateinamen gibt die Lade-Reihenfolge an. Später geladene Regeln mit gleichem Namen können frühere überschreiben. |
55 | 104 |
|
56 | | -``` |
57 | | -{ |
58 | | - 'uuid': str # (generated) |
59 | | - 'metatype': str # (config) |
60 | | - 'name': str, # Typ des Configeintrags (user, group, ui...) |
| 105 | +### Schlüssel dieses Objektes |
61 | 106 |
|
62 | | - -------- Zusatz je Config Typ ------- |
| 107 | +#### .metatype, str (`rule` | `category`) |
63 | 108 |
|
64 | | - **kwargs |
65 | | - |
66 | | - . . . . . . . z.B. User . . . . . . . |
| 109 | +Klassifiziert das Objekt als Regel für das Tagging oder zur Kategorisierung. Einige Schlüssel werden abhängig von dieser Angabe anders genutzt (siehe unten). |
67 | 110 |
|
68 | | - 'username': str, |
69 | | - 'password': str # hashed |
70 | | - 'ibans': list # Eigentümer |
71 | | - 'rules': dict # private Regeln |
72 | | - 'parser': dict # private Parser |
| 111 | +#### .name, str |
73 | 112 |
|
74 | | - . . . . . . . z.B. Gruppe . . . . . . |
| 113 | +Frei wählbarer Name der Regel. |
| 114 | + |
| 115 | +##### .multi, str (`AND` | `OR`) |
| 116 | + |
| 117 | +Art der Verkettung der Filter. Ohne diese Angabe wird der Default `AND` gewählt. Wird hier `OR` angegeben, werden alle Filter (`regex`, `filter`, `parsed`-keys) mit `OR` verknüpft. |
| 118 | + |
| 119 | +#### .parsed, dict (optional) |
| 120 | + |
| 121 | +Ein Dictionary, bei dem der `key` der Bezeichner für den geparsten Wert einer Transaktion unter `.parsed.$WERT` ist, der mit dem `value` abgeglichen wird. |
| 122 | + |
| 123 | +##### .parsed[].key, str, int |
| 124 | + |
| 125 | +Die Bezeichnung (Schlüssel) des Werts, der geprüft werden soll. |
| 126 | + |
| 127 | +#### filter, list (optional) |
| 128 | + |
| 129 | +Liste mit Dictionaryies, die Argumenten zum durchsuchen von allgemeinen Werten einer Transaktion enthalten. |
| 130 | + |
| 131 | +##### filter[].key, str | int |
| 132 | + |
| 133 | +Die Bezeichnung (Schlüssel) des Werts, der geprüft werden soll. `key` kann hier jeder Bezeichner sein, der in der ersten Ebene des Transaktionsobjektes vorkommen könnte. Ausgenommen sind hier die `parsed` Werte, für die es ja aber dafür eine eigene Filterangabe gibt. |
| 134 | + |
| 135 | +#### filter[].value, str | int | bool | list |
| 136 | + |
| 137 | +Der Wert, mit dem der Wert aus der Datenbank abgeglichen werden soll. |
| 138 | + |
| 139 | +#### filter[].compare, str (`==` | `!=` | `<` | `>` | `<=` | `>=` | `in` | `notin` | `all` | `regex`) |
| 140 | + |
| 141 | +Art des Vergleichs: |
75 | 142 |
|
76 | | - 'groupname': str |
77 | | - "ibans": list, # IBANs, die zur Gruppe gheören |
78 | | - "members": [ |
79 | | - { "user": "anna", "role": "owner" }, |
80 | | - { "user": "bob", "role": "viewer" } |
81 | | - ] |
82 | | -} |
83 | 143 | ``` |
| 144 | +Wert-aus-DB von rule.key |
| 145 | +$compare |
| 146 | +rule.value |
| 147 | +``` |
| 148 | + |
| 149 | +Dabei haben die Operatoren folgende Bedeutung: |
| 150 | + |
| 151 | +- `==` : Die Werte müssen exakt gleich sein (default). |
| 152 | +- `!=` : Die Werte müssen ungleich sein. |
| 153 | +- `<` : Der Wert in der Datenbank muss kleiner sein als der Vergleichswert. |
| 154 | +- `>` : Der Wert in der Datenbank muss größer sein als der Vergleichswert. |
| 155 | +- `<=` : Der Wert in der Datenbank muss kleiner oder gleich sein wie der Vergleichswert. |
| 156 | +- `>=` : Der Wert in der Datenbank muss größer oder gleich sein wie der Vergleichswert. |
| 157 | +- `in`: Mindestens ein Wert der Vergleichsliste muss in dem Listenwert aus der Datenbank vorkommen. |
| 158 | +- `all`: Alle Werte der Vergleichsliste müssen in dem Listenwert aus der Datenbank vorkommen. |
| 159 | +- `notin`: Kein Wert der Vergleichsliste darf in dem Listenwert aus der Datenbank vorkommen. |
| 160 | +- `regex`: Regex String, der auf den Buchungstext angewendet werden soll. Ein Teil-Treffer des RegExes wird als Treffer gewertet. |
| 161 | + |
| 162 | +#### .tags, list (nur bei metatype: `rule`) |
| 163 | + |
| 164 | +Liste mit Tags, die bei getroffene Einträge hinzugefügt werden. |
84 | 165 |
|
85 | | -## Handling von Prioritäten |
| 166 | +#### .category, str (nur bei metatype: `category`) |
86 | 167 |
|
87 | | -Die Priorität wird zwischen 0 und 100 automatisch gesetzt, kann aber auch abgegen werden. 0 ist unwichtig, 100 ist wichtig. |
| 168 | +Name der Hauptkategorie, die bei einem Treffer für den Eintrag gesetzt werden soll. Es muss entweder eine Haupt- oder eine Sekundärkategorie angegeben werden. |
88 | 169 |
|
89 | | -Beim Tagging werden nur Einträge selektiert, die eine niedrigere Priorität haben als die akutelle Regel. |
| 170 | +#### .priority, int (nur bei metatype: `category`) |
90 | 171 |
|
91 | | -Es wird beim Taggen entweder die Priorität 1 (automatisches Taggen), die der Regel gesetzt (wenn diese höher ist) oder die explizit übermittelte. Ausnahmen sind: |
| 172 | +Priorität der Regel. Eine höhere Priorität (größere Zahl) überschreibt zuvor gesetzt Kategorien mit einer niedrigeren Priorität. |
92 | 173 |
|
93 | | -- Das manuelle Taggen: Hier wird immer eine Priorität von 99 gesetzt. |
94 | | -- Das automatische Tagging mit einer explizit angegebenen Regel: Hier werden Einträge < 99 selektiert und überschrieben, dann aber wieder die Priorät der Regel (oder 1) gesetzt. |
| 174 | +Ein manuelles Kategorisieren hat immer die höchste Priorität. |
0 commit comments