ingest comdirect as raw strings
This commit is contained in:
@@ -100,3 +100,45 @@ class Category(BaseModel):
|
||||
|
||||
def __repr__(self):
|
||||
return f'Category.from_str("{self.__str__()}")'
|
||||
|
||||
|
||||
class ComdirectBase(BaseModel):
|
||||
date_book: str = Field(alias="Buchungstag", examples=["07.09.2026"])
|
||||
amount_eur: str = Field(alias="Umsatz in EUR", examples=["32,43"])
|
||||
|
||||
|
||||
class ComdirectCommon(ComdirectBase):
|
||||
type: str = Field(
|
||||
alias="Vorgang", examples=["Lastschrift / Belastung", "Kartenumsatz"]
|
||||
)
|
||||
text: str = Field(alias="Buchungstext")
|
||||
|
||||
|
||||
class ComdirectGiro(ComdirectCommon):
|
||||
# "Buchungstag";"Wertstellung (Valuta)";"Vorgang";"Buchungstext";"Umsatz in EUR";
|
||||
# "Buchungstag";"Wertstellung (Valuta)";"Vorgang";"Buchungstext";"Umsatz in EUR";
|
||||
date_val: str = Field(alias="Wertstellung (Valuta)", examples=["07.09.2026"])
|
||||
|
||||
|
||||
class ComdirectCreditCard(ComdirectCommon):
|
||||
# "Buchungstag";"Umsatztag";"Vorgang";"Referenz";"Buchungstext";"Umsatz in EUR";
|
||||
date_book: str = Field(alias="Buchungstag", examples=["07.09.2026"])
|
||||
date_val: str = Field(alias="Umsatztag", default="")
|
||||
type: str = Field(
|
||||
alias="Vorgang",
|
||||
examples=["Lastschrift / Belastung", "Kartenumsatz"],
|
||||
default="",
|
||||
)
|
||||
reference: str = Field(alias="Referenz", default="")
|
||||
text: str = Field(alias="Buchungstext", default="")
|
||||
amount_eur: str = Field(alias="Umsatz in EUR", examples=["32,43"], default="")
|
||||
|
||||
|
||||
class ComdirectDepot(BaseModel):
|
||||
# "Buchungstag";"Geschäftstag";"Stück / Nom.";"Bezeichnung";"WKN";"Währung";"Ausführungskurs";"Umsatz in EUR";
|
||||
date_val: str = Field(alias="Geschäftstag")
|
||||
num: str = Field(alias="Stück / Nom.")
|
||||
name: str = Field(alias="Bezeichnung")
|
||||
wkn: str = Field(alias="WKN")
|
||||
currency: str = Field(alias="Währung")
|
||||
spot_price: str = Field(alias="Ausführungskurs")
|
||||
|
||||
+27
-10
@@ -4,29 +4,46 @@ from enum import Enum, auto
|
||||
from pathlib import Path
|
||||
|
||||
from src.models import B4wExport
|
||||
from src.settings.account_ingest import ACCOUNT_INGESTION_FUNCTIONS
|
||||
|
||||
|
||||
def reader_raw(path: Path):
|
||||
def _reader_raw(path: Path):
|
||||
with path.open() as fid:
|
||||
return list(csv.DictReader(fid))
|
||||
|
||||
|
||||
def reader_b4w(path: Path):
|
||||
raw = reader_raw(path)
|
||||
raw = _reader_raw(path)
|
||||
return list(map(B4wExport.model_validate, raw))
|
||||
|
||||
|
||||
|
||||
PATTERN_ACCOUNT_NAME = r'^"Umsätze ([^"]+)";"Zeitraum: .*$'
|
||||
PATTERN_HEADER = r'"([^"]+)"'
|
||||
PATTERN_DATA = r'"([^"]+)"'
|
||||
|
||||
class EXPECT_LINE(Enum):
|
||||
ACCOUNT_NAME = auto()
|
||||
BLANK = auto()
|
||||
HEADER = auto()
|
||||
DATA = auto()
|
||||
|
||||
|
||||
def reader_comdirect(path: Path):
|
||||
bank_name = "comdirect"
|
||||
ingestion_functions = ACCOUNT_INGESTION_FUNCTIONS.get(bank_name)
|
||||
assert ingestion_functions
|
||||
|
||||
result = {}
|
||||
raw = _reader_raw_comdirect(path)
|
||||
for account_name, account_data in raw.items():
|
||||
ingestion_function = ingestion_functions.get(account_name)
|
||||
assert ingestion_function
|
||||
result[account_name] = list(map(ingestion_function, account_data))
|
||||
|
||||
PATTERN_ACCOUNT_NAME = r'^"Umsätze ([^"]+)";"Zeitraum: .*$'
|
||||
PATTERN_HEADER = r'"([^"]+)"'
|
||||
PATTERN_DATA = r'"([^"]+)"'
|
||||
return result
|
||||
|
||||
class EXPECT_LINE(Enum):
|
||||
ACCOUNT_NAME = auto()
|
||||
BLANK = auto()
|
||||
HEADER = auto()
|
||||
DATA = auto()
|
||||
def _reader_raw_comdirect(path: Path):
|
||||
|
||||
with path.open(encoding="latin1") as fid:
|
||||
lines = fid.readlines()
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
from src.models import ComdirectCreditCard, ComdirectDepot, ComdirectGiro
|
||||
|
||||
ACCOUNT_INGESTION_FUNCTIONS = {
|
||||
"comdirect": {
|
||||
"Girokonto": lambda x: ComdirectGiro.model_validate(x),
|
||||
"Visa-Karte (Kreditkarte)": lambda x: ComdirectCreditCard.model_validate(x),
|
||||
"Tagesgeld PLUS-Konto": lambda x: ComdirectGiro.model_validate(x),
|
||||
"Depot": lambda x: ComdirectDepot.model_validate(x),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user