comdirect ingest: overhaul
This commit is contained in:
@@ -3,6 +3,7 @@ from datetime import date
|
||||
from decimal import Decimal
|
||||
from enum import Enum
|
||||
|
||||
from pydantic import BaseModel
|
||||
from sqlalchemy import Column, Date, Integer, Numeric, String
|
||||
from sqlalchemy.orm import DeclarativeBase
|
||||
|
||||
@@ -37,6 +38,15 @@ def _parse_decimal_german(decimal_str: str) -> Decimal:
|
||||
return Decimal(decimal_str.replace(".", "").replace(",", "."))
|
||||
|
||||
|
||||
type Csv2DictRow = dict[str, str]
|
||||
type Csv2Dict = list[Csv2DictRow]
|
||||
type CsV2DictMulti = dict[str, Csv2Dict]
|
||||
|
||||
|
||||
class ExportBaseModel(BaseModel):
|
||||
pass
|
||||
|
||||
|
||||
class BaseModelDb(DeclarativeBase):
|
||||
pass
|
||||
|
||||
|
||||
+4
-4
@@ -1,15 +1,15 @@
|
||||
from datetime import date
|
||||
from decimal import Decimal
|
||||
|
||||
from pydantic import BaseModel, Field, computed_field, field_validator
|
||||
from pydantic import Field, computed_field, field_validator
|
||||
from sqlalchemy import Column, Date, ForeignKey, Integer, String, UniqueConstraint
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from src.constants import IBAN_PATTERN, Currency
|
||||
from src.models._common import BaseModelDb, IngestdbBase, Sign, _hash
|
||||
from src.models._common import BaseModelDb, ExportBaseModel, IngestdbBase, Sign, _hash
|
||||
|
||||
|
||||
class B4wExport(BaseModel):
|
||||
class B4wExport(ExportBaseModel):
|
||||
id: int = Field(alias="Id1", description="internal B4w ID")
|
||||
account_iban: str = Field(alias="OwnrAcctIBAN", pattern=IBAN_PATTERN)
|
||||
account_currency: Currency = Field(alias="OwnrAcctCcy")
|
||||
@@ -56,7 +56,7 @@ class B4wExport(BaseModel):
|
||||
return category
|
||||
|
||||
|
||||
class Category(BaseModel):
|
||||
class Category(ExportBaseModel):
|
||||
name: str = Field(pattern=r"[^:\r\n]+")
|
||||
parent: Category | None = None
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
from datetime import date
|
||||
from decimal import Decimal
|
||||
|
||||
from pydantic import BaseModel, Field, computed_field, field_validator
|
||||
from pydantic import Field, computed_field, field_validator
|
||||
from sqlalchemy import Column, Date, String
|
||||
|
||||
from src.models._common import (
|
||||
ExportBaseModel,
|
||||
IngestdbBase,
|
||||
_hash,
|
||||
_parse_date_german,
|
||||
@@ -12,7 +13,7 @@ from src.models._common import (
|
||||
)
|
||||
|
||||
|
||||
class ComdirectBase(BaseModel):
|
||||
class ComdirectBase(ExportBaseModel):
|
||||
date_val: date | None = Field(
|
||||
alias="Wertstellung (Valuta)", examples=["07.09.2026"]
|
||||
)
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
from pathlib import Path
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from src.constants import IBAN_PATTERN, Currency
|
||||
from src.models.b4w import B4wExport
|
||||
from src.models.comdirect import ComdirectCreditCard, ComdirectDepot, ComdirectGiro
|
||||
|
||||
|
||||
class Account(BaseModel):
|
||||
name: str
|
||||
model: type[B4wExport | ComdirectGiro | ComdirectCreditCard | ComdirectDepot]
|
||||
iban: str | None = Field(pattern=IBAN_PATTERN, default=None)
|
||||
currency: Currency | None = None
|
||||
|
||||
|
||||
class Source(BaseModel):
|
||||
name: str
|
||||
source_path: Path
|
||||
accounts: list[Account]
|
||||
|
||||
def get_account_names(self) -> list[str]:
|
||||
return [a.name for a in self.accounts]
|
||||
|
||||
def get_account(self, name: str) -> Account | None:
|
||||
return next((a for a in self.accounts if a.name == name), None)
|
||||
Reference in New Issue
Block a user