-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodels.py
116 lines (89 loc) · 3.41 KB
/
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from __future__ import annotations
from datetime import date, datetime
from enum import Enum
from typing import Any, Optional
from sqlalchemy import Boolean, String, ForeignKeyConstraint, CheckConstraint
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
class Bank(Enum):
CSAS = '0800'
CSOB = '0300'
FIO = '2010'
KB = '0100'
MONETA = '0600'
RB = '5500'
class TransactionType(Enum):
INCOMING = 1,
OUTGOING = 2
@staticmethod
def from_float(num: float) -> TransactionType:
return TransactionType.INCOMING if num > 0 else TransactionType.OUTGOING
class TransactionTypeDetail(Enum):
INCOMING = 'Příchozí platba'
OUTGOING = 'Odchozí platba'
ATM = 'Výběr z bankomatu'
FEE = 'Poplatek'
TAX = 'Odvod daně'
CARD = 'Platba kartou'
class UpdateStatus(Enum):
PENDING = 1
SUCCESS = 2
FAILURE = 3
class Base(DeclarativeBase):
pass
class Account(Base):
__tablename__ = 'account'
# Fixed length 17 digits (prefix 6, separator 1, account number 10)
number: Mapped[str] = mapped_column(String(17), CheckConstraint('LENGTH(number) = 17'), primary_key=True)
bank: Mapped[Bank] = mapped_column(primary_key=True)
name: Mapped[Optional[str]]
name_search: Mapped[Optional[str]]
owner: Mapped[Optional[str]]
owner_search: Mapped[Optional[str]]
balance: Mapped[Optional[float]]
currency: Mapped[Optional[str]] = mapped_column(String(20))
description: Mapped[Optional[str]]
created: Mapped[Optional[date]]
last_updated: Mapped[datetime]
last_fetched: Mapped[Optional[datetime]]
archived: Mapped[Any] = mapped_column(Boolean, default=False)
inserted: Mapped[datetime] = mapped_column(default=datetime.now())
transactions: Mapped[list["Transaction"]] = relationship()
def __repr__(self) -> str:
return f"Account({str(self.__dict__)})"
class Transaction(Base):
__tablename__ = 'transaction'
id: Mapped[int] = mapped_column(primary_key=True)
date: Mapped[date]
amount: Mapped[float]
currency: Mapped[str] = mapped_column(String(20))
counter_account: Mapped[Optional[str]] = mapped_column(index=True)
type: Mapped[TransactionType]
type_detail: Mapped[TransactionTypeDetail]
type_str: Mapped[str]
variable_symbol: Mapped[str]
constant_symbol: Mapped[str]
specific_symbol: Mapped[str]
description: Mapped[str]
ca_identifier: Mapped[Optional[str]] = mapped_column(String(8), index=True)
ca_name: Mapped[Optional[str]]
category: Mapped[Optional[str]]
account_number: Mapped[str]
account_bank: Mapped[Bank]
__table_args__ = (ForeignKeyConstraint(['account_number', 'account_bank'],
['account.number', 'account.bank']),
{})
def __repr__(self) -> str:
return f"Transaction({str(self.__dict__)})"
class AccountUpdate(Base):
__tablename__ = 'account_update'
id: Mapped[int] = mapped_column(primary_key=True)
status: Mapped[UpdateStatus]
started: Mapped[datetime]
ended: Mapped[Optional[datetime]]
account_number: Mapped[str]
account_bank: Mapped[Bank]
__table_args__ = (ForeignKeyConstraint(['account_number', 'account_bank'],
['account.number', 'account.bank']),
{})
def __repr__(self) -> str:
return f"AccountUpdate({str(self.__dict__)})"