diff --git a/src/models.py b/src/models.py index a500eeb..8d03906 100644 --- a/src/models.py +++ b/src/models.py @@ -95,12 +95,15 @@ def _parse_date_german(date_str: str) -> date | None: day, month, year = list(map(int, date_str.split("."))) return date(day=day, month=month, year=year) + def _parse_decimal_german(decimal_str: str) -> Decimal: return Decimal(decimal_str.replace(".", "").replace(",", ".")) class ComdirectBase(BaseModel): - date_val: date | None = Field(alias="Wertstellung (Valuta)", examples=["07.09.2026"]) + date_val: date | None = Field( + alias="Wertstellung (Valuta)", examples=["07.09.2026"] + ) amount_eur: Decimal = Field(alias="Umsatz in EUR", examples=["32,43"]) @field_validator("date_val", mode="before") @@ -138,7 +141,9 @@ class ComdirectCreditCard(ComdirectGiro): ) reference: str = Field(alias="Referenz", default="") text: str = Field(alias="Buchungstext", default="") - amount_eur: Decimal | None = Field(alias="Umsatz in EUR", examples=["32,43"], default=None) + amount_eur: Decimal | None = Field( + alias="Umsatz in EUR", examples=["32,43"], default=None + ) class ComdirectDepot(ComdirectBase): diff --git a/src/reader.py b/src/reader.py index db7de09..4df5906 100644 --- a/src/reader.py +++ b/src/reader.py @@ -18,11 +18,11 @@ def reader_b4w(path: 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() @@ -33,6 +33,7 @@ class EXPECT_LINE(Enum): COMDIRECT_ACCOUNTS = BANK_ACCOUNTS.get("comdirect", {}) assert isinstance(COMDIRECT_ACCOUNTS, dict) + def reader_comdirect(path: Path): result = {} raw = _reader_raw_comdirect(path) @@ -42,6 +43,7 @@ def reader_comdirect(path: Path): result[account_name] = list(map(account.ingestion_function, account_data)) return result + def _reader_raw_comdirect(path: Path): with path.open(encoding="latin1") as fid: diff --git a/src/settings/constants.py b/src/settings/constants.py index a8cb886..fc2cd09 100644 --- a/src/settings/constants.py +++ b/src/settings/constants.py @@ -1,8 +1,8 @@ - from enum import Enum IBAN_PATTERN = r"^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$" + class Currency(str, Enum): EUR = "EUR" USD = "USD" @@ -14,5 +14,3 @@ class Currency(str, Enum): def __repr__(self): return f"Currency.{self.name}" - - diff --git a/src/settings/models.py b/src/settings/models.py index d58994a..485b8db 100644 --- a/src/settings/models.py +++ b/src/settings/models.py @@ -9,6 +9,3 @@ class AccountInfo(BaseModel): iban: str = Field(pattern=IBAN_PATTERN) ingestion_function: Callable currency: Currency - - - diff --git a/tests/test_reader.py b/tests/test_reader.py index 30aea9c..927af5c 100644 --- a/tests/test_reader.py +++ b/tests/test_reader.py @@ -14,6 +14,8 @@ def test_reader_comdirect(): assert len(data) == len(COMDIRECT_ACCOUNTS) assert set(data) == set(COMDIRECT_ACCOUNTS) assert all(isinstance(row, ComdirectGiro) for row in data["Girokonto"]) - assert all(isinstance(row, ComdirectCreditCard) for row in data["Visa-Karte (Kreditkarte)"]) + assert all( + isinstance(row, ComdirectCreditCard) for row in data["Visa-Karte (Kreditkarte)"] + ) assert all(isinstance(row, ComdirectGiro) for row in data["Tagesgeld PLUS-Konto"]) assert all(isinstance(row, ComdirectDepot) for row in data["Depot"])